diff --git a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java index a9d44bbe..0c977a41 100644 --- a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java @@ -1165,8 +1165,8 @@ public class CoDelServiceImpl implements CoDelService { header.setDelNo(data.getDelNo()); header.setModifyFlag(true); coDelMapper.updateEcssDelHeaderForModify(header); - // 改单导入后的状态处理逻辑 - handleNotifyStatusAfterModify(checkHeader.get(0)); + // 改单导入后的状态处理逻辑 - 新增/修改发货涉及PN/Qty变化 + handleNotifyStatusAfterModify(checkHeader.get(0), true); } @Override @@ -1186,8 +1186,8 @@ public class CoDelServiceImpl implements CoDelService { header.setDelNo(data.getDelNo()); header.setModifyFlag(true); coDelMapper.updateEcssDelHeaderForModify(header); - // 改单导入后的状态处理逻辑 - handleNotifyStatusAfterModify(checkHeader.get(0)); + // 改单导入后的状态处理逻辑 - 删除发货涉及PN/Qty变化(删除PN) + handleNotifyStatusAfterModify(checkHeader.get(0), true); // 改单取消某条订单 通知仓库和单证人员 //设置邮件内容 String text = "" + "
发货通知单" +data.getDelNo()+"【发票:"+ data.getCmcInvoice()+"】改单" + "
"+ @@ -1348,11 +1348,18 @@ public class CoDelServiceImpl implements CoDelService { } // 检查是否有PN被删除(在原数据中存在但新数据中不存在) + boolean hasPnDeleted = false; for (String originalPn : originalPnQtyMap.keySet()) { if (!newPnQtyMap.containsKey(originalPn)) { log.info("检测到PN被删除: {}, 原数量: {}", originalPn, originalPnQtyMap.get(originalPn)); + hasPnDeleted = true; } } + + // 检查是否有PN或Qty的修改 + boolean hasPnOrQtyModified = excelList.stream() + .anyMatch(item -> item.getModifyQtyFlag() != null && item.getModifyQtyFlag()); + coDelMapper.batchSaveEcssCoDelNotifyDetail(excelList); headerData.setModifyFlag(true); // 更新头表字段,包括ReadyDate、ShippingMode、Destination @@ -1381,7 +1388,14 @@ public class CoDelServiceImpl implements CoDelService { } // 改单导入后的状态处理逻辑 - handleNotifyStatusAfterModify(headerData); + // 只有在修改了PN/Qty或删除了PN时才执行状态处理 + if (hasPnOrQtyModified || hasPnDeleted) { + log.info("检测到PN/Qty修改或PN删除,执行状态处理逻辑"); + handleNotifyStatusAfterModify(headerData, true); + } else { + log.info("仅修改了其他字段(Destination、Shipping Mode、Currency、TP等),执行状态处理逻辑但不删除托盘数据"); + handleNotifyStatusAfterModify(headerData, false); + } } /** @@ -1496,6 +1510,10 @@ public class CoDelServiceImpl implements CoDelService { table.append("PN"); table.append("数量(原)"); table.append("数量(新)"); + table.append("Currency(原)"); + table.append("Currency(新)"); + table.append("TP(原)"); + table.append("TP(新)"); table.append("变更说明"); table.append(""); @@ -1512,31 +1530,77 @@ public class CoDelServiceImpl implements CoDelService { table.append("").append(newDetail.getPn()).append(""); table.append("-"); table.append("").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); + table.append("-"); + table.append("").append(newDetail.getCurrency() != null ? newDetail.getCurrency() : "-").append(""); + table.append("-"); + table.append("").append(newDetail.getTp() != null ? newDetail.getTp().setScale(2, RoundingMode.HALF_UP).toString() : "-").append(""); table.append("新增"); } else if (newDetail == null) { // 删除行 table.append("").append(oldDetail.getPn()).append(""); table.append("").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); table.append("-"); + table.append("").append(oldDetail.getCurrency() != null ? oldDetail.getCurrency() : "-").append(""); + table.append("-"); + table.append("").append(oldDetail.getTp() != null ? oldDetail.getTp().setScale(2, RoundingMode.HALF_UP).toString() : "-").append(""); + table.append("-"); table.append("已删除"); - } else if (!oldDetail.getPn().equals(newDetail.getPn())) { - // 换料 - table.append("").append(oldDetail.getPn()).append(" → ").append(newDetail.getPn()).append(""); - table.append("").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); - table.append("").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); - table.append("换料"); - } else if (!oldDetail.getQty().equals(newDetail.getQty())) { - // 数量变化 - table.append("").append(newDetail.getPn()).append(""); - table.append("").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); - table.append("").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); - table.append("数量变更"); } else { - // 无变化 - table.append("").append(newDetail.getPn()).append(""); + // 判断各个字段的变化 + boolean pnChanged = !oldDetail.getPn().equals(newDetail.getPn()); + boolean qtyChanged = !oldDetail.getQty().equals(newDetail.getQty()); + boolean currencyChanged = !Objects.equals(oldDetail.getCurrency(), newDetail.getCurrency()); + boolean tpChanged = !Objects.equals(oldDetail.getTp(), newDetail.getTp()); + + // 构建变更说明 + List changes = new ArrayList<>(); + if (pnChanged) changes.add("换料"); + if (qtyChanged) changes.add("数量变更"); + if (currencyChanged) changes.add("Currency变更"); + if (tpChanged) changes.add("TP变更"); + String changeDesc = changes.isEmpty() ? "-" : String.join("、", changes); + + // PN列 + if (pnChanged) { + table.append("").append(oldDetail.getPn()).append(" → ").append(newDetail.getPn()).append(""); + } else { + table.append("").append(newDetail.getPn()).append(""); + } + + // 数量列 table.append("").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); - table.append("").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); - table.append("-"); + if (qtyChanged) { + table.append("").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); + } else { + table.append("").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append(""); + } + + // Currency列 + String oldCurrency = oldDetail.getCurrency() != null ? oldDetail.getCurrency() : "-"; + String newCurrency = newDetail.getCurrency() != null ? newDetail.getCurrency() : "-"; + table.append("").append(oldCurrency).append(""); + if (currencyChanged) { + table.append("").append(newCurrency).append(""); + } else { + table.append("").append(newCurrency).append(""); + } + + // TP列 + String oldTp = oldDetail.getTp() != null ? oldDetail.getTp().setScale(2, RoundingMode.HALF_UP).toString() : "-"; + String newTp = newDetail.getTp() != null ? newDetail.getTp().setScale(2, RoundingMode.HALF_UP).toString() : "-"; + table.append("").append(oldTp).append(""); + if (tpChanged) { + table.append("").append(newTp).append(""); + } else { + table.append("").append(newTp).append(""); + } + + // 变更说明列 + if (!changes.isEmpty()) { + table.append("").append(changeDesc).append(""); + } else { + table.append("").append(changeDesc).append(""); + } } table.append(""); @@ -5173,17 +5237,23 @@ public class CoDelServiceImpl implements CoDelService { /** * 改单导入后处理通知单状态 - * 1. 如果当前状态是已报关,则删除对应的报关单 - * 2. 将通知单状态更新为已下达 + * + *

处理逻辑:

+ * * * @param headerData 发货通知单头数据 + * @param isPnOrQtyModified 是否修改了PN/Qty或删除了PN * @author AI Assistant * @date 2024-10-09 */ - private void handleNotifyStatusAfterModify(EcssCoDelNotifyHeaderData headerData) { + private void handleNotifyStatusAfterModify(EcssCoDelNotifyHeaderData headerData, boolean isPnOrQtyModified) { try { - log.info("开始处理改单导入后的状态更新,发货通知单号:{}, 当前状态:{}", - headerData.getDelNo(), headerData.getNotifyStatus()); + log.info("开始处理改单导入后的状态更新,发货通知单号:{}, 当前状态:{}, PN/Qty是否修改:{}", + headerData.getDelNo(), headerData.getNotifyStatus(), isPnOrQtyModified); // 检查当前通知单状态 String currentStatus = headerData.getNotifyStatus(); @@ -5210,16 +5280,26 @@ public class CoDelServiceImpl implements CoDelService { log.info("已删除发货通知单{}对应的{}个报关单", headerData.getDelNo(), declarations.size()); } - // 将通知单状态更新为已下达 - headerData.setNotifyStatus("已下达"); - coDelMapper.changeEcssDelStatus(headerData); - clearPalletData(headerData); - EcssCoDelPalletHeaderData inData = new EcssCoDelPalletHeaderData(); - inData.setSite(headerData.getSite()); - inData.setBuNo(headerData.getBuNo()); - inData.setDelNo(headerData.getDelNo()); - coDelMapper.deletePalletHeader(inData); - log.info("发货通知单{}状态已更新为已下达", headerData.getDelNo()); + // 根据修改类型决定后续操作 + if (isPnOrQtyModified) { + // 修改了PN/Qty或删除了PN:需要删除托盘数据,状态更新为"已下达" + log.info("检测到PN/Qty修改或PN删除,删除托盘数据并将状态更新为已下达"); + headerData.setNotifyStatus("已下达"); + coDelMapper.changeEcssDelStatus(headerData); + clearPalletData(headerData); + EcssCoDelPalletHeaderData inData = new EcssCoDelPalletHeaderData(); + inData.setSite(headerData.getSite()); + inData.setBuNo(headerData.getBuNo()); + inData.setDelNo(headerData.getDelNo()); + coDelMapper.deletePalletHeader(inData); + log.info("发货通知单{}状态已更新为已下达,托盘数据已删除", headerData.getDelNo()); + } else { + // 仅修改了其他字段(Destination、Shipping Mode、Currency、TP等):不删除托盘数据,状态更新为"仓库已确认" + log.info("仅修改了其他字段(Destination、Shipping Mode、Currency、TP等),保留托盘数据并将状态更新为仓库已确认"); + headerData.setNotifyStatus("仓库已确认"); + coDelMapper.changeEcssDelStatus(headerData); + log.info("发货通知单{}状态已更新为仓库已确认,托盘数据已保留", headerData.getDelNo()); + } } catch (Exception e) { log.error("处理改单导入后状态更新失败,发货通知单号:{}, 错误信息:{}", diff --git a/src/main/resources/mapper/ecss/EcssCommonMapper.xml b/src/main/resources/mapper/ecss/EcssCommonMapper.xml index 1062fb2d..197a3a6a 100644 --- a/src/main/resources/mapper/ecss/EcssCommonMapper.xml +++ b/src/main/resources/mapper/ecss/EcssCommonMapper.xml @@ -63,7 +63,7 @@ t.part_no, t.qty, CASE WHEN t.rn = 1 THEN t.box_qty ELSE NULL END AS boxQty, - isnull(t.rolls,0) AS rolls, + CASE WHEN t.rn = 1 THEN isnull(t.rolls,t.allRolls) ELSE 0 END AS rolls, t.pn, CASE WHEN t.rn = 1 THEN t.grossWeight ELSE NULL END AS grossWeight, CASE WHEN t.rn = 1 THEN t.netWeight ELSE NULL END AS netWeight, @@ -81,6 +81,7 @@ b.qty, a.box_qty, b.rolls, + a.rolls as allRolls, b.pn, a.gross_weight AS grossWeight, a.net_weight AS netWeight,