diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java index 22a2338ea..c6049a450 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java @@ -69,7 +69,52 @@ public class PickingOrderApplicationService { AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); pickingOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); } - return pickingOrderDomainService.queryList(pickingOrderDO); + List pickingOrderPOList = pickingOrderDomainService.queryList(pickingOrderDO); + + // 重新计算物料种类数:按料号去重,一个料号算一种物料 + if (!CollectionUtils.isEmpty(pickingOrderPOList)) { + // 收集所有拣货单号 + List pickingOrderNumbers = pickingOrderPOList.stream() + .map(PickingOrderPO::getPickingOrderNumber) + .filter(Objects::nonNull) + .filter(number -> !number.trim().isEmpty()) + .collect(Collectors.toList()); + + if (!pickingOrderNumbers.isEmpty()) { + // 批量查询所有拣货单的物料明细(循环查询每个拣货单的物料明细) + Map> materialDetailsByOrderNumber = new HashMap<>(); + for (String pickingOrderNumber : pickingOrderNumbers) { + PickingMaterialDetailDO pickingMaterialDetailDO = new PickingMaterialDetailDO(); + pickingMaterialDetailDO.setPickingOrderNumber(pickingOrderNumber); + List materialDetails = pickingMaterialDetailDomainService.queryList(pickingMaterialDetailDO); + if (!CollectionUtils.isEmpty(materialDetails)) { + materialDetailsByOrderNumber.put(pickingOrderNumber, materialDetails); + } + } + + // 为每个拣货单计算物料种类数(按料号去重) + for (PickingOrderPO pickingOrderPO : pickingOrderPOList) { + String pickingOrderNumber = pickingOrderPO.getPickingOrderNumber(); + if (pickingOrderNumber != null && materialDetailsByOrderNumber.containsKey(pickingOrderNumber)) { + List materialDetails = materialDetailsByOrderNumber.get(pickingOrderNumber); + // 按料号去重,计算物料种类数 + long materialQuantity = materialDetails.stream() + .map(PickingMaterialDetailPO::getMaterialCode) + .filter(Objects::nonNull) + .filter(code -> !code.trim().isEmpty()) + .distinct() + .count(); + pickingOrderPO.setMaterialQuantity((int) materialQuantity); + log.debug("重新计算物料种类数 - 拣货单号: {}, 物料种类数: {}", pickingOrderNumber, materialQuantity); + } else { + // 如果没有物料明细,物料种类数为0 + pickingOrderPO.setMaterialQuantity(0); + } + } + } + } + + return pickingOrderPOList; }