Browse Source

新增托盘发邮件

java8
han\hanst 1 month ago
parent
commit
9bacd84dbf
  1. 210
      src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java

210
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<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();
}
}
Loading…
Cancel
Save