wfg 1 год назад
Родитель
Сommit
2d451ef1bc

+ 271 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_YML.java

@@ -0,0 +1,271 @@
+package org.springblade.los.Util;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import org.springblade.los.edi.dto.InttraSoDto;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Regular_YML {
+	public static Map<String, Object> notNullEDIData_Booking(InttraSoDto ediData, String type) {
+		Map<String, Object> map = new HashMap<>();
+		int code = 200;
+		String msg = "";
+		String character = "";
+		String textLength = "";
+		String special = "";
+		if (ObjectUtils.isNull(ediData)) {
+			code = 500;
+			map.put("code", code);
+			map.put("data", "数据不能为空!");
+			return map;
+		}
+
+		//主单号
+		if (ObjectUtils.isNotNull(ediData.getMblNo())) {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getMblNo(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 30)) {
+					textLength += "主单号,";
+				} else {
+					ediData.setMblNo(mapString.get("susscess"));
+				}
+			} else {
+				character += "提单号,";
+			}
+		}
+
+		//运输条款代码
+		if (ObjectUtils.isNull(ediData.getTransportTermCode())) {
+			msg += "运输条款代码,";
+		} else {
+			String serviceCode = RegularUtils.serviceTermToInttraCode(ediData.getTransportTermCode());
+			ediData.setTransportTermCode(serviceCode);
+			ediData.setTransportTermName(RegularUtils.serviceTermFromInttraCode(serviceCode));
+		}
+
+		if (ObjectUtils.isNull(ediData.getCarrierArgreementNo())) {
+			msg += "船司约号,";
+		}
+
+		if (ObjectUtils.isNotNull(ediData.getBookingRemarks())) {
+			String bookingRemarks = ediData.getBookingRemarks().trim();
+			if (!bookingRemarks.isEmpty()) {
+				Map<String, String> mapString = RegularUtils.regularEn(bookingRemarks, false);
+				if ("200".equals(mapString.get("code"))) {
+					ediData.setBookingRemarks(mapString.get("susscess"));
+				} else {
+					character += "订舱备注,";
+				}
+			}
+		}
+
+		if (ObjectUtils.isNull(ediData.getHshipperCntyName())) {
+			msg += "发货人国家代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getHshipperCntyName(), false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setHshipperCntyName(mapString.get("susscess").toUpperCase());
+			} else {
+				character += "发货人国家代码,";
+			}
+		}
+
+		if (ObjectUtils.isNull(ediData.getHShipper())) {
+			msg += "发货人,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getHShipper(), false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setHShipper(mapString.get("susscess"));
+			} else {
+				character += "发货人,";
+			}
+		}
+
+		if (ObjectUtils.isNull(ediData.getHconsigneeCntyName())) {
+			msg += "收货人国家代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getHconsigneeCntyName(), false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setHconsigneeCntyName(mapString.get("susscess").toUpperCase());
+			} else {
+				character += "收货人国家代码,";
+			}
+		}
+
+		//收货人
+		if (ObjectUtils.isNull(ediData.getHConsignee())) {
+			msg += "收货人,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getHConsignee(),false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setHConsignee(mapString.get("susscess"));
+			} else {
+				character += "收货人,";
+			}
+		}
+
+		if (ObjectUtils.isNull(ediData.getHnotifyCntyName())) {
+			msg += "通知人国家代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getHnotifyCntyName(), false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setHnotifyCntyName(mapString.get("susscess").toUpperCase());
+			} else {
+				character += "通知人国家代码,";
+			}
+		}
+
+		//通知人
+		if (ObjectUtils.isNull(ediData.getHNotify())) {
+			msg += "通知人,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getHNotify(),false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setHNotify(mapString.get("susscess"));
+			} else {
+				character += "通知人,";
+			}
+		}
+
+		if (ObjectUtils.isNotNull(ediData.getHNotify2())) {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getHNotify2(),false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setHNotify2(mapString.get("susscess"));
+			} else {
+				character += "第二通知人,";
+			}
+		}
+
+		//包装描述
+		if (ObjectUtils.isNull(ediData.getPackagesDescribe())) {
+			msg += "包装描述,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPackagesDescribe(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 35)) {
+					textLength += "包装描述,";
+				} else {
+					ediData.setPackagesDescribe(mapString.get("susscess"));
+				}
+			} else {
+				character += "包装描述,";
+			}
+		}
+
+		if("danger".equals(ediData.getCargoType())){
+//			if(ObjectUtils.isNull(ediData.getHsCode())){
+//				msg += "HS CODE,";
+//			}
+//			if(ObjectUtils.isNull(ediData.getDgImdgCode())){
+//				msg += "IMDG CODE,";
+//			}
+//			if(ObjectUtils.isNull(ediData.getDgUnCode())){
+//				msg += "UN CODE,";
+//			}
+		}
+
+		if (ObjectUtils.isNull(ediData.getMarks())) {
+			msg += "唛头,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getMarks(),false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setMarks(mapString.get("susscess"));
+			} else {
+				character += "唛头,";
+			}
+		}
+
+		if (ObjectUtils.isNull(ediData.getGoodsDesc())) {
+			msg += "货描,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getGoodsDesc(),false);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setGoodsDesc(mapString.get("susscess"));
+			} else {
+				character += "货描,";
+			}
+		}
+
+		if (ObjectUtils.isNotNull(ediData.getCyRemarks())) {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getCyRemarks(),true);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setCyRemarks(mapString.get("susscess").trim().replaceAll("\\r", "").replaceAll("\\n", ":"));
+			} else {
+				character += "场站备注,";
+			}
+		}else{
+			ediData.setCyRemarks("");
+		}
+
+		if (ObjectUtils.isNull(ediData.getPreCntrs())) {
+			msg += "预配箱型箱量,";
+		} else {
+			List<Map<String, Object>> mapList = ediData.getPreCntrs();
+			for (Map<String, Object> map1 : mapList) {
+				// Double temperature = ObjectUtils.isNotNull(map1.get("temperature")) ? Double.parseDouble(map1.get("temperature").toString()) : 0;
+				//箱型代码 sizeType
+				if (ObjectUtils.isNull(map1.get("cntrTypeCode").toString())) {
+					msg += "箱型代码,";
+				} else {  //sizeType
+					Map<String, String> mapString = RegularUtils.regularEn(map1.get("cntrTypeCode").toString(), true);
+					if ("200".equals(mapString.get("code"))) {
+						// ediData.setBoxCode(mapString.get("susscess"));
+					} else {
+						character += "箱型代码,";
+					}
+				}
+				//箱量
+				if (ObjectUtils.isNull(map1.get("cntrQty"))) {
+					msg += "箱量,";
+				}
+				//冷藏通风量
+				if (ObjectUtils.isNotNull(map1.get("ventilation"))) {
+					Map<String, String> mapString = RegularUtils.regularEn(map1.get("ventilation").toString(), true);
+					if ("200".equals(mapString.get("code"))) {
+						if (RegularUtils.regularLength(mapString.get("susscess"), 18)) {
+							textLength += "冷藏通风量,";
+						} else {
+							if (mapString.get("susscess").contains(",")) {
+								special += "冷藏通风量不能出现“,”";
+							} else {
+							}
+						}
+					} else {
+						character += "冷藏通风量,";
+					}
+				}
+				//温度单位
+				if (ObjectUtils.isNotNull(map1.get("temperatureUnit").toString())) {
+					Map<String, String> mapString = RegularUtils.regularEn(map1.get("temperatureUnit").toString(), true);
+					if ("200".equals(mapString.get("code"))) {
+					} else {
+						character += "温度单位,";
+					}
+				}
+			}
+		}
+
+		String data = "";
+		if (ObjectUtils.isNotNull(msg)) {
+			code = 500;
+			data += "下列项目未填写或 EDI 代码为空:" + msg;
+		}
+		if (ObjectUtils.isNotNull(character)) {
+			code = 500;
+			data += "下列项目含有特殊字符:" + character;
+		}
+		if (ObjectUtils.isNotNull(textLength)) {
+			code = 500;
+			data += "下列项目长度超长:" + textLength;
+		}
+		if (ObjectUtils.isNotNull(special)) {
+			code = 500;
+			data += "其他:" + special;
+		}
+		map.put("code", code);
+		map.put("data", data);
+		return map;
+	}
+}

+ 10 - 0
blade-service/blade-los/src/main/java/org/springblade/los/edi/dto/InttraSoDto.java

@@ -492,6 +492,8 @@ public class InttraSoDto {
 	 */
 	private String cyEnName;
 
+	private String cyRemarks;
+
 	/*   NAD+ST+++   */
 	/**
 	 * TO DOOR 联系信息
@@ -884,4 +886,12 @@ public class InttraSoDto {
 			return ("HYCK".equals(this.ediTypes.getType()) && "ESL-BOOKING".equals(ediTypes.getCode()));
 		}
 	}
+
+	public Boolean ediTypeIsHYCK_YML_BOOKING(){
+		if(ObjectUtils.isNull(this.ediTypes)){
+			return false;
+		}else {
+			return ("HYCK".equals(this.ediTypes.getType()) && "YML-BOOKING".equals(ediTypes.getCode()));
+		}
+	}
 }

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/edi/service/IEDISenderService.java

@@ -131,4 +131,6 @@ public interface IEDISenderService {
 	FilesCenter sendingSmlBooking(InttraSoDto smlSoDto, JsonNode ediParamCarrier);
 
 	FilesCenter sendingEslBooking(InttraSoDto eslSoDto, JsonNode ediParamCarrier);
+
+	FilesCenter sendingYmlBooking(InttraSoDto ymlSoDto, JsonNode ediParamCarrier);
 }

+ 358 - 1
blade-service/blade-los/src/main/java/org/springblade/los/edi/service/impl/EDISenderServiceImpl.java

@@ -6487,5 +6487,362 @@ public class EDISenderServiceImpl implements IEDISenderService {
 		}
 	}
 
-}
+	@Override
+	public FilesCenter sendingYmlBooking(InttraSoDto ymlSoDto, JsonNode ediParamCarrier) {
+		try {
+			String localFolder = genEdiLocalFolder(ymlSoDto, ediParamCarrier);
+			String localFileName = genEdiLocalFileName(ymlSoDto, ediParamCarrier);
+			File file = new File(localFolder, localFileName);
+			file.createNewFile();
+			// 打开文件输出流进行写入操作
+			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+			int count = 0;
+			String carrierCode = ymlSoDto.getCarrierCode();
+			String cargoType = ymlSoDto.getCargoType();
+
+			// 向文件写入数据
+			// 00 HEAD RECORD
+			// 2=增加  3=删除 4=变更  9=原始
+			writer.write("00:IFTMBF:BOOKING:9:" + ymlSoDto.getSenderCode() + ":YANGMING:" + ymlSoDto.getFileDate() + "'");
+			writer.newLine();
+			count++;
+
+			// 02 BOOKING 订舱信息
+			// 记录类型标识
+			writer.write("02");
+			// 运编号
+			writer.write(":" + (ObjectUtils.isNull(ymlSoDto.getBookingNo()) ? ymlSoDto.getMblNo() : ymlSoDto.getBookingNo()));
+			// 提单号
+			writer.write(":" + ymlSoDto.getMblNo());
+			// 交货条款 CY-CY(pier-pier/port):30
+			//CY-CFS(pier/port-door): 29
+			//CFS-CY(door-pier/port): 28
+			//CFS-CFS(door-door): 27
+			writer.write(":" + ymlSoDto.getTransportTermName());
+			// 货代方企业名称
+			writer.write(":" + ymlSoDto.getSenderCode());
+			// 即接受订舱的人的代码 + 签单人说明 + 询价单位 + 国外订舱单位 + 转船标识 + 分批 + 装期 + 效期 + 运费协议号 + 费率本代码 + 服务合同号 + BOND NO + 舱位互用标识
+			writer.write(":YANGMING::::::::" + ymlSoDto.getCarrierArgreementNo() + "::");
+			writer.write(ymlSoDto.getCarrierArgreementNo()+"::::"+ymlSoDto.getCyRemarks()+"'");
+			writer.newLine();
+			count++;
+
+			// 03 提单信息,不填
+			// 提单类型(ORI: BILL OF LADING EXP: WAYBILL) + 提单签发地代码 + 提单签发地 + 签发日期 + 正本提单份数 + 预付地点 + 到付地点
+			writer.write("03:"+ymlSoDto.getIssueType()+":"+ymlSoDto.getIssuanceLandCode()+":" + ymlSoDto.getIssuanceLand()
+				+ ":" + ymlSoDto.getIssueDate() + ":3:"
+				+ ("PP".equals(ymlSoDto.getMPayMode()) ? ymlSoDto.getMPayPlaceName() : "")
+				+ ("CC".equals(ymlSoDto.getMPayMode()) ? ymlSoDto.getMPayPlaceName() : ""));
+			// AMS Ams Tag AmsCode
+			// V_AMSPROP	IF(AMSPROP='Y','Y',IF(AMSPROP='N','N',IF(AMSPROP='1',' ','')))
+			writer.write(":'");
+
+			// ACI Canada Aci
+			// V_ACIPROP	IF(ACIPROP='Y','Y',IF(ACIPROP='N','N',IF(ACIPROP='1',' ','')))
+			// ACI NO VarChar(35)
+			// writer.write("::'");
+			writer.newLine();
+			count++;
+
+			// 11 VESSEL 船舶信息
+			// 记录类型标识 + 船舶呼号 +  船名 + 航次 + 船舶经营人
+			writer.write("11::"+ymlSoDto.getVesselName()+":"+ymlSoDto.getVoyageNo()+":YML:YML::");
+			writer.write(":" + ymlSoDto.getEtd() + "::::'");
+			writer.newLine();
+			count++;
+
+			// 12	PORTS 地点信息
+			writer.write("12");
+			// 收货地代码 + 收货地代名称
+			writer.write(":" + ymlSoDto.getPlaceReceiptCode() + ":" + ymlSoDto.getPlaceReceiptName());
+			// 装货港代码 + 装货港
+			writer.write(":" + ymlSoDto.getPolCode() + ":" + ymlSoDto.getPolName());
+			// 卸货港代码 + 卸货港代
+			writer.write(":" + ymlSoDto.getPodCode() + ":" + ymlSoDto.getPodName());
+			// 中转港代码 + 中转港 不填
+			writer.write("::");
+			// 交货地代码  + 交货地
+			writer.write(":" + ymlSoDto.getPlaceDeliveryCode() + ":" + ymlSoDto.getPlaceDeliveryName());
+			// 目的地代码  + 目的地
+			writer.write(":" + ymlSoDto.getPlaceDestinationCode() + ":" + ymlSoDto.getPlaceDestinationName());
+			// if(V_Depotid=142,'L&S',if(V_Depotid=167,'ITC',if(V_Depotid=341,'COS',if(V_Depotid=342,'MIN','QCT'))))
+			// SYSID	CORPID	CORPNO		CODENO	HELPMEM	SNAME
+			// 1		142		QDMGLH		L&S		明港陆海	明港陆海场站
+			// 1		167		QDJFCZ		CYJF	捷丰场站	捷丰场站
+			// 1		341		QDDAYA		COS		大亚场站	明港大亚
+			// 1		342		QDMINGGANG	MIN		明港		明港场站
+			Long cyId = ObjectUtils.isNotNull(ymlSoDto.getCyId()) ? ymlSoDto.getCyId() : 0;
+			String cyCode = cyId.equals(142) ? "L&S" : (cyId.equals(167) ? "ITC" : (cyId.equals(341) ? "COS" : (cyId.equals(342) ? "MIN" : "QCT")));
+			writer.write(":" + cyCode + "'");
+			writer.newLine();
+			count++;
+
+			// 14 FREIGHT CLAUSE             运费条款
+			String pm = ymlSoDto.getMPayMode();
+			String pmc = "PP".equals(pm) ? "P" : ("CC".equals(pm) ? "C" : "E");
+			writer.write("14:" + pmc + ":" + ("PP".equals(pm) ? "FREIGHT PREPAID" : ("CC".equals(pm) ? "FREIGHT COLLECT" : "OTHER")) + "'");
+			writer.newLine();
+			count++;
 
+			// 15 运费及费用项目
+			// 付款方式:[P]=预付 [C]=免费 [F]=免费 [R]=备注记录 [E]=第三地付款 [L]=第一程预付/第二程到付
+			// if(v_Mpayplace<>'DESTINATION',RecFreightChargesDetails.thirdplace,'')
+			writer.write("15::" + pmc + "::"+ymlSoDto.getMPayPlaceCode()+"::::::'");
+			writer.newLine();
+			count++;
+
+			// 17 REMARKS 订舱备注 其他信息
+			List<String> bookingRemarks = RegularUtils.reformatEDIText(ymlSoDto.getBookingRemarks(), 35, true);
+			writer.write("17"); // 发货人代码为空
+			Integer lc = 0;
+			if (bookingRemarks.size()>0) {
+				for (int l = 0; l < bookingRemarks.size(); l++) {
+					String line = bookingRemarks.get(l);
+					if (!line.trim().isEmpty()) {
+						writer.write(":" + line);
+						lc++;
+					}
+				}
+			}
+			if(lc==0){
+				writer.write(":");
+			}
+			writer.write("'");
+			writer.newLine();
+			count++;
+
+			// 20	SHIPPER 发货人
+			// 处理收发通之前,先处理货描,因为收发通多余的部分要追加到货描
+			List<String> goodsDescAddtion_S = new ArrayList<>();
+			// 发货人
+			String shpr = ObjectUtils.isNotNull(ymlSoDto.getHShipper()) ? ymlSoDto.getHShipper() : "";
+			List<String> hShipper = RegularUtils.reformatEDIText(shpr, 35, true);
+			writer.write("20:" + ymlSoDto.getHshipperCntyName());
+			for (int l = 0; l < hShipper.size(); l++) {
+				if (l < 6) {
+					writer.write(":" + hShipper.get(l));
+				} else {
+					goodsDescAddtion_S.add(hShipper.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 21	CONSIGNEE 收货人
+			List<String> goodsDescAddtion_C = new ArrayList<>();
+			String cnee = ObjectUtils.isNotNull(ymlSoDto.getHConsignee()) ? ymlSoDto.getHConsignee() : "";
+			List<String> hConsignee = RegularUtils.reformatEDIText(cnee, 35, true);
+			writer.write("21:" + ymlSoDto.getHconsigneeCntyName());
+			for (int l = 0; l < hConsignee.size(); l++) {
+				if (l < 6) {
+					writer.write(":" + hConsignee.get(l));
+				} else {
+					goodsDescAddtion_C.add(hConsignee.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 22	NOTIFY PARTY 通知人
+			List<String> goodsDescAddtion_N = new ArrayList<>();
+			String notify = ObjectUtils.isNotNull(ymlSoDto.getHNotify()) ? ymlSoDto.getHNotify() : "";
+			List<String> hNotify = RegularUtils.reformatEDIText(notify, 35, true);
+			writer.write("22:" + ymlSoDto.getHnotifyCntyName());
+			for (int l = 0; l < hNotify.size(); l++) {
+				if (l < 6) {
+					writer.write(":" + hNotify.get(l));
+				} else {
+					goodsDescAddtion_N.add(hNotify.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 24 订舱联系人
+			writer.write("24:TINA:yangming-seataocn@jms-logistics.com:0532-82668811-177'");
+			writer.newLine();
+			count += 1;
+
+			// 41 CARGO OF BOOKING  订舱货物
+			// 注:1)货物有两种包装,如是大包装(如托盘),则必须同时填小包装件数和包装类型;
+			// 2) CARGO ID (货物标识)的填法: S=普通,  R=冷冻,   D=危险 ,  O=非标
+			// 41:1::S:8378:CT:CARTONS:20559:138.8::::::20559'
+			// 记录类型标识 + 货物序号 + 货类代码 + 货物标识
+			// wfg 预配中包含特种箱时, CARGO ID = O,此处暂时不支持特种箱(OOG,  OUT OF GAUGE 中文解释超标准(集装箱))
+			// haveOOG 是否包含特种箱
+			List<String> goodsDescReefer = new ArrayList<>();
+			Boolean haveOOG = false;
+			String cargoId = haveOOG ? "O" : ("danger".equals(cargoType) ? "D" : ("reefer".equals(cargoType) ? "R" : "S"));
+			writer.write("41:1:"+ymlSoDto.getHsCode()+":" + cargoId);
+			// 第一层包装件数 + 第一层包装类型 + 第一层包装说明
+			writer.write(":" + ymlSoDto.getPackagesNumber() + ":" + ymlSoDto.getPackagesCode() + ":" + ymlSoDto.getPackagesDescribe());
+			// 第一层包装皮重 + 第一层包装尺码
+			writer.write(":" + ymlSoDto.getGrossWeight().setScale(2, BigDecimal.ROUND_HALF_UP));
+			writer.write(":" + ymlSoDto.getVolumeOfGoods().setScale(3, BigDecimal.ROUND_HALF_UP));
+			// 第二层包装件数 + 第二层包装类型 + 第二层包装说明 + 第二层包装皮重 + 第二层包装尺码 + 货毛重
+			writer.write("::::::" + ymlSoDto.getGrossWeight().setScale(2, BigDecimal.ROUND_HALF_UP) + "'");
+			writer.newLine();
+			count += 1;
+
+			// 43 DANGEROUS, REEFER & OOG 危险品,冷藏和超标信息
+			// 温度中,除正(+)负(-)号及小数点外,最多只能三位数字。
+			if (ObjectUtils.isNotNull(ymlSoDto.getPreCntrs())) {
+				List<Map<String, Object>> mapList = ymlSoDto.getPreCntrs();
+				if (mapList.size() > 0) {
+					Map<String, Object> map = mapList.get(0);
+					String T = map.get("temperature").toString();
+					String V = map.get("ventilation").toString();
+					if((ObjectUtils.isNotNull(T) && ObjectUtils.isNull(V)) || (ObjectUtils.isNull(T) && ObjectUtils.isNotNull(V))){
+						throw new SecurityException("温度和通风度必须同时填写!");
+					}
+
+					if(haveOOG){
+						// OOG 此处判断是否有超高等值
+					}
+
+					if(!T.isEmpty()){
+//						goodsDescReefer.add("CARGO IS STOWED IN REEFER CONTAINER AT THE ");
+//						goodsDescReefer.add("SHIPPER'S REQUESTED CARRYING TEMP OF " + T + " 'C VENT: " + V + " CBM/H");
+					}
+
+					if(!T.isEmpty() && !V.isEmpty()){
+						writer.write("43::::::::::" + map.get("ventilation") + ":C:" + map.get("temperature") + ":::'");
+					}else {
+						writer.write("43:"+ymlSoDto.getDgImdgCode()+"::"+ymlSoDto.getDgUnCode()+":N'");
+					}
+					writer.newLine();
+					count += 1;
+				}
+			}
+
+			// 44	MARKS & NOS. 唛头 1-10 行
+			List<String> goodsMarks = RegularUtils.reformatEDIText(ymlSoDto.getMarks(), 47, true);
+			List<String> goodsMarksAddtion = new ArrayList<>();
+			writer.write("44:");
+			for (int l = 0; l < goodsMarks.size(); l++) {
+				String line = goodsMarks.get(l);
+				if(line.trim().isEmpty()){
+					line = ".";
+				}
+//				if (l < 5) {
+//					writer.write(":" + line);
+//				} else {
+//					goodsMarksAddtion.add(line);
+//				}
+				if(l>0) {
+					writer.write(":");
+				}
+				writer.write(line);
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 47 CARGO DESCRIPTION 货物描述 5行一组
+			List<String> goodsDesc = RegularUtils.reformatEDIText(ymlSoDto.getGoodsDesc(), 70, true);
+			int glc = goodsDesc.size();
+			for (int l = 0; l < glc; l++) {
+				String line  = goodsDesc.get(l);
+				line = line.trim().isEmpty() ? "." : line;
+				if(l % 5 == 0){
+					if(l>0){
+						writer.write("'");
+						writer.newLine();
+						count += 1;
+					}
+					writer.write("47:" + line);
+				}else{
+					writer.write(":" + line);
+					if(l == (glc - 1)){
+						writer.write("'");
+						writer.newLine();
+						count += 1;
+					}
+				}
+//				writer.write("47:" + line + "'");
+//				writer.newLine();
+//				count += 1;
+			}
+
+			for(String line : goodsDescReefer){
+				writer.write("47:" + RegularUtils.escapeEDILine(line) + "'");
+				writer.newLine();
+				count += 1;
+				glc += 1;
+			}
+			for(String line : goodsDescAddtion_S){
+				glc += 1;
+				writer.write("47:" + (glc==1?"*":"*") + line + "'");
+				writer.newLine();
+				count += 1;
+			}
+			for(String line : goodsDescAddtion_C){
+				glc += 1;
+				writer.write("47:" + (glc==1?"*":"**") + line + "'");
+				writer.newLine();
+				count += 1;
+			}
+			for(String line : goodsDescAddtion_N){
+				glc += 1;
+				writer.write("47:" + (glc==1?"*":"***") + line + "'");
+				writer.newLine();
+				count += 1;
+			}
+
+			if(glc>99){
+				throw new SecurityException("货描行数过长!");
+			}
+
+			// 48 CONTAINER OF BOOKING 订舱预配箱
+			if (ObjectUtils.isNotNull(ymlSoDto.getPreCntrs())) {
+				List<Map<String, Object>> mapList = ymlSoDto.getPreCntrs();
+				for (Map<String, Object> map1 : mapList) {
+					// 记录类型标识 + 集装箱尺寸类 + 集装箱箱数 sizeType
+					writer.write("48:" + map1.get("cntrTypeCode") + ":" + map1.get("cntrQty"));
+					// 集装箱状态 + 主拼号 + 装箱方式 自选/内装/自派车队等
+					writer.write(":" + ("FCL".equals(ymlSoDto.getLoadType()) ? "F" : "L") + "::");
+					//  装箱地点代码 + 装箱地点说明 + 货主箱标志
+					Integer isSoc = ObjectUtils.isNotNull(map1.get("isSoc")) ? (Integer)map1.get("isSoc") : 0;
+					writer.write(":"+ymlSoDto.getCyCode()+"::"+(isSoc==1 ? "Y" : "N")+"'");
+					writer.newLine();
+					count += 1;
+				}
+			}
+
+			// 51 已知箱号的集装箱细目,只取直单
+//			if("DD".equals(ymlSoDto.getBillType()) && ObjectUtils.isNotNull(ymlSoDto.getLoadedCntrs())){
+//				List<Map<String, Object>> mapLoadedList = ymlSoDto.getLoadedCntrs();
+//				for (Map<String, Object> map : mapLoadedList) {
+//					String sizeType=map.get("sizeType").toString();
+//					if(sizeType.isEmpty()) {
+//						throw new SecurityException("ESL EDI 箱型代码没有维护!");
+//					}
+//					BigDecimal pkgs = ((BigDecimal) map.get("quantity")).setScale(0, BigDecimal.ROUND_HALF_UP);
+//					BigDecimal gwt = ((BigDecimal) map.get("grossWeight")).setScale(3, BigDecimal.ROUND_HALF_UP);
+//					writer.write("51::"+sizeType+"::" + pkgs.toString()+ ":" + gwt.toString() + ":'");
+//					writer.newLine();
+//					count += 1;
+//				}
+//			}
+
+			// 90 订舱人联系信息 不填
+			// writer.write("90:QJM:QINGDAO JMS-LOGISTICS SERVICE CO.,LTD.::Miya Wang:0086-532-82668811-216:0086-532-82668660-216:hmm-seataocn@jms-logistics.com'");
+			// writer.newLine();
+			// count += 1;
+
+			// 99 TRAILER RECORD              尾记录
+			// RECORD TOTAL OF FILE   记录总数	9(6)	包括:头、尾记录
+			writer.write("99:" + (++count) + "'");
+
+			writer.close();
+			String status = sysClient.getParamService("upload.url");
+			String replaceUrl = sysClient.getParamService("replace.url");
+			return createEDIFilesCenter(ymlSoDto, file,status,replaceUrl);
+		} catch (IOException e) {
+			throw new SecurityException("生成edi文件失败");
+		}
+	}
+}

+ 31 - 13
blade-service/blade-los/src/main/java/org/springblade/los/edi/service/impl/EdiTypesServiceImpl.java

@@ -173,15 +173,7 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 		return res;
 	}
 
-	/**
-	 * 统一赋值函数
-	 *
-	 * @param inttraSoDto
-	 * @param details
-	 * @param ediCodeName
-	 * @return
-	 */
-	public static void resetBillsNullValuesAsEmptyString(InttraSoDto inttraSoDto){
+		public static void resetBillsNullValuesAsEmptyString(InttraSoDto inttraSoDto){
 		//将字符串为null的赋默认值为""
 		Field[] fields = inttraSoDto.getClass().getDeclaredFields();
 		for (Field field : fields) {
@@ -211,7 +203,16 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 		}
 	}
 
-	public Boolean fill(InttraSoDto inttraSoDto, Bills details, String ediCodeName, JsonNode ediParamCarrier, Boolean mixedCargo) {
+	/**
+	 * 统一赋值函数
+	 *
+	 * @param inttraSoDto
+	 * @param details
+	 * @param ediCodeName
+	 * @param ediPackageCodeName
+	 * @return
+	 */
+	public Boolean fill(InttraSoDto inttraSoDto, Bills details, String ediCodeName, String ediPackageCodeName, JsonNode ediParamCarrier, Boolean mixedCargo) {
 		String bltype = details.getBillType();
 		inttraSoDto.setBillType(bltype);
 		List<Bills> hblBills = billsService.list(new LambdaQueryWrapper<Bills>()
@@ -442,8 +443,15 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 
 		inttraSoDto.setCyId(details.getCyId());
 		inttraSoDto.setCyCode(details.getCyCode());
+		if (ObjectUtils.isNotNull(details.getCyId())) {
+			BCorps bCorps = bCorpsService.getById(details.getCyId());
+			if (bCorps != null) {
+				inttraSoDto.setCyCode(bCorps.getCyCode());
+			}
+		}
 		inttraSoDto.setCyCnName(details.getCyCnName());
 		inttraSoDto.setCyEnName(details.getCyEnName());
+		inttraSoDto.setCyRemarks(details.getCyRemarks());
 		// 场站代码就是3字码
 //			if (ObjectUtils.isNotNull(details.getCyId())) {
 //				BCorps bCorps = bCorpsService.getById(details.getCyId());
@@ -477,7 +485,7 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 			BPackages bPackages = bPackagesService.getOne(new LambdaQueryWrapper<BPackages>()
 				.eq(BPackages::getId, details.getPackingUnitId()));
 			if (bPackages != null) {
-				String ediCode = RegularUtils.getEdiCode(ediCodeName, bPackages.getExtendedData());
+				String ediCode = RegularUtils.getEdiCode(ObjectUtils.isNotNull(ediPackageCodeName)?ediPackageCodeName:ediCodeName, bPackages.getExtendedData());
 				inttraSoDto.setPackagesCode(ediCode);
 			}
 		}
@@ -742,6 +750,7 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 			Boolean mixedCargo = readEdiParamBooleanValue(ediParamCarrier, "mixedCargo", false);
 
 			String EDI_CODE_NAME = readEdiParamStringValue(ediParamCarrier, "ediCode", "INTTRA");
+			String EDI_PACKAGE_CODE_NAME = readEdiParamStringValue(ediParamCarrier, "ediPackageCode", EDI_CODE_NAME);
 			Boolean INCLUDING_HBL = readEdiParamBooleanValue(ediParamCarrier, "includingHBL", false);
 
 			Boolean CHECK_ALREADY_SEND = readEdiParamBooleanValue(ediParamCarrier, "checkAlreadySend", false);
@@ -844,13 +853,13 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 			SimpleDateFormat sdf4 = new SimpleDateFormat(readEdiParamStringValue(ediParamCarrier, "fileDate-format", "yyyyMMddHHmm"));
 			inttraSoDto.setFileDate(sdf4.format(date));
 
-			fill(inttraSoDto, details, EDI_CODE_NAME, ediParamCarrier, mixedCargo);
+			fill(inttraSoDto, details, EDI_CODE_NAME, EDI_PACKAGE_CODE_NAME, ediParamCarrier, mixedCargo);
 
 			if (!hblBillsList.isEmpty()) {
 				List<InttraSoDto> hbls = new ArrayList<>();
 				for (Bills bill : hblBillsList) {
 					InttraSoDto dto = new InttraSoDto();
-					fill(dto, bill, EDI_CODE_NAME, ediParamCarrier, mixedCargo);
+					fill(dto, bill, EDI_CODE_NAME, EDI_PACKAGE_CODE_NAME, ediParamCarrier, mixedCargo);
 					if (!inttraSoDto.getHasMixedCargo()) {
 						inttraSoDto.setHasMixedCargo(dto.getHasMixedCargo());
 					}
@@ -1015,6 +1024,15 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 						return R.fail(e.getMessage());
 					}
 				}
+			} else if (inttraSoDto.ediTypeIsHYCK_YML_BOOKING()) {
+				status = Regular_YML.notNullEDIData_Booking(inttraSoDto, "SO");
+				if ("200".equals(status.get("code").toString())) {
+					try {
+						filesCenter = iediSenderService.sendingYmlBooking(inttraSoDto, ediParamCarrier);
+					} catch (Exception e) {
+						return R.fail(e.getMessage());
+					}
+				}
 			} else {
 				return R.fail("EDI 未实现!");
 			}