|
|
@ -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); |
|
|
|
|
|
|
|
|
|
|
|
// 更新头表字段(ReadyDate、ShippingMode、Destination) |
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
// 更新头表字段,包括ReadyDate、ShippingMode、Destination |
|
|
|
|
|
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 { |
|
|
|
|
|
// 检查数量是否有变更 |
|
|
|
|
|
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 { |
|
|
} else { |
|
|
s.append("<li style='margin-top: 10px'>").append("PN:").append(detail.getPn()).append(" 数量:"). |
|
|
|
|
|
append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</li>"); |
|
|
|
|
|
|
|
|
// 无变更 |
|
|
|
|
|
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 { |
|
|
|
|
|
// 检查数量是否有变更 |
|
|
|
|
|
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 { |
|
|
} else { |
|
|
sNew.append("<li style='margin-top: 10px'>").append("PN:").append(detail.getPn()).append(" 数量:"). |
|
|
|
|
|
append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("</li>"); |
|
|
|
|
|
|
|
|
// 无变更 |
|
|
|
|
|
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 |
|
|
|