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 2f7b422de..90447f556 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 @@ -37,6 +37,7 @@ import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; 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.PickingMaterialDetailPO; import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder; import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService; import com.mhd.wms.domain.stockOutOrder.repository.po.StockOutOrderPO; @@ -269,9 +270,43 @@ public class StockOutOrderApplicationService { // 4. 为每个物料明细设置分配按钮显示类型,递归处理所有层级 setAllocationButtonTypeRecursively(detailList); + // 5. 出库交接场景(已出库/已复核):过滤 pickingQuantity 为 0 的明细,与交接详情一致 + if (stockOutOrderPO.getStatus() != null && (stockOutOrderPO.getStatus() == 9 || stockOutOrderPO.getStatus() == 12)) { + filterMaterialDetailByPickingQuantity(detailList, stockOutOrderPO.getReview(), stockOutOrderPO.getOutOrderNumber()); + } + return stockOutOrderPO; } + /** + * 出库交接场景:递归过滤 pickingQuantity 为 0 的明细(与交接详情一致) + * @param detailList 物料明细树 + * @param review 是否需要复核 1-是 2-否 + * @param outOrderNumber 出库单号(review=1 时用于 picking_material_detail 查询) + */ + private void filterMaterialDetailByPickingQuantity(List detailList, Integer review, String outOrderNumber) { + if (CollectionUtils.isEmpty(detailList)) { + return; + } + for (int i = detailList.size() - 1; i >= 0; i--) { + OutMaterialDetailPO d = detailList.get(i); + List children = d.getChildren(); + if (!CollectionUtils.isEmpty(children)) { + filterMaterialDetailByPickingQuantity(children, review, outOrderNumber); + } + BigDecimal pickQty; + if (Integer.valueOf(1).equals(review) && d.getUniqueId() != null) { + PickingMaterialDetailPO pickingSummary = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(d.getUniqueId()); + pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO; + } else { + pickQty = d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO; + } + if (pickQty.compareTo(BigDecimal.ZERO) <= 0) { + detailList.remove(i); + } + } + } + /** * 递归为出库物料明细设置更多属性 * 如果已分配库存(materialInventoryId不为空),则从库存表中获取批次属性值 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java index 13589daad..d5a7da647 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java @@ -21,6 +21,7 @@ import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder; import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService; +import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper; import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService; import com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO; import com.mhd.wms.domain.pickingOrder.repository.todo.PickingOrderDO; @@ -42,7 +43,9 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * 下发任务Service业务层处理 @@ -79,6 +82,9 @@ public class DeliveTaskImpl extends ServiceImpl im @Autowired private IOutMaterialDetailService outMaterialDetailService; + @Autowired + private PickingMaterialDetailMapper pickingMaterialDetailMapper; + /** * 查询下发任务列表 */ @@ -128,16 +134,7 @@ public class DeliveTaskImpl extends ServiceImpl im BigDecimal pickingQuantity = pickingOrderPOS.getPickingQuantity();//已拣货数量 deliveTaskPO.setPickingQuantity(pickingQuantity); } - // 物料种类数:从出库明细按料号去重统计 - long materialQuantity = outMaterialDetailService.list(new LambdaQueryWrapper() - .eq(OutMaterialDetail::getOutOrderNumber, orderNumber)) - .stream() - .map(d -> d.getMaterialCode() != null && !d.getMaterialCode().isEmpty() ? d.getMaterialCode() : d.getMaterialNo()) - .filter(c -> c != null && !c.isEmpty()) - .distinct() - .count(); - deliveTaskPO.setMaterialQuantity((int) materialQuantity); - // 已复核数量、出库单信息:直接从出库单获取(getCheckInfo仅支持复核中状态会抛异常) + // 已复核数量、出库单信息:直接从出库单获取(需在物料统计前获取,用于判断是否需要复核) StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() .eq(StockOutOrder::getOutOrderNumber, orderNumber)); if (stockOutOrder != null) { @@ -147,6 +144,29 @@ public class DeliveTaskImpl extends ServiceImpl im deliveTaskPO.setCarrier(stockOutOrder.getCarrier()); deliveTaskPO.setCheckQuantity(stockOutOrder.getCheckQuantity());//已复核数量 } + // 物料种类数:从出库明细按料号去重统计,pickingQuantity 为 0 的过滤掉(与交接详情一致) + List omdList = outMaterialDetailService.list(new LambdaQueryWrapper() + .eq(OutMaterialDetail::getOutOrderNumber, orderNumber) + .eq(OutMaterialDetail::getDelFlag, 1)); + Set outUniqueIdsWithPicking = null; + if (stockOutOrder != null && Integer.valueOf(1).equals(stockOutOrder.getReview())) { + List ids = pickingMaterialDetailMapper.selectOutUniqueIdsWithPickingByOutOrderNumber(orderNumber); + outUniqueIdsWithPicking = ids != null ? new HashSet<>(ids) : new HashSet<>(); + } + final Set pickingIds = outUniqueIdsWithPicking; + long materialQuantity = omdList.stream() + .filter(d -> { + if (pickingIds != null) { + return pickingIds.contains(d.getUniqueId()); + } + BigDecimal pq = d.getPickingQuantity(); + return pq != null && pq.compareTo(BigDecimal.ZERO) > 0; + }) + .map(d -> d.getMaterialCode() != null && !d.getMaterialCode().isEmpty() ? d.getMaterialCode() : d.getMaterialNo()) + .filter(c -> c != null && !c.isEmpty()) + .distinct() + .count(); + deliveTaskPO.setMaterialQuantity((int) materialQuantity); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index 3cf3724de..0cde67b58 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -22,6 +22,7 @@ import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryM import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper; import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper; +import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.taskHandoverMaterialDetail.repository.po.TaskHandoverMaterialDetailPO; import com.mhd.wms.domain.shiftManage.repository.po.ShiftManagePO; import com.mhd.wms.domain.shiftManage.repository.todo.ShiftManageDO; @@ -130,6 +131,7 @@ public class HandoverTaskOrderDomainService { List materialDetailList = new ArrayList<>(); for (OutMaterialDetail omd : outMaterialDetailList) { BigDecimal handoverQuantity; + BigDecimal pickQty; if (Integer.valueOf(1).equals(review)) { // 仅包含复核单上的明细(有拣货)且已复核的 if (outUniqueIdsWithPicking != null && !outUniqueIdsWithPicking.contains(omd.getUniqueId())) { @@ -138,12 +140,19 @@ public class HandoverTaskOrderDomainService { if (omd.getCheckQuantity() == null || omd.getCheckQuantity().compareTo(BigDecimal.ZERO) <= 0) { continue; } + // pickingQuantity 为 0 的过滤掉:从 picking_material_detail 取拣货数量 + PickingMaterialDetailPO pickingSummary = pickingMaterialDetailMapper.queryTotalsByOutNumberAndBaseId(omd.getUniqueId()); + pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO; + if (pickQty.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } handoverQuantity = omd.getCheckQuantity(); } else { BigDecimal qty = omd.getPickingQuantity() != null ? omd.getPickingQuantity() : omd.getQuantity(); if (qty == null || qty.compareTo(BigDecimal.ZERO) <= 0) { continue; } + pickQty = qty; handoverQuantity = qty; } TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO(); @@ -160,7 +169,7 @@ public class HandoverTaskOrderDomainService { detail.setWeightLimit(omd.getWeightLimit()); detail.setVolumeLimit(omd.getVolumeLimit()); detail.setQuantity(omd.getQuantity()); - detail.setPickingQuantity(omd.getPickingQuantity()); + detail.setPickingQuantity(pickQty); detail.setCheckQuantity(handoverQuantity); detail.setPackId(omd.getPackId()); detail.setPackCode(omd.getPackCode());