|
|
|
@ -1175,64 +1175,64 @@ public class CoDelExcelServiceImpl implements CoDelExcelService { |
|
|
|
// 先删除全部明细,再新建明细 |
|
|
|
coDelMapper.deleteAllEcssDelDetail(headerData); |
|
|
|
|
|
|
|
// 智能判断改单逻辑:按PN分组汇总数量,避免因顺序变化导致误判 |
|
|
|
// 构建原数据Map:按PN分组,计算每个PN的总数量 |
|
|
|
Map<String, BigDecimal> 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<String, BigDecimal> 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<Integer, EcssCoDelNotifyDetailData> originalDetailMap = dbData.stream() |
|
|
|
.collect(Collectors.toMap(EcssCoDelNotifyDetail::getItemNo, detail -> detail, (v1, v2) -> v1)); |
|
|
|
Set<Integer> 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 |
|
|
|
if (originalDetail == null) { |
|
|
|
// 新增行:原数据不存在该itemNo |
|
|
|
isModified = true; |
|
|
|
isQtyModified = true; |
|
|
|
log.info("检测到新增PN: {}, 数量: {}", pn, newTotalQty); |
|
|
|
} else if (originalTotalQty.compareTo(newTotalQty) != 0) { |
|
|
|
// 数量变更:PN存在但总数量不同 |
|
|
|
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("检测到PN数量变更: {}, 原数量: {}, 新数量: {}", pn, originalTotalQty, newTotalQty); |
|
|
|
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等),执行状态处理逻辑但不删除托盘数据"); |
|
|
|
|