فهرست منبع

海运出口导入 excel(PIL)

wfg 6 ماه پیش
والد
کامیت
32561c5196

+ 664 - 10
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/TemplateImportServiceImpl.java

@@ -28,10 +28,7 @@ import java.math.RoundingMode;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -383,7 +380,11 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 					// throw new RuntimeException("船名航次不能为空");
 				}
 			} else if (val0.equals("POR")) {
-				String port = getSheetCellValueAsString(sheet, r, 1);
+				String port = getSheetCellValueAsString(sheet, r, 1).toUpperCase();
+				if (port.contains("QINGDAO")) {
+					// 青岛
+					port = "QINGDAO,CHINA";
+				}
 				System.out.println("por:" + port);
 				if (ObjectUtils.isNotNull(port)) {
 					BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
@@ -403,7 +404,11 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 					// throw new RuntimeException("收货地不能为空");
 				}
 
-				port = getSheetCellValueAsString(sheet, r, 4);
+				port = getSheetCellValueAsString(sheet, r, 4).toUpperCase();
+				if (port.contains("QINGDAO")) {
+					// 青岛
+					port = "QINGDAO,CHINA";
+				}
 				System.out.println("pol:" + port);
 				if (ObjectUtils.isNotNull(port)) {
 					BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
@@ -628,6 +633,333 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 		Path tempFile = Files.createTempFile("prefix", "suffix");
 		// 将MultipartFile的内容复制到临时文件
 		Files.copy(file.getInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
+		// 创建FileInputStream来读取临时文件
+		FileInputStream fis = new FileInputStream(tempFile.toFile());
+		Workbook workbook = null;
+		Sheet sheet = null;
+		String errMsg = "";
+
+		try {
+			workbook = WorkbookFactory.create(fis);
+			sheet = workbook.getSheetAt(0); // 获取第一个工作表
+		} catch (Exception e) {
+			workbook = null;
+			sheet = null;
+			errMsg = e.getMessage();
+		}
+
+		if (ObjectUtils.isNull(workbook) || ObjectUtils.isNull(sheet)) {
+			throw new RuntimeException("文件读取失败,该文件可能不是 Excel 文件!" + errMsg);
+		}
+
+		String stringCellValue = "";
+
+		int firstRow = sheet.getFirstRowNum();
+		int lastRow = sheet.getLastRowNum();
+		if (firstRow <= 0 && lastRow < 0) {
+			throw new RuntimeException("文件内容为空!");
+		}
+
+		boolean sft_row = false;
+		boolean vessel_row = false;
+		boolean receipt_row = false;
+		boolean marks_row = false;
+		int skip_row = 0;
+
+		// 收发通导入时,后两行是邮箱和 customer code,不算收发通内容
+		StringBuilder sbLines = new StringBuilder();
+		for (int r = firstRow; r <= lastRow; r++) {
+			String val0 = getSheetCellValueAsString(sheet, r, 0).toUpperCase(); // .replace(" ", "")
+			if (val0.equals("*SHIPPER(托运人):")) {
+				sbLines.setLength(0);
+				sft_row = true;
+			} else if (val0.equals("*CONSIGNEE(收货人):")) {
+				if(sbLines.length()>=2){
+					String[] lines = sbLines.toString().trim().split("\n");
+					sbLines.setLength(0);
+					for(int l=0; l<lines.length - 2; l++){
+						sbLines.append(lines[l].trim().concat("\n"));
+					}
+				}
+				if (stringBuilderIsNotEmpty(sbLines)) {
+					System.out.println("shipper:" + sbLines);
+					seaBillsDetail.setHshipperDetails(sbLines.toString().trim());
+				} else {
+					// throw new RuntimeException("提单发货人描述不能为空");
+				}
+
+				sft_row = true;
+				sbLines.setLength(0);
+			} else if (val0.equals("*NOTIFY PARTY(通知人):")) {
+				if(sbLines.length()>=2){
+					String[] lines = sbLines.toString().trim().split("\n");
+					sbLines.setLength(0);
+					for(int l=0; l<lines.length - 2; l++){
+						sbLines.append(lines[l].trim().concat("\n"));
+					}
+				}
+				if (stringBuilderIsNotEmpty(sbLines)) {
+					System.out.println("consignee:" + sbLines);
+					seaBillsDetail.setHconsigneeDetails(sbLines.toString().trim());
+				} else {
+					// throw new RuntimeException("提单收货人描述不能为空");
+				}
+
+				sft_row = true;
+				sbLines.setLength(0);
+			} else if (val0.equals("VESSEL/VOYAGE NUMBER(船名或船期)")) {
+				if(sbLines.length()>=2){
+					String[] lines = sbLines.toString().trim().split("\n");
+					sbLines.setLength(0);
+					for(int l=0; l<lines.length - 2; l++){
+						sbLines.append(lines[l].trim().concat("\n"));
+					}
+				}
+				if (stringBuilderIsNotEmpty(sbLines)) {
+					System.out.println("notifyParty:" + sbLines);
+					seaBillsDetail.setHnotifyDetails(sbLines.toString().trim());
+				} else {
+					seaBillsDetail.setHnotifyDetails("SAME AS CNEE");
+					// throw new RuntimeException("提单通知人描述不能为空");
+				}
+
+				sbLines.setLength(0);
+
+				sft_row = false;
+				vessel_row = true;
+			} else if (val0.equals("*PLACE OF RECEIPT(收货地)")) {
+				vessel_row = false;
+				receipt_row = true;
+			} else if (val0.equals("MARKS & NUMBERS")) {
+				receipt_row = false;
+				marks_row = true;
+				skip_row = 1;
+			} else if (val0.equals("REMARK")) {
+			} else {
+				val0 = getSheetCellValueAsString(sheet, r, 0);
+
+				// 收发通行
+				if(sft_row) {
+					sbLines.append(val0.concat("\n"));
+				}
+
+				// 船名航次行
+				if(vessel_row) {
+					// VSL/VOY
+					String vslVoy = val0;
+					if (ObjectUtils.isNotNull(vslVoy)) {
+						if (vslVoy.contains("/")) {
+							String vsl = vslVoy.substring(0, vslVoy.indexOf("/"));
+							String voy = vslVoy.substring(vslVoy.indexOf("/") + 1);
+							if (ObjectUtils.isNotNull(vsl)) {
+								BVessels vessels = bVesselsService.getOne(new LambdaQueryWrapper<BVessels>()
+									.eq(BVessels::getTenantId, AuthUtil.getTenantId())
+									.eq(BVessels::getIsDeleted, 0)
+									.like(BVessels::getEnName, vsl)
+									.last("limit 1"));
+								if (vessels != null) {
+									bills.setVesselEnName(vessels.getEnName());
+									bills.setVesselCnName(vessels.getCnName());
+									bills.setVesselId(vessels.getId());
+								}
+							}
+							bills.setVoyageNo(voy);
+							System.out.println("vsl:" + vsl);
+							System.out.println("voy:" + voy);
+							System.out.println("vslVoy:" + vslVoy);
+						} else {
+							throw new RuntimeException("船名航次不能为空");
+						}
+					} else {
+						// throw new RuntimeException("船名航次不能为空");
+					}
+
+					// *Port of Loading (装货港)
+					/* 港口不导
+					val0 = getSheetCellValueAsString(sheet, r, 3);
+					if (ObjectUtils.isNotNull(val0)) {
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPolId(ports.getId());
+							bills.setPolCode(ports.getCode());
+							bills.setPolCnName(ports.getCnName());
+							bills.setPolEnName(ports.getEnName());
+							bills.setPolNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("装货港 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("装货港不能为空");
+					}
+
+					// *Port of Discharge(卸货港)
+					val0 = getSheetCellValueAsString(sheet, r, 5);
+					if (ObjectUtils.isNotNull(val0)) {
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPodId(ports.getId());
+							bills.setPodCode(ports.getCode());
+							bills.setPodCnName(ports.getCnName());
+							bills.setPodEnName(ports.getEnName());
+							bills.setPodNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("卸货港 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("卸货港不能为空");
+					}
+					 */
+				}
+
+				// 收货地行
+				if(receipt_row) {
+					/* 港口不导
+					System.out.println("por:" + val0);
+					if (ObjectUtils.isNotNull(val0)) {
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPlaceReceiptId(ports.getId());
+							bills.setPlaceReceiptCode(ports.getCode());
+							bills.setPlaceReceiptName(ports.getEnName());
+							bills.setPlaceReceiptNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("收货地 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("收货地不能为空");
+					}
+
+					 */
+
+					// *Place of Delivery(交货地)
+					/* 港口不导
+					val0 = getSheetCellValueAsString(sheet, r, 3);
+					if (ObjectUtils.isNotNull(val0)) {
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPlaceDeliveryId(ports.getId());
+							bills.setPlaceDeliveryCode(ports.getCode());
+							bills.setPlaceDeliveryName(ports.getEnName());
+							bills.setPlaceDeliveryNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("交货地 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("交货地不能为空");
+					}
+					 */
+
+					// Bill of Lading NO.(提单号)
+					val0 = getSheetCellValueAsString(sheet, r, 5);
+					if (ObjectUtils.isNotNull(val0)) {
+						System.out.println("blno:" + val0);
+						bills.setMblno(val0);
+					} else {
+						// throw new RuntimeException("提单号不能为空");
+					}
+				}
+
+				// 唛头行
+				if(marks_row){
+					if(skip_row>0){
+						// 跳过无效hang
+						skip_row--;
+					}else{
+						// 找到 *托运人签章:标识
+						int stop_row = r;
+						for (int r1 = r; r1 <= lastRow; r1++) {
+							val0 = getSheetCellValueAsString(sheet, r1, 6).toUpperCase(); // .replace(" ", "")
+							if(val0.equals("*托运人签章:")){
+								stop_row = r1 - 1;
+								break;
+							}
+						}
+
+						// 唛头
+						sbLines.setLength(0);
+						for (int r1 = r; r1 <= stop_row; r1++) {
+							sbLines.append(getSheetCellValueAsString(sheet, r1, 0).toUpperCase().trim().concat("\r\n"));
+						}
+						bills.setMarks(sbLines.toString().trim());
+
+						// 货描
+						sbLines.setLength(0);
+						for (int r1 = r; r1 <= stop_row; r1++) {
+							sbLines.append(getSheetCellValueAsString(sheet, r1, 3).toUpperCase().trim().concat("\r\n"));
+						}
+						bills.setCommodityDescr(sbLines.toString().trim());
+
+						// 件数
+						Map<String, Object> pkgs = getSheetCellValueAsNumericPrefixMap(sheet, r, 2);
+						String kindPkgs = pkgs.get("str").toString();
+						if (ObjectUtils.isNotNull(kindPkgs)) {
+							BPackages bPackages = bPackagesService.getOne(new LambdaQueryWrapper<BPackages>()
+								.eq(BPackages::getEnName, kindPkgs));
+							if (bPackages != null) {
+								bills.setPackingUnitId(bPackages.getId());
+								bills.setPackingUnit(bPackages.getEnName());
+							}
+						}
+
+						bills.setQuantity(new BigDecimal(String.valueOf(pkgs.get("value"))).setScale(0, RoundingMode.HALF_UP));
+						bills.setQuantityPackingDescr("SAY " + BigDecimalUtils.convertToEnglish(bills.getQuantity()) + " " + bills.getPackingUnit() + " ONLY.");
+
+						// G.W.
+						double gw = getSheetCellValueAsNumericPrefix(sheet, r, 6);
+						System.out.println("gw:" + gw);
+						bills.setGrossWeight(new BigDecimal(gw).setScale(3, RoundingMode.HALF_UP));
+
+						// MEAS
+						double meas = getSheetCellValueAsNumericPrefix(sheet, r, 7);
+						System.out.println("meas:" + meas);
+						bills.setMeasurement(new BigDecimal(meas).setScale(3, RoundingMode.HALF_UP));
+
+						// 跳出大循环
+						break;
+					}
+				}
+			}
+		}
+
+		bills.setContainersList(new ArrayList<>());
+		bills.setPreContainersList(new ArrayList<>());
+		bills.setContainersReportsList(new ArrayList<>());
+		bills.setFeeCenterListC(new ArrayList<>());
+		bills.setFeeCenterListD(new ArrayList<>());
+		bills.setFilesList(new ArrayList<>());
+		bills.setWaitingBoxList(new ArrayList<>());
+		bills.setDetail(seaBillsDetail);
+		// 将字符串为null的赋默认值为""
+		resetBillsNullValuesAsEmptyString(bills);
+
+		return R.data(bills);
+	}
+
+	/*
+	@Override
+	public R<Bills> importPilBooking_bak(MultipartFile file, Long billId) throws Exception {
+		Bills bills = billsService.getById(billId);
+		SeaBillsDetail seaBillsDetail = new SeaBillsDetail();
+		// 创建临时文件
+		Path tempFile = Files.createTempFile("prefix", "suffix");
+		// 将MultipartFile的内容复制到临时文件
+		Files.copy(file.getInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
 
 		// 创建FileInputStream来读取临时文件
 		FileInputStream fis = new FileInputStream(tempFile.toFile());
@@ -887,6 +1219,7 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 		resetBillsNullValuesAsEmptyString(bills);
 		return R.data(bills);
 	}
+	 */
 
 	@Override
 	public R<Bills> importPilCutOffOrders(MultipartFile file, Long billId) throws Exception {
@@ -896,6 +1229,326 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 		Path tempFile = Files.createTempFile("prefix", "suffix");
 		// 将MultipartFile的内容复制到临时文件
 		Files.copy(file.getInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
+		// 创建FileInputStream来读取临时文件
+		FileInputStream fis = new FileInputStream(tempFile.toFile());
+		Workbook workbook = null;
+		Sheet sheet = null;
+		String errMsg = "";
+
+		try {
+			workbook = WorkbookFactory.create(fis);
+			sheet = workbook.getSheetAt(0); // 获取第一个工作表
+		} catch (Exception e) {
+			workbook = null;
+			sheet = null;
+			errMsg = e.getMessage();
+		}
+
+		if (ObjectUtils.isNull(workbook) || ObjectUtils.isNull(sheet)) {
+			throw new RuntimeException("文件读取失败,该文件可能不是 Excel 文件!" + errMsg);
+		}
+
+		String stringCellValue = "";
+
+		int firstRow = sheet.getFirstRowNum();
+		int lastRow = sheet.getLastRowNum();
+		if (firstRow <= 0 && lastRow < 0) {
+			throw new RuntimeException("文件内容为空!");
+		}
+
+		boolean sft_row = false;
+		boolean vessel_row = false;
+		boolean receipt_row = false;
+		boolean marks_row = false;
+		int skip_row = 0;
+
+		// 收发通导入时,后两行是邮箱和 customer code,不算收发通内容
+		StringBuilder sbLines = new StringBuilder();
+		for (int r = firstRow; r <= lastRow; r++) {
+			String val0 = getSheetCellValueAsString(sheet, r, 0).toUpperCase(); // .replace(" ", "")
+			if (val0.equals("*SHIPPER(托运人):")) {
+				sbLines.setLength(0);
+				sft_row = true;
+			} else if (val0.equals("*CONSIGNEE(收货人):")) {
+				if (stringBuilderIsNotEmpty(sbLines)) {
+					System.out.println("shipper:" + sbLines);
+					seaBillsDetail.setHshipperDetails(sbLines.toString().trim());
+				} else {
+					// throw new RuntimeException("提单发货人描述不能为空");
+				}
+
+				sft_row = true;
+				sbLines.setLength(0);
+			} else if (val0.equals("*NOTIFY PARTY(通知人):")) {
+				if (stringBuilderIsNotEmpty(sbLines)) {
+					System.out.println("consignee:" + sbLines);
+					seaBillsDetail.setHconsigneeDetails(sbLines.toString().trim());
+				} else {
+					// throw new RuntimeException("提单收货人描述不能为空");
+				}
+
+				sft_row = true;
+				sbLines.setLength(0);
+			} else if (val0.equals("ALSO NOTIFY")) {
+				if (stringBuilderIsNotEmpty(sbLines)) {
+					System.out.println("notifyParty:" + sbLines);
+					seaBillsDetail.setHnotifyDetails(sbLines.toString().trim());
+				} else {
+					seaBillsDetail.setHnotifyDetails("SAME AS CNEE");
+				}
+
+				sft_row = true;
+				sbLines.setLength(0);
+			} else if (val0.equals("VESSEL/VOYAGE NUMBER(船名或船期)")) {
+				if (stringBuilderIsNotEmpty(sbLines)) {
+					System.out.println("notifyParty:" + sbLines);
+					seaBillsDetail.setHnotifyDetails(sbLines.toString().trim());
+				} else {
+					seaBillsDetail.setHnotifyDetails("SAME AS CNEE");
+				}
+
+				sbLines.setLength(0);
+
+				sft_row = false;
+				vessel_row = true;
+			} else if (val0.equals("*PLACE OF RECEIPT(收货地)")) {
+				vessel_row = false;
+				receipt_row = true;
+			} else if (val0.equals("MARKS & NUMBERS")) {
+				receipt_row = false;
+				marks_row = true;
+				skip_row = 1;
+			} else if (val0.equals("REMARK")) {
+			} else {
+				val0 = getSheetCellValueAsString(sheet, r, 0);
+
+				// 收发通行
+				if(sft_row) {
+					sbLines.append(val0.concat("\n"));
+				}
+
+				// 船名航次行
+				if(vessel_row) {
+					// VSL/VOY
+					String vslVoy = val0;
+					if (ObjectUtils.isNotNull(vslVoy)) {
+						if (vslVoy.contains("/")) {
+							String vsl = vslVoy.substring(0, vslVoy.indexOf("/"));
+							String voy = vslVoy.substring(vslVoy.indexOf("/") + 1);
+							if (ObjectUtils.isNotNull(vsl)) {
+								BVessels vessels = bVesselsService.getOne(new LambdaQueryWrapper<BVessels>()
+									.eq(BVessels::getTenantId, AuthUtil.getTenantId())
+									.eq(BVessels::getIsDeleted, 0)
+									.like(BVessels::getEnName, vsl)
+									.last("limit 1"));
+								if (vessels != null) {
+									bills.setVesselEnName(vessels.getEnName());
+									bills.setVesselCnName(vessels.getCnName());
+									bills.setVesselId(vessels.getId());
+								}
+							}
+							bills.setVoyageNo(voy);
+							System.out.println("vsl:" + vsl);
+							System.out.println("voy:" + voy);
+							System.out.println("vslVoy:" + vslVoy);
+						} else {
+							throw new RuntimeException("船名航次不能为空");
+						}
+					} else {
+						// throw new RuntimeException("船名航次不能为空");
+					}
+
+					// *Port of Loading (装货港)
+					val0 = getSheetCellValueAsString(sheet, r, 3).toUpperCase();
+					if (ObjectUtils.isNotNull(val0)) {
+						if (val0.contains("QINGDAO")) {
+							// 青岛
+							val0 = "QINGDAO,CHINA";
+						}
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPolId(ports.getId());
+							bills.setPolCode(ports.getCode());
+							bills.setPolCnName(ports.getCnName());
+							bills.setPolEnName(ports.getEnName());
+							bills.setPolNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("装货港 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("装货港不能为空");
+					}
+
+					// *Port of Discharge(卸货港)
+					val0 = getSheetCellValueAsString(sheet, r, 5);
+					if (ObjectUtils.isNotNull(val0)) {
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPodId(ports.getId());
+							bills.setPodCode(ports.getCode());
+							bills.setPodCnName(ports.getCnName());
+							bills.setPodEnName(ports.getEnName());
+							bills.setPodNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("卸货港 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("卸货港不能为空");
+					}
+				}
+
+				// 收货地行
+				if(receipt_row) {
+					/* 港口不导
+					System.out.println("por:" + val0);
+					if (ObjectUtils.isNotNull(val0)) {
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPlaceReceiptId(ports.getId());
+							bills.setPlaceReceiptCode(ports.getCode());
+							bills.setPlaceReceiptName(ports.getEnName());
+							bills.setPlaceReceiptNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("收货地 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("收货地不能为空");
+					}
+
+					 */
+
+					// *Place of Delivery(交货地)
+					/* 港口不导
+					val0 = getSheetCellValueAsString(sheet, r, 3);
+					if (ObjectUtils.isNotNull(val0)) {
+						BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+							.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+							.eq(BPorts::getIsDeleted, 0)
+							.like(BPorts::getEnName, val0)
+							.last("limit 1"));
+						if (ports != null) {
+							bills.setPlaceDeliveryId(ports.getId());
+							bills.setPlaceDeliveryCode(ports.getCode());
+							bills.setPlaceDeliveryName(ports.getEnName());
+							bills.setPlaceDeliveryNamePrint(ports.getEnName());
+						} else {
+							throw new RuntimeException("交货地 " + val0 + " 无法识别!");
+						}
+					} else {
+						// throw new RuntimeException("交货地不能为空");
+					}
+					 */
+
+					// Bill of Lading NO.(提单号) 不导
+					/*
+					val0 = getSheetCellValueAsString(sheet, r, 5);
+					if (ObjectUtils.isNotNull(val0)) {
+						System.out.println("blno:" + val0);
+						bills.setMblno(val0);
+					} else {
+						// throw new RuntimeException("提单号不能为空");
+					}
+					 */
+				}
+
+				// 唛头行
+				if(marks_row){
+					if(skip_row>0){
+						// 跳过无效hang
+						skip_row--;
+					}else{
+						// 找到 *托运人签章:标识
+						int stop_row = r;
+						for (int r1 = r; r1 <= lastRow; r1++) {
+							val0 = getSheetCellValueAsString(sheet, r1, 6).toUpperCase(); // .replace(" ", "")
+							if(val0.equals("*托运人签章:")){
+								stop_row = r1 - 1;
+								break;
+							}
+						}
+
+						// 唛头
+						sbLines.setLength(0);
+						for (int r1 = r; r1 <= stop_row; r1++) {
+							sbLines.append(getSheetCellValueAsString(sheet, r1, 0).toUpperCase().trim().concat("\r\n"));
+						}
+						bills.setMarks(sbLines.toString().trim());
+
+						// 货描
+						sbLines.setLength(0);
+						for (int r1 = r; r1 <= stop_row; r1++) {
+							sbLines.append(getSheetCellValueAsString(sheet, r1, 3).toUpperCase().trim().concat("\r\n"));
+						}
+						bills.setCommodityDescr(sbLines.toString().trim());
+
+						// 件数
+						Map<String, Object> pkgs = getSheetCellValueAsNumericPrefixMap(sheet, r, 2);
+						String kindPkgs = pkgs.get("str").toString();
+						if (ObjectUtils.isNotNull(kindPkgs)) {
+							BPackages bPackages = bPackagesService.getOne(new LambdaQueryWrapper<BPackages>()
+								.eq(BPackages::getEnName, kindPkgs));
+							if (bPackages != null) {
+								bills.setPackingUnitId(bPackages.getId());
+								bills.setPackingUnit(bPackages.getEnName());
+							}
+						}
+
+						bills.setQuantity(new BigDecimal(String.valueOf(pkgs.get("value"))).setScale(0, RoundingMode.HALF_UP));
+						bills.setQuantityPackingDescr("SAY " + BigDecimalUtils.convertToEnglish(bills.getQuantity()) + " " + bills.getPackingUnit() + " ONLY.");
+
+						// G.W.
+						double gw = getSheetCellValueAsNumericPrefix(sheet, r, 6);
+						System.out.println("gw:" + gw);
+						bills.setGrossWeight(new BigDecimal(gw).setScale(3, RoundingMode.HALF_UP));
+
+						// MEAS
+						double meas = getSheetCellValueAsNumericPrefix(sheet, r, 7);
+						System.out.println("meas:" + meas);
+						bills.setMeasurement(new BigDecimal(meas).setScale(3, RoundingMode.HALF_UP));
+
+						// 跳出大循环
+						break;
+					}
+				}
+			}
+		}
+
+		bills.setContainersList(new ArrayList<>());
+		bills.setPreContainersList(new ArrayList<>());
+		bills.setContainersReportsList(new ArrayList<>());
+		bills.setFeeCenterListC(new ArrayList<>());
+		bills.setFeeCenterListD(new ArrayList<>());
+		bills.setFilesList(new ArrayList<>());
+		bills.setWaitingBoxList(new ArrayList<>());
+		bills.setDetail(seaBillsDetail);
+		// 将字符串为null的赋默认值为""
+		resetBillsNullValuesAsEmptyString(bills);
+
+		return R.data(bills);
+	}
+
+
+	/*
+	@Override
+	public R<Bills> importPilCutOffOrders(MultipartFile file, Long billId) throws Exception {
+		Bills bills = billsService.getById(billId);
+		SeaBillsDetail seaBillsDetail = new SeaBillsDetail();
+		// 创建临时文件
+		Path tempFile = Files.createTempFile("prefix", "suffix");
+		// 将MultipartFile的内容复制到临时文件
+		Files.copy(file.getInputStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
 
 		// 创建FileInputStream来读取临时文件
 		FileInputStream fis = new FileInputStream(tempFile.toFile());
@@ -1154,14 +1807,15 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 		resetBillsNullValuesAsEmptyString(bills);
 		return R.data(bills);
 	}
+	 */
 
 	@Override
 	public R<Bills> importHisenseBill(MultipartFile file, Long billId) throws Exception {
-		// Bills bills = billsService.getById(billId);
+		Bills bills = billsService.getById(billId);
 
-		Bills bills = new Bills();
-		resetBillsValuesAsNull(bills);
-		bills.setId(billId);
+		// Bills bills = new Bills();
+		// resetBillsValuesAsNull(bills);
+		// bills.setId(billId);
 
 		// SeaBillsDetail seaBillsDetail = new SeaBillsDetail();
 		SeaBillsDetail seaBillsDetail = seaBillsDetailService.getOne(new LambdaQueryWrapper<SeaBillsDetail>()