From 5da3be211fd4cc395d2206ea858d54deada4ac89 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Sat, 4 Oct 2025 09:30:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=8D=95=E5=AF=BC=E5=85=A5=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E9=87=8C=E6=9C=89=E6=94=B9=E5=8A=A8=E7=9A=84=E5=B0=B1?= =?UTF-8?q?=E7=BA=A2=E8=89=B2=E5=AD=97=E4=BD=93=E6=98=BE=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?ReadyDate=E3=80=81ShippingMode=E3=80=81Destination=E4=B9=9F?= =?UTF-8?q?=E8=83=BD=E9=80=9A=E8=BF=87=E6=94=B9=E5=8D=95=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ecss/service/impl/CoDelServiceImpl.java | 199 ++++++++++++++---- 1 file changed, 153 insertions(+), 46 deletions(-) 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 94dad5fe..303f7e40 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 @@ -105,7 +105,7 @@ public class CoDelServiceImpl implements CoDelService { // 检查物料存在性 Map> invalidMaterialsByInvoice = checkMaterialsExistence(excelList, site, currentUser.getUsername(), inData.getBuNo()); - + // 按发票号分组并汇总数据 Map> groupedByInvoice = excelList.stream() .collect(Collectors.groupingBy(EcssCoDelNotifyData::getCmcInvoice)); @@ -115,7 +115,7 @@ public class CoDelServiceImpl implements CoDelService { groupedByInvoice.forEach((invoice, dataList) -> { Map summary = new HashMap<>(); summary.put("cmcInvoice", invoice); - + // 格式化日期为字符串 Date readyDate = dataList.get(0).getReadyDate(); 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("destination", dataList.get(0).getDestination()); summary.put("shippingMode", dataList.get(0).getShippingMode()); - + // 检查是否已存在 List existingHeaders = coDelMapper.checkIfHasHeader(invoice); boolean exists = !existingHeaders.isEmpty(); summary.put("exists", exists); - + // 检查物料存在性 List invalidMaterials = invalidMaterialsByInvoice.get(invoice); boolean hasInvalidMaterials = invalidMaterials != null && !invalidMaterials.isEmpty(); summary.put("hasInvalidMaterials", hasInvalidMaterials); - + if (hasInvalidMaterials) { summary.put("invalidMaterials", invalidMaterials); summary.put("invalidMaterialsText", "不存在的物料:" + String.join("、", invalidMaterials)); } - + // 设置状态信息 if (exists) { summary.put("status", "已存在"); @@ -203,7 +203,7 @@ public class CoDelServiceImpl implements CoDelService { excelList = excelList.stream() .filter(data -> !invalidInvoices.contains(data.getCmcInvoice())) .collect(Collectors.toList()); - + // 记录被筛选掉的发票及其不存在的物料 for (Map.Entry> entry : invalidMaterialsByInvoice.entrySet()) { String invoice = entry.getKey(); @@ -215,7 +215,7 @@ public class CoDelServiceImpl implements CoDelService { // 成功和失败列表 List successList = new ArrayList<>(); List failList = new ArrayList<>(); - + // 添加物料不存在的发票到失败列表 for (Map.Entry> entry : invalidMaterialsByInvoice.entrySet()) { String invoice = entry.getKey(); @@ -743,8 +743,24 @@ public class CoDelServiceImpl implements CoDelService { } else { headerData = notifyHeader.get(0); } + + // 保存原始头表数据用于比较 + EcssCoDelNotifyHeaderData originalHeaderData = new EcssCoDelNotifyHeaderData(); + originalHeaderData.setReadyDate(headerData.getReadyDate()); + originalHeaderData.setShippingMode(headerData.getShippingMode()); + originalHeaderData.setDestination(headerData.getDestination()); + List dbinData =coDelMapper.searchEcssCoDelNotifyDetail(headerData); List 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); for (int i = 0; i < excelList.size(); i++) { @@ -753,51 +769,142 @@ public class CoDelServiceImpl implements CoDelService { } coDelMapper.batchSaveEcssCoDelNotifyDetail(excelList); headerData.setModifyFlag(true); - coDelMapper.updateEcssDelHeaderForModify(headerData); + // 更新头表字段,包括ReadyDate、ShippingMode、Destination + coDelMapper.updateEcssDelHeader(headerData); List 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 dbData, + List newData) { + StringBuilder emailContent = new StringBuilder(); + emailContent.append("
发货通知单").append(newHeaderData.getDelNo()) + .append("【发票:").append(newHeaderData.getCmcInvoice()).append("】改单
"); + + // 检查头表字段变更 + 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("
  • Ready Date: ") + .append(originalDate).append(" → ").append(newDate).append("
  • "); + } + + // 检查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("
  • Shipping Mode: ") + .append(originalMode).append(" → ").append(newMode).append("
  • "); + } + + // 检查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("
  • Destination: ") + .append(originalDest).append(" → ").append(newDest).append("
  • "); + } + + // 如果有头表字段变更,添加到邮件内容 + if (hasHeaderChanges) { + emailContent.append("
    头表字段变更
    ") + .append("
      ").append(headerChanges).append("
    "); + } + + // 处理明细变更 Map> dbMap = dbData.stream().collect(Collectors.groupingBy(EcssCoDelNotifyDetail::getPn)); Map> newMap = newData.stream().collect(Collectors.groupingBy(EcssCoDelNotifyDetail::getPn)); - StringBuilder s = new StringBuilder(); - s.append("
      "); + + // 构建原数据明细 + StringBuilder originalDetails = new StringBuilder(); + originalDetails.append("
        "); for (EcssCoDelNotifyDetailData detail : dbData) { if (!newMap.containsKey(detail.getPn())) { - s.append("
      1. ").append("PN:").append(detail.getPn()).append(" 数量:"). - append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("
      2. "); + // 删除的项目用红色显示 + originalDetails.append("
      3. ") + .append("PN:").append(detail.getPn()).append(" 数量:") + .append(detail.getQty().setScale(0, RoundingMode.HALF_UP)) + .append(" [已删除]
      4. "); } else { - s.append("
      5. ").append("PN:").append(detail.getPn()).append(" 数量:"). - append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("
      6. "); + // 检查数量是否有变更 + EcssCoDelNotifyDetailData newDetail = newMap.get(detail.getPn()).get(0); + if (!detail.getQty().equals(newDetail.getQty())) { + // 数量有变更,用红色显示 + originalDetails.append("
      7. ") + .append("PN:").append(detail.getPn()).append(" 数量:") + .append(detail.getQty().setScale(0, RoundingMode.HALF_UP)) + .append("
      8. "); + } else { + // 无变更 + originalDetails.append("
      9. ") + .append("PN:").append(detail.getPn()).append(" 数量:") + .append(detail.getQty().setScale(0, RoundingMode.HALF_UP)) + .append("
      10. "); + } } } - s.append("
      "); - // 改单 通知仓库和单证人员 - //设置邮件内容 - StringBuilder sNew = new StringBuilder(); - sNew.append("
        "); + originalDetails.append("
      "); + + // 构建新数据明细 + StringBuilder newDetails = new StringBuilder(); + newDetails.append("
        "); for (EcssCoDelNotifyDetailData detail : newData) { if (!dbMap.containsKey(detail.getPn())) { - sNew.append("
      1. ").append("PN:").append(detail.getPn()).append(" 数量:"). - append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("
      2. "); + // 新增的项目用红色显示 + newDetails.append("
      3. ") + .append("PN:").append(detail.getPn()).append(" 数量:") + .append(detail.getQty().setScale(0, RoundingMode.HALF_UP)) + .append(" [新增]
      4. "); } else { - sNew.append("
      5. ").append("PN:").append(detail.getPn()).append(" 数量:"). - append(detail.getQty().setScale(0, RoundingMode.HALF_UP)).append("
      6. "); + // 检查数量是否有变更 + EcssCoDelNotifyDetailData originalDetail = dbMap.get(detail.getPn()).get(0); + if (!detail.getQty().equals(originalDetail.getQty())) { + // 数量有变更,用红色显示 + newDetails.append("
      7. ") + .append("PN:").append(detail.getPn()).append(" 数量:") + .append(detail.getQty().setScale(0, RoundingMode.HALF_UP)) + .append("
      8. "); + } else { + // 无变更 + newDetails.append("
      9. ") + .append("PN:").append(detail.getPn()).append(" 数量:") + .append(detail.getQty().setScale(0, RoundingMode.HALF_UP)) + .append("
      10. "); + } } } - sNew.append("
      "); - //设置邮件内容 - String oldText = "" + "
      " + "原数据" - + "
      " + "
      " + s + "
      "; - String newText = "" + "
      " + "新数据" - + "
      " + "
      " + sNew + "
      "; - String text = "" + "
      发货通知单" +headerData.getDelNo()+ - "【发票:"+ headerData.getCmcInvoice()+"】改单" - + "
      "+ 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("
    "); + + // 添加明细变更到邮件内容 + String oldText = "
    原数据
    " + originalDetails + "
    "; + String newText = "
    新数据
    " + newDetails + "
    "; + emailContent.append(oldText).append(newText); + + return emailContent; } @Override @@ -2910,17 +3017,17 @@ public class CoDelServiceImpl implements CoDelService { */ private Map> checkMaterialsExistence(List excelList, String site, String username, String buNo) { Map> invalidMaterialsByInvoice = new HashMap<>(); - + // 按发票号分组 Map> groupedByInvoice = excelList.stream() .collect(Collectors.groupingBy(EcssCoDelNotifyData::getCmcInvoice)); - + // 检查每个发票的物料 for (Map.Entry> entry : groupedByInvoice.entrySet()) { String invoice = entry.getKey(); List invoiceData = entry.getValue(); List invalidMaterials = new ArrayList<>(); - + // 检查该发票下的每个物料 for (EcssCoDelNotifyData data : invoiceData) { String pn = data.getPn(); @@ -2933,7 +3040,7 @@ public class CoDelServiceImpl implements CoDelService { invalidMaterials.add(pn); } } - + // 测试用:如果物料号以 "TEST" 开头,强制认为不存在(用于测试功能) if (pn.startsWith("TEST") && !invalidMaterials.contains(pn)) { invalidMaterials.add(pn); @@ -2941,13 +3048,13 @@ public class CoDelServiceImpl implements CoDelService { } } } - + // 如果该发票有不存在的物料,记录下来 if (!invalidMaterials.isEmpty()) { invalidMaterialsByInvoice.put(invoice, invalidMaterials); } } - + return invalidMaterialsByInvoice; }