From bb3ca932d25147177f6abcf46a44de5c96f64fae Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 09:53:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(oms):=E5=87=BA=E5=85=A5=E5=BA=93=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=AD=98=E5=9C=A8=E6=80=A7=E6=A0=A1=E9=AA=8C=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=94=B6=E9=9B=86=E5=90=8E=E7=BB=9F=E4=B8=80=E6=8F=90?= =?UTF-8?q?=E7=A4=BA(=E7=89=A9=E6=96=99+=E5=AE=A2=E6=88=B7=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E7=BC=96=E5=8F=B7=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=B8=A6=E5=85=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整2d1e4b59引入的校验流程(入库parseStockInExcel/出库parseExcelFile统一): 1. 第一步:物料编号存在性校验——逐编号查库,全部不存在的收集到missingMaterials,不立即报错 2. 第二步:客户编号存在性校验——逐编号查库,全部不存在的收集到missingCustomers,不立即报错 3. 第三步:两步全部完成后统一抛出提示,避免修完物料问题重导一次才暴露客户问题: 只缺物料:"物料[A、B]不存在,请先维护物料信息,维护完成后重新导入" 只缺客户:"客户[C]不存在,请先维护客户信息,维护完成后重新导入" 都缺:"物料[A、B]不存在,请先维护物料信息;客户[C、D]不存在,请先维护客户信息,维护完成后重新导入" 4. 存在性全部通过后才继续多货主/多客户编号/客户与货主一致性等校验及建单; 入库"多个客户编号"校验相应移到存在性之后,多个编号中缺哪个报哪个 5. 入库客户查询结果存入customerCache复用,一致性校验不再二次查库 漏填编号(空白行)仍即时报错,不属于存在性问题,行为不变 --- .../ReservationStockInOrderImpl.java | 95 ++++++++++++------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java index 2503b839f..20176fe04 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java @@ -259,7 +259,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl> shipperIds = new ArrayList<>(); Set processedShipperIds = new HashSet<>(); - // ====== 物料存在性校验(落库前):查询结果为空说明库中没有该物料,收集全部缺失料号后一次性提示维护 ====== + // ====== 第一步:物料编号存在性校验(落库前,先收集全部缺失编号,不立即报错) ====== Map materialCache = new LinkedHashMap<>(); List missingMaterials = new ArrayList<>(); for (ProductDetail productDetail : productDetailList) { @@ -277,21 +277,10 @@ public class ReservationStockInOrderImpl extends ServiceImpl shipper = new HashMap<>(); - shipper.put("shipperId", materialBaseInfoPO.getShipperId()); - shipper.put("shipperName", materialBaseInfoPO.getShipperName()); - shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); - shipperIds.add(shipper); - } - } - // ====== 客户存在性校验(落库前):客户编号在库中查询结果为空说明客户不存在,提示维护后再导入 ====== + // ====== 第二步:客户编号存在性校验(落库前,先收集全部缺失编号,不立即报错) ====== Map customerCache = new HashMap<>(); + List missingCustomers = new ArrayList<>(); for (CustomerDeliveryDetail customerDeliveryDetail : customerDeliveryDetailList) { String customerCode = customerDeliveryDetail.getCustomerCode() == null ? "" : customerDeliveryDetail.getCustomerCode().trim(); if (customerCode.isEmpty()) { @@ -302,9 +291,33 @@ public class ReservationStockInOrderImpl extends ServiceImpl problems = new ArrayList<>(); + if (!missingMaterials.isEmpty()) { + problems.add("物料[" + String.join("、", missingMaterials) + "]不存在,请先维护物料信息"); + } + if (!missingCustomers.isEmpty()) { + problems.add("客户[" + String.join("、", missingCustomers) + "]不存在,请先维护客户信息"); + } + throw new Exception(String.join(";", problems) + ",维护完成后重新导入"); + } + + // ====== 后续处理(编号均已存在):货主归属校验、建单落库 ====== + for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { + if (materialBaseInfoPO.getShipperId() != null && processedShipperIds.add(materialBaseInfoPO.getShipperId())) { + Map shipper = new HashMap<>(); + shipper.put("shipperId", materialBaseInfoPO.getShipperId()); + shipper.put("shipperName", materialBaseInfoPO.getShipperName()); + shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); + shipperIds.add(shipper); } - customerCache.put(customerCode, customer); } // 货品明细不为空时,校验货主信息 @@ -506,8 +519,8 @@ public class ReservationStockInOrderImpl extends ServiceImpl materialCache = new LinkedHashMap<>(); List missingMaterials = new ArrayList<>(); for (StockInProductDetail productDetail : productDetailList) { @@ -522,9 +535,35 @@ public class ReservationStockInOrderImpl extends ServiceImpl customerCodes = new LinkedHashSet<>(); + for (StockInProductDetail productDetail : productDetailList) { + if (productDetail.getCustomerCode() != null && !productDetail.getCustomerCode().trim().isEmpty()) { + customerCodes.add(productDetail.getCustomerCode().trim()); + } } + Map customerCache = new HashMap<>(); + List missingCustomers = new ArrayList<>(); + for (String customerCode : customerCodes) { + UserPo customer = stockOutOrderMapper.queryCustomerByCode(customerCode, loginUser.getUserPo().getOrganizationId()); + if (customer == null || customer.getUserId() == null) { + missingCustomers.add(customerCode); + } else { + customerCache.put(customerCode, customer); + } + } + // ====== 第三步:物料/客户存在性校验全部完成后,统一提示两类编号各自有哪些不存在 ====== + if (!missingMaterials.isEmpty() || !missingCustomers.isEmpty()) { + List problems = new ArrayList<>(); + if (!missingMaterials.isEmpty()) { + problems.add("物料[" + String.join("、", missingMaterials) + "]不存在,请先维护物料信息"); + } + if (!missingCustomers.isEmpty()) { + problems.add("客户[" + String.join("、", missingCustomers) + "]不存在,请先维护客户信息"); + } + throw new ServiceException(String.join(";", problems) + ",维护完成后重新导入"); + } + // ====== 后续处理(编号均已存在):名称自动匹配、货主归属与一致性校验、建单 ====== // 明细回填库中匹配到的物料名称(自动匹配,模板中的名称列可不填/以库中为准;库中名称为空时保留模板值) for (StockInProductDetail productDetail : productDetailList) { String materialName = materialCache.get(productDetail.getProductCode()).getMaterialName(); @@ -532,7 +571,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl> shipperIds = new ArrayList<>(); Set processedShipperIds = new HashSet<>(); for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { @@ -554,24 +593,14 @@ public class ReservationStockInOrderImpl extends ServiceImpl customerCodes = new LinkedHashSet<>(); - for (StockInProductDetail productDetail : productDetailList) { - if (productDetail.getCustomerCode() != null && !productDetail.getCustomerCode().trim().isEmpty()) { - customerCodes.add(productDetail.getCustomerCode().trim()); - } - } if (customerCodes.size() > 1) { throw new ServiceException("导入明细中存在多个客户编号(" + String.join("、", customerCodes) + "),一个入库单只能属于一个客户"); } if (!customerCodes.isEmpty()) { String customerCode = customerCodes.iterator().next(); - // 查询结果为空说明库中没有该客户,提示维护后再导入 - customer = stockOutOrderMapper.queryCustomerByCode(customerCode, loginUser.getUserPo().getOrganizationId()); - if (customer == null || customer.getUserId() == null) { - throw new ServiceException("客户[" + customerCode + "]不存在,请先维护客户信息后再导入"); - } + customer = customerCache.get(customerCode); // 客户编号与物料归属货主一致性校验(不一致拦截,提示两者编号;货主编码未维护时提示货主名称) if (!shipperIds.isEmpty() && !customer.getUserId().equals(shipperIds.get(0).get("shipperId"))) { Object materialShipperCode = shipperIds.get(0).get("shipperCode");