手动分配子项修改

This commit is contained in:
秦鸿展
2026-02-13 09:27:12 +08:00
parent 53f8ed1014
commit 86db4db68e
2 changed files with 108 additions and 7 deletions
@@ -119,7 +119,7 @@ public class ShiftMaterialDetailApplicationService {
}
// 性能优化:批量获取批次属性,避免N+1查询问题
// 1. 收集所有唯一的materialBaseInfoId
// 1. 收集所有唯一的materialBaseInfoId(包括子项的,此时子项还未构建,所以直接遍历所有项)
Set<Long> materialBaseInfoIdSet = list.stream()
.map(ShiftMaterialDetailPO::getMaterialBaseInfoId)
.filter(Objects::nonNull)
@@ -146,18 +146,47 @@ public class ShiftMaterialDetailApplicationService {
}
}
// 3. 为每个物料明细设置更多属性(从库存表中获取值
setMaterialMoreDetailListFromInventory(list, batchDetailMap);
// 3. 构建父子关系(类似queryListChildren的逻辑
List<ShiftMaterialDetailPO> parentList = list.stream()
.filter(e -> e.getLevel() != null && e.getLevel() == 1)
.collect(Collectors.toList());
return list;
// 递归构建子项关系
parentList.forEach(parent -> {
List<ShiftMaterialDetailPO> children = getChildren(parent.getUniqueId(), list, 2);
parent.setChildren(children);
});
// 4. 为每个物料明细(包括子项)设置更多属性(从库存表中获取值)
setMaterialMoreDetailListFromInventoryRecursively(parentList, batchDetailMap);
return parentList;
}
/**
* 为移位物料明细设置更多属性(从库存表中获取值)
* 递归获取子项
*/
private List<ShiftMaterialDetailPO> getChildren(Long parentUniqueId, List<ShiftMaterialDetailPO> allList, Integer maxLevel) {
List<ShiftMaterialDetailPO> 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<ShiftMaterialDetailPO> shiftMaterialDetailPOList,
private void setMaterialMoreDetailListFromInventoryRecursively(List<ShiftMaterialDetailPO> shiftMaterialDetailPOList,
Map<Long, List<BatchDetailFeignPO>> 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);
}
});
}
@@ -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<ShiftManageMapper, ShiftManage>
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<ShiftManageMapper, ShiftManage>
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<ShiftMaterialDetailDO> 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;