|
|
|
@ -4102,9 +4102,62 @@ public class CoDelServiceImpl implements CoDelService { |
|
|
|
@Transactional |
|
|
|
public void savePalletMaintenance(EcssCoDelPalletHeaderData inData) { |
|
|
|
SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); |
|
|
|
|
|
|
|
// 获取发货通知单信息 |
|
|
|
EcssCoDelNotifyHeaderData notifyHeader = coDelMapper.getEcssCoDelNotifyHeader(inData.getSite(), inData.getDelNo()); |
|
|
|
|
|
|
|
// 检查发货通知单状态是否为已报关 |
|
|
|
boolean isCustomsCleared = "已报关".equals(notifyHeader.getNotifyStatus()); |
|
|
|
|
|
|
|
// 保存修改前的托数据(用于邮件通知) |
|
|
|
List<EcssCoDelPalletHeaderData> oldPalletHeaderList = null; |
|
|
|
List<EcssDeclarationHeaderData> deletedDeclarations = null; |
|
|
|
// 保存修改前的托数据 |
|
|
|
EcssCoDelNotifyHeaderData queryDatao = new EcssCoDelNotifyHeaderData(); |
|
|
|
queryDatao.setSite(inData.getSite()); |
|
|
|
queryDatao.setBuNo(inData.getBuNo()); |
|
|
|
queryDatao.setDelNo(inData.getDelNo()); |
|
|
|
oldPalletHeaderList = coDelMapper.searchEcssCoDelPalletHeaderData(queryDatao); |
|
|
|
if (isCustomsCleared) { |
|
|
|
log.info("栈板维护:发货通知单{}状态为已报关,开始删除对应的报关单", inData.getDelNo()); |
|
|
|
|
|
|
|
// 查找对应的报关单 |
|
|
|
EcssDeclarationHeaderData declarationQuery = new EcssDeclarationHeaderData(); |
|
|
|
declarationQuery.setSite(inData.getSite()); |
|
|
|
declarationQuery.setDelNo(inData.getDelNo()); |
|
|
|
|
|
|
|
deletedDeclarations = coDelMapper.searchDeclarationHeader( |
|
|
|
new Page<EcssDeclarationHeaderData>(1, 1000), declarationQuery).getRecords(); |
|
|
|
|
|
|
|
// 删除找到的报关单 |
|
|
|
for (EcssDeclarationHeaderData declaration : deletedDeclarations) { |
|
|
|
log.info("删除报关单,报关单号:{}", declaration.getDeclarationNo()); |
|
|
|
coDelMapper.deleteDeclarationHeader(declaration); |
|
|
|
coDelMapper.deleteDeclarationDetail(declaration); |
|
|
|
} |
|
|
|
|
|
|
|
log.info("已删除发货通知单{}对应的{}个报关单", inData.getDelNo(), deletedDeclarations.size()); |
|
|
|
|
|
|
|
// 将通知单状态更新为仓库已确认 |
|
|
|
notifyHeader.setNotifyStatus("仓库已确认"); |
|
|
|
coDelMapper.changeEcssDelStatus(notifyHeader); |
|
|
|
|
|
|
|
log.info("发货通知单{}状态已更新为仓库已确认", inData.getDelNo()); |
|
|
|
} |
|
|
|
|
|
|
|
// 栈板维护只需要调用palletHeaderSave方法 |
|
|
|
palletHeaderSave(inData.getSite(), inData.getBuNo(), inData.getDelNo(), |
|
|
|
inData.getPalletRecords(), currentUser); |
|
|
|
|
|
|
|
// 如果状态为已报关,发送邮件通知创建人 |
|
|
|
// 查询新增的托盘信息(用于邮件通知) |
|
|
|
EcssCoDelNotifyHeaderData queryData = new EcssCoDelNotifyHeaderData(); |
|
|
|
queryData.setSite(inData.getSite()); |
|
|
|
queryData.setBuNo(inData.getBuNo()); |
|
|
|
queryData.setDelNo(inData.getDelNo()); |
|
|
|
List<EcssCoDelPalletHeaderData> newPalletHeaderList = coDelMapper.searchEcssCoDelPalletHeaderData(queryData); |
|
|
|
|
|
|
|
sendPalletMaintenanceNotificationEmail(notifyHeader, oldPalletHeaderList, newPalletHeaderList, deletedDeclarations, inData); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@ -5536,4 +5589,161 @@ public class CoDelServiceImpl implements CoDelService { |
|
|
|
return emailContent.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 发送栈板维护通知邮件 |
|
|
|
* |
|
|
|
* @param notifyHeader 发货通知单头数据 |
|
|
|
* @param oldPalletHeaderList 修改前的托盘头表数据列表 |
|
|
|
* @param newPalletHeaderList 新增的托盘头表数据列表 |
|
|
|
* @param deletedDeclarations 已删除的报关单列表 |
|
|
|
* @param inData 托盘头表数据 |
|
|
|
* @author AI Assistant |
|
|
|
* @date 2025-12-03 |
|
|
|
*/ |
|
|
|
private void sendPalletMaintenanceNotificationEmail(EcssCoDelNotifyHeaderData notifyHeader, |
|
|
|
List<EcssCoDelPalletHeaderData> oldPalletHeaderList, |
|
|
|
List<EcssCoDelPalletHeaderData> newPalletHeaderList, |
|
|
|
List<EcssDeclarationHeaderData> deletedDeclarations, |
|
|
|
EcssCoDelPalletHeaderData inData) { |
|
|
|
try { |
|
|
|
log.info("开始发送栈板维护通知邮件,发货通知单号:{}", notifyHeader.getDelNo()); |
|
|
|
|
|
|
|
// 生成邮件内容 |
|
|
|
String emailContent = generatePalletMaintenanceEmailContent(notifyHeader, oldPalletHeaderList, |
|
|
|
newPalletHeaderList, deletedDeclarations, inData); |
|
|
|
|
|
|
|
// 获取发货通知单创建人邮箱 |
|
|
|
SysUserEntity creator = coDelMapper.queryByUserName(notifyHeader.getCreateBy()); |
|
|
|
if (creator == null || StringUtils.isBlank(creator.getEmail())) { |
|
|
|
log.warn("发货通知单创建人{}不存在或没有配置邮箱地址", notifyHeader.getCreateBy()); |
|
|
|
return; |
|
|
|
} |
|
|
|
String creatorEmail = creator.getEmail(); |
|
|
|
|
|
|
|
// 发送邮件 |
|
|
|
String subject = String.format("发货通知单%s【发票:%s】栈板维护及报关单删除通知", |
|
|
|
notifyHeader.getDelNo(), notifyHeader.getCmcInvoice()); |
|
|
|
String[] mailAddress = {creatorEmail}; |
|
|
|
|
|
|
|
sendMailUtil(subject, emailContent, mailAddress, notifyHeader); |
|
|
|
|
|
|
|
log.info("栈板维护通知邮件发送成功,收件人:{}", creatorEmail); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("发送栈板维护通知邮件失败,发货通知单号:{}, 错误信息:{}", |
|
|
|
notifyHeader.getDelNo(), e.getMessage(), e); |
|
|
|
// 邮件发送失败不影响主流程,只记录日志 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 生成栈板维护邮件内容 |
|
|
|
* |
|
|
|
* @param notifyHeader 发货通知单头数据 |
|
|
|
* @param oldPalletHeaderList 修改前的托盘头表数据列表 |
|
|
|
* @param newPalletHeaderList 新增的托盘头表数据列表 |
|
|
|
* @param deletedDeclarations 已删除的报关单列表 |
|
|
|
* @param inData 托盘头表数据 |
|
|
|
* @return HTML格式的邮件内容 |
|
|
|
*/ |
|
|
|
private String generatePalletMaintenanceEmailContent(EcssCoDelNotifyHeaderData notifyHeader, |
|
|
|
List<EcssCoDelPalletHeaderData> oldPalletHeaderList, |
|
|
|
List<EcssCoDelPalletHeaderData> newPalletHeaderList, |
|
|
|
List<EcssDeclarationHeaderData> deletedDeclarations, |
|
|
|
EcssCoDelPalletHeaderData inData) { |
|
|
|
StringBuilder emailContent = new StringBuilder(); |
|
|
|
|
|
|
|
emailContent.append("<!DOCTYPE html>"); |
|
|
|
emailContent.append("<html>"); |
|
|
|
emailContent.append("<head>"); |
|
|
|
emailContent.append("<meta charset='UTF-8'>"); |
|
|
|
emailContent.append("<style>"); |
|
|
|
emailContent.append("body { font-family: Arial, sans-serif; margin: 20px; }"); |
|
|
|
emailContent.append("table { border-collapse: collapse; width: 100%; margin: 10px 0; }"); |
|
|
|
emailContent.append("th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }"); |
|
|
|
emailContent.append("th { background-color: #f2f2f2; font-weight: bold; }"); |
|
|
|
emailContent.append(".warning { color: #ff6600; font-size: 16px; font-weight: bold; margin: 20px 0; padding: 10px; background-color: #fff3cd; border: 1px solid #ff6600; }"); |
|
|
|
emailContent.append(".section-title { color: #333; font-size: 16px; font-weight: bold; margin: 20px 0 10px 0; }"); |
|
|
|
emailContent.append("</style>"); |
|
|
|
emailContent.append("</head>"); |
|
|
|
emailContent.append("<body>"); |
|
|
|
|
|
|
|
// 邮件标题 |
|
|
|
emailContent.append("<h2>发货通知单栈板维护及报关单删除通知</h2>"); |
|
|
|
|
|
|
|
// 警告信息 |
|
|
|
emailContent.append("<p class='warning'>⚠️ 重要提醒:由于栈板维护操作,对应的报关单已被自动删除,发货通知单状态已变更为‘仓库已确认’。</p>"); |
|
|
|
|
|
|
|
// 发货通知单基本信息 |
|
|
|
emailContent.append("<div class='section-title'>一、发货通知单信息</div>"); |
|
|
|
emailContent.append("<table>"); |
|
|
|
emailContent.append("<tr><td style='width: 150px;'>发货通知单号</td><td>").append(notifyHeader.getDelNo()).append("</td></tr>"); |
|
|
|
emailContent.append("<tr><td>发票号</td><td>").append(notifyHeader.getCmcInvoice() != null ? notifyHeader.getCmcInvoice() : "").append("</td></tr>"); |
|
|
|
emailContent.append("<tr><td>客户</td><td>").append(notifyHeader.getCustomerName() != null ? notifyHeader.getCustomerName() : "").append("</td></tr>"); |
|
|
|
emailContent.append("<tr><td>原状态</td><td style='color: red;'>"+(notifyHeader.getNotifyStatus())+"</td></tr>"); |
|
|
|
emailContent.append("<tr><td>当前状态</td><td style='color: green;'>仓库已确认</td></tr>"); |
|
|
|
emailContent.append("</table>"); |
|
|
|
|
|
|
|
// 新增的托盘信息(过滤出新增的托盘:在新列表中但不在旧列表中) |
|
|
|
if (newPalletHeaderList != null && !newPalletHeaderList.isEmpty()) { |
|
|
|
// 获取旧托盘的seqNo集合 |
|
|
|
Set<Integer> oldSeqNos = new HashSet<>(); |
|
|
|
if (oldPalletHeaderList != null) { |
|
|
|
for (EcssCoDelPalletHeaderData old : oldPalletHeaderList) { |
|
|
|
if (old.getSeqNo() != null) { |
|
|
|
oldSeqNos.add(old.getSeqNo()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 过滤出新增的托盘 |
|
|
|
List<EcssCoDelPalletHeaderData> addedPallets = newPalletHeaderList.stream() |
|
|
|
.filter(p -> p.getSeqNo() != null && !oldSeqNos.contains(p.getSeqNo())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
if (!addedPallets.isEmpty()) { |
|
|
|
emailContent.append("<div class='section-title'>二、新增的托盘信息</div>"); |
|
|
|
emailContent.append("<table>"); |
|
|
|
emailContent.append("<tr><th>序号</th><th>托盘号</th><th>栈板</th><th>托数</th><th>长(cm)</th><th>宽(cm)</th><th>高(cm)</th><th>体积</th></tr>"); |
|
|
|
|
|
|
|
for (EcssCoDelPalletHeaderData newData : addedPallets) { |
|
|
|
emailContent.append("<tr>"); |
|
|
|
emailContent.append("<td>").append(newData.getSeqNo() != null ? newData.getSeqNo() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(newData.getPalletNo() != null ? newData.getPalletNo() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(newData.getPallet() != null ? newData.getPallet() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(newData.getPalletQty() != null ? newData.getPalletQty() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(newData.getLength() != null ? newData.getLength() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(newData.getWidth() != null ? newData.getWidth() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(newData.getHeight() != null ? newData.getHeight() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(newData.getVolume() != null ? newData.getVolume() : "").append("</td>"); |
|
|
|
emailContent.append("</tr>"); |
|
|
|
} |
|
|
|
emailContent.append("</table>"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 已删除的报关单信息 |
|
|
|
if (deletedDeclarations != null && !deletedDeclarations.isEmpty()) { |
|
|
|
emailContent.append("<div class='section-title'>三、已删除的报关单</div>"); |
|
|
|
emailContent.append("<table>"); |
|
|
|
emailContent.append("<tr><th>报关单号</th><th>创建人</th><th>创建时间</th></tr>"); |
|
|
|
|
|
|
|
for (EcssDeclarationHeaderData declaration : deletedDeclarations) { |
|
|
|
emailContent.append("<tr>"); |
|
|
|
emailContent.append("<td>").append(declaration.getDeclarationNo() != null ? declaration.getDeclarationNo() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(declaration.getCreateBy() != null ? declaration.getCreateBy() : "").append("</td>"); |
|
|
|
emailContent.append("<td>").append(declaration.getCreateDate() != null ? declaration.getCreateDate() : "").append("</td>"); |
|
|
|
emailContent.append("</tr>"); |
|
|
|
} |
|
|
|
emailContent.append("</table>"); |
|
|
|
} |
|
|
|
|
|
|
|
emailContent.append("<p style='margin-top: 20px;' class='warning'><strong>备注:</strong>请重新生成报关单。</p>"); |
|
|
|
|
|
|
|
emailContent.append("</body>"); |
|
|
|
emailContent.append("</html>"); |
|
|
|
|
|
|
|
return emailContent.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
} |