Browse Source

ADD VOLTA EDI

wfg 8 months ago
parent
commit
73880d069c

+ 428 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/Regular_VOLTA.java

@@ -0,0 +1,428 @@
+package org.springblade.los.Util;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import org.springblade.los.business.sea.entity.ContainersCommodity;
+import org.springblade.los.edi.dto.InttraSoDto;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Regular_VOLTA {
+	public static Map<String, Object> notNullVoltaBookingDto(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.isNull(ediData.getMblNo())) {
+			ediData.setMblNo("");
+		}
+
+//		if("SI".equals(type)){
+//			if (ObjectUtils.isNull(ediData.getCarrierArgreementNo())) {
+//				msg+="服务合同号";
+//			}
+//		}
+
+		//运输条款代码
+		if (ObjectUtils.isNull(ediData.getTransportTermCode())) {
+			msg += "运输条款代码,";
+		} else {
+			String serviceCode = RegularUtils.serviceTermToInttraCode(ediData.getTransportTermCode());
+			ediData.setTransportTermCode(serviceCode);
+			ediData.setTransportTermName(RegularUtils.serviceTermFromInttraCode(serviceCode));
+		}
+
+		//船名代码
+		if (ObjectUtils.isNotNull(ediData.getVesselId())) {
+			if (ObjectUtils.isNull(ediData.getVesselCode())) {
+				// msg += "HMM 船名 " + ediData.getVesselName() + " 代码,";
+			}
+		}
+
+		//船名
+		if (ObjectUtils.isNull(ediData.getVesselName())) {
+			// msg += "船名,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getVesselName(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 30)) {
+					textLength += "船名,";
+				} else {
+					ediData.setVesselName(mapString.get("susscess"));
+				}
+			} else {
+				character += "船名,";
+			}
+		}
+		//装货港代码
+		if (ObjectUtils.isNull(ediData.getPolCode())) {
+			msg += "装货港代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPolCode(),true);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setPolCode(mapString.get("susscess"));
+			} else {
+				character += "装货港代码,";
+			}
+		}
+		//装货港
+		if (ObjectUtils.isNull(ediData.getPolName())) {
+			msg += "装货港,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPolName(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 256)) {
+					textLength += "装货港,";
+				} else {
+					ediData.setPolName(mapString.get("susscess"));
+				}
+			} else {
+				character += "装货港,";
+			}
+		}
+		//收货地代码
+		if (ObjectUtils.isNull(ediData.getPlaceReceiptCode())) {
+			msg += "收货地代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPlaceReceiptCode(),true);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setPlaceReceiptCode(mapString.get("susscess"));
+			} else {
+				character += "收货地代码,";
+			}
+		}
+		//收货地
+		if (ObjectUtils.isNull(ediData.getPlaceReceiptName())) {
+			msg += "收货地,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPlaceReceiptName(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 256)) {
+					textLength += "收货地,";
+				} else {
+					ediData.setPlaceReceiptName(mapString.get("susscess"));
+				}
+			} else {
+				character += "收货地,";
+			}
+		}
+		//卸货港代码
+		if (ObjectUtils.isNull(ediData.getPodCode())) {
+			msg += "卸货港代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPodCode(),true);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setPodCode(mapString.get("susscess"));
+			} else {
+				character += "卸货港代码,";
+			}
+		}
+		//卸货港
+		if (ObjectUtils.isNull(ediData.getPodName())) {
+			msg += "卸货港,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPodName(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 256)) {
+					textLength += "卸货港,";
+				} else {
+					ediData.setPodName(mapString.get("susscess"));
+				}
+			} else {
+				character += "卸货港,";
+			}
+		}
+		//交货地代码
+		if (ObjectUtils.isNull(ediData.getPlaceDeliveryCode())) {
+			msg += "交货地代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPlaceDeliveryCode(),true);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setPlaceDeliveryCode(mapString.get("susscess"));
+			} else {
+				character += "交货地代码,";
+			}
+		}
+		//交货地
+		if (ObjectUtils.isNull(ediData.getPlaceDeliveryName())) {
+			msg += "交货地,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPlaceDeliveryName(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 256)) {
+					textLength += "交货地,";
+				} else {
+					ediData.setPlaceDeliveryName(mapString.get("susscess"));
+				}
+			} else {
+				character += "交货地,";
+			}
+		}
+		//目的地代码
+		// 2024-08-06 将目的地代码和地点放在了交货地,故判断交货地
+		if (ObjectUtils.isNull(ediData.getPlaceDestinationCode())) {
+			// msg += "目的地代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPlaceDestinationCode(),true);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setPlaceDestinationCode(mapString.get("susscess"));
+			} else {
+				character += "目的地代码,";
+			}
+		}
+		//目的地
+		if (ObjectUtils.isNull(ediData.getPlaceDestinationName())) {
+			// msg += "目的地,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPlaceDestinationName(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 256)) {
+					textLength += "目的地,";
+				} else {
+					ediData.setPlaceDestinationName(mapString.get("susscess"));
+				}
+			} else {
+				character += "目的地,";
+			}
+		}
+		//中转港
+		if (ObjectUtils.isNotNull(ediData.getPotName())) {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPotName(),true);
+			if ("200".equals(mapString.get("code"))) {
+				if (RegularUtils.regularLength(mapString.get("susscess"), 256)) {
+					textLength += "中转港,";
+				} else {
+					ediData.setPotName(mapString.get("susscess"));
+				}
+			} else {
+				character += "中转港,";
+			}
+		}
+
+		if("danger".equals(ediData.getCargoType())){
+			if(ObjectUtils.isNull(ediData.getHsCode())){
+				// HS CODE 不是必填
+				// msg += "HS CODE,";
+			}
+			if(ObjectUtils.isNull(ediData.getDgImdgCode())){
+				msg += "IMDG CODE,";
+			}
+			if(ObjectUtils.isNull(ediData.getDgUnCode())){
+				msg += "UN CODE,";
+			}
+		}
+
+		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 += "订舱备注,";
+				}
+			}
+		}
+//		String text = "";
+//		if (ObjectUtils.isNotNull(ediData.getBookingRemarks())) {
+//			String bookingRemarks = ediData.getBookingRemarks().trim();
+//			if (!bookingRemarks.isEmpty()) {
+//				String[] bookingRemarksArr = bookingRemarks.replaceAll("\r", "").split("\n");
+//				// 最多 5 行
+//				for (int i = 0; i < bookingRemarksArr.length; i++) {
+//					String line = bookingRemarksArr[i].trim();
+//					if (!line.isEmpty()) {
+//						if (text.isEmpty()) {
+//							text = RegularUtils.escapeEDILine(line);
+//						} else {
+//							text += ":" + RegularUtils.escapeEDILine(line);
+//						}
+//					}
+//					if(i == 4){
+//						break;
+//					}
+//				}
+//			}
+//		}
+//		ediData.setBookingRemarks(text);
+
+		//发货人
+		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.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.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.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.isNull(ediData.getPackagesCode())) {
+			msg += "包装代码,";
+		} else {
+			Map<String, String> mapString = RegularUtils.regularEn(ediData.getPackagesCode(),true);
+			if ("200".equals(mapString.get("code"))) {
+				ediData.setPackagesCode(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 (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;
+				//箱型代码
+				if (ObjectUtils.isNull(map1.get("sizeType").toString())) {
+					msg += "箱型代码,";
+				} else {
+					Map<String, String> mapString = RegularUtils.regularEn(map1.get("sizeType").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;
+	}
+	public static Map<String, Object> notNullVoltaSIDto(InttraSoDto ediData) {
+		Map<String, Object> RSO = notNullVoltaBookingDto(ediData, "SI");
+		if (200 != Integer.parseInt(RSO.get("code").toString())) {
+			// 发生错误时,直接返回
+		}
+
+		return RSO;
+	}
+}

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

@@ -898,4 +898,18 @@ public class InttraSoDto {
 			return ("HYCK".equals(this.ediTypes.getType()) && "YML-BOOKING".equals(ediTypes.getCode()));
 		}
 	}
+	public Boolean ediTypeIsHYCK_VOLTA_BOOKING(){
+		if(ObjectUtils.isNull(this.ediTypes)){
+			return false;
+		}else {
+			return ("HYCK".equals(this.ediTypes.getType()) && "VOLTA-BOOKING".equals(ediTypes.getCode()));
+		}
+	}
+	public Boolean ediTypeIsHYCK_VOLTA_SI(){
+		if(ObjectUtils.isNull(this.ediTypes)){
+			return false;
+		}else {
+			return ("HYCK".equals(this.ediTypes.getType()) && "VOLTA-SI".equals(ediTypes.getCode()));
+		}
+	}
 }

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

@@ -133,4 +133,20 @@ public interface IEDISenderService {
 	FilesCenter sendingEslBooking(InttraSoDto eslSoDto, JsonNode ediParamCarrier);
 
 	FilesCenter sendingYmlBooking(InttraSoDto ymlSoDto, JsonNode ediParamCarrier);
+
+	/**
+	 * apl so
+	 * @param voltaSoDto
+	 * @param ediParamCarrier
+	 * @return
+	 */
+	FilesCenter sendingVoltaBooking(InttraSoDto voltaSoDto, JsonNode ediParamCarrier);
+
+	/**
+	 * apl si
+	 * @param voltaSiDto
+	 * @param ediParamCarrier
+	 * @return
+	 */
+	FilesCenter sendingVoltaSI(InttraSoDto voltaSiDto, JsonNode ediParamCarrier);
 }

+ 672 - 0
blade-service/blade-los/src/main/java/org/springblade/los/edi/service/impl/EDISenderServiceImpl.java

@@ -7036,4 +7036,676 @@ public class EDISenderServiceImpl implements IEDISenderService {
 			throw new SecurityException("生成edi文件失败");
 		}
 	}
+
+	@Override
+	public FilesCenter sendingVoltaBooking(@Validated InttraSoDto voltaSoDto, JsonNode ediParamCarrier) {
+		try {
+			String localFolder = genEdiLocalFolder(voltaSoDto, ediParamCarrier);
+			String localFileName = genEdiLocalFileName(voltaSoDto, ediParamCarrier);
+			File file = new File(localFolder, localFileName);
+			file.createNewFile();
+			// 打开文件输出流进行写入操作
+			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+			int count = 0;
+			String carrierCode = voltaSoDto.getCarrierCode();
+			String cargoType = voltaSoDto.getCargoType();
+
+			// 向文件写入数据
+			// 00 HEAD RECORD
+			// 2=增加  3=删除 4=变更  9=原始
+			writer.write("00:IFTMBF:BOOKING:9:" + voltaSoDto.getSenderCode() + ":HMM:" + voltaSoDto.getFileDate() + "'");
+			writer.newLine();
+			count++;
+
+			// 02 BOOKING 订舱信息
+			// 记录类型标识
+			writer.write("02");
+			// 运编号
+			writer.write(":" + voltaSoDto.getMblNo());
+			// 提单号
+			writer.write(":" + voltaSoDto.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(":" + ("CY-DOOR".equals(voltaSoDto.getTransportTermName()) ? "CY-DR" : voltaSoDto.getTransportTermName()));
+			// 货代方企业名称
+			writer.write(":" + voltaSoDto.getSenderCode());
+			// 即接受订舱的人的代码 + 签单人说明 + 询价单位 + 国外订舱单位 + 转船标识 + 分批 + 装期 + 效期 + 运费协议号 + 费率本代码 + 服务合同号 + BOND NO + 舱位互用标识
+			writer.write(":HMM::::::::" + voltaSoDto.getCarrierArgreementNo() + "::"+voltaSoDto.getCorpArgreementNo()+"::'");
+			writer.newLine();
+			count++;
+
+			// 03 提单信息,不填
+			// 提单类型(ORI: BILL OF LADING EXP: WAYBILL) + 提单签发地代码 + 提单签发地 + 签发日期 + 正本提单份数 + 预付地点 + 到付地点
+			writer.write("03:::" + voltaSoDto.getIssuanceLand() + ":" + voltaSoDto.getIssueDate() + ":3:"
+				+ ("PP".equals(voltaSoDto.getMPayMode()) ? voltaSoDto.getMPayPlaceName() : "")
+				+ ("CC".equals(voltaSoDto.getMPayMode()) ? voltaSoDto.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:::::::::::"+voltaSoDto.getVesselCode()+":"+voltaSoDto.getVesselName()+":"+voltaSoDto.getVoyageNo()+"'");
+			writer.newLine();
+			count++;
+
+			// 12	PORTS 地点信息
+			writer.write("12");
+			// 收货地代码 + 收货地代名称
+			writer.write(":" + voltaSoDto.getPlaceReceiptCode() + ":" + voltaSoDto.getPlaceReceiptName());
+			// 装货港代码 + 装货港
+			writer.write(":" + voltaSoDto.getPolCode() + ":" + voltaSoDto.getPolName());
+			// 卸货港代码 + 卸货港代
+			writer.write(":" + voltaSoDto.getPodCode() + ":" + voltaSoDto.getPodName());
+			// 中转港代码 + 中转港 不填
+			writer.write(":" + voltaSoDto.getPotCode() + ":" + voltaSoDto.getPotName());
+			// 交货地代码  + 交货地
+			writer.write(":" + voltaSoDto.getPlaceDeliveryCode() + ":" + voltaSoDto.getPlaceDeliveryName());
+			// 目的地代码  + 目的地
+			writer.write(":" + voltaSoDto.getPlaceDestinationCode() + ":" + voltaSoDto.getPlaceDestinationName() + "'");
+			writer.newLine();
+			count++;
+
+			// 14 FREIGHT CLAUSE             运费条款
+			String pm = voltaSoDto.getMPayMode();
+			String pmc = "PP".equals(pm) ? "P" : ("CC".equals(pm) ? "C" : "OTH");
+			writer.write("14:" + pmc + ":" + ("PP".equals(pm) ? "FREIGHT PREPAID" : ("CC".equals(pm) ? "FREIGHT COLLECT" : "OTHER")) + "'");
+			writer.newLine();
+			count++;
+
+			// 15 运费及费用项目
+			writer.write("15::NONE:" + pmc + "'");
+			writer.newLine();
+			count++;
+
+			// 17 REMARKS 订舱备注 其他信息
+			// 有订舱备注,填订舱备注,否则填 IEIEC
+			List<String> bookingRemarksAddtion = new ArrayList<>();
+
+			String IEIEC = ObjectUtils.isNotNull(voltaSoDto.getEdiIeiec()) ? voltaSoDto.getEdiIeiec().trim() : "";
+			List<String> bookingRemarks = RegularUtils.reformatEDIText(voltaSoDto.getBookingRemarks(), 35, true);
+			if (bookingRemarks.size()>0 || !IEIEC.isEmpty()) {
+				writer.write("17"); // 发货人代码为空
+				if(IEIEC.isEmpty()) {
+					int lc = 0;
+					for (int l = 0; l < bookingRemarks.size(); l++) {
+						String line = bookingRemarks.get(l);
+						if (line.trim().isEmpty()) {
+							line = ".";
+						}
+						lc++;
+						if (l <= 5) {
+							writer.write(":" + line);
+						} else {
+							bookingRemarksAddtion.add(line);
+						}
+					}
+				}else{
+					writer.write(":" + IEIEC);
+					if(ObjectUtils.isNotNull(voltaSoDto.getEdiIegstin())){
+						writer.write(":" + voltaSoDto.getEdiIegstin());
+					}
+					if(ObjectUtils.isNotNull(voltaSoDto.getEdiIemail())){
+						writer.write(":" + RegularUtils.escapeEDILine(voltaSoDto.getEdiIemail()));
+					}
+				}
+
+				writer.write("'");
+				writer.newLine();
+				count++;
+			}
+
+			// 20	SHIPPER 发货人
+			// 处理收发通之前,先处理货描,因为收发通多余的部分要追加到货描
+			List<String> goodsDescAddtion = new ArrayList<>();
+			// 发货人
+			String shpr = ObjectUtils.isNull(voltaSoDto.getMShipper()) ? voltaSoDto.getHShipper() : voltaSoDto.getMShipper();
+			List<String> hShipper = RegularUtils.reformatEDIText(shpr, 35, true);
+			writer.write("20:"); // 发货人代码为空
+			for (int l = 0; l < hShipper.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + hShipper.get(l));
+				} else {
+					goodsDescAddtion.add("*" + hShipper.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 21	CONSIGNEE 收货人
+			String cnee = ObjectUtils.isNull(voltaSoDto.getMConsignee()) ? voltaSoDto.getHConsignee() : voltaSoDto.getMConsignee();
+			List<String> hConsignee = RegularUtils.reformatEDIText(cnee, 35, true);
+			writer.write("21:"); // 收货人代码为空
+			for (int l = 0; l < hConsignee.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + hConsignee.get(l));
+				} else {
+					goodsDescAddtion.add("**" + hConsignee.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 22	NOTIFY PARTY 通知人
+			String notify = ObjectUtils.isNull(voltaSoDto.getMNotify()) ? voltaSoDto.getHNotify() : voltaSoDto.getMNotify();
+			List<String> hNotify = RegularUtils.reformatEDIText(notify, 35, true);
+			writer.write("22:"); // 通知人代码为空
+			for (int l = 0; l < hNotify.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + hNotify.get(l));
+				} else {
+					goodsDescAddtion.add("***" + hNotify.get(l));
+				}
+			}
+			writer.write("'");
+			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'
+			// 记录类型标识 + 货物序号 + 货类代码 + 货物标识
+			writer.write("41:1::" + ("danger".equals(cargoType) ? "D" : ("reefer".equals(cargoType) ? "R" : "S")));
+			// 第一层包装件数 + 第一层包装类型 + 第一层包装说明
+			writer.write(":" + voltaSoDto.getPackagesNumber() + ":" + voltaSoDto.getPackagesCode() + ":" + voltaSoDto.getPackagesDescribe());
+			// 第一层包装皮重 + 第一层包装尺码
+			writer.write(":" + voltaSoDto.getGrossWeight().setScale(0, BigDecimal.ROUND_HALF_UP));
+			writer.write(":" + voltaSoDto.getVolumeOfGoods().setScale(3, BigDecimal.ROUND_HALF_UP));
+			// 第二层包装件数 + 第二层包装类型 + 第二层包装说明 + 第二层包装皮重 + 第二层包装尺码 + 货毛重
+			writer.write("::::::" + voltaSoDto.getGrossWeight().setScale(2, BigDecimal.ROUND_HALF_UP) + "'");
+			writer.newLine();
+			count += 1;
+
+			// 43 DANGEROUS, REEFER & OOG 危险品,冷藏和超标信息
+			// 温度中,除正(+)负(-)号及小数点外,最多只能三位数字。
+			if (ObjectUtils.isNotNull(voltaSoDto.getPreCntrs())) {
+				List<Map<String, Object>> mapList = voltaSoDto.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("温度和通风度必须同时填写!");
+					}
+
+					writer.write("43:"+voltaSoDto.getDgImdgCode()+"::"+voltaSoDto.getDgUnCode()+":::::::" + map.get("ventilation") + ":"+(ObjectUtils.isNotNull(map.get("temperature"))?"C":"")+":" + map.get("temperature") + ":::::::'");
+					writer.newLine();
+					count += 1;
+				}
+			}
+
+			// 44	MARKS & NOS. 唛头 1-10 行
+			List<String> goodsMarks = RegularUtils.reformatEDIText(voltaSoDto.getMarks(), 47, true);
+			List<String> goodsMarksAddtion = new ArrayList<>();
+			writer.write("44");
+			for (int l = 0; l < goodsMarks.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + goodsMarks.get(l));
+				} else {
+					goodsMarksAddtion.add(goodsMarks.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 47 CARGO DESCRIPTION 货物描述 5行一组,每行47字符
+			List<String> goodsDesc = RegularUtils.reformatEDIText(voltaSoDto.getGoodsDesc(), 47, true);
+			List<String> goodsDescAddtion2 = new ArrayList<>();
+			writer.write("47");
+			for (int l = 0; l < goodsDesc.size(); l++) {
+				String line  = goodsDesc.get(l);
+				line = line.trim().isEmpty() ? "." : line;
+				if (l < 5) {
+					writer.write(":" + line);
+				} else {
+					goodsDescAddtion2.add(line);
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 48 CONTAINER OF BOOKING 订舱预配箱
+			if (ObjectUtils.isNotNull(voltaSoDto.getPreCntrs())) {
+				List<Map<String, Object>> mapList = voltaSoDto.getPreCntrs();
+				for (Map<String, Object> map1 : mapList) {
+					// 记录类型标识 + 集装箱尺寸类 + 集装箱箱数
+					writer.write("48:" + map1.get("sizeType") + ":" + map1.get("cntrQty"));
+					// 集装箱状态 + 主拼号 + 装箱方式 自选/内装/自派车队等
+					writer.write(":" + ("FCL".equals(voltaSoDto.getLoadType()) ? "F" : "L") + "::");
+					//  装箱地点代码 + 装箱地点说明 + 货主箱标志
+					writer.write(":::"+("1".equals(map1.get("isSoc").toString()) ? "Y" : "N")+"'");
+					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(voltaSoDto, file,status,replaceUrl);
+		} catch (IOException e) {
+			throw new SecurityException("生成edi文件失败");
+		}
+	}
+
+	@Override
+	public FilesCenter sendingVoltaSI(@Validated InttraSoDto voltaSiDto, JsonNode ediParamCarrier) {
+		try {
+			String localFolder = genEdiLocalFolder(voltaSiDto, ediParamCarrier);
+			String localFileName = genEdiLocalFileName(voltaSiDto, ediParamCarrier);
+			File file = new File(localFolder, localFileName);
+			file.createNewFile();
+			// 打开文件输出流进行写入操作
+			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+			int count = 0;
+			String carrierCode = voltaSiDto.getCarrierCode();
+			String cargoType = voltaSiDto.getCargoType();
+
+			// 向文件写入数据
+			// 00 HEAD RECORD
+			// 2=增加  3=删除 4=变更  9=原始
+			writer.write("00:IFTMIN:shipping request:9:" + voltaSiDto.getSenderCode() + ":HMM:" + voltaSiDto.getFileDate() + "'");
+			writer.newLine();
+			count++;
+
+			// 02 BOOKING 订舱信息
+			// 记录类型标识
+			writer.write("02");
+			// 运编号
+			writer.write(":" + (ObjectUtils.isNotNull(voltaSiDto.getBookingNo()) ? voltaSiDto.getBookingNo() : voltaSiDto.getMblNo()));
+			// 提单号
+			writer.write(":" + voltaSiDto.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(":" + ("CY-DOOR".equals(voltaSiDto.getTransportTermName()) ? "CY-DR" : voltaSiDto.getTransportTermName()));
+			// 货代方企业名称
+			writer.write(":" + voltaSiDto.getSenderCode());
+			// 即接受订舱的人的代码 + 签单人说明 + 询价单位 + 国外订舱单位 + 转船标识 + 分批 + 装期 + 效期 + 运费协议号 + 费率本代码 + 服务合同号 + BOND NO + 舱位互用标识
+			writer.write(":HMM::::::::::"+voltaSiDto.getCarrierArgreementNo()+"::'");
+			writer.newLine();
+			count++;
+
+			// 03 提单信息,不填
+			// 提单类型(ORI: BILL OF LADING EXP: WAYBILL) + 提单签发地代码 + 提单签发地 + 签发日期 + 正本提单份数 + 预付地点 + 到付地点
+			String issueType = "ORI".equals(voltaSiDto.getIssueType()) || "EXP".equals(voltaSiDto.getIssueType()) ? voltaSiDto.getIssueType() : "";
+			writer.write("03:"+issueType+"::" + voltaSiDto.getIssuanceLand() + ":" + voltaSiDto.getIssueDate() + ":3:"
+				+ ("PP".equals(voltaSiDto.getMPayMode()) ? voltaSiDto.getMPayPlaceName() : "")
+				+ ("CC".equals(voltaSiDto.getMPayMode()) ? voltaSiDto.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:::::::::::"+voltaSiDto.getVesselCode()+":"+voltaSiDto.getVesselName()+":"+voltaSiDto.getVoyageNo()+"'");
+			writer.newLine();
+			count++;
+
+			// 12	PORTS 地点信息
+			writer.write("12");
+			// 收货地代码 + 收货地代名称
+			writer.write(":" + voltaSiDto.getPlaceReceiptCode() + ":" + voltaSiDto.getPlaceReceiptName());
+			// 装货港代码 + 装货港
+			writer.write(":" + voltaSiDto.getPolCode() + ":" + voltaSiDto.getPolName());
+			// 卸货港代码 + 卸货港代
+			writer.write(":" + voltaSiDto.getPodCode() + ":" + voltaSiDto.getPodName());
+			// 中转港代码 + 中转港 不填
+			writer.write(":"+voltaSiDto.getPotCode()+":"+voltaSiDto.getPotName());
+			// 交货地代码  + 交货地
+			writer.write(":" + voltaSiDto.getPlaceDeliveryCode() + ":" + voltaSiDto.getPlaceDeliveryName());
+			// 目的地代码  + 目的地
+			writer.write(":" + voltaSiDto.getPlaceDestinationCode() + ":" + voltaSiDto.getPlaceDestinationName() + "'");
+			writer.newLine();
+			count++;
+
+			// 14 FREIGHT CLAUSE             运费条款
+			String pm = voltaSiDto.getMPayMode();
+			String pmc = "PP".equals(pm) ? "P" : ("CC".equals(pm) ? "C" : "OTH");
+			writer.write("14:" + pm + ":" + ("PP".equals(pm) ? "FREIGHT PREPAID" : ("CC".equals(pm) ? "FREIGHT COLLECT" : "OTHER")) + "'");
+			writer.newLine();
+			count++;
+
+			// 15 运费及费用项目
+			writer.write("15::NONE:" + pm + "'");
+			writer.newLine();
+			count++;
+
+			// 17 REMARKS 订舱备注 其他信息
+			// 有订舱备注,填订舱备注,否则填 IEIEC
+			String IEIEC = ObjectUtils.isNotNull(voltaSiDto.getEdiIeiec()) ? voltaSiDto.getEdiIeiec().trim() : "";
+			String IEGSTIN = ObjectUtils.isNotNull(voltaSiDto.getEdiIegstin()) ? voltaSiDto.getEdiIegstin().trim() : "";
+			String IEMAIL = ObjectUtils.isNotNull(voltaSiDto.getEdiIemail()) ? voltaSiDto.getEdiIemail().trim() : "";
+			if(!IEIEC.isEmpty()){
+				writer.write("17:" + IEIEC + ":" + IEGSTIN +":" + IEMAIL + "'");
+				writer.newLine();
+				count++;
+			}
+//			List<String> bookingRemarksAddtion = new ArrayList<>();
+//			List<String> bookingRemarks = RegularUtils.reformatEDIText(hmmSiDto.getBookingRemarks(), 35, true);
+//			if (bookingRemarks.size()>0 || !IEIEC.isEmpty()) {
+//				writer.write("17"); // 发货人代码为空
+//				if(IEIEC.isEmpty()) {
+//					int lc = 0;
+//					for (int l = 0; l < bookingRemarks.size(); l++) {
+//						String line = bookingRemarks.get(l);
+//						if (line.trim().isEmpty()) {
+//							line = ".";
+//						}
+//						lc++;
+//						if (l <= 5) {
+//							writer.write(":" + line);
+//						} else {
+//							bookingRemarksAddtion.add(line);
+//						}
+//					}
+//				}else{
+//					writer.write(":" + IEIEC);
+//					if(ObjectUtils.isNotNull(hmmSiDto.getEdiIegstin())){
+//						writer.write(":" + hmmSiDto.getEdiIegstin());
+//					}
+//					if(ObjectUtils.isNotNull(hmmSiDto.getEdiIemail())){
+//						writer.write(":" + RegularUtils.escapeEDILine(hmmSiDto.getEdiIemail()));
+//					}
+//				}
+//
+//				writer.write("'");
+//				writer.newLine();
+//				count++;
+//			}
+
+			// 20	SHIPPER 发货人
+			// 处理收发通之前,先处理货描,因为收发通多余的部分要追加到货描
+			List<String> goodsDescAddtion = new ArrayList<>();
+			// 发货人
+			String shpr = ObjectUtils.isNull(voltaSiDto.getMShipper()) ? voltaSiDto.getHShipper() : voltaSiDto.getMShipper();
+			List<String> hShipper = RegularUtils.reformatEDIText(shpr, 35, true);
+			writer.write("20:"); // 发货人代码为空
+			for (int l = 0; l < hShipper.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + hShipper.get(l));
+				} else {
+					goodsDescAddtion.add("*" + hShipper.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 21	CONSIGNEE 收货人
+			String cnee = ObjectUtils.isNull(voltaSiDto.getMConsignee()) ? voltaSiDto.getHConsignee() : voltaSiDto.getMConsignee();
+			List<String> hConsignee = RegularUtils.reformatEDIText(cnee, 35, true);
+			writer.write("21:"); // 收货人代码为空
+			for (int l = 0; l < hConsignee.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + hConsignee.get(l));
+				} else {
+					goodsDescAddtion.add("**" + hConsignee.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 22	NOTIFY PARTY 通知人
+			String notify = ObjectUtils.isNull(voltaSiDto.getMNotify()) ? voltaSiDto.getHNotify() : voltaSiDto.getMNotify();
+			List<String> hNotify = RegularUtils.reformatEDIText(notify, 35, true);
+			writer.write("22:"); // 通知人代码为空
+			for (int l = 0; l < hNotify.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + hNotify.get(l));
+				} else {
+					goodsDescAddtion.add("***" + hNotify.get(l));
+				}
+			}
+			writer.write("'");
+			writer.newLine();
+			count += 1;
+
+			// 23	SEC NOTIFY PARTY 第二通知人
+			String notify2 = ObjectUtils.isNull(voltaSiDto.getMNotify2()) ? voltaSiDto.getHNotify2() : voltaSiDto.getMNotify2();
+			List<String> hNotify2 = RegularUtils.reformatEDIText(notify2, 35, true);
+			writer.write("23:"); // 通知人代码为空
+			for (int l = 0; l < hNotify2.size(); l++) {
+				if (l < 5) {
+					writer.write(":" + hNotify2.get(l));
+				} else {
+					goodsDescAddtion.add("****" + hNotify2.get(l));
+				}
+			}
+			writer.write("'");
+			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'
+			// 记录类型标识 + 货物序号 + 货类代码 + 货物标识
+			writer.write("41:1::" + ("danger".equals(cargoType) ? "D" : ("reefer".equals(cargoType) ? "R" : "S")));
+			// 第一层包装件数 + 第一层包装类型 + 第一层包装说明
+			writer.write(":" + voltaSiDto.getPackagesNumber() + ":" + voltaSiDto.getPackagesCode() + ":" + voltaSiDto.getPackagesDescribe());
+			// 第一层包装皮重 + 第一层包装尺码
+			writer.write(":" + voltaSiDto.getGrossWeight().setScale(3, BigDecimal.ROUND_HALF_UP));
+			writer.write(":" + voltaSiDto.getVolumeOfGoods().setScale(3, BigDecimal.ROUND_HALF_UP));
+			// 第二层包装件数 + 第二层包装类型 + 第二层包装说明 + 第二层包装皮重 + 第二层包装尺码 + 货毛重
+			writer.write("::::::" + voltaSiDto.getGrossWeight().setScale(3, BigDecimal.ROUND_HALF_UP) + "'");
+			writer.newLine();
+			count += 1;
+
+			// 43 DANGEROUS, REEFER & OOG 危险品,冷藏和超标信息
+			// 温度中,除正(+)负(-)号及小数点外,最多只能三位数字。
+			if (ObjectUtils.isNotNull(voltaSiDto.getPreCntrs())) {
+				List<Map<String, Object>> mapList = voltaSiDto.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("温度和通风度必须同时填写!");
+					}
+
+					writer.write("43:"+voltaSiDto.getDgImdgCode()+"::"+voltaSiDto.getDgUnCode()+":::::::" + map.get("ventilation") + ":C:" + map.get("temperature") + "::::::::'");
+					writer.newLine();
+					count += 1;
+				}
+			}
+
+			// 44	MARKS & NOS. 唛头 12 节
+			List<String> goodsMarks = RegularUtils.reformatEDIText(voltaSiDto.getMarks(), 35, true);
+			int marksLineCount = goodsMarks.size();
+			for (int l = 0; l < marksLineCount; l++) {
+				String line = goodsMarks.get(l);
+				if(line.trim().isEmpty()){
+					line=".";
+				}
+				if((l % 9)==0){
+					writer.write("44");
+				}
+				writer.write(":" + line);
+				if((l % 9)==8 || l==(marksLineCount - 1)){
+					writer.write("'");
+					writer.newLine();
+					count += 1;
+				}
+			}
+
+			// 47 CARGO DESCRIPTION 货物描述 5行一组
+			List<String> goodsDesc = RegularUtils.reformatEDIText(voltaSiDto.getGoodsDesc(), 70, true);
+			int descrLineCount = goodsDesc.size();
+			for (int l = 0; l < descrLineCount; l++) {
+				String line = goodsMarks.get(l);
+				if(line.trim().isEmpty()){
+					line=".";
+				}
+				if((l % 5)==0){
+					writer.write("47");
+				}
+				writer.write(":" + line);
+				if((l % 5)==7 || l==(descrLineCount - 1)){
+					writer.write("'");
+					writer.newLine();
+					count += 1;
+				}
+			}
+
+			// 附加文本,Shpr, Cnee, Notify, Notify2
+			for(String line : goodsDescAddtion){
+				writer.write("47:" + line + "'");
+				writer.newLine();
+				count += 1;
+			}
+
+			// 48 CONTAINER OF BOOKING 订舱预配箱
+			if (ObjectUtils.isNotNull(voltaSiDto.getPreCntrs())) {
+				List<Map<String, Object>> mapList = voltaSiDto.getPreCntrs();
+				for (Map<String, Object> map1 : mapList) {
+					// 记录类型标识 + 集装箱尺寸类 + 集装箱箱数
+					writer.write("48:" + map1.get("sizeType") + ":" + map1.get("cntrQty"));
+					// 集装箱状态
+					writer.write(":" + (ObjectUtils.isNotNull(voltaSiDto.getBookingNo()) && !voltaSiDto.getBookingNo().equals(voltaSiDto.getMblNo()) ? "L" : "F"));
+					// 主拼号 + 装箱方式 自选/内装/自派车队等
+					writer.write(":" + (ObjectUtils.isNotNull(voltaSiDto.getBookingNo()) && !voltaSiDto.getBookingNo().equals(voltaSiDto.getMblNo()) ? voltaSiDto.getBookingNo() : ""));
+					writer.write("::::N'");
+					writer.newLine();
+					count += 1;
+				}
+			}
+
+			// DD, MM + HH
+			List<InttraSoDto> billsList = new ArrayList<>();
+			billsList.add(voltaSiDto);
+			voltaSiDto.setIsMasterBill(true);
+			if (ObjectUtils.isNotNull(voltaSiDto.getHblBillsList())) {
+				for (InttraSoDto bill : voltaSiDto.getHblBillsList()) {
+					bill.setIsMasterBill(false);
+					billsList.add(bill);
+				}
+			}
+
+			for(InttraSoDto bill : billsList) {
+				if (ObjectUtils.isNotNull(bill.getLoadedCntrs())) {
+					List<Map<String, Object>> mapLoadedList = bill.getLoadedCntrs();
+					for (Map<String, Object> map : mapLoadedList) {
+						// 箱号
+						String cntrNo=map.get("cntrNo").toString();
+						String sealNo=map.get("sealNo").toString();
+						if(!(cntrNo.isEmpty() && sealNo.isEmpty())){
+							if(cntrNo.isEmpty() || sealNo.isEmpty()){
+								throw new SecurityException("箱号、铅封号必须同时填写!");
+							}
+						}
+						String sizeType=map.get("sizeType").toString();
+						if(sizeType.isEmpty()) {
+							throw new SecurityException("HMM 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);
+						BigDecimal vol = ((BigDecimal) map.get("volume")).setScale(3, BigDecimal.ROUND_HALF_UP);
+						if (ObjectUtils.isNull(pkgs.equals(BigDecimal.ZERO))
+							|| ObjectUtils.isNull(gwt.equals(BigDecimal.ZERO))
+							|| ObjectUtils.isNull(vol.equals(BigDecimal.ZERO))
+						) {
+							throw new SecurityException("箱内货物件重尺填写不全!");
+						}
+
+						writer.write("51:"+cntrNo+":"+sizeType+":" + sealNo + ":" + pkgs.toString());
+						writer.write(":" + gwt.toString() + ":" + ((BigDecimal) map.get("tareWeight")).setScale(3, BigDecimal.ROUND_HALF_UP).toString());
+						writer.write(":" + vol.toString());
+						writer.write("::::::");
+						// VGM WT + VGM DATE + VGM METHOD + VGM LOCATION
+						// wfg
+						writer.write("::::'");
+						writer.newLine();
+						count += 1;
+
+						// 录入品名
+						if(ObjectUtils.isNotNull(map.get("commodityList"))){
+							List<ContainersCommodity> cargoList = (List<ContainersCommodity>) map.get("commodityList");
+							for (ContainersCommodity cargo : cargoList) {
+								if (ObjectUtils.isNull(cargo.getHscode())) {
+									throw new RuntimeException("箱内货物没有填写 HSCODE");
+								}
+								if (ObjectUtils.isNull(cargo.getPackingUnitCode())) {
+									throw new RuntimeException("箱内货物包装单位没有填写或缺少EDI代码");
+								}
+								if (cargo.getQuantity().equals(BigDecimal.ZERO)
+									|| cargo.getGrossWeight().equals(BigDecimal.ZERO)
+									|| cargo.getMeasurement().equals(BigDecimal.ZERO)
+								) {
+									throw new RuntimeException("箱内货物件重尺填写不全");
+								}
+								BigDecimal ccPkgs = cargo.getQuantity().setScale(0, RoundingMode.HALF_UP);
+								BigDecimal ccGw = cargo.getGrossWeight().setScale(3, RoundingMode.HALF_UP);
+								BigDecimal ccVol = cargo.getMeasurement().setScale(3, RoundingMode.HALF_UP);
+
+								String ncm = cargo.getHscode()  + ":" + cargo.getCommodityEnName();
+								ncm+=":" + cargo.getPackingUnitCode() + ":" + ccPkgs.toString();
+								ncm+=":" + ccGw.toString() + ":" + ccVol.toString();
+
+								writer.write("53:"+cntrNo+":"+ncm + "'");
+								writer.newLine();
+								count += 1;
+							}
+						}
+
+						// VGM Shipper
+						// wfg
+						writer.write("58::::::::'");
+
+						// VGM WEIGHT COMPANY
+						// wfg
+						writer.write("59::::::::'");
+					}
+				}
+			}
+
+			// 90 订舱人联系信息
+			writer.write("90:QJM:QINGDAO JMS-LOGISTICS SERVICE CO.,LTD.::Miya Wang:0532-82668811 Ext.171:0532-82668660 Ext.171: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(voltaSiDto, file,status,replaceUrl);
+		} catch (IOException e) {
+			throw new SecurityException("生成edi文件失败");
+		}
+	}
 }

+ 18 - 0
blade-service/blade-los/src/main/java/org/springblade/los/edi/service/impl/EdiTypesServiceImpl.java

@@ -1052,6 +1052,24 @@ public class EdiTypesServiceImpl extends ServiceImpl<EdiTypesMapper, EdiTypes> i
 						return R.fail(e.getMessage());
 					}
 				}
+			} else if (inttraSoDto.ediTypeIsHYCK_VOLTA_BOOKING()) {
+				status = Regular_VOLTA.notNullVoltaBookingDto(inttraSoDto, "SO");
+				if ("200".equals(status.get("code").toString())) {
+					try {
+						filesCenter = iediSenderService.sendingVoltaBooking(inttraSoDto, ediParamCarrier);
+					} catch (Exception e) {
+						return R.fail(e.getMessage());
+					}
+				}
+			} else if (inttraSoDto.ediTypeIsHYCK_VOLTA_SI()) {
+				status = Regular_VOLTA.notNullVoltaSIDto(inttraSoDto);
+				if ("200".equals(status.get("code").toString())) {
+					try {
+						filesCenter = iediSenderService.sendingVoltaSI(inttraSoDto, ediParamCarrier);
+					} catch (Exception e) {
+						return R.fail(e.getMessage());
+					}
+				}
 			} else {
 				return R.fail("EDI 未实现!");
 			}