From e0b3ddff04516c67ec15010bac0d18254ffae553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Sat, 18 Apr 2026 11:43:33 +0800 Subject: [PATCH] =?UTF-8?q?WMS=E5=87=BA=E5=BA=93=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockOutOrderApplicationService.java | 74 ++++++++++++------- .../facade/IOutMaterialDetailService.java | 6 ++ .../mapper/OutMaterialDetailMapper.java | 7 ++ .../persistence/OutMaterialDetailImpl.java | 9 +++ .../facade/IPickingMaterialDetailService.java | 6 ++ .../mapper/PickingMaterialDetailMapper.java | 6 ++ .../PickingMaterialDetailImpl.java | 10 +++ .../OutMaterialDetailMapper.xml | 20 +++++ .../PickingMaterialDetailMapper.xml | 16 ++++ .../stockOutOrder/StockOutOrderMapper.xml | 10 ++- 10 files changed, 138 insertions(+), 26 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index 07c3967a6..f1a4a255f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -36,9 +36,11 @@ import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.outMaterialDetail.service.OutMaterialDetailDomainService; import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService; +import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow; import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.stockInOrder.entity.StockInOrder; import com.mhd.wms.domain.receiptOrderAccount.entity.ReceiptOrderAccount; @@ -187,39 +189,61 @@ public class StockOutOrderApplicationService { } List stockOutOrderPOS = stockOutOrderDomainService.queryList(stockOutOrderDO); + if (CollectionUtils.isEmpty(stockOutOrderPOS)) { + return stockOutOrderPOS; + } + List outOrderNumbers = stockOutOrderPOS.stream() + .map(StockOutOrderPO::getOutOrderNumber) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + List orderIds = stockOutOrderPOS.stream() + .map(StockOutOrderPO::getOutOrderId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + Map materialAggByNum = outMaterialDetailService.selectAggregatesForStockOutList(outOrderNumbers).stream() + .collect(Collectors.toMap(OutStockListMaterialAgg::getOutOrderNumber, Function.identity(), (a, b) -> a)); + + Map pickingAggByNum = pickingMaterialDetailService.listPickingAggregatesByOutOrderNumbers(outOrderNumbers).stream() + .collect(Collectors.toMap(PickingAggByOutOrderRow::getOutOrderNumber, Function.identity(), (a, b) -> a)); + + Map> accountByOrderId = Collections.emptyMap(); + if (!CollectionUtils.isEmpty(orderIds)) { + List accounts = receiptOrderAccountService.list( + new LambdaQueryWrapper().in(ReceiptOrderAccount::getOrderId, orderIds)); + accountByOrderId = accounts.stream().collect(Collectors.groupingBy(ReceiptOrderAccount::getOrderId)); + } + for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOS) { - StockOutOrderPO stockOutOrderPO1 = stockOutOrderDomainService.getInfoChildren(stockOutOrderPO.getOutOrderId()); - List materialDetailList = stockOutOrderPO1 != null ? stockOutOrderPO1.getMaterialDetailList() : null; - if (materialDetailList == null) { - materialDetailList = Collections.emptyList(); - } - BigDecimal reduce = materialDetailList.stream().map(OutMaterialDetailPO::getOutboundQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); - stockOutOrderPO.setTotalOutboundQuantity(reduce); - stockOutOrderPO.setAllocationQuantity(stockOutOrderPO1 != null ? stockOutOrderPO1.getAllocationQuantity() : null); String outOrderNumber = stockOutOrderPO.getOutOrderNumber(); - // PDA复核物料总数量:使用实际下发时的拣货完成数量(picking_material_detail),拣货多少显示多少 - // PDA端物料总数量取quantity字段、复核总数量取checkQuantity字段,需同时设置quantity和pickingQuantity - BigDecimal actualPickingQty = pickingMaterialDetailService.sumPickingQuantityByOutOrderNumber(outOrderNumber); - BigDecimal displayPickingQty = actualPickingQty.compareTo(BigDecimal.ZERO) > 0 ? actualPickingQty : (stockOutOrderPO1 != null ? stockOutOrderPO1.getPickingQuantity() : BigDecimal.ZERO); + OutStockListMaterialAgg mag = materialAggByNum.get(outOrderNumber); + BigDecimal reduce = (mag != null && mag.getTotalOutboundQuantity() != null) + ? mag.getTotalOutboundQuantity() : BigDecimal.ZERO; + stockOutOrderPO.setTotalOutboundQuantity(reduce); + // allocation_quantity / picking_quantity(主表)已在 queryList 的 SQL 中带出,无需再 getInfo + + PickingAggByOutOrderRow pk = pickingAggByNum.get(outOrderNumber); + BigDecimal actualPickingQty = (pk != null && pk.getSumPickingQty() != null) + ? pk.getSumPickingQty() : BigDecimal.ZERO; + BigDecimal displayPickingQty = actualPickingQty.compareTo(BigDecimal.ZERO) > 0 + ? actualPickingQty + : (stockOutOrderPO.getPickingQuantity() != null ? stockOutOrderPO.getPickingQuantity() : BigDecimal.ZERO); stockOutOrderPO.setPickingQuantity(displayPickingQty); - stockOutOrderPO.setQuantity(displayPickingQty); - // 物料种类:优先从picking_material_detail统计,为0时从out_material_detail按料号去重 - Integer materialTypeCount = pickingMaterialDetailService.countMaterialTypesByOutOrderNumber(outOrderNumber); + + Integer materialTypeCount = pk != null ? pk.getMaterialTypeCount() : null; if (materialTypeCount != null && materialTypeCount > 0) { stockOutOrderPO.setMaterialQuantity(materialTypeCount); } else { - long count = materialDetailList.stream() - .map(d -> d.getMaterialBaseInfoId() != null ? String.valueOf(d.getMaterialBaseInfoId()) : d.getMaterialCode()) - .filter(Objects::nonNull) - .distinct() - .count(); - stockOutOrderPO.setMaterialQuantity((int) count); + int cnt = (mag != null && mag.getMaterialKindCountDistinct() != null) + ? mag.getMaterialKindCountDistinct() : 0; + stockOutOrderPO.setMaterialQuantity(cnt); } - // 复核总数量:从out_material_detail汇总check_quantity - BigDecimal checkSum = materialDetailList.stream().map(OutMaterialDetailPO::getCheckQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal checkSum = (mag != null && mag.getCheckQuantitySum() != null) + ? mag.getCheckQuantitySum() : BigDecimal.ZERO; stockOutOrderPO.setCheckQuantity(checkSum); - List list = receiptOrderAccountService.list(new LambdaQueryWrapper().eq(ReceiptOrderAccount::getOrderId, stockOutOrderPO.getOutOrderId())); - stockOutOrderPO.setReceiptOrderAccountList(list); + stockOutOrderPO.setReceiptOrderAccountList( + accountByOrderId.getOrDefault(stockOutOrderPO.getOutOrderId(), Collections.emptyList())); } return stockOutOrderPOS; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java index 4dc11fc83..5a2c6c4fc 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; @@ -35,6 +36,11 @@ public interface IOutMaterialDetailService extends IService public List queryListChildren(OutMaterialDetailDO outMaterialDetailDO); + /** + * 出库列表页:按出库单号批量聚合明细(仅 level=1) + */ + List selectAggregatesForStockOutList(List outOrderNumbers); + /** * 新增物料明细 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java index b5084d859..9dc295f5a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java @@ -3,8 +3,10 @@ package com.mhd.wms.domain.outMaterialDetail.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -53,4 +55,9 @@ public interface OutMaterialDetailMapper extends BaseMapper * @return int */ public int batchAddPickingQuantityByUniqueIds(OutMaterialDetailDO outMaterialDetailDO); + + /** + * 出库列表页:按出库单号批量聚合(仅 level=1) + */ + List selectAggregatesForStockOutList(@Param("outOrderNumbers") List outOrderNumbers); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java index 511a238a5..b3114d1d7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java @@ -33,6 +33,7 @@ import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetail import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.outMaterialDetailSerialNumber.entity.OutMaterialDetailSerialNumber; @@ -117,6 +118,14 @@ public class OutMaterialDetailImpl extends ServiceImpl selectAggregatesForStockOutList(List outOrderNumbers) { + if (CollectionUtils.isEmpty(outOrderNumbers)) { + return Collections.emptyList(); + } + return outMaterialDetailMapper.selectAggregatesForStockOutList(outOrderNumbers); + } + private List getChildren(Long parentUniqueId, List materialDetailPOList, Integer maxLevel){ List childrenCityList = materialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(childrenCityList)){ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/facade/IPickingMaterialDetailService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/facade/IPickingMaterialDetailService.java index 95becdcce..fd7a0245c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/facade/IPickingMaterialDetailService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/facade/IPickingMaterialDetailService.java @@ -2,6 +2,7 @@ package com.mhd.wms.domain.pickingMaterialDetail.repository.facade; import com.baomidou.mybatisplus.extension.service.IService; import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail; +import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow; import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO; import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate; @@ -37,6 +38,11 @@ public interface IPickingMaterialDetailService extends IService listPickingAggregatesByOutOrderNumbers(List outOrderNumbers); + /** * 新增拣货单物料明细 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/mapper/PickingMaterialDetailMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/mapper/PickingMaterialDetailMapper.java index cfcac4000..29bf0b13d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/mapper/PickingMaterialDetailMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/mapper/PickingMaterialDetailMapper.java @@ -2,6 +2,7 @@ package com.mhd.wms.domain.pickingMaterialDetail.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail; +import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow; import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO; import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate; @@ -35,6 +36,11 @@ public interface PickingMaterialDetailMapper extends BaseMapper listPickingAggregatesByOutOrderNumbers(@Param("outOrderNumbers") List outOrderNumbers); + /** * 按出库单号查询有拣货数量的 out_unique_id 列表(= out_material_detail.unique_id,即复核单上的明细) */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/persistence/PickingMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/persistence/PickingMaterialDetailImpl.java index a83121073..7e2d6c35f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/persistence/PickingMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/persistence/PickingMaterialDetailImpl.java @@ -16,6 +16,7 @@ import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.todo.OutMater import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail; import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService; import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper; +import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingAggByOutOrderRow; import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO; import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate; @@ -78,6 +79,15 @@ public class PickingMaterialDetailImpl extends ServiceImpl listPickingAggregatesByOutOrderNumbers(List outOrderNumbers) { + if (CollectionUtils.isEmpty(outOrderNumbers)) { + return Collections.emptyList(); + } + List rows = pickingMaterialDetailMapper.listPickingAggregatesByOutOrderNumbers(outOrderNumbers); + return rows != null ? rows : Collections.emptyList(); + } + /** * 新增拣货单物料明细 */ diff --git a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml index 69d11fe73..8d298c27a 100644 --- a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml @@ -409,4 +409,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{item.uniqueId} + + + \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml index 486fd03a4..88f8ad258 100644 --- a/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/pickingMaterialDetail/PickingMaterialDetailMapper.xml @@ -229,6 +229,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND COALESCE(pmd.PICKING_QUANTITY, 0) > 0 + +