From b09b07978ffec2a52e55da390c3c8902c454a1f5 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 19:43:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(oms):=20=E5=87=BA=E5=BA=93=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=89=B9=E6=AC=A1=E5=88=86=E9=85=8D=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=9A=E6=89=B9=E6=AC=A1=E5=8F=B7=E4=BC=98=E5=85=88=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E3=80=81=E7=A7=BB=E9=99=A4=E5=BD=92=E5=B1=9E=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E3=80=81=E5=BA=93=E5=AD=98=E4=B8=8D=E8=B6=B3=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对 c1f483f0 出库导入指定仓库功能的迭代调整: 1. 移除物料仓库归属前置校验(countInventoryByWarehouse):物料档案全仓共享、 不属于任何仓库,仓库约束收敛到批次分配环节——分不到当前仓批次即报库存不足 2. getkcId 增加分配排序:同物料同仓多条可用库存时,有批次号的优先、空批次 沉底、同组按库存ID(入库先后);此前无排序随机取第一条,会分到无批次号的 历史脏数据记录 3. 明细仓库编码/名称兜底:部分历史库存记录只存仓库ID未存编码/名称,按ID 反查仓库表补齐,修复明细仓库只显示ID不显示名称 4. 库存校验改收集式:全部物料批次比较完成后统一报出不足物料清单,原为逐行 分配时立即抛错,首个不足即中断、后续物料不参与比较 --- .../ExecutionStockInOrderImpl.java | 20 -------- .../mapper/ReservationStockInOrderMapper.java | 6 --- .../ReservationStockInOrderImpl.java | 50 ++++++++++++------- .../ReservationStockInOrderMapper.xml | 7 +-- 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/persistence/ExecutionStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/persistence/ExecutionStockInOrderImpl.java index d12764de6..c92312bea 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/persistence/ExecutionStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/persistence/ExecutionStockInOrderImpl.java @@ -259,26 +259,6 @@ public class ExecutionStockInOrderImpl extends ServiceImpl 0) { - String warehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); - List wrongWarehouseMaterials = new ArrayList<>(); - for (ProductDetail productDetail : productDetailList) { - MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode()); - if (materialBaseInfoPO == null) { - continue; - } - int count = reservationStockInOrderMapper.countInventoryByWarehouse(materialBaseInfoPO.getMaterialBaseInfoId(), warehouseId); - if (count <= 0) { - wrongWarehouseMaterials.add(productDetail.getProductCode()); - } - } - if (!wrongWarehouseMaterials.isEmpty()) { - throw new Exception("物料[" + String.join("、", wrongWarehouseMaterials) + "]在当前仓库[" - + (warehouseName == null ? warehouseId : warehouseName) + "]没有库存记录,无法从该仓库出库,请确认导入仓库是否正确"); - } - } - ExecutionStockOutOrderDO reservationStockOutOrderDO = new ExecutionStockOutOrderDO(); reservationStockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); reservationStockOutOrderDO.setShipperId((Long) shipperIds.get(0).get("shipperId")); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java index 95c8d9bc2..6749cbfc2 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java @@ -37,12 +37,6 @@ public interface ReservationStockInOrderMapper extends BaseMapper getkcId(@Param("id") Long id,@Param("q") BigDecimal q, @Param("warehouseId") Long warehouseId); - /** - * 出库导入校验:物料在指定仓库是否存在库存记录(存在即视为归属该仓库,不限数量) - * @return 库存记录数 - */ - public int countInventoryByWarehouse(@Param("id") Long id, @Param("warehouseId") Long warehouseId); - public MaterialWarehouseControlPO getInfoByMaterialBaseInfoIds(@Param("id") Long id); public MaterialGoodsRulePO getGoodsInfoByMaterialBaseInfoIds(@Param("id") Long id); 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 44e1cf151..9d7774ba5 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 @@ -309,24 +309,9 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0) { - String warehouseName = stockInOrderMapper.getWarehouseName(warehouseId); - List wrongWarehouseMaterials = new ArrayList<>(); - for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { - int count = stockInOrderMapper.countInventoryByWarehouse(materialBaseInfoPO.getMaterialBaseInfoId(), warehouseId); - if (count <= 0) { - wrongWarehouseMaterials.add(materialBaseInfoPO.getMaterialCode()); - } - } - if (!wrongWarehouseMaterials.isEmpty()) { - throw new Exception("物料[" + String.join("、", wrongWarehouseMaterials) + "]在当前仓库[" - + (warehouseName == null ? warehouseId : warehouseName) + "]没有库存记录,无法从该仓库出库,请确认导入仓库是否正确"); - } - } - // ====== 后续处理(编号均已存在):货主归属校验、建单落库 ====== + // 物料档案全仓共享、不属于任何仓库;仓库约束在下方"分配批次"环节生效: + // getkcId 按 warehouseId 过滤,分不到当前仓库的批次即报"批次库存数量少于出库数量",不会取到其他仓库的库存 for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { if (materialBaseInfoPO.getShipperId() != null && processedShipperIds.add(materialBaseInfoPO.getShipperId())) { Map shipper = new HashMap<>(); @@ -347,6 +332,28 @@ public class ReservationStockInOrderImpl extends ServiceImpl insufficientMaterials = new HashSet<>(); + for (ProductDetail productDetail : productDetailList) { + MaterialBaseInfoPO materialBaseInfoPO = materialCache.get(productDetail.getProductCode()); + if (materialBaseInfoPO == null) { + continue; // 存在性已在前面统一校验 + } + BigDecimal requireQty = new BigDecimal(productDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP); + List inventoryList = stockInOrderMapper.getkcId( + materialBaseInfoPO.getMaterialBaseInfoId(), requireQty, warehouseId); + if (inventoryList == null || inventoryList.isEmpty()) { + insufficientMaterials.add(productDetail.getProductCode()); + } + } + if (!insufficientMaterials.isEmpty()) { + throw new Exception("物料[" + String.join("、", insufficientMaterials) + "]" + + (warehouseId != null && warehouseId > 0 ? "在当前仓库" : "") + "批次库存数量少于出库数量!"); + } + } + ReservationStockOutOrderDO reservationStockOutOrderDO = new ReservationStockOutOrderDO(); // 生成出库业务单号 String orderNumber = reservationStockOutOrderApplicationService.generateReserveOrderNumber(); @@ -415,6 +422,15 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0) { + if (warehouseCode == null || warehouseCode.trim().isEmpty()) { + warehouseCode = stockInOrderMapper.getWarehouseCode(invWarehouseId); + } + if (warehouseName == null || warehouseName.trim().isEmpty()) { + warehouseName = stockInOrderMapper.getWarehouseName(invWarehouseId); + } + } String inOrderNumber = reservationMaterialInventoryPO.getInOrderNumber(); BigDecimal inventoryQuantity = reservationMaterialInventoryPO.getInventoryQuantity(); String unit = reservationMaterialInventoryPO.getUnit(); diff --git a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml index f2d601503..bc72a3926 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml @@ -559,11 +559,8 @@ and WAREHOUSE_ID = #{warehouseId} - - -