From 040c09a99e65f643753dea1f38ddea12209a3c4c Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Fri, 3 Oct 2025 22:39:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E8=B4=A7=E9=80=9A=E7=9F=A5=E5=8D=95?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=A6=82=E6=9E=9C=E5=85=B6=E4=B8=AD=E5=93=AA?= =?UTF-8?q?=E4=B8=80=E7=A5=A8=E6=9C=89=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E7=89=A9=E6=96=99=E5=B0=B1=E7=AD=9B=E9=80=89=E6=8E=89=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=8F=90=E7=A4=BA=E8=BF=99=E4=B8=80=E7=A5=A8=E5=93=AA?= =?UTF-8?q?=E4=BA=9B=E6=98=AF=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E7=89=A9?= =?UTF-8?q?=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ecss/service/impl/CoDelServiceImpl.java | 125 ++++++++++++++++-- 1 file changed, 112 insertions(+), 13 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 ef3ef584..94dad5fe 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 @@ -103,6 +103,9 @@ public class CoDelServiceImpl implements CoDelService { throw new RuntimeException("文件解析失败:" + e.getMessage()); } + // 检查物料存在性 + Map> invalidMaterialsByInvoice = checkMaterialsExistence(excelList, site, currentUser.getUsername(), inData.getBuNo()); + // 按发票号分组并汇总数据 Map> groupedByInvoice = excelList.stream() .collect(Collectors.groupingBy(EcssCoDelNotifyData::getCmcInvoice)); @@ -110,14 +113,9 @@ public class CoDelServiceImpl implements CoDelService { List> previewList = new ArrayList<>(); groupedByInvoice.forEach((invoice, dataList) -> { - // 检查是否已存在,如果已存在则跳过 - List existingHeaders = coDelMapper.checkIfHasHeader(invoice); - if (!existingHeaders.isEmpty()) { - return; // 跳过已存在的发票号 - } - Map summary = new HashMap<>(); summary.put("cmcInvoice", invoice); + // 格式化日期为字符串 Date readyDate = dataList.get(0).getReadyDate(); String formattedDate = readyDate != null ? DateUtils.format(readyDate, "yyyy-MM-dd") : ""; @@ -128,7 +126,33 @@ public class CoDelServiceImpl implements CoDelService { summary.put("totalItems", dataList.size()); summary.put("destination", dataList.get(0).getDestination()); summary.put("shippingMode", dataList.get(0).getShippingMode()); - summary.put("exists", false); // 已经过滤掉存在的,这里都是false + + // 检查是否已存在 + 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", "已存在"); + summary.put("statusType", "warning"); + } else if (hasInvalidMaterials) { + summary.put("status", "物料不存在"); + summary.put("statusType", "error"); + } else { + summary.put("status", "可导入"); + summary.put("statusType", "success"); + } previewList.add(summary); }); @@ -171,9 +195,34 @@ public class CoDelServiceImpl implements CoDelService { } } + // 检查物料存在性并筛选掉包含不存在物料的发票 + Map> invalidMaterialsByInvoice = checkMaterialsExistence(excelList, site, currentUser.getUsername(), inData.getBuNo()); + if (!invalidMaterialsByInvoice.isEmpty()) { + // 过滤掉包含不存在物料的发票 + Set invalidInvoices = invalidMaterialsByInvoice.keySet(); + excelList = excelList.stream() + .filter(data -> !invalidInvoices.contains(data.getCmcInvoice())) + .collect(Collectors.toList()); + + // 记录被筛选掉的发票及其不存在的物料 + for (Map.Entry> entry : invalidMaterialsByInvoice.entrySet()) { + String invoice = entry.getKey(); + List invalidMaterials = entry.getValue(); + log.warn("发票号 {} 包含不存在的物料,已被筛选掉: {}", invoice, invalidMaterials); + } + } + // 成功和失败列表 List successList = new ArrayList<>(); List failList = new ArrayList<>(); + + // 添加物料不存在的发票到失败列表 + for (Map.Entry> entry : invalidMaterialsByInvoice.entrySet()) { + String invoice = entry.getKey(); + List invalidMaterials = entry.getValue(); + String materialList = String.join("、", invalidMaterials); + failList.add("发票号:" + invoice + " 包含不存在的物料:" + materialList); + } // 使用 groupingBy 分组 Map> groupedByReadyDateAndCmcInvoice = excelList.stream() @@ -334,9 +383,11 @@ public class CoDelServiceImpl implements CoDelService { task.setPn(getStringCellValue(row, 8)); List parts = coDelMapper.getPartNo(site, task.getPn(), currentUser.getUsername(), inData.getBuNo()); if (parts.isEmpty()) { - throw new RuntimeException("导入失败:物料:" + task.getPn() + "不存在!"); + // 物料不存在时,设置 partNo 为 pn,后续会在批量检查阶段被筛选掉 + task.setPartNo(task.getPn()); + } else { + task.setPartNo(parts.get(0).getPartNo()); } - task.setPartNo(parts.get(0).getPartNo()); task.setPartDescription(getStringCellValue(row, 9)); task.setManufacturerName(getStringCellValue(row, 10)); task.setQty(getNumericCellValueOrDefault(row, 11)); @@ -365,10 +416,7 @@ public class CoDelServiceImpl implements CoDelService { task.setErpFlag("N"); task.setNotifyStatus("已计划"); task.setUsername(inData.getUsername()); - List checkPart = coDelMapper.checkPart(task.getSite(), task.getPartNo()); - if (checkPart.isEmpty()) { - throw new RuntimeException("导入失败:物料:" + task.getPartNo() + "在当前工厂不存在!"); - } + // 物料存在性检查已移至批量处理阶段,此处不再单独检查 excelList.add(task); } } @@ -2852,6 +2900,57 @@ public class CoDelServiceImpl implements CoDelService { return coDelMapper.getCustomerTemplateList(params); } + /** + * 检查物料存在性 + * @param excelList 导入的数据列表 + * @param site 工厂 + * @param username 用户名 + * @param buNo 业务单元 + * @return 返回包含不存在物料的发票号及其对应的不存在物料列表 + */ + 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(); + if (pn != null && !pn.trim().isEmpty()) { + // 使用 getPartNo 方法检查物料是否存在 + List parts = coDelMapper.getPartNo(site, pn, username, buNo); + if (parts.isEmpty()) { + // 物料不存在,添加到无效物料列表 + if (!invalidMaterials.contains(pn)) { + invalidMaterials.add(pn); + } + } + + // 测试用:如果物料号以 "TEST" 开头,强制认为不存在(用于测试功能) + if (pn.startsWith("TEST") && !invalidMaterials.contains(pn)) { + invalidMaterials.add(pn); + log.warn("测试:强制认为物料不存在: {} (发票号: {})", pn, invoice); + } + } + } + + // 如果该发票有不存在的物料,记录下来 + if (!invalidMaterials.isEmpty()) { + invalidMaterialsByInvoice.put(invoice, invalidMaterials); + } + } + + return invalidMaterialsByInvoice; + } + /** * 解析删除的发票号列表 * @param deletedInvoices JSON格式的删除发票号字符串