Browse Source

只有关键修改(PN/Qty)才会触发托盘数据清理

java8
han\hanst 1 month ago
parent
commit
c91d485df5
  1. 152
      src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java
  2. 3
      src/main/resources/mapper/ecss/EcssCommonMapper.xml

152
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 = "<!DOCTYPE>" + "<div>发货通知单" +data.getDelNo()+"【发票:"+ data.getCmcInvoice()+"】改单" + "</div>"+
@ -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);
// 更新头表字段包括ReadyDateShippingModeDestination
@ -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("<th>PN</th>");
table.append("<th>数量(原)</th>");
table.append("<th>数量(新)</th>");
table.append("<th>Currency(原)</th>");
table.append("<th>Currency(新)</th>");
table.append("<th>TP(原)</th>");
table.append("<th>TP(新)</th>");
table.append("<th>变更说明</th>");
table.append("</tr>");
@ -1512,31 +1530,77 @@ public class CoDelServiceImpl implements CoDelService {
table.append("<td class='added'>").append(newDetail.getPn()).append("</td>");
table.append("<td>-</td>");
table.append("<td class='added'>").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td>-</td>");
table.append("<td class='added'>").append(newDetail.getCurrency() != null ? newDetail.getCurrency() : "-").append("</td>");
table.append("<td>-</td>");
table.append("<td class='added'>").append(newDetail.getTp() != null ? newDetail.getTp().setScale(2, RoundingMode.HALF_UP).toString() : "-").append("</td>");
table.append("<td class='added'>新增</td>");
} else if (newDetail == null) {
// 删除行
table.append("<td class='deleted'>").append(oldDetail.getPn()).append("</td>");
table.append("<td class='deleted'>").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td>-</td>");
table.append("<td class='deleted'>").append(oldDetail.getCurrency() != null ? oldDetail.getCurrency() : "-").append("</td>");
table.append("<td>-</td>");
table.append("<td class='deleted'>").append(oldDetail.getTp() != null ? oldDetail.getTp().setScale(2, RoundingMode.HALF_UP).toString() : "-").append("</td>");
table.append("<td>-</td>");
table.append("<td class='deleted'>已删除</td>");
} else if (!oldDetail.getPn().equals(newDetail.getPn())) {
// 换料
table.append("<td>").append(oldDetail.getPn()).append(" → <span class='changed'>").append(newDetail.getPn()).append("</span></td>");
table.append("<td>").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td class='changed'>").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td class='changed'>换料</td>");
} else if (!oldDetail.getQty().equals(newDetail.getQty())) {
// 数量变化
table.append("<td>").append(newDetail.getPn()).append("</td>");
table.append("<td>").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td class='changed'>").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td class='changed'>数量变更</td>");
} else {
// 无变化
table.append("<td>").append(newDetail.getPn()).append("</td>");
// 判断各个字段的变化
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<String> 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("<td>").append(oldDetail.getPn()).append(" → <span class='changed'>").append(newDetail.getPn()).append("</span></td>");
} else {
table.append("<td>").append(newDetail.getPn()).append("</td>");
}
// 数量列
table.append("<td>").append(oldDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td>").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
table.append("<td>-</td>");
if (qtyChanged) {
table.append("<td class='changed'>").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
} else {
table.append("<td>").append(newDetail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</td>");
}
// Currency列
String oldCurrency = oldDetail.getCurrency() != null ? oldDetail.getCurrency() : "-";
String newCurrency = newDetail.getCurrency() != null ? newDetail.getCurrency() : "-";
table.append("<td>").append(oldCurrency).append("</td>");
if (currencyChanged) {
table.append("<td class='changed'>").append(newCurrency).append("</td>");
} else {
table.append("<td>").append(newCurrency).append("</td>");
}
// 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("<td>").append(oldTp).append("</td>");
if (tpChanged) {
table.append("<td class='changed'>").append(newTp).append("</td>");
} else {
table.append("<td>").append(newTp).append("</td>");
}
// 变更说明列
if (!changes.isEmpty()) {
table.append("<td class='changed'>").append(changeDesc).append("</td>");
} else {
table.append("<td>").append(changeDesc).append("</td>");
}
}
table.append("</tr>");
@ -5173,17 +5237,23 @@ public class CoDelServiceImpl implements CoDelService {
/**
* 改单导入后处理通知单状态
* 1. 如果当前状态是已报关则删除对应的报关单
* 2. 将通知单状态更新为已下达
*
* <p><b>处理逻辑</b></p>
* <ul>
* <li>如果当前状态是已报关删除对应的报关单</li>
* <li>如果修改了PN/Qty或删除了PN删除托盘数据状态更新为"已下达"</li>
* <li>如果仅修改了其他字段(DestinationShipping ModeCurrencyTP等)不删除托盘数据状态更新为"仓库已确认"</li>
* </ul>
*
* @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 {
// 仅修改了其他字段(DestinationShipping ModeCurrencyTP等)不删除托盘数据状态更新为"仓库已确认"
log.info("仅修改了其他字段(Destination、Shipping Mode、Currency、TP等),保留托盘数据并将状态更新为仓库已确认");
headerData.setNotifyStatus("仓库已确认");
coDelMapper.changeEcssDelStatus(headerData);
log.info("发货通知单{}状态已更新为仓库已确认,托盘数据已保留", headerData.getDelNo());
}
} catch (Exception e) {
log.error("处理改单导入后状态更新失败,发货通知单号:{}, 错误信息:{}",

3
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,

Loading…
Cancel
Save