|
|
|
@ -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); |
|
|
|
// 更新头表字段,包括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("<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>如果仅修改了其他字段(Destination、Shipping Mode、Currency、TP等):不删除托盘数据,状态更新为"仓库已确认"</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 { |
|
|
|
// 仅修改了其他字段(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("处理改单导入后状态更新失败,发货通知单号:{}, 错误信息:{}", |
|
|
|
|