From 86db4db68e50e6c58af2017c6df4ba1af6a5b105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Fri, 13 Feb 2026 09:27:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=88=86=E9=85=8D=E5=AD=90?= =?UTF-8?q?=E9=A1=B9=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ShiftMaterialDetailApplicationService.java | 46 +++++++++++-- .../persistence/ShiftManageImpl.java | 69 ++++++++++++++++++- 2 files changed, 108 insertions(+), 7 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftMaterialDetail/ShiftMaterialDetailApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftMaterialDetail/ShiftMaterialDetailApplicationService.java index 256f592ea..08f0fae37 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftMaterialDetail/ShiftMaterialDetailApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/shiftMaterialDetail/ShiftMaterialDetailApplicationService.java @@ -119,7 +119,7 @@ public class ShiftMaterialDetailApplicationService { } // 性能优化:批量获取批次属性,避免N+1查询问题 - // 1. 收集所有唯一的materialBaseInfoId + // 1. 收集所有唯一的materialBaseInfoId(包括子项的,此时子项还未构建,所以直接遍历所有项) Set materialBaseInfoIdSet = list.stream() .map(ShiftMaterialDetailPO::getMaterialBaseInfoId) .filter(Objects::nonNull) @@ -146,18 +146,47 @@ public class ShiftMaterialDetailApplicationService { } } - // 3. 为每个物料明细设置更多属性(从库存表中获取值) - setMaterialMoreDetailListFromInventory(list, batchDetailMap); + // 3. 构建父子关系(类似queryListChildren的逻辑) + List parentList = list.stream() + .filter(e -> e.getLevel() != null && e.getLevel() == 1) + .collect(Collectors.toList()); - return list; + // 递归构建子项关系 + parentList.forEach(parent -> { + List children = getChildren(parent.getUniqueId(), list, 2); + parent.setChildren(children); + }); + + // 4. 为每个物料明细(包括子项)设置更多属性(从库存表中获取值) + setMaterialMoreDetailListFromInventoryRecursively(parentList, batchDetailMap); + + return parentList; } /** - * 为移位物料明细设置更多属性(从库存表中获取值) + * 递归获取子项 + */ + private List getChildren(Long parentUniqueId, List allList, Integer maxLevel) { + List childrenList = allList.stream() + .filter(materialDetailPO -> parentUniqueId != null && parentUniqueId.equals(materialDetailPO.getParentUniqueId())) + .collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(childrenList)) { + childrenList.forEach(child -> { + if (child.getLevel() != null && child.getLevel() < maxLevel) { + child.setChildren(getChildren(child.getUniqueId(), allList, maxLevel)); + } + }); + } + return childrenList; + } + + /** + * 为移位物料明细设置更多属性(从库存表中获取值),递归处理子项 * @param shiftMaterialDetailPOList 移位物料明细列表 * @param batchDetailMap 批次属性Map */ - private void setMaterialMoreDetailListFromInventory(List shiftMaterialDetailPOList, + private void setMaterialMoreDetailListFromInventoryRecursively(List shiftMaterialDetailPOList, Map> batchDetailMap) { if (CollectionUtils.isEmpty(shiftMaterialDetailPOList)) { return; @@ -235,6 +264,11 @@ public class ShiftMaterialDetailApplicationService { shiftMaterialDetailPO.getUniqueId(), shiftMaterialDetailPO.getMaterialBaseInfoId(), shiftMaterialDetailPO.getMaterialInventoryId(), materialMoreDetailList != null ? materialMoreDetailList.size() : 0); + + // 递归处理子项 + if (!CollectionUtils.isEmpty(shiftMaterialDetailPO.getChildren())) { + setMaterialMoreDetailListFromInventoryRecursively(shiftMaterialDetailPO.getChildren(), batchDetailMap); + } }); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java index 1e0f11c85..69edf470c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/repository/persistence/ShiftManageImpl.java @@ -41,6 +41,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; @@ -113,7 +114,9 @@ public class ShiftManageImpl extends ServiceImpl setWarehouseInfo(e); //设置物料信息 setMaterialDetailInfo(e); - e.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId)); + // 设置父级信息 + Long parentUniqueId = idGenerator.snowflakeId(SnowFlakeConstants.wmsId); + e.setUniqueId(parentUniqueId); e.setShiftNumber(shiftManage.getShiftNumber()); e.setOrganizationId(loginUser.getUserPo().getOrganizationId()); e.setOrganizationName(loginUser.getUserPo().getOrganizationName()); @@ -125,10 +128,74 @@ public class ShiftManageImpl extends ServiceImpl e.setUpdateBy(loginUser.getUserid()); e.setUpdateTime(new Date()); e.setSerialNumberManage(e.getSerialNumberManage()); + // 设置父级level为1 + if (e.getLevel() == null) { + e.setLevel(1); + } ShiftMaterialDetail shiftMaterialDetail = new ShiftMaterialDetail(); BeanUtils.copyProperties(e, shiftMaterialDetail); shiftMaterialDetail.setNewStorageLocationName(newStorageLocationName); shiftMaterialDetailList.add(shiftMaterialDetail); + + // 处理子项 + List shiftMaterialDetailDOChildList = e.getChildren(); + if (!CollectionUtils.isEmpty(shiftMaterialDetailDOChildList)) { + for (ShiftMaterialDetailDO shiftMaterialDetailDOChild : shiftMaterialDetailDOChildList) { + // 如果子项没有materialInventoryId,则从父级继承库存相关信息 + if (shiftMaterialDetailDOChild.getMaterialInventoryId() == null) { + // 从父级继承库存相关信息 + shiftMaterialDetailDOChild.setMaterialInventoryId(e.getMaterialInventoryId()); + shiftMaterialDetailDOChild.setMaterialBaseInfoId(e.getMaterialBaseInfoId()); + shiftMaterialDetailDOChild.setMaterialCode(e.getMaterialCode()); + shiftMaterialDetailDOChild.setMaterialName(e.getMaterialName()); + shiftMaterialDetailDOChild.setBarCode(e.getBarCode()); + shiftMaterialDetailDOChild.setInventoryQuantity(e.getInventoryQuantity()); + shiftMaterialDetailDOChild.setOldWarehouseId(e.getOldWarehouseId()); + shiftMaterialDetailDOChild.setOldWarehouseCode(e.getOldWarehouseCode()); + shiftMaterialDetailDOChild.setOldWarehouseName(e.getOldWarehouseName()); + shiftMaterialDetailDOChild.setOldStorageSectionId(e.getOldStorageSectionId()); + shiftMaterialDetailDOChild.setOldStorageCode(e.getOldStorageCode()); + shiftMaterialDetailDOChild.setOldStorageName(e.getOldStorageName()); + shiftMaterialDetailDOChild.setOldStorageLocationId(e.getOldStorageLocationId()); + shiftMaterialDetailDOChild.setOldStorageLocationCode(e.getOldStorageLocationCode()); + shiftMaterialDetailDOChild.setOldStorageLocationName(e.getOldStorageLocationName()); + shiftMaterialDetailDOChild.setBatchNumber(e.getBatchNumber()); + shiftMaterialDetailDOChild.setMaterialStatusCode(e.getMaterialStatusCode()); + shiftMaterialDetailDOChild.setMaterialStatusName(e.getMaterialStatusName()); + shiftMaterialDetailDOChild.setContainerId(e.getContainerId()); + shiftMaterialDetailDOChild.setContainerCode(e.getContainerCode()); + shiftMaterialDetailDOChild.setContainerType(e.getContainerType()); + shiftMaterialDetailDOChild.setContainerTypeName(e.getContainerTypeName()); + } else { + // 如果子项有materialInventoryId,则设置库存信息 + setMaterialInventory(shiftMaterialDetailDOChild); + } + // 设置库位信息和物料信息 + setWarehouseInfo(shiftMaterialDetailDOChild); + setMaterialDetailInfo(shiftMaterialDetailDOChild); + + // 设置子项的uniqueId和parentUniqueId + Long childUniqueId = idGenerator.snowflakeId(SnowFlakeConstants.wmsId); + shiftMaterialDetailDOChild.setUniqueId(childUniqueId); + shiftMaterialDetailDOChild.setParentUniqueId(parentUniqueId); + shiftMaterialDetailDOChild.setShiftNumber(shiftManage.getShiftNumber()); + shiftMaterialDetailDOChild.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + shiftMaterialDetailDOChild.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + shiftMaterialDetailDOChild.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + shiftMaterialDetailDOChild.setCreateByName(loginUser.getUsername()); + shiftMaterialDetailDOChild.setCreateBy(loginUser.getUserid()); + shiftMaterialDetailDOChild.setCreateTime(new Date()); + shiftMaterialDetailDOChild.setUpdateByName(loginUser.getUsername()); + shiftMaterialDetailDOChild.setUpdateBy(loginUser.getUserid()); + shiftMaterialDetailDOChild.setUpdateTime(new Date()); + // 设置子项level为2 + shiftMaterialDetailDOChild.setLevel(2); + + ShiftMaterialDetail shiftMaterialDetailChild = new ShiftMaterialDetail(); + BeanUtils.copyProperties(shiftMaterialDetailDOChild, shiftMaterialDetailChild); + shiftMaterialDetailList.add(shiftMaterialDetailChild); + } + } }); iShiftMaterialDetailService.saveBatch(shiftMaterialDetailList); Boolean b;