Browse Source

改单判断逻辑:按itemNo逐行比较,避免同PN多行时按总数量比较漏判

master
han\hanst 2 weeks ago
parent
commit
20a83948d4
  1. 94
      src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java

94
src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java

@ -1175,64 +1175,64 @@ public class CoDelExcelServiceImpl implements CoDelExcelService {
// 先删除全部明细再新建明细 // 先删除全部明细再新建明细
coDelMapper.deleteAllEcssDelDetail(headerData); 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++) { 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 isModified = false;
boolean isQtyModified = 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; isModified = true;
isQtyModified = 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 // 只有真正有变化的才标记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); handleNotifyStatusAfterModify(headerData, true);
} else { } else {
log.info("仅修改了其他字段(Destination、Shipping Mode、Currency、TP等),执行状态处理逻辑但不删除托盘数据"); log.info("仅修改了其他字段(Destination、Shipping Mode、Currency、TP等),执行状态处理逻辑但不删除托盘数据");

Loading…
Cancel
Save