From 353300b643da46d1695e27cd48e2a40efe0c9fc8 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 26 Aug 2026 16:56:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=E5=87=BA=E5=85=A5=E5=BA=93=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=A2=9E=E5=8A=A0=E6=96=99=E5=8F=B7=E4=B8=8E=E8=A7=84?= =?UTF-8?q?=E6=A0=BC=E5=9E=8B=E5=8F=B7/SKU=E7=A0=81=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E6=80=A7=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 按料号查物料档案后逐项比对,任何一项不符直接报对应错误:规格型号/SKU码必须与档案完全一致(trim后比较) - Excel留空而档案有值、或Excel填值而档案为空,均视为不一致报错(提示Excel:空/档案:空) - SKU码以档案条码(bar_code)为比对基准;出库料号已填写但货主下查不到时直接报错,不再被SKU码/商品名称静默兜底(与入库对齐 --- .../StockInOrderApplicationService.java | 26 +++++-------- .../listener/ExcelParseService.java | 38 +++++++++---------- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java index 31bea8a0a..898f94e6d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java @@ -1827,8 +1827,6 @@ public class StockInOrderApplicationService { .collect(Collectors.groupingBy(r -> StringUtils.isBlank(r.getConsignmentNo()) ? "__EMPTY_CONSIGNMENT__" : r.getConsignmentNo())); List orderList = new ArrayList<>(); - // 收集"料号与规格型号/SKU码不一致"的错误行,最后统一抛出,避免用户修一行导一次 - List consistencyErrors = new ArrayList<>(); for (Map.Entry> entry : groupMap.entrySet()) { List groupRows = entry.getValue(); StockInOrderImportRowDTO h = groupRows.get(0); @@ -2047,20 +2045,21 @@ public class StockInOrderApplicationService { log.error(errorMsg); throw new ServiceException(errorMsg); } - // 校验料号与规格型号/SKU码的一致性:档案有值就必须一致(Excel留空视为不一致);档案为空则跳过该项 + // 校验料号与规格型号/SKU码一致性:按料号查到档案后逐项比对,任何一项不符直接报对应错误 + // 双方(trim后)必须完全一致:Excel留空而档案有值、或Excel填了值而档案为空,均视为不一致报错 String excelSpec = StringUtils.trimToEmpty(r.getSpecificationModel()); - if (StringUtils.isNotBlank(materialBaseInfoPO.getSpecificationModel()) - && !excelSpec.equals(materialBaseInfoPO.getSpecificationModel().trim())) { - consistencyErrors.add(String.format("料号[%s](商品名称:%s)规格型号与物料档案不一致(Excel:%s / 档案:%s)", + String dbSpec = StringUtils.trimToEmpty(materialBaseInfoPO.getSpecificationModel()); + if (!excelSpec.equals(dbSpec)) { + throw new ServiceException(String.format("导入失败:料号[%s](商品名称:%s)规格型号与物料档案不一致(Excel:%s / 档案:%s)", r.getMaterialCode(), r.getMaterialName(), - excelSpec.isEmpty() ? "空" : excelSpec, materialBaseInfoPO.getSpecificationModel().trim())); + excelSpec.isEmpty() ? "空" : excelSpec, dbSpec.isEmpty() ? "空" : dbSpec)); } String excelSku = StringUtils.trimToEmpty(r.getSkuCode()); - if (StringUtils.isNotBlank(materialBaseInfoPO.getBarCode()) - && !excelSku.equals(materialBaseInfoPO.getBarCode().trim())) { - consistencyErrors.add(String.format("料号[%s](商品名称:%s)SKU码与物料档案不一致(Excel:%s / 档案:%s)", + String dbSku = StringUtils.trimToEmpty(materialBaseInfoPO.getBarCode()); + if (!excelSku.equals(dbSku)) { + throw new ServiceException(String.format("导入失败:料号[%s](商品名称:%s)SKU码与物料档案不一致(Excel:%s / 档案:%s)", r.getMaterialCode(), r.getMaterialName(), - excelSku.isEmpty() ? "空" : excelSku, materialBaseInfoPO.getBarCode().trim())); + excelSku.isEmpty() ? "空" : excelSku, dbSku.isEmpty() ? "空" : dbSku)); } // 数量已在前面检查过,这里直接使用 @@ -2203,11 +2202,6 @@ public class StockInOrderApplicationService { if (orderList.isEmpty()) { throw new ServiceException("导入失败:所有入库单的明细行都因数据不完整(数量为空或物料基础信息缺失)被跳过,请检查Excel数据"); } - // 存在料号与规格型号/SKU码不一致的明细行时,拒绝导入并一次性提示全部问题行 - if (!consistencyErrors.isEmpty()) { - throw new ServiceException("导入失败,以下明细行的规格型号/SKU码与物料档案不一致,请修正后重新导入:\n" - + String.join("\n", consistencyErrors)); - } return stockInOrderDomainService.batchInsert(orderList); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/listener/ExcelParseService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/listener/ExcelParseService.java index a933251e5..fa6146503 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/listener/ExcelParseService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/listener/ExcelParseService.java @@ -112,8 +112,7 @@ public class ExcelParseService { LoginUser loginUser = SecurityUtils.getLoginUser(); Long topOrganizationId = loginUser != null && loginUser.getUserPo() != null ? loginUser.getUserPo().getTopOrganizationId() : null; - StringBuilder materialConsistencyErrors = new StringBuilder(); - initList(itemList, warehouseId, warehouseCode, warehouseName, shipperId, topOrganizationId, materialConsistencyErrors); + initList(itemList, warehouseId, warehouseCode, warehouseName, shipperId, topOrganizationId); stockOutOrder.setMaterialDetailList(itemList); stockOutOrder.setWarehouseName(warehouseName); stockOutOrder.setWarehouseCode(warehouseCode); @@ -171,10 +170,6 @@ public class ExcelParseService { for (String dateError : headerListener.getDateParseErrors()) { errorMsg.append(dateError).append("; "); } - // 物料一致性校验错误与必填校验错误合并,任一有错都不落库 - if (materialConsistencyErrors.length() > 0) { - errorMsg.insert(0, materialConsistencyErrors); - } if (errorMsg.length() > 0) { return errorMsg; } else { @@ -425,7 +420,8 @@ public class ExcelParseService { * @param shipperId 货主ID(用于过滤物料基础信息,确保查询到的是该货主绑定的物料) * @param topOrganizationId 一级组织ID(用于过滤物料基础信息) */ - private void initList(List outMaterialDetailDOList, Long warehouseId, String warehouseCode, String warehouseName, Long shipperId, Long topOrganizationId, StringBuilder materialConsistencyErrors) { for (OutMaterialDetailDO outMaterialDetailDO : outMaterialDetailDOList) { + private void initList(List outMaterialDetailDOList, Long warehouseId, String warehouseCode, String warehouseName, Long shipperId, Long topOrganizationId) { + for (OutMaterialDetailDO outMaterialDetailDO : outMaterialDetailDOList) { outMaterialDetailDO.setWarehouseId(warehouseId); outMaterialDetailDO.setWarehouseCode(warehouseCode); outMaterialDetailDO.setWarehouseName(warehouseName); @@ -457,25 +453,25 @@ public class ExcelParseService { if (materialList != null && !materialList.isEmpty()) { materialBaseInfoPO = materialList.get(0); materialBaseInfoId = materialBaseInfoPO.getMaterialBaseInfoId(); - // ==== 新增:料号与规格型号/SKU码一致性校验(档案有值就必须一致,Excel留空视为不一致;档案为空跳过)==== + BigDecimal unitPrice = materialBaseInfoPO.getUnitPrice(); + outMaterialDetailDO.setUnitPrice(unitPrice); + // ==== 料号与规格型号/SKU码一致性校验:任何一项不符直接报对应错误 ==== + // 双方(trim后)必须完全一致:Excel留空而档案有值、或Excel填了值而档案为空,均视为不一致报错 String excelSpec = StringUtils.trimToEmpty(outMaterialDetailDO.getSpecificationModel()); - if (StringUtils.isNotBlank(materialBaseInfoPO.getSpecificationModel()) - && !excelSpec.equals(materialBaseInfoPO.getSpecificationModel().trim())) { - materialConsistencyErrors.append("料号「").append(outMaterialDetailDO.getMaterialNo()) - .append("」规格型号与物料档案不一致(Excel:").append(excelSpec.isEmpty() ? "空" : excelSpec) - .append(" / 档案:").append(materialBaseInfoPO.getSpecificationModel().trim()).append("); "); + String dbSpec = StringUtils.trimToEmpty(materialBaseInfoPO.getSpecificationModel()); + if (!excelSpec.equals(dbSpec)) { + throw new ServiceException(String.format("导入失败:料号「%s」规格型号与物料档案不一致(Excel:%s / 档案:%s)", + materialNo, excelSpec.isEmpty() ? "空" : excelSpec, dbSpec.isEmpty() ? "空" : dbSpec)); } String excelSku = StringUtils.trimToEmpty(outMaterialDetailDO.getSkucode()); - if (StringUtils.isNotBlank(materialBaseInfoPO.getBarCode()) - && !excelSku.equals(materialBaseInfoPO.getBarCode().trim())) { - materialConsistencyErrors.append("料号「").append(outMaterialDetailDO.getMaterialNo()) - .append("」SKU码与物料档案不一致(Excel:").append(excelSku.isEmpty() ? "空" : excelSku) - .append(" / 档案:").append(materialBaseInfoPO.getBarCode().trim()).append("); "); + String dbSku = StringUtils.trimToEmpty(materialBaseInfoPO.getBarCode()); + if (!excelSku.equals(dbSku)) { + throw new ServiceException(String.format("导入失败:料号「%s」SKU码与物料档案不一致(Excel:%s / 档案:%s)", + materialNo, excelSku.isEmpty() ? "空" : excelSku, dbSku.isEmpty() ? "空" : dbSku)); } - }else { + } else { // 料号已填写但在该货主下查不到 → 直接报错(与入库导入一致),不再被SKU码/商品名称静默兜底 - materialConsistencyErrors.append("料号「").append(materialNo) - .append("」在当前客户(货主)下不存在,请核对料号或在物料管理中维护;"); + throw new ServiceException(String.format("导入失败:料号「%s」在当前客户(货主)下不存在,请核对料号或在物料管理中维护", materialNo)); } }