Browse Source

Merge remote-tracking branch 'origin/dev' into dev

纪新园 1 year ago
parent
commit
ef3b5ea9d5

+ 80 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/RegularUtils.java

@@ -170,6 +170,28 @@ public class RegularUtils {
 		}
 	}
 
+	public static String escapeEDILineAll(String line) {
+		if(ObjectUtils.isNull(line) || line.isEmpty()){
+			return "";
+		} else {
+			return line.replaceAll("\\?", "??")
+				.replaceAll("\\+", "?+")
+				.replaceAll("'", "?'")
+				.replaceAll(":", "?:")
+				.replaceAll("%", "?%")
+				.replaceAll("!", "?!")
+				.replaceAll("@", "?@")
+				.replaceAll("#", "?#")
+				.replaceAll("\\$", "?$")
+				.replaceAll("\\^", "?^")
+				.replaceAll("\\[", "?[")
+				.replaceAll("]", "?:")
+				.replaceAll("\\{", "?:")
+				.replaceAll("}", "?:")
+				.replaceAll("~", "?:")
+				.replaceAll("\\*", "?:");
+		}
+	}
 	/**
 	 * 英文数字转数值
 	 * @param englishWord
@@ -318,6 +340,64 @@ public class RegularUtils {
 		return lines;
 	}
 
+	public static List<String> reformatEDITextEscapeAll(String rawText, int lineLen, Boolean Escape) {
+		String text = ObjectUtils.isNotNull(rawText) ?  rawText : "";
+		List<String> lines = new ArrayList<>();
+		// 去除前面的空行,保留中间的空行
+		if(!text.isEmpty()){
+			String[] buf = text.split("\n");
+			Pattern p1 = Pattern.compile("[a-zA-Z]");
+			for (String item : buf) {
+				String ln = item.trim();
+				if(ln.isEmpty()) {
+					if(lines.size()>0) {
+						lines.add("");
+					}
+				}else {
+					while (!ln.isEmpty()) {
+						if (ln.length() <= lineLen) {
+							lines.add(Escape ? escapeEDILineAll(ln) : ln);
+							ln = "";
+						} else {
+							if (!p1.matcher(ln.charAt(lineLen) + "").matches()) {
+								if (Escape) {
+									lines.add(escapeEDILineAll(ln.substring(0, lineLen)));
+								} else {
+									lines.add(ln.substring(0, lineLen));
+								}
+								ln = ln.substring(lineLen);
+							} else {
+								int p = -1;
+								for (int i = lineLen - 2; i >= 0; i--) {
+									if (!p1.matcher(ln.charAt(i) + "").matches()) {
+										p = i;
+										break;
+									}
+								}
+								if (p == -1) {
+									if (Escape) {
+										lines.add(escapeEDILineAll(ln.substring(0, lineLen)));
+									} else {
+										lines.add(ln.substring(0, lineLen));
+									}
+									ln = ln.substring(lineLen);
+								} else {
+									if (Escape) {
+										lines.add(escapeEDILineAll(ln.substring(0, p + 1)));
+									} else {
+										lines.add(ln.substring(0, p + 1));
+									}
+									ln = ln.substring(p + 1);
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return lines;
+	}
 	/**
 	 * get char fill composite String for existed prefix or suffix
 	 * for example,if need left padding zero for some String,

+ 3 - 3
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_APL.java

@@ -328,15 +328,15 @@ public class Regular_APL {
 		String data = "";
 		if (ObjectUtils.isNotNull(msg)) {
 			code = 500;
-			data += "空:" + msg;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
 		}
 		if (ObjectUtils.isNotNull(character)) {
 			code = 500;
-			data += "特殊字符:" + character;
+			data += "下列项目含有特殊字符:" + character;
 		}
 		if (ObjectUtils.isNotNull(textLength)) {
 			code = 500;
-			data += "长度超长:" + textLength;
+			data += "下列项目长度超长:" + textLength;
 		}
 		if (ObjectUtils.isNotNull(special)) {
 			code = 500;

+ 3 - 3
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_ESL.java

@@ -195,15 +195,15 @@ public class Regular_ESL {
 		String data = "";
 		if (ObjectUtils.isNotNull(msg)) {
 			code = 500;
-			data += "空:" + msg;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
 		}
 		if (ObjectUtils.isNotNull(character)) {
 			code = 500;
-			data += "特殊字符:" + character;
+			data += "下列项目含有特殊字符:" + character;
 		}
 		if (ObjectUtils.isNotNull(textLength)) {
 			code = 500;
-			data += "长度超长:" + textLength;
+			data += "下列项目长度超长:" + textLength;
 		}
 		if (ObjectUtils.isNotNull(special)) {
 			code = 500;

+ 3 - 3
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_HMM.java

@@ -397,15 +397,15 @@ public class Regular_HMM {
 		String data = "";
 		if (ObjectUtils.isNotNull(msg)) {
 			code = 500;
-			data += "空:" + msg;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
 		}
 		if (ObjectUtils.isNotNull(character)) {
 			code = 500;
-			data += "特殊字符:" + character;
+			data += "下列项目含有特殊字符:" + character;
 		}
 		if (ObjectUtils.isNotNull(textLength)) {
 			code = 500;
-			data += "长度超长:" + textLength;
+			data += "下列项目长度超长:" + textLength;
 		}
 		if (ObjectUtils.isNotNull(special)) {
 			code = 500;

+ 3 - 3
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_INTTRA.java

@@ -1221,15 +1221,15 @@ public class Regular_INTTRA {
 		String data = "";
 		if (ObjectUtils.isNotNull(msg)) {
 			code = 500;
-			data += "空:" + msg;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
 		}
 		if (ObjectUtils.isNotNull(character)) {
 			code = 500;
-			data += "特殊字符:" + character;
+			data += "下列项目含有特殊字符:" + character;
 		}
 		if (ObjectUtils.isNotNull(textLength)) {
 			code = 500;
-			data += "长度超长:" + textLength;
+			data += "下列项目长度超长:" + textLength;
 		}
 		if (ObjectUtils.isNotNull(special)) {
 			code = 500;

+ 9 - 9
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_ONE.java

@@ -71,12 +71,12 @@ public class Regular_ONE {
 			ediData.setTransportTermName(RegularUtils.serviceTermFromInttraCode(serviceCode));
 		}
 
-		//运输条款代码
-		if (ObjectUtils.isNotNull(ediData.getVesselId())) {
-			if (ObjectUtils.isNull(ediData.getVesselCode())) {
-				msg += "ONE 船名 " + ediData.getVesselName() + " 代码,";
-			}
-		}
+		//船名代码不是必须
+//		if (ObjectUtils.isNotNull(ediData.getVesselId())) {
+//			if (ObjectUtils.isNull(ediData.getVesselCode())) {
+//				msg += "ONE 船名 " + ediData.getVesselName() + " 代码,";
+//			}
+//		}
 
 		//船名
 		if (ObjectUtils.isNull(ediData.getVesselName())) {
@@ -346,15 +346,15 @@ public class Regular_ONE {
 		String data = "";
 		if (ObjectUtils.isNotNull(msg)) {
 			code = 500;
-			data += "空:" + msg;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
 		}
 		if (ObjectUtils.isNotNull(character)) {
 			code = 500;
-			data += "特殊字符:" + character;
+			data += "下列项目含有特殊字符:" + character;
 		}
 		if (ObjectUtils.isNotNull(textLength)) {
 			code = 500;
-			data += "长度超长:" + textLength;
+			data += "下列项目长度超长:" + textLength;
 		}
 		if (ObjectUtils.isNotNull(special)) {
 			code = 500;

+ 3 - 3
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_PIL.java

@@ -352,15 +352,15 @@ public class Regular_PIL {
 		String data = "";
 		if (ObjectUtils.isNotNull(msg)) {
 			code = 500;
-			data += "空:" + msg;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
 		}
 		if (ObjectUtils.isNotNull(character)) {
 			code = 500;
-			data += "特殊字符:" + character;
+			data += "下列项目含有特殊字符:" + character;
 		}
 		if (ObjectUtils.isNotNull(textLength)) {
 			code = 500;
-			data += "长度超长:" + textLength;
+			data += "下列项目长度超长:" + textLength;
 		}
 		if (ObjectUtils.isNotNull(special)) {
 			code = 500;

+ 4 - 4
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_SML.java

@@ -416,7 +416,7 @@ public class Regular_SML {
 				for (Map<String, Object> map1 : mapList) {
 					// Double temperature = ObjectUtils.isNotNull(map1.get("temperature")) ? Double.parseDouble(map1.get("temperature").toString()) : 0;
 					//箱型代码
-					if (ObjectUtils.isNull(map1.get("sizeType").toString())) {
+					if (ObjectUtils.isNull(map1.get("sizeType"))) {
 						msg += "箱型代码,";
 					} else {
 						Map<String, String> mapString = RegularUtils.regularEn(map1.get("sizeType").toString(), true);
@@ -461,15 +461,15 @@ public class Regular_SML {
 		String data = "";
 		if (ObjectUtils.isNotNull(msg)) {
 			code = 500;
-			data += "空:" + msg;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
 		}
 		if (ObjectUtils.isNotNull(character)) {
 			code = 500;
-			data += "特殊字符:" + character;
+			data += "下列项目含有特殊字符:" + character;
 		}
 		if (ObjectUtils.isNotNull(textLength)) {
 			code = 500;
-			data += "长度超长:" + textLength;
+			data += "下列项目长度超长:" + textLength;
 		}
 		if (ObjectUtils.isNotNull(special)) {
 			code = 500;

+ 2 - 1
blade-service/blade-los/src/main/java/org/springblade/los/edi/controller/EdiTypesController.java

@@ -77,7 +77,8 @@ public class EdiTypesController extends BladeController {
 		LambdaQueryWrapper<EdiTypes> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(EdiTypes::getTenantId, AuthUtil.getTenantId())
 			.eq(EdiTypes::getIsDeleted, 0)
-			.eq(ObjectUtils.isNotNull(ediTypes.getType()), EdiTypes::getType, ediTypes.getType());
+			.eq(ObjectUtils.isNotNull(ediTypes.getType()), EdiTypes::getType, ediTypes.getType())
+		    .orderBy(true, true, EdiTypes::getCode);
 		if (!"admin".equals(AuthUtil.getUserName())) {
 			lambdaQueryWrapper.apply("find_in_set(" + deptUtils.getDeptPid()+"" + ",userlist)");
 		}

+ 59 - 29
blade-service/blade-los/src/main/java/org/springblade/los/edi/service/impl/EDISenderServiceImpl.java

@@ -56,6 +56,26 @@ public class EDISenderServiceImpl implements IEDISenderService {
 	@Autowired
 	static FTPPoolConfig config;
 
+	public static String getOSName() {
+		String osName = System.getProperty("os.name").toLowerCase();
+		if (osName.contains("win")) {
+			return "win";
+		} else if (osName.contains("mac")) {
+			return "mac";
+		} else if (osName.contains("nix") || osName.contains("nux") || osName.contains("aix")) {
+			return "unix";
+		} else {
+			return osName;
+		}
+	}
+	public static Boolean getOsIsWindow(){
+		String osName = getOSName();
+		return "win".equals(osName);
+	}
+	public static Boolean getOsIsUnix(){
+		String osName = getOSName();
+		return "unix".equals(osName);
+	}
 	public static boolean createDir(String folder) {
 		if (!folder.endsWith(File.separator)) {
 			// 结尾是否以"/"结束
@@ -72,11 +92,14 @@ public class EDISenderServiceImpl implements IEDISenderService {
 	}
 
 	private String genEdiLocalFolder(@Validated InttraSoDto edi, JsonNode ediParamCarrier) {
-		String pathRoot = "/home/minio/file/" + AuthUtil.getTenantId() + "-bladex/upload/" + edi.getEdiTypes().getCode() + "/";
+		// String pathRoot = "/home/minio/file/" + AuthUtil.getTenantId() + "-bladex/upload/" + edi.getEdiTypes().getCode() + "/";
+		String pathRoot = "/home/minio/file/" + AuthUtil.getTenantId() + "-bladex/upload";
 		// 本地测试
-		pathRoot = "D:" + pathRoot;
-		if (!createDir(pathRoot)) {
-			pathRoot = "";
+		if(getOsIsWindow()) {
+			pathRoot = "D:\\home\\minio\\file\\" + AuthUtil.getTenantId() + "-bladex\\upload";
+			if (!createDir(pathRoot)) {
+				pathRoot = "";
+			}
 		}
 		return pathRoot;
 	}
@@ -326,9 +349,9 @@ public class EDISenderServiceImpl implements IEDISenderService {
 	public FilesCenter sendingInttraSo(@Validated InttraSoDto inttraSoDto, JsonNode ediParamCarrier) {
 		Date date = new Date();
 		try {
-//			String localFolder = genEdiLocalFolder(inttraSoDto, ediParamCarrier);
-			String localFolder = "/home/minio/file/" + AuthUtil.getTenantId() + "-bladex/upload";
-//			localFolder = "D:/home/minio/file/" + AuthUtil.getTenantId() + "-bladex/upload";
+			String localFolder = genEdiLocalFolder(inttraSoDto, ediParamCarrier);
+			// String localFolder = "/home/minio/file/" + AuthUtil.getTenantId() + "-bladex/upload";
+ 			// localFolder = "D:/home/minio/file/" + AuthUtil.getTenantId() + "-bladex/upload";
 			String localFileName = genEdiLocalFileName(inttraSoDto, ediParamCarrier);
 			File file = new File(localFolder, localFileName);
 			file.createNewFile();
@@ -486,10 +509,13 @@ public class EDISenderServiceImpl implements IEDISenderService {
 			writer.newLine();
 			count += 1;
 			/* =================0530=================  */
-			if (ObjectUtils.isNotNull(inttraSoDto.getEtd())) {
-				writer.write("DTM+133:" + inttraSoDto.getEtd() + ":102'");
-				writer.newLine();
-				count += 1;
+			// MAEU 发送 ETD,其他不发送
+			if ("MAEU".equals(carrierCode)) {
+				if (ObjectUtils.isNotNull(inttraSoDto.getEtd())) {
+					writer.write("DTM+133:" + inttraSoDto.getEtd() + ":102'");
+					writer.newLine();
+					count += 1;
+				}
 			}
 			/* =================0520=================  */
 			writer.write("LOC+11+" + inttraSoDto.getPodCode() + "::6:" + inttraSoDto.getPodName() + "'");
@@ -823,7 +849,9 @@ public class EDISenderServiceImpl implements IEDISenderService {
 					writer.newLine();
 					count += 1;
 
-					if ("reefer".equals(cargoType)) {
+					// 无论是否冻柜,操作填了就发送
+					// if ("reefer".equals(cargoType)) {
+					if (true) {
 						if (ObjectUtils.isNotNull(map1.get("ventilation"))) {
 							writer.write("MEA+AAE+AAS+CBM:" + map1.get("ventilation") + "'");
 							writer.newLine();
@@ -836,13 +864,10 @@ public class EDISenderServiceImpl implements IEDISenderService {
 						}
 						if (ObjectUtils.isNotNull(map1.get("temperature"))) {
 							writer.write("TMP+2+" + map1.get("temperature"));
-							if (ObjectUtils.isNotNull(map1.get("temperatureUnit"))) {
-								writer.write(":" + map1.get("temperatureUnit") + "'");
-								writer.newLine();
-							} else {
-								writer.write(":CEL'");
-								writer.newLine();
-							}
+							String tu = ObjectUtils.isNotNull(map1.get("temperatureUnit")) ? map1.get("temperatureUnit").toString() : "CEL";
+							tu = tu.equals("C") ? "CEL" : (tu.equals("F") ? "FAH" : tu);
+							writer.write(":" + tu + "'");
+							writer.newLine();
 							count += 1;
 						}
 					}
@@ -1983,8 +2008,11 @@ public class EDISenderServiceImpl implements IEDISenderService {
 	@Override
 	public FilesCenter sendingOneBooking(@Validated InttraSoDto oneSoDto, JsonNode ediParamCarrier) {
 		try {
+			Boolean allowMaster = readEdiParamBooleanValue(ediParamCarrier, "allowMaster", true);
 			List<InttraSoDto> billsList = new ArrayList<>();
-			billsList.add(oneSoDto);
+			if(allowMaster || !"MM".equals(oneSoDto.getBillType())) {
+				billsList.add(oneSoDto);
+			}
 			oneSoDto.setIsMasterBill(true);
 			if (ObjectUtils.isNotNull(oneSoDto.getHblBillsList())) {
 				for (InttraSoDto bill : oneSoDto.getHblBillsList()) {
@@ -5869,10 +5897,11 @@ public class EDISenderServiceImpl implements IEDISenderService {
 			String S1 = sdf2.format(date);
 			String mbf = "MBF" + S1.substring(4, 14);
 			String msgId = S1.substring(4, 12) + S1.substring(14, 17);
-			writer.write("UNB+UNOA:1+JMS:ZZ+SMLM:ZZ+" + sdf1.format(date) + mbf + "'");
+			writer.write("UNB+UNOA:1+JMS:ZZ+SMLM:ZZ+" + sdf1.format(date) + ":" + mbf + "'");
 			writer.newLine();
 			/* =================0010=================  */
-			writer.write("UNH+80+"+ msgId +"+IFTMBF:D:98B:UN'");
+			// +80
+			writer.write("UNH+"+ msgId +"+IFTMBF:D:98B:UN'");
 			writer.newLine();
 			count += 1;
 			/* =================0020=================  */
@@ -5888,7 +5917,7 @@ public class EDISenderServiceImpl implements IEDISenderService {
 			writer.newLine();
 			count += 1;
 
-			List<String> goodsDesc = RegularUtils.reformatEDIText(smlSoDto.getGoodsDesc(), 70, true);
+			List<String> goodsDesc = RegularUtils.reformatEDITextEscapeAll(smlSoDto.getGoodsDesc(), 70, true);
 			List<String> goodsDescAddtion = new ArrayList<>();
 			int gc = goodsDesc.size();
 			for(int l = 0; l<gc; l++){
@@ -5912,7 +5941,7 @@ public class EDISenderServiceImpl implements IEDISenderService {
 				}
 			}
 
-			List<String> bookingRemarks = RegularUtils.reformatEDIText(smlSoDto.getBookingRemarks(), 70, true);
+			List<String> bookingRemarks = RegularUtils.reformatEDITextEscapeAll(smlSoDto.getBookingRemarks(), 70, true);
 			List<String> bookingRemarksAddtion = new ArrayList<>();
 			gc = bookingRemarks.size();
 			for(int l = 0; l<gc; l++){
@@ -5943,7 +5972,7 @@ public class EDISenderServiceImpl implements IEDISenderService {
 
 			// 船名
 			// V_VOY+'+1++HJSC:172:182+++'+RecTDT.smlvslno+':::'+V_VSL
-			writer.write("TDT+20+" + smlSoDto.getVoyageNo() + "+1+HJSC:172:182+++" + smlSoDto.getVesselCode() + ":::"+smlSoDto.getVesselName()+"'");
+			writer.write("TDT+20+" + smlSoDto.getVoyageNo() + "+1++HJSC:172:182+++" + smlSoDto.getVesselCode() + ":::"+smlSoDto.getVesselName()+"'");
 			writer.newLine();
 			count += 1;
 
@@ -5964,11 +5993,12 @@ public class EDISenderServiceImpl implements IEDISenderService {
 			writer.newLine();
 			count += 1;
 
-			writer.write("NAD+FW+CN116336+QINGDAO JET MARINE LOGISTICS CO.,LTD.'");
+			// QINGDAO JET MARINE LOGISTICS CO.,LTD. 超35字符,故折行
+			writer.write("NAD+FW+CN116336+QINGDAO JET MARINE LOGISTICS CO.,:LTD.'");
 			writer.newLine();
 			count += 1;
 
-			List<String> shpr = RegularUtils.reformatEDIText(smlSoDto.getHShipper(), 35, true);
+			List<String> shpr = RegularUtils.reformatEDITextEscapeAll(smlSoDto.getHShipper(), 35, true);
 			List<String> shprAddtion = new ArrayList<>();
 			gc = shpr.size();
 			for(int l = 0; l<gc; l++){
@@ -5992,7 +6022,7 @@ public class EDISenderServiceImpl implements IEDISenderService {
 				}
 			}
 
-			List<String> cnee = RegularUtils.reformatEDIText(smlSoDto.getHConsignee(), 35, true);
+			List<String> cnee = RegularUtils.reformatEDITextEscapeAll(smlSoDto.getHConsignee(), 35, true);
 			List<String> cneeAddtion = new ArrayList<>();
 			gc = cnee.size();
 			for(int l = 0; l<gc; l++){
@@ -6016,7 +6046,7 @@ public class EDISenderServiceImpl implements IEDISenderService {
 				}
 			}
 
-			List<String> notify = RegularUtils.reformatEDIText(smlSoDto.getHNotify(), 35, true);
+			List<String> notify = RegularUtils.reformatEDITextEscapeAll(smlSoDto.getHNotify(), 35, true);
 			List<String> notifyAddtion = new ArrayList<>();
 			gc = notify.size();
 			for(int l = 0; l<gc; l++){

+ 4 - 1
blade-service/blade-los/src/main/java/org/springblade/los/edi/service/impl/EdiTypesServiceImpl.java

@@ -765,7 +765,10 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 			inttraSoDto.setMessageDate(sdf.format(date));
 			SimpleDateFormat sdf1 = new SimpleDateFormat(readEdiParamStringValue(ediParamCarrier, "fileExchangeNumber-format", "yyMMddHHmm"));
 			String corpId = details.getCorpId().toString();
-			inttraSoDto.setFileExchangeNumber(sdf1.format(date) + corpId.substring(corpId.length() - 4));
+			if(corpId.length()>4){
+				corpId = corpId.substring(corpId.length() - 4);
+			}
+			inttraSoDto.setFileExchangeNumber(sdf1.format(date) + corpId);
 			inttraSoDto.setInformationNo(inttraSoDto.getFileExchangeNumber());
 
 			String mblNo = ObjectUtils.isNotNull(details.getMblno()) ? details.getMblno() : "";