diff --git a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java index e7d3d511..2089daaf 100644 --- a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java @@ -1175,64 +1175,64 @@ public class CoDelExcelServiceImpl implements CoDelExcelService { // 先删除全部明细,再新建明细 coDelMapper.deleteAllEcssDelDetail(headerData); - // 智能判断改单逻辑:按PN分组汇总数量,避免因顺序变化导致误判 - // 构建原数据Map:按PN分组,计算每个PN的总数量 - Map originalPnQtyMap = new HashMap<>(); - for (EcssCoDelNotifyDetailData detail : dbData) { - String pn = detail.getPn(); - BigDecimal qty = detail.getQty(); - originalPnQtyMap.put(pn, originalPnQtyMap.getOrDefault(pn, BigDecimal.ZERO).add(qty)); - } - - // 构建新数据Map:按PN分组,计算每个PN的总数量 - Map newPnQtyMap = new HashMap<>(); - for (EcssCoDelNotifyData excelData : excelList) { - String pn = excelData.getPn(); - BigDecimal qty = excelData.getQty(); - newPnQtyMap.put(pn, newPnQtyMap.getOrDefault(pn, BigDecimal.ZERO).add(qty)); - } + // 改单判断逻辑:按itemNo逐行比较,避免同PN多行时按总数量比较漏判 + Map originalDetailMap = dbData.stream() + .collect(Collectors.toMap(EcssCoDelNotifyDetail::getItemNo, detail -> detail, (v1, v2) -> v1)); + Set newItemNoSet = new HashSet<>(); - // 设置itemNo并判断每一行是否有变化(智能判断:按PN比较总数量) + // 设置itemNo并判断每一行是否有变化(按itemNo一对一比较PN/数量) for (int i = 0; i < excelList.size(); i++) { - excelList.get(i).setDelNo(headerData.getDelNo()); - excelList.get(i).setItemNo(i + 1); + EcssCoDelNotifyData excelData = excelList.get(i); + Integer itemNo = i + 1; + excelData.setDelNo(headerData.getDelNo()); + excelData.setItemNo(itemNo); + newItemNoSet.add(itemNo); - String pn = excelList.get(i).getPn(); - BigDecimal originalTotalQty = originalPnQtyMap.get(pn); - BigDecimal newTotalQty = newPnQtyMap.get(pn); + EcssCoDelNotifyDetailData originalDetail = originalDetailMap.get(itemNo); - // 判断是否有修改(按PN比较总数量,避免因顺序变化误判) boolean isModified = false; boolean isQtyModified = false; - if (originalTotalQty == null) { - // 新增PN:原数据中不存在该PN - isModified = true; - isQtyModified = true; - log.info("检测到新增PN: {}, 数量: {}", pn, newTotalQty); - } else if (originalTotalQty.compareTo(newTotalQty) != 0) { - // 数量变更:PN存在但总数量不同 + if (originalDetail == null) { + // 新增行:原数据不存在该itemNo isModified = true; isQtyModified = true; - log.info("检测到PN数量变更: {}, 原数量: {}, 新数量: {}", pn, originalTotalQty, newTotalQty); + BigDecimal newQty = excelData.getQty() != null ? excelData.getQty() : BigDecimal.ZERO; + log.info("检测到新增明细行: itemNo={}, PN={}, 数量={}", itemNo, excelData.getPn(), newQty); + } else { + String originalPn = originalDetail.getPn(); + String newPn = excelData.getPn(); + BigDecimal originalQty = originalDetail.getQty() != null ? originalDetail.getQty() : BigDecimal.ZERO; + BigDecimal newQty = excelData.getQty() != null ? excelData.getQty() : BigDecimal.ZERO; + + boolean pnChanged = !Objects.equals(originalPn, newPn); + boolean qtyChanged = originalQty.compareTo(newQty) != 0; + if (pnChanged || qtyChanged) { + isModified = true; + isQtyModified = true; + log.info("检测到明细行变更: itemNo={}, 原PN={}, 新PN={}, 原数量={}, 新数量={}", + itemNo, originalPn, newPn, originalQty, newQty); + } } - // 其他情况:PN和总数量都相同,无变化,isModified保持false // 只有真正有变化的才标记modifyFlag=true - excelList.get(i).setModifyFlag(isModified); - - // 设置数量变化标记 - if (isQtyModified) { - excelList.get(i).setModifyQtyFlag(true); - } + excelData.setModifyFlag(isModified); + // 仅PN/数量变化时标记modifyQtyFlag=true + excelData.setModifyQtyFlag(isQtyModified); } - // 检查是否有PN被删除(在原数据中存在但新数据中不存在) - boolean hasPnDeleted = false; - for (String originalPn : originalPnQtyMap.keySet()) { - if (!newPnQtyMap.containsKey(originalPn)) { - log.info("检测到PN被删除: {}, 原数量: {}", originalPn, originalPnQtyMap.get(originalPn)); - hasPnDeleted = true; + // 检查是否有明细行被删除(原itemNo存在但新数据中不存在) + boolean hasDetailDeleted = false; + for (Integer originalItemNo : originalDetailMap.keySet()) { + if (!newItemNoSet.contains(originalItemNo)) { + EcssCoDelNotifyDetailData deletedDetail = originalDetailMap.get(originalItemNo); + BigDecimal deletedQty = deletedDetail != null && deletedDetail.getQty() != null + ? deletedDetail.getQty() : BigDecimal.ZERO; + log.info("检测到明细行被删除: itemNo={}, PN={}, 原数量={}", + originalItemNo, + deletedDetail != null ? deletedDetail.getPn() : "-", + deletedQty); + hasDetailDeleted = true; } } @@ -1268,9 +1268,9 @@ public class CoDelExcelServiceImpl implements CoDelExcelService { } // 改单导入后的状态处理逻辑 - // 只有在修改了PN/Qty或删除了PN时才执行状态处理 - if (hasPnOrQtyModified || hasPnDeleted) { - log.info("检测到PN/Qty修改或PN删除,执行状态处理逻辑"); + // 只有在修改了PN/Qty或删除了明细行时才执行状态处理 + if (hasPnOrQtyModified || hasDetailDeleted) { + log.info("检测到PN/Qty修改或明细行删除,执行状态处理逻辑"); handleNotifyStatusAfterModify(headerData, true); } else { log.info("仅修改了其他字段(Destination、Shipping Mode、Currency、TP等),执行状态处理逻辑但不删除托盘数据");