From 801c9fec3d061ca7a550df315c5f28549b7d36ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Wed, 11 Feb 2026 10:55:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=8D=95=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E6=94=B6=E8=B4=A7=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockInOrderApplicationService.java | 27 +-- .../service/StockInOrderDomainService.java | 165 +++++++++++++++ .../StockReceiptOrderDomainService.java | 194 ++++++++++++++++++ 3 files changed, 365 insertions(+), 21 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 002ed078e..305a161a0 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 @@ -73,28 +73,13 @@ public class StockInOrderApplicationService { if (topOrganizationId != null && topOrganizationId != 1){ stockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); } - try { - // 直接从数据库查询当前登录用户选择的仓库,不使用缓存 - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoFromDb(loginUser.getUserid()); - if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) { - AssociationWarehouseCacheDO associationWarehouseCacheDO = JSON.parseObject( - JSONObject.toJSONString(ajaxResult.get("data")), - AssociationWarehouseCacheDO.class); - if (associationWarehouseCacheDO != null) { - if (associationWarehouseCacheDO.getWarehouseId() != null) { - stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); - } - if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseCode())) { - stockInOrderDO.setWarehouseCode(associationWarehouseCacheDO.getWarehouseCode()); - } - if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseName())) { - stockInOrderDO.setWarehouseName(associationWarehouseCacheDO.getWarehouseName()); - } - } + // 前端有传warehouseId则优先使用传参;未传时才使用"用户关联仓库"作为默认值 + if (stockInOrderDO.getWarehouseId() == null) { + AssociationWarehouseCacheDO associationWarehouseCacheDO = + SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO != null) { + stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); } - } catch (Exception e) { - // 如果获取仓库信息失败,记录日志但不影响查询(允许查询所有仓库) - log.warn("获取用户关联仓库信息失败,将查询所有仓库数据,用户ID:{},错误:{}", loginUser.getUserid(), e.getMessage()); } } return stockInOrderDomainService.queryList(stockInOrderDO); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java index f755574a1..de3cc88a6 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java @@ -26,7 +26,12 @@ import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWa import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO; import com.mhd.wms.domain.qualityInspection.repository.facade.IQualityInspectionService; import com.mhd.wms.domain.qualityInspection.repository.todo.QualityInspectionDO; +import com.mhd.wms.domain.receiptMaterialDetail.repository.facade.IReceiptMaterialDetailService; +import com.mhd.wms.domain.receiptMaterialDetail.repository.po.ReceiptMaterialDetailPO; import com.mhd.wms.domain.receiptMaterialDetail.repository.todo.ReceiptMaterialDetailDO; +import com.mhd.wms.domain.shelfMaterialDetail.repository.facade.IShelfMaterialDetailService; +import com.mhd.wms.domain.shelfMaterialDetail.repository.po.ShelfMaterialDetailPO; +import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO; import com.mhd.wms.domain.stockInOrder.entity.StockInOrder; import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService; import com.mhd.wms.domain.stockInOrder.repository.po.StockInOrderPO; @@ -34,6 +39,9 @@ import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO; import com.mhd.wms.domain.stockReceiptOrder.repository.po.StockReceiptOrderPO; import com.mhd.wms.domain.stockReceiptOrder.repository.todo.StockReceiptOrderDO; import com.mhd.wms.domain.stockReceiptOrder.service.StockReceiptOrderDomainService; +import com.mhd.wms.domain.stockShelfOrder.repository.po.StockShelfOrderPO; +import com.mhd.wms.domain.stockShelfOrder.repository.todo.StockShelfOrderDO; +import com.mhd.wms.domain.stockShelfOrder.service.StockShelfOrderDomainService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -62,6 +70,8 @@ public class StockInOrderDomainService { @Autowired private StockReceiptOrderDomainService stockReceiptOrderDomainService; @Autowired + private StockShelfOrderDomainService stockShelfOrderDomainService; + @Autowired private IQualityInspectionService qualityInspectionService; @Autowired private IMaterialBaseInfoService materialBaseInfoService; @@ -71,6 +81,10 @@ public class StockInOrderDomainService { private IMaterialWarehouseControlService materialWarehouseControlService; @Autowired private SystemServiceFeign systemServiceFeign; + @Autowired + private IReceiptMaterialDetailService receiptMaterialDetailService; + @Autowired + private IShelfMaterialDetailService shelfMaterialDetailService; /** * 分页查询入库单列表 @@ -180,10 +194,161 @@ public class StockInOrderDomainService { inMaterialDetailDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); inMaterialDetailDO.setLevel(1); List inMaterialDetailPOList = materialDetailService.queryList(inMaterialDetailDO); + + // 先通过入库单号查询收货单列表 + StockReceiptOrderDO stockReceiptOrderDO = new StockReceiptOrderDO(); + stockReceiptOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); + List stockReceiptOrderPOList = stockReceiptOrderDomainService.queryList(stockReceiptOrderDO); + + // 先通过入库单号查询上架单列表 + StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO(); + stockShelfOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); + List stockShelfOrderPOList = stockShelfOrderDomainService.queryList(stockShelfOrderDO); + + // 查询收货单明细,用于填充收货数量和更新毛重、净重、面积、体积 + List receiptMaterialDetailPOList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(stockReceiptOrderPOList)) { + List receiptOrderNumberList = stockReceiptOrderPOList.stream() + .map(StockReceiptOrderPO::getReceiptOrderNumber) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(receiptOrderNumberList)) { + ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO(); + receiptMaterialDetailDO.setReceiptOrderNumberList(receiptOrderNumberList); + receiptMaterialDetailPOList = receiptMaterialDetailService.queryList(receiptMaterialDetailDO); + } + } + + // 查询上架单明细,用于填充上架数量 + List shelfMaterialDetailPOList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(stockShelfOrderPOList)) { + for (StockShelfOrderPO stockShelfOrderPO : stockShelfOrderPOList) { + if (StringUtils.isNotBlank(stockShelfOrderPO.getShelfOrderNumber())) { + ShelfMaterialDetailDO shelfMaterialDetailDO = new ShelfMaterialDetailDO(); + shelfMaterialDetailDO.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber()); + List shelfDetails = shelfMaterialDetailService.queryList(shelfMaterialDetailDO); + if (!CollectionUtils.isEmpty(shelfDetails)) { + shelfMaterialDetailPOList.addAll(shelfDetails); + } + } + } + } + + // 按 materialDetailId 分组汇总收货数量和上架数量,以及更新毛重、净重、面积、体积 + if (!CollectionUtils.isEmpty(inMaterialDetailPOList)) { + // 按 materialDetailId 分组汇总收货数量(实际收货数量)、毛重、净重、面积、体积 + // 收货数量:入库单对应的收货单实际收货数量汇总 + Map receiptDetailMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(receiptMaterialDetailPOList)) { + // 递归处理所有层级的收货单明细(包括子明细) + for (ReceiptMaterialDetailPO receiptDetail : receiptMaterialDetailPOList) { + processReceiptDetail(receiptDetail, receiptDetailMap); + } + } + + // 按 materialDetailId 分组汇总上架数量(实际上架数量) + // 上架数量:入库单对应的上架单实际上架数量汇总 + Map shelfQuantityMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(shelfMaterialDetailPOList)) { + for (ShelfMaterialDetailPO shelfDetail : shelfMaterialDetailPOList) { + if (shelfDetail.getMaterialDetailId() != null && shelfDetail.getShelvesQuantity() != null) { + Long materialDetailId = shelfDetail.getMaterialDetailId(); + BigDecimal shelvesQuantity = shelfQuantityMap.getOrDefault(materialDetailId, BigDecimal.ZERO); + shelfQuantityMap.put(materialDetailId, shelvesQuantity.add(shelfDetail.getShelvesQuantity())); + } + } + } + + // 填充入库单明细的收货数量、上架数量,以及更新毛重、净重、面积、体积 + for (InMaterialDetailPO inMaterialDetail : inMaterialDetailPOList) { + Long materialDetailId = inMaterialDetail.getMaterialDetailId(); + if (materialDetailId != null) { + // 填充收货数量(入库单对应的收货单实际收货数量) + ReceiptMaterialDetailPO receiptDetail = receiptDetailMap.get(materialDetailId); + if (receiptDetail != null) { + // 更新收货数量 + if (receiptDetail.getReceiptQuantity() != null) { + inMaterialDetail.setReceiptQuantity(receiptDetail.getReceiptQuantity()); + } + + // 更新毛重、净重、面积、体积(根据收货时所填的明细行数据更新到入库单明细中) + // 将收货单明细中填写的数据汇总后更新到入库单明细 + if (receiptDetail.getTotalGrossWeight() != null) { + inMaterialDetail.setTotalGrossWeight(receiptDetail.getTotalGrossWeight()); + } + if (receiptDetail.getTotalNetWeight() != null) { + inMaterialDetail.setTotalNetWeight(receiptDetail.getTotalNetWeight()); + } + if (receiptDetail.getTotalArea() != null) { + inMaterialDetail.setTotalArea(receiptDetail.getTotalArea()); + } + if (receiptDetail.getTotalVolume() != null) { + inMaterialDetail.setTotalVolume(receiptDetail.getTotalVolume()); + } + } + + // 填充上架数量(入库单对应的上架单实际上架数量) + BigDecimal shelvesQuantity = shelfQuantityMap.get(materialDetailId); + if (shelvesQuantity != null) { + inMaterialDetail.setShelvesQuantity(shelvesQuantity); + } + } + } + } + stockInOrderPO.setMaterialDetailList(inMaterialDetailPOList); return stockInOrderPO; } + /** + * 递归处理收货单明细,汇总毛重、净重、面积、体积 + * @param receiptDetail 收货单明细 + * @param receiptDetailMap 收货单明细汇总Map + */ + private void processReceiptDetail(ReceiptMaterialDetailPO receiptDetail, Map receiptDetailMap) { + if (receiptDetail == null || receiptDetail.getMaterialDetailId() == null) { + return; + } + + Long materialDetailId = receiptDetail.getMaterialDetailId(); + ReceiptMaterialDetailPO existing = receiptDetailMap.get(materialDetailId); + + if (existing == null) { + // 如果不存在,直接放入Map + receiptDetailMap.put(materialDetailId, receiptDetail); + } else { + // 如果已存在,汇总收货数量、毛重、净重、面积、体积 + // 汇总收货数量(实际收货数量) + BigDecimal receiptQuantity = existing.getReceiptQuantity() != null ? existing.getReceiptQuantity() : BigDecimal.ZERO; + BigDecimal newReceiptQuantity = receiptDetail.getReceiptQuantity() != null ? receiptDetail.getReceiptQuantity() : BigDecimal.ZERO; + existing.setReceiptQuantity(receiptQuantity.add(newReceiptQuantity)); + + // 汇总毛重、净重、面积、体积(根据收货时填写的数据) + // 累加所有收货单明细的毛重、净重、面积、体积 + BigDecimal existingGrossWeight = existing.getTotalGrossWeight() != null ? existing.getTotalGrossWeight() : BigDecimal.ZERO; + BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO; + existing.setTotalGrossWeight(existingGrossWeight.add(newGrossWeight)); + + BigDecimal existingNetWeight = existing.getTotalNetWeight() != null ? existing.getTotalNetWeight() : BigDecimal.ZERO; + BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO; + existing.setTotalNetWeight(existingNetWeight.add(newNetWeight)); + + BigDecimal existingArea = existing.getTotalArea() != null ? existing.getTotalArea() : BigDecimal.ZERO; + BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO; + existing.setTotalArea(existingArea.add(newArea)); + + BigDecimal existingVolume = existing.getTotalVolume() != null ? existing.getTotalVolume() : BigDecimal.ZERO; + BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO; + existing.setTotalVolume(existingVolume.add(newVolume)); + } + + // 递归处理子明细 + if (!CollectionUtils.isEmpty(receiptDetail.getChildren())) { + for (ReceiptMaterialDetailPO child : receiptDetail.getChildren()) { + processReceiptDetail(child, receiptDetailMap); + } + } + } /** * @description 审核入库单 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java index 189eecbe6..9df36dfb3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java @@ -24,6 +24,7 @@ import com.mhd.wms.domain.containerUsageRecord.repository.facade.IContainerUsage import com.mhd.wms.domain.containerUsageRecord.repository.todo.ContainerUsageRecordDO; import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService; import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO; +import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.facade.IInMaterialDetailSerialNumberService; @@ -388,6 +389,8 @@ public class StockReceiptOrderDomainService { genInventoryStandingReport(stockReceiptOrderPO, stockReceiptOrderDO); //修改物料明细信息 receiptMaterialDetailService.batchReceiptUpdate(stockReceiptOrderDO); + //同步更新入库单明细的收货数量、总毛重、总净重、总面积、总体积 + syncUpdateInMaterialDetailFromReceipt(stockReceiptOrderDO, stockReceiptOrderPO); //生成 收货作业单 genStockReceiptTaskOrderByReceivingGoods(stockReceiptOrderPO,stockReceiptOrderDO); //收货后上架前 生成质检 @@ -400,6 +403,197 @@ public class StockReceiptOrderDomainService { } + /** + * 同步更新入库单明细的收货数量、总毛重、总净重、总面积、总体积 + * 根据收货单明细中填写的数据,按materialDetailId分组汇总后更新到入库单明细 + * @param stockReceiptOrderDO 收货单DO + * @param stockReceiptOrderPO 收货单PO(可选,如果为null则从DO中获取) + */ + private void syncUpdateInMaterialDetailFromReceipt(StockReceiptOrderDO stockReceiptOrderDO, StockReceiptOrderPO stockReceiptOrderPO) { + if (stockReceiptOrderDO == null || StringUtils.isBlank(stockReceiptOrderDO.getReceiptOrderNumber())) { + return; + } + + // 获取入库单号 + String inOrderNumber = stockReceiptOrderDO.getInOrderNumber(); + if (StringUtils.isBlank(inOrderNumber) && stockReceiptOrderPO != null) { + inOrderNumber = stockReceiptOrderPO.getInOrderNumber(); + } + if (StringUtils.isBlank(inOrderNumber) && stockReceiptOrderDO.getReceiptOrderId() != null) { + // 如果收货单DO中没有入库单号,从收货单PO中获取 + StockReceiptOrderPO receiptOrderPO = stockReceiptOrderService.getInfo(stockReceiptOrderDO.getReceiptOrderId()); + if (receiptOrderPO != null) { + inOrderNumber = receiptOrderPO.getInOrderNumber(); + } + } + + if (StringUtils.isBlank(inOrderNumber)) { + log.warn("收货单【{}】没有关联的入库单号,无法同步更新入库单明细", stockReceiptOrderDO.getReceiptOrderNumber()); + return; + } + + log.info("开始同步更新入库单【{}】的明细,收货单号:{}", inOrderNumber, stockReceiptOrderDO.getReceiptOrderNumber()); + + // 查询该入库单对应的所有收货单 + StockReceiptOrderDO queryReceiptOrderDO = new StockReceiptOrderDO(); + queryReceiptOrderDO.setInOrderNumber(inOrderNumber); + List receiptOrderPOList = stockReceiptOrderService.queryList(queryReceiptOrderDO); + + if (CollectionUtils.isEmpty(receiptOrderPOList)) { + return; + } + + // 获取所有收货单号 + List receiptOrderNumberList = receiptOrderPOList.stream() + .map(StockReceiptOrderPO::getReceiptOrderNumber) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(receiptOrderNumberList)) { + return; + } + + // 从数据库查询该入库单对应的所有收货单明细(包括已更新的数据) + ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO(); + receiptMaterialDetailDO.setReceiptOrderNumberList(receiptOrderNumberList); + List receiptMaterialDetailPOList = receiptMaterialDetailService.queryList(receiptMaterialDetailDO); + + if (CollectionUtils.isEmpty(receiptMaterialDetailPOList)) { + return; + } + + // 按unique_id(入库单明细的唯一标识)分组汇总收货数量、总毛重、总净重、总面积、总体积 + // 注意:收货单明细的material_detail_id和入库单明细的material_detail_id是不同的 + // 需要通过in_unique_id(收货单明细)关联到unique_id(入库单明细) + Map> uniqueIdSummaryMap = new HashMap<>(); + + // 递归处理所有层级的收货单明细 + for (ReceiptMaterialDetailPO receiptDetail : receiptMaterialDetailPOList) { + processReceiptDetailPOForSync(receiptDetail, uniqueIdSummaryMap); + } + + // 批量更新入库单明细 + if (!uniqueIdSummaryMap.isEmpty()) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Date updateTime = new Date(); + + log.info("开始同步更新入库单【{}】的明细,共{}个明细需要更新", inOrderNumber, uniqueIdSummaryMap.size()); + + for (Map.Entry> entry : uniqueIdSummaryMap.entrySet()) { + Long uniqueId = entry.getKey(); // 这是入库单明细的unique_id + Map summary = entry.getValue(); + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("unique_id", uniqueId); + updateWrapper.eq("in_order_number", inOrderNumber); + updateWrapper.eq("del_flag", 1); + + boolean hasUpdate = false; + + // 更新收货数量 + if (summary.containsKey("receiptQuantity") && summary.get("receiptQuantity") != null) { + updateWrapper.set("receipt_quantity", summary.get("receiptQuantity")); + hasUpdate = true; + } + + // 更新总毛重 + if (summary.containsKey("totalGrossWeight") && summary.get("totalGrossWeight") != null) { + updateWrapper.set("total_gross_weight", summary.get("totalGrossWeight")); + hasUpdate = true; + } + + // 更新总净重 + if (summary.containsKey("totalNetWeight") && summary.get("totalNetWeight") != null) { + updateWrapper.set("total_net_weight", summary.get("totalNetWeight")); + hasUpdate = true; + } + + // 更新总面积 + if (summary.containsKey("totalArea") && summary.get("totalArea") != null) { + updateWrapper.set("total_area", summary.get("totalArea")); + hasUpdate = true; + } + + // 更新总体积 + if (summary.containsKey("totalVolume") && summary.get("totalVolume") != null) { + updateWrapper.set("total_volume", summary.get("totalVolume")); + hasUpdate = true; + } + + if (hasUpdate) { + updateWrapper.set("update_by", loginUser.getUserid()); + updateWrapper.set("update_by_name", loginUser.getUsername()); + updateWrapper.set("update_time", updateTime); + boolean updateResult = iInMaterialDetailService.update(updateWrapper); + if (updateResult) { + log.info("成功更新入库单明细,uniqueId: {}, 收货数量: {}, 总毛重: {}, 总净重: {}, 总面积: {}, 总体积: {}", + uniqueId, + summary.get("receiptQuantity"), + summary.get("totalGrossWeight"), + summary.get("totalNetWeight"), + summary.get("totalArea"), + summary.get("totalVolume")); + } else { + log.warn("更新入库单明细失败,uniqueId: {}, inOrderNumber: {}", uniqueId, inOrderNumber); + } + } else { + log.debug("入库单明细无需更新,uniqueId: {}", uniqueId); + } + } + log.info("完成同步更新入库单【{}】的明细", inOrderNumber); + } else { + log.warn("入库单【{}】没有需要更新的明细数据", inOrderNumber); + } + } + + /** + * 递归处理收货单明细,汇总收货数量、总毛重、总净重、总面积、总体积 + * @param receiptDetail 收货单明细PO + * @param uniqueIdSummaryMap 汇总Map,key为入库单明细的unique_id(即收货单明细的in_unique_id),value为字段汇总Map + */ + private void processReceiptDetailPOForSync(ReceiptMaterialDetailPO receiptDetail, + Map> uniqueIdSummaryMap) { + if (receiptDetail == null || receiptDetail.getInUniqueId() == null) { + return; + } + + // 使用in_unique_id作为key,因为这是关联到入库单明细的unique_id + Long uniqueId = receiptDetail.getInUniqueId(); + Map summary = uniqueIdSummaryMap.computeIfAbsent(uniqueId, k -> new HashMap<>()); + + // 汇总收货数量 + BigDecimal receiptQuantity = summary.getOrDefault("receiptQuantity", BigDecimal.ZERO); + BigDecimal newReceiptQuantity = receiptDetail.getReceiptQuantity() != null ? receiptDetail.getReceiptQuantity() : BigDecimal.ZERO; + summary.put("receiptQuantity", receiptQuantity.add(newReceiptQuantity)); + + // 汇总总毛重 + BigDecimal totalGrossWeight = summary.getOrDefault("totalGrossWeight", BigDecimal.ZERO); + BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO; + summary.put("totalGrossWeight", totalGrossWeight.add(newGrossWeight)); + + // 汇总总净重 + BigDecimal totalNetWeight = summary.getOrDefault("totalNetWeight", BigDecimal.ZERO); + BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO; + summary.put("totalNetWeight", totalNetWeight.add(newNetWeight)); + + // 汇总总面积 + BigDecimal totalArea = summary.getOrDefault("totalArea", BigDecimal.ZERO); + BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO; + summary.put("totalArea", totalArea.add(newArea)); + + // 汇总总体积 + BigDecimal totalVolume = summary.getOrDefault("totalVolume", BigDecimal.ZERO); + BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO; + summary.put("totalVolume", totalVolume.add(newVolume)); + + // 递归处理子明细 + if (!CollectionUtils.isEmpty(receiptDetail.getChildren())) { + for (ReceiptMaterialDetailPO child : receiptDetail.getChildren()) { + processReceiptDetailPOForSync(child, uniqueIdSummaryMap); + } + } + } + /** * @param stockReceiptOrderDO * @return StockReceiptOrder