From 9bacd84dbf779d9ed7d89a508003d924e737bee3 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Wed, 3 Dec 2025 15:02:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=98=E7=9B=98=E5=8F=91?= =?UTF-8?q?=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ecss/service/impl/CoDelServiceImpl.java | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) 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 5c768560..b8827364 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 @@ -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 oldPalletHeaderList = null; + List 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(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 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 oldPalletHeaderList, + List newPalletHeaderList, + List 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 oldPalletHeaderList, + List newPalletHeaderList, + List deletedDeclarations, + EcssCoDelPalletHeaderData inData) { + StringBuilder emailContent = new StringBuilder(); + + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + + // 邮件标题 + emailContent.append("

发货通知单栈板维护及报关单删除通知

"); + + // 警告信息 + emailContent.append("

⚠️ 重要提醒:由于栈板维护操作,对应的报关单已被自动删除,发货通知单状态已变更为‘仓库已确认’。

"); + + // 发货通知单基本信息 + emailContent.append("
一、发货通知单信息
"); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append("
发货通知单号").append(notifyHeader.getDelNo()).append("
发票号").append(notifyHeader.getCmcInvoice() != null ? notifyHeader.getCmcInvoice() : "").append("
客户").append(notifyHeader.getCustomerName() != null ? notifyHeader.getCustomerName() : "").append("
原状态"+(notifyHeader.getNotifyStatus())+"
当前状态仓库已确认
"); + + // 新增的托盘信息(过滤出新增的托盘:在新列表中但不在旧列表中) + if (newPalletHeaderList != null && !newPalletHeaderList.isEmpty()) { + // 获取旧托盘的seqNo集合 + Set oldSeqNos = new HashSet<>(); + if (oldPalletHeaderList != null) { + for (EcssCoDelPalletHeaderData old : oldPalletHeaderList) { + if (old.getSeqNo() != null) { + oldSeqNos.add(old.getSeqNo()); + } + } + } + + // 过滤出新增的托盘 + List addedPallets = newPalletHeaderList.stream() + .filter(p -> p.getSeqNo() != null && !oldSeqNos.contains(p.getSeqNo())) + .collect(Collectors.toList()); + + if (!addedPallets.isEmpty()) { + emailContent.append("
二、新增的托盘信息
"); + emailContent.append(""); + emailContent.append(""); + + for (EcssCoDelPalletHeaderData newData : addedPallets) { + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + } + emailContent.append("
序号托盘号栈板托数长(cm)宽(cm)高(cm)体积
").append(newData.getSeqNo() != null ? newData.getSeqNo() : "").append("").append(newData.getPalletNo() != null ? newData.getPalletNo() : "").append("").append(newData.getPallet() != null ? newData.getPallet() : "").append("").append(newData.getPalletQty() != null ? newData.getPalletQty() : "").append("").append(newData.getLength() != null ? newData.getLength() : "").append("").append(newData.getWidth() != null ? newData.getWidth() : "").append("").append(newData.getHeight() != null ? newData.getHeight() : "").append("").append(newData.getVolume() != null ? newData.getVolume() : "").append("
"); + } + } + + // 已删除的报关单信息 + if (deletedDeclarations != null && !deletedDeclarations.isEmpty()) { + emailContent.append("
三、已删除的报关单
"); + emailContent.append(""); + emailContent.append(""); + + for (EcssDeclarationHeaderData declaration : deletedDeclarations) { + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + emailContent.append(""); + } + emailContent.append("
报关单号创建人创建时间
").append(declaration.getDeclarationNo() != null ? declaration.getDeclarationNo() : "").append("").append(declaration.getCreateBy() != null ? declaration.getCreateBy() : "").append("").append(declaration.getCreateDate() != null ? declaration.getCreateDate() : "").append("
"); + } + + emailContent.append("

备注:请重新生成报关单。

"); + + emailContent.append(""); + emailContent.append(""); + + return emailContent.toString(); + } + }