Browse Source

改单导入邮件里有改动的就红色字体显示,ReadyDate、ShippingMode、Destination也能通过改单导入修改

java8
han\hanst 3 months ago
parent
commit
5da3be211f
  1. 199
      src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java

199
src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java

@ -105,7 +105,7 @@ public class CoDelServiceImpl implements CoDelService {
// 检查物料存在性 // 检查物料存在性
Map<String, List<String>> invalidMaterialsByInvoice = checkMaterialsExistence(excelList, site, currentUser.getUsername(), inData.getBuNo()); Map<String, List<String>> invalidMaterialsByInvoice = checkMaterialsExistence(excelList, site, currentUser.getUsername(), inData.getBuNo());
// 按发票号分组并汇总数据 // 按发票号分组并汇总数据
Map<String, List<EcssCoDelNotifyData>> groupedByInvoice = excelList.stream() Map<String, List<EcssCoDelNotifyData>> groupedByInvoice = excelList.stream()
.collect(Collectors.groupingBy(EcssCoDelNotifyData::getCmcInvoice)); .collect(Collectors.groupingBy(EcssCoDelNotifyData::getCmcInvoice));
@ -115,7 +115,7 @@ public class CoDelServiceImpl implements CoDelService {
groupedByInvoice.forEach((invoice, dataList) -> { groupedByInvoice.forEach((invoice, dataList) -> {
Map<String, Object> summary = new HashMap<>(); Map<String, Object> summary = new HashMap<>();
summary.put("cmcInvoice", invoice); summary.put("cmcInvoice", invoice);
// 格式化日期为字符串 // 格式化日期为字符串
Date readyDate = dataList.get(0).getReadyDate(); Date readyDate = dataList.get(0).getReadyDate();
String formattedDate = readyDate != null ? DateUtils.format(readyDate, "yyyy-MM-dd") : ""; String formattedDate = readyDate != null ? DateUtils.format(readyDate, "yyyy-MM-dd") : "";
@ -126,22 +126,22 @@ public class CoDelServiceImpl implements CoDelService {
summary.put("totalItems", dataList.size()); summary.put("totalItems", dataList.size());
summary.put("destination", dataList.get(0).getDestination()); summary.put("destination", dataList.get(0).getDestination());
summary.put("shippingMode", dataList.get(0).getShippingMode()); summary.put("shippingMode", dataList.get(0).getShippingMode());
// 检查是否已存在 // 检查是否已存在
List<EcssCoDelNotifyHeaderData> existingHeaders = coDelMapper.checkIfHasHeader(invoice); List<EcssCoDelNotifyHeaderData> existingHeaders = coDelMapper.checkIfHasHeader(invoice);
boolean exists = !existingHeaders.isEmpty(); boolean exists = !existingHeaders.isEmpty();
summary.put("exists", exists); summary.put("exists", exists);
// 检查物料存在性 // 检查物料存在性
List<String> invalidMaterials = invalidMaterialsByInvoice.get(invoice); List<String> invalidMaterials = invalidMaterialsByInvoice.get(invoice);
boolean hasInvalidMaterials = invalidMaterials != null && !invalidMaterials.isEmpty(); boolean hasInvalidMaterials = invalidMaterials != null && !invalidMaterials.isEmpty();
summary.put("hasInvalidMaterials", hasInvalidMaterials); summary.put("hasInvalidMaterials", hasInvalidMaterials);
if (hasInvalidMaterials) { if (hasInvalidMaterials) {
summary.put("invalidMaterials", invalidMaterials); summary.put("invalidMaterials", invalidMaterials);
summary.put("invalidMaterialsText", "不存在的物料:" + String.join("、", invalidMaterials)); summary.put("invalidMaterialsText", "不存在的物料:" + String.join("、", invalidMaterials));
} }
// 设置状态信息 // 设置状态信息
if (exists) { if (exists) {
summary.put("status", "已存在"); summary.put("status", "已存在");
@ -203,7 +203,7 @@ public class CoDelServiceImpl implements CoDelService {
excelList = excelList.stream() excelList = excelList.stream()
.filter(data -> !invalidInvoices.contains(data.getCmcInvoice())) .filter(data -> !invalidInvoices.contains(data.getCmcInvoice()))
.collect(Collectors.toList()); .collect(Collectors.toList());
// 记录被筛选掉的发票及其不存在的物料 // 记录被筛选掉的发票及其不存在的物料
for (Map.Entry<String, List<String>> entry : invalidMaterialsByInvoice.entrySet()) { for (Map.Entry<String, List<String>> entry : invalidMaterialsByInvoice.entrySet()) {
String invoice = entry.getKey(); String invoice = entry.getKey();
@ -215,7 +215,7 @@ public class CoDelServiceImpl implements CoDelService {
// 成功和失败列表 // 成功和失败列表
List<String> successList = new ArrayList<>(); List<String> successList = new ArrayList<>();
List<String> failList = new ArrayList<>(); List<String> failList = new ArrayList<>();
// 添加物料不存在的发票到失败列表 // 添加物料不存在的发票到失败列表
for (Map.Entry<String, List<String>> entry : invalidMaterialsByInvoice.entrySet()) { for (Map.Entry<String, List<String>> entry : invalidMaterialsByInvoice.entrySet()) {
String invoice = entry.getKey(); String invoice = entry.getKey();
@ -743,8 +743,24 @@ public class CoDelServiceImpl implements CoDelService {
} else { } else {
headerData = notifyHeader.get(0); headerData = notifyHeader.get(0);
} }
// 保存原始头表数据用于比较
EcssCoDelNotifyHeaderData originalHeaderData = new EcssCoDelNotifyHeaderData();
originalHeaderData.setReadyDate(headerData.getReadyDate());
originalHeaderData.setShippingMode(headerData.getShippingMode());
originalHeaderData.setDestination(headerData.getDestination());
List<EcssCoDelNotifyDetailData> dbinData =coDelMapper.searchEcssCoDelNotifyDetail(headerData); List<EcssCoDelNotifyDetailData> dbinData =coDelMapper.searchEcssCoDelNotifyDetail(headerData);
List<EcssCoDelNotifyDetailData> dbData = new ArrayList<>(dbinData); List<EcssCoDelNotifyDetailData> dbData = new ArrayList<>(dbinData);
// 更新头表字段ReadyDateShippingModeDestination
if (!excelList.isEmpty()) {
EcssCoDelNotifyData firstExcelData = excelList.get(0);
headerData.setReadyDate(firstExcelData.getReadyDate());
headerData.setShippingMode(firstExcelData.getShippingMode());
headerData.setDestination(firstExcelData.getDestination());
}
// 先删除全部明细再新建明细 // 先删除全部明细再新建明细
coDelMapper.deleteAllEcssDelDetail(headerData); coDelMapper.deleteAllEcssDelDetail(headerData);
for (int i = 0; i < excelList.size(); i++) { for (int i = 0; i < excelList.size(); i++) {
@ -753,51 +769,142 @@ public class CoDelServiceImpl implements CoDelService {
} }
coDelMapper.batchSaveEcssCoDelNotifyDetail(excelList); coDelMapper.batchSaveEcssCoDelNotifyDetail(excelList);
headerData.setModifyFlag(true); headerData.setModifyFlag(true);
coDelMapper.updateEcssDelHeaderForModify(headerData);
// 更新头表字段包括ReadyDateShippingModeDestination
coDelMapper.updateEcssDelHeader(headerData);
List<EcssCoDelNotifyDetailData> newData =coDelMapper.searchEcssCoDelNotifyDetail(headerData); List<EcssCoDelNotifyDetailData> newData =coDelMapper.searchEcssCoDelNotifyDetail(headerData);
// 构建邮件内容包含头表字段变更和明细变更
StringBuilder emailContent = generateModifyEmailContent(originalHeaderData, headerData, dbData, newData);
String textHead = headerData.getDelNo()+"【发票:"+ headerData.getCmcInvoice()+"】改单";
String[] mailAddress = coDelMapper.queryUsersByRoleName("关务仓库",headerData.getSite()).stream().map(SysUserEntity::getEmail).toArray(String[]::new);
String[] mailAddress2 = new String[]{coDelMapper.queryByUserName(headerData.getCreateBy()).getEmail()};
String[] mailAddressAll = ArrayUtils.addAll(mailAddress, mailAddress2);
if (mailAddressAll.length>0) {
sendMailUtil(textHead, emailContent.toString(), mailAddressAll, headerData);
}
}
/**
* 生成改单邮件内容包含头表字段变更和明细变更
*/
private StringBuilder generateModifyEmailContent(EcssCoDelNotifyHeaderData originalHeaderData,
EcssCoDelNotifyHeaderData newHeaderData,
List<EcssCoDelNotifyDetailData> dbData,
List<EcssCoDelNotifyDetailData> newData) {
StringBuilder emailContent = new StringBuilder();
emailContent.append("<!DOCTYPE><div>发货通知单").append(newHeaderData.getDelNo())
.append("【发票:").append(newHeaderData.getCmcInvoice()).append("】改单</div>");
// 检查头表字段变更
StringBuilder headerChanges = new StringBuilder();
boolean hasHeaderChanges = false;
// 检查ReadyDate变更
if (!Objects.equals(originalHeaderData.getReadyDate(), newHeaderData.getReadyDate())) {
hasHeaderChanges = true;
String originalDate = originalHeaderData.getReadyDate() != null ?
DateUtils.format(originalHeaderData.getReadyDate(), "yyyy-MM-dd") : "无";
String newDate = newHeaderData.getReadyDate() != null ?
DateUtils.format(newHeaderData.getReadyDate(), "yyyy-MM-dd") : "无";
headerChanges.append("<li style='margin-top: 10px'>Ready Date: ")
.append(originalDate).append(" → <span style='color:red'>").append(newDate).append("</span></li>");
}
// 检查ShippingMode变更
if (!Objects.equals(originalHeaderData.getShippingMode(), newHeaderData.getShippingMode())) {
hasHeaderChanges = true;
String originalMode = originalHeaderData.getShippingMode() != null ? originalHeaderData.getShippingMode() : "无";
String newMode = newHeaderData.getShippingMode() != null ? newHeaderData.getShippingMode() : "无";
headerChanges.append("<li style='margin-top: 10px'>Shipping Mode: ")
.append(originalMode).append(" → <span style='color:red'>").append(newMode).append("</span></li>");
}
// 检查Destination变更
if (!Objects.equals(originalHeaderData.getDestination(), newHeaderData.getDestination())) {
hasHeaderChanges = true;
String originalDest = originalHeaderData.getDestination() != null ? originalHeaderData.getDestination() : "无";
String newDest = newHeaderData.getDestination() != null ? newHeaderData.getDestination() : "无";
headerChanges.append("<li style='margin-top: 10px'>Destination: ")
.append(originalDest).append(" → <span style='color:red'>").append(newDest).append("</span></li>");
}
// 如果有头表字段变更添加到邮件内容
if (hasHeaderChanges) {
emailContent.append("<div><span style='color:blue'>头表字段变更</span></div>")
.append("<div><ol>").append(headerChanges).append("</ol></div>");
}
// 处理明细变更
Map<String, List<EcssCoDelNotifyDetailData>> dbMap = dbData.stream().collect(Collectors.groupingBy(EcssCoDelNotifyDetail::getPn)); Map<String, List<EcssCoDelNotifyDetailData>> dbMap = dbData.stream().collect(Collectors.groupingBy(EcssCoDelNotifyDetail::getPn));
Map<String, List<EcssCoDelNotifyDetailData>> newMap = newData.stream().collect(Collectors.groupingBy(EcssCoDelNotifyDetail::getPn)); Map<String, List<EcssCoDelNotifyDetailData>> newMap = newData.stream().collect(Collectors.groupingBy(EcssCoDelNotifyDetail::getPn));
StringBuilder s = new StringBuilder();
s.append("<ol>");
// 构建原数据明细
StringBuilder originalDetails = new StringBuilder();
originalDetails.append("<ol>");
for (EcssCoDelNotifyDetailData detail : dbData) { for (EcssCoDelNotifyDetailData detail : dbData) {
if (!newMap.containsKey(detail.getPn())) { if (!newMap.containsKey(detail.getPn())) {
s.append("<li style='margin-top: 10px;color:red'>").append("PN:").append(detail.getPn()).append(" 数量:").
append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</li>");
// 删除的项目用红色显示
originalDetails.append("<li style='margin-top: 10px;color:red'>")
.append("PN:").append(detail.getPn()).append(" 数量:")
.append(detail.getQty().setScale(0, RoundingMode.HALF_UP))
.append(" [已删除]</li>");
} else { } else {
s.append("<li style='margin-top: 10px'>").append("PN:").append(detail.getPn()).append(" 数量:").
append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</li>");
// 检查数量是否有变更
EcssCoDelNotifyDetailData newDetail = newMap.get(detail.getPn()).get(0);
if (!detail.getQty().equals(newDetail.getQty())) {
// 数量有变更用红色显示
originalDetails.append("<li style='margin-top: 10px'>")
.append("PN:").append(detail.getPn()).append(" 数量:<span style='color:red'>")
.append(detail.getQty().setScale(0, RoundingMode.HALF_UP))
.append("</span></li>");
} else {
// 无变更
originalDetails.append("<li style='margin-top: 10px'>")
.append("PN:").append(detail.getPn()).append(" 数量:")
.append(detail.getQty().setScale(0, RoundingMode.HALF_UP))
.append("</li>");
}
} }
} }
s.append("</ol>");
// 改单 通知仓库和单证人员
//设置邮件内容
StringBuilder sNew = new StringBuilder();
sNew.append("<ol>");
originalDetails.append("</ol>");
// 构建新数据明细
StringBuilder newDetails = new StringBuilder();
newDetails.append("<ol>");
for (EcssCoDelNotifyDetailData detail : newData) { for (EcssCoDelNotifyDetailData detail : newData) {
if (!dbMap.containsKey(detail.getPn())) { if (!dbMap.containsKey(detail.getPn())) {
sNew.append("<li style='margin-top: 10px;color:red'>").append("PN:").append(detail.getPn()).append(" 数量:").
append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</li>");
// 新增的项目用红色显示
newDetails.append("<li style='margin-top: 10px;color:red'>")
.append("PN:").append(detail.getPn()).append(" 数量:")
.append(detail.getQty().setScale(0, RoundingMode.HALF_UP))
.append(" [新增]</li>");
} else { } else {
sNew.append("<li style='margin-top: 10px'>").append("PN:").append(detail.getPn()).append(" 数量:").
append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</li>");
// 检查数量是否有变更
EcssCoDelNotifyDetailData originalDetail = dbMap.get(detail.getPn()).get(0);
if (!detail.getQty().equals(originalDetail.getQty())) {
// 数量有变更用红色显示
newDetails.append("<li style='margin-top: 10px'>")
.append("PN:").append(detail.getPn()).append(" 数量:<span style='color:red'>")
.append(detail.getQty().setScale(0, RoundingMode.HALF_UP))
.append("</span></li>");
} else {
// 无变更
newDetails.append("<li style='margin-top: 10px'>")
.append("PN:").append(detail.getPn()).append(" 数量:")
.append(detail.getQty().setScale(0, RoundingMode.HALF_UP))
.append("</li>");
}
} }
} }
sNew.append("</ol>");
//设置邮件内容
String oldText = "<!DOCTYPE>" + "<div>" + "<span style='color:blue'>原数据</span>"
+ "</div>" + "<div>" + s + "</div>";
String newText = "<!DOCTYPE>" + "<div>" + "<span style='color:blue'>新数据</span>"
+ "</div>" + "<div>" + sNew + "</div>";
String text = "<!DOCTYPE>" + "<div>发货通知单" +headerData.getDelNo()+
"【发票:"+ headerData.getCmcInvoice()+"】改单"
+ "</div>"+ oldText+newText;
String textHead = headerData.getDelNo()+"【发票:"+ headerData.getCmcInvoice()+"】改单";
String[] mailAddress = coDelMapper.queryUsersByRoleName("关务仓库",headerData.getSite()).stream().map(SysUserEntity::getEmail).toArray(String[]::new);
String[] mailAddress2 = new String[]{coDelMapper.queryByUserName(headerData.getCreateBy()).getEmail()};
String[] mailAddressAll = ArrayUtils.addAll(mailAddress, mailAddress2);
if (mailAddressAll.length>0) {
sendMailUtil(textHead, text,mailAddressAll, headerData);
}
newDetails.append("</ol>");
// 添加明细变更到邮件内容
String oldText = "<div><span style='color:blue'>原数据</span></div><div>" + originalDetails + "</div>";
String newText = "<div><span style='color:blue'>新数据</span></div><div>" + newDetails + "</div>";
emailContent.append(oldText).append(newText);
return emailContent;
} }
@Override @Override
@ -2910,17 +3017,17 @@ public class CoDelServiceImpl implements CoDelService {
*/ */
private Map<String, List<String>> checkMaterialsExistence(List<EcssCoDelNotifyData> excelList, String site, String username, String buNo) { private Map<String, List<String>> checkMaterialsExistence(List<EcssCoDelNotifyData> excelList, String site, String username, String buNo) {
Map<String, List<String>> invalidMaterialsByInvoice = new HashMap<>(); Map<String, List<String>> invalidMaterialsByInvoice = new HashMap<>();
// 按发票号分组 // 按发票号分组
Map<String, List<EcssCoDelNotifyData>> groupedByInvoice = excelList.stream() Map<String, List<EcssCoDelNotifyData>> groupedByInvoice = excelList.stream()
.collect(Collectors.groupingBy(EcssCoDelNotifyData::getCmcInvoice)); .collect(Collectors.groupingBy(EcssCoDelNotifyData::getCmcInvoice));
// 检查每个发票的物料 // 检查每个发票的物料
for (Map.Entry<String, List<EcssCoDelNotifyData>> entry : groupedByInvoice.entrySet()) { for (Map.Entry<String, List<EcssCoDelNotifyData>> entry : groupedByInvoice.entrySet()) {
String invoice = entry.getKey(); String invoice = entry.getKey();
List<EcssCoDelNotifyData> invoiceData = entry.getValue(); List<EcssCoDelNotifyData> invoiceData = entry.getValue();
List<String> invalidMaterials = new ArrayList<>(); List<String> invalidMaterials = new ArrayList<>();
// 检查该发票下的每个物料 // 检查该发票下的每个物料
for (EcssCoDelNotifyData data : invoiceData) { for (EcssCoDelNotifyData data : invoiceData) {
String pn = data.getPn(); String pn = data.getPn();
@ -2933,7 +3040,7 @@ public class CoDelServiceImpl implements CoDelService {
invalidMaterials.add(pn); invalidMaterials.add(pn);
} }
} }
// 测试用如果物料号以 "TEST" 开头强制认为不存在用于测试功能 // 测试用如果物料号以 "TEST" 开头强制认为不存在用于测试功能
if (pn.startsWith("TEST") && !invalidMaterials.contains(pn)) { if (pn.startsWith("TEST") && !invalidMaterials.contains(pn)) {
invalidMaterials.add(pn); invalidMaterials.add(pn);
@ -2941,13 +3048,13 @@ public class CoDelServiceImpl implements CoDelService {
} }
} }
} }
// 如果该发票有不存在的物料记录下来 // 如果该发票有不存在的物料记录下来
if (!invalidMaterials.isEmpty()) { if (!invalidMaterials.isEmpty()) {
invalidMaterialsByInvoice.put(invoice, invalidMaterials); invalidMaterialsByInvoice.put(invoice, invalidMaterials);
} }
} }
return invalidMaterialsByInvoice; return invalidMaterialsByInvoice;
} }

Loading…
Cancel
Save