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. 将通知单状态更新为已下达
+ *
+ * 处理逻辑:
+ *
+ * - 如果当前状态是已报关,删除对应的报关单
+ * - 如果修改了PN/Qty或删除了PN:删除托盘数据,状态更新为"已下达"
+ * - 如果仅修改了其他字段(Destination、Shipping Mode、Currency、TP等):不删除托盘数据,状态更新为"仓库已确认"
+ *
*
* @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,