diff --git a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelTXServiceImpl.java b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelTXServiceImpl.java index 77d8c996..d03f645e 100644 --- a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelTXServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelTXServiceImpl.java @@ -398,6 +398,9 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService { int palletDetailItemNo = 1; Map boxListMap = new LinkedHashMap<>(); + // 记录已处理的合并区域,保证“总体积/毛重”只落在该合并区域的第一个托/箱 + Set handledVolumeMergedRegions = new HashSet<>(); + Set handledGrossWeightMergedRegions = new HashSet<>(); for (int r = 1; r <= lastRowNum; r++) { Row row = sheet.getRow(r); @@ -480,8 +483,22 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService { // 判断是否是托盘的第一行 if (isFirstRowOfMergedRegion(sheet, r, headerMap.get("托数")) || !isMerged(sheet, r, headerMap.get("托数"))) { int palletCount = (int) Double.parseDouble(palletQtyStr); - String volumeStr = headerMap.containsKey("总体积") ? getMergedCellValue(sheet, r, headerMap.get("总体积")) : null; String outerSizeStr = headerMap.containsKey("外包尺寸") ? getMergedCellValue(sheet, r, headerMap.get("外包尺寸")) : null; + BigDecimal volume = null; + if (headerMap.containsKey("总体积")) { + int volumeCol = headerMap.get("总体积"); + String volumeRegionKey = getMergedRegionKey(sheet, r, volumeCol); + if (volumeRegionKey != null) { + if (handledVolumeMergedRegions.contains(volumeRegionKey)) { + volume = BigDecimal.ZERO; + } else { + volume = parseBigDecimal(getMergedCellValue(sheet, r, volumeCol)); + handledVolumeMergedRegions.add(volumeRegionKey); + } + } else { + volume = parseBigDecimal(getMergedCellValue(sheet, r, volumeCol)); + } + } String palletNo = palletSeqNo + "~" + (palletSeqNo + palletCount - 1); @@ -492,7 +509,7 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService { palletHeader.setSeqNo(palletSeqNo); palletHeader.setPalletNo(palletNo); palletHeader.setPalletQty(palletCount); - palletHeader.setVolume(parseBigDecimal(volumeStr)); + palletHeader.setVolume(volume); if (outerSizeStr != null && !outerSizeStr.isEmpty()) { String[] sizes = outerSizeStr.split("\\*"); @@ -514,7 +531,21 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService { // 4. 箱信息 EcssCoDelBoxList String netWeightStr = headerMap.containsKey("净重") ? getMergedCellValue(sheet, r, headerMap.get("净重")) : null; - String grossWeightStr = headerMap.containsKey("毛重") ? getMergedCellValue(sheet, r, headerMap.get("毛重")) : null; + BigDecimal grossWeight = null; + if (headerMap.containsKey("毛重")) { + int grossWeightCol = headerMap.get("毛重"); + String grossWeightRegionKey = getMergedRegionKey(sheet, r, grossWeightCol); + if (grossWeightRegionKey != null) { + if (handledGrossWeightMergedRegions.contains(grossWeightRegionKey)) { + grossWeight = BigDecimal.ZERO; + } else { + grossWeight = parseBigDecimal(getMergedCellValue(sheet, r, grossWeightCol)); + handledGrossWeightMergedRegions.add(grossWeightRegionKey); + } + } else { + grossWeight = parseBigDecimal(getMergedCellValue(sheet, r, grossWeightCol)); + } + } if (netWeightStr != null && !netWeightStr.isEmpty()) { if (isFirstRowOfMergedRegion(sheet, r, headerMap.get("净重")) || !isMerged(sheet, r, headerMap.get("净重"))) { @@ -525,7 +556,7 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService { boxList.setSeqNo(currentPalletSeqNo); boxList.setItemNo(String.valueOf(boxItemNo++)); boxList.setNetWeight(parseBigDecimal(netWeightStr)); - boxList.setGrossWeight(parseBigDecimal(grossWeightStr)); + boxList.setGrossWeight(grossWeight); boxList.setCreateBy(data.getUsername()); boxList.setCreateDate(new Date()); boxList.setBoxQty(BigDecimal.ZERO); @@ -645,6 +676,18 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService { return true; } + private String getMergedRegionKey(Sheet sheet, int row, int col) { + for (int i = 0; i < sheet.getNumMergedRegions(); i++) { + CellRangeAddress region = sheet.getMergedRegion(i); + if (row >= region.getFirstRow() && row <= region.getLastRow() && + col >= region.getFirstColumn() && col <= region.getLastColumn()) { + return region.getFirstRow() + "_" + region.getLastRow() + "_" + + region.getFirstColumn() + "_" + region.getLastColumn(); + } + } + return null; + } + private BigDecimal parseBigDecimal(String str) { if (str == null || str.trim().isEmpty()) return null; try {