PDA移位修改

This commit is contained in:
秦鸿展
2026-03-14 15:37:56 +08:00
parent 7dac63da34
commit 360ffdc0d3
3 changed files with 91 additions and 21 deletions
@@ -421,7 +421,8 @@ public class ShiftManageApplicationService {
if (!isShiftParentCopy(parent, firstChild)) { if (!isShiftParentCopy(parent, firstChild)) {
continue; continue;
} }
BeanUtils.copyProperties(firstChild, parent, "children", "parentUniqueId", "uniqueId", "shiftIoDetailId"); // 排除 quantity:子项(parent_copy)通常无 quantity,避免覆盖父项的计划数量
BeanUtils.copyProperties(firstChild, parent, "children", "parentUniqueId", "uniqueId", "shiftIoDetailId", "quantity");
List<ShiftMaterialDetailDO> newChildren = new ArrayList<>(); List<ShiftMaterialDetailDO> newChildren = new ArrayList<>();
for (int i = 1; i < children.size(); i++) { for (int i = 1; i < children.size(); i++) {
ShiftMaterialDetailDO c = children.get(i); ShiftMaterialDetailDO c = children.get(i);
@@ -521,15 +522,25 @@ public class ShiftManageApplicationService {
BigDecimal totalShiftQuantity = BigDecimal.ZERO;//移位单当前作业收货数 BigDecimal totalShiftQuantity = BigDecimal.ZERO;//移位单当前作业收货数
int totalActualReceiptMaterialQuantity = 0;//移位单收货物料种数 int totalActualReceiptMaterialQuantity = 0;//移位单收货物料种数
List<ShiftMaterialDetailDO> returnShiftMaterialDetailDOList = new ArrayList<>(); List<ShiftMaterialDetailDO> returnShiftMaterialDetailDOList = new ArrayList<>();
for (ShiftMaterialDetailDO shiftMaterialDetailDO : shiftManageDO.getShiftMaterialDetailList()){ List<ShiftMaterialDetailDO> inputDetailList = shiftManageDO.getShiftMaterialDetailList();
if (CollectionUtils.isEmpty(inputDetailList)) {
throw new ServiceException("物料明细不能为空,请确认已传入 shiftMaterialDetailList 或从 getInfoByApp 获取移位详情");
}
for (ShiftMaterialDetailDO shiftMaterialDetailDO : inputDetailList){
//设置物料更多属性信息 //设置物料更多属性信息
ShiftMaterialDetailPO shiftMaterialDetailPO = shiftMaterialDetailPODbMap.get(shiftMaterialDetailDO.getShiftIoDetailId()); ShiftMaterialDetailPO shiftMaterialDetailPO = shiftMaterialDetailPODbMap.get(shiftMaterialDetailDO.getShiftIoDetailId());
if (shiftMaterialDetailPO == null){ if (shiftMaterialDetailPO == null){
throw new ServiceException("物料明细不存在"); throw new ServiceException("物料明细不存在");
} }
//ShiftQuantity前端传过来是0 他那边不好赋值 和Quantity参数统一;有子项时父级已从 assignFirstChildToParentAndRemove 合并了 parent_copy,不再覆盖 //ShiftQuantity前端传过来是0 他那边不好赋值 和Quantity参数统一;有子项时父级已从 assignFirstChildToParentAndRemove 合并了 parent_copy,不再覆盖
// 注意:assignFirstChildToParentAndRemove 复制时已排除 quantity,避免子项覆盖父项;此处 quantity 为 null 时保留已有 shiftQuantity
if (CollectionUtils.isEmpty(shiftMaterialDetailDO.getChildren())) { if (CollectionUtils.isEmpty(shiftMaterialDetailDO.getChildren())) {
shiftMaterialDetailDO.setShiftQuantity(shiftMaterialDetailDO.getQuantity()); BigDecimal qty = shiftMaterialDetailDO.getQuantity();
if (qty != null) {
shiftMaterialDetailDO.setShiftQuantity(qty);
} else if (shiftMaterialDetailDO.getShiftQuantity() == null) {
shiftMaterialDetailDO.setShiftQuantity(BigDecimal.ZERO);
}
} }
if (shiftMaterialDetailDO.getShiftQuantity() == null || shiftMaterialDetailDO.getShiftQuantity().compareTo(BigDecimal.ZERO) == 0){ if (shiftMaterialDetailDO.getShiftQuantity() == null || shiftMaterialDetailDO.getShiftQuantity().compareTo(BigDecimal.ZERO) == 0){
//未进行移位直接跳过(有子项时父级 shiftQuantity 可能为 0,由子项汇总) //未进行移位直接跳过(有子项时父级 shiftQuantity 可能为 0,由子项汇总)
@@ -608,6 +619,9 @@ public class ShiftManageApplicationService {
returnShiftMaterialDetailDO.setChildren(returnShiftMaterialDetailDOChildList); returnShiftMaterialDetailDO.setChildren(returnShiftMaterialDetailDOChildList);
returnShiftMaterialDetailDOList.add(returnShiftMaterialDetailDO); returnShiftMaterialDetailDOList.add(returnShiftMaterialDetailDO);
} }
if (CollectionUtils.isEmpty(returnShiftMaterialDetailDOList)) {
throw new ServiceException("无有效物料明细可移位,请确认 shiftQuantity>0 或子项有移位数量");
}
returnShiftManageDO.setShiftQuantity(totalShiftQuantity); returnShiftManageDO.setShiftQuantity(totalShiftQuantity);
returnShiftManageDO.setShiftMaterialDetailList(returnShiftMaterialDetailDOList); returnShiftManageDO.setShiftMaterialDetailList(returnShiftMaterialDetailDOList);
returnShiftManageDO.setShiftMaterialQuantity(totalActualReceiptMaterialQuantity); returnShiftManageDO.setShiftMaterialQuantity(totalActualReceiptMaterialQuantity);
@@ -104,6 +104,10 @@ public class ShiftManageDomainService {
Map<Long, List<OutMaterialDetailSerialNumberPO>> inMaterialDetailSerialNumberMap = outMaterialDetailSerialNumberPOList.stream() Map<Long, List<OutMaterialDetailSerialNumberPO>> inMaterialDetailSerialNumberMap = outMaterialDetailSerialNumberPOList.stream()
.collect(Collectors.groupingBy(OutMaterialDetailSerialNumberPO::getMaterialDetailUniqueId)); .collect(Collectors.groupingBy(OutMaterialDetailSerialNumberPO::getMaterialDetailUniqueId));
shiftMaterialDetailPOList.forEach(shiftMaterialDetailPO -> { shiftMaterialDetailPOList.forEach(shiftMaterialDetailPO -> {
// 第一次移位显示:shiftQuantity 等于计划数量 quantity
if (shiftMaterialDetailPO.getShiftQuantity() == null || shiftMaterialDetailPO.getShiftQuantity().compareTo(BigDecimal.ZERO) == 0) {
shiftMaterialDetailPO.setShiftQuantity(shiftMaterialDetailPO.getQuantity() != null ? shiftMaterialDetailPO.getQuantity() : BigDecimal.ZERO);
}
// PDA移位页面:父级也填充批次属性、净重、毛重、面积、体积,保证顶层结构有值 // PDA移位页面:父级也填充批次属性、净重、毛重、面积、体积,保证顶层结构有值
fillMaterialMoreDetailForShiftDetail(shiftMaterialDetailPO); fillMaterialMoreDetailForShiftDetail(shiftMaterialDetailPO);
// 填充 totalNetWeight 等,供 PDA 表单区(移入数量、移入库位、容器旁)显示 // 填充 totalNetWeight 等,供 PDA 表单区(移入数量、移入库位、容器旁)显示
@@ -113,6 +117,10 @@ public class ShiftManageDomainService {
List<ShiftMaterialDetailPO> shiftMaterialDetailPOChildrenNowList = new ArrayList<>(); List<ShiftMaterialDetailPO> shiftMaterialDetailPOChildrenNowList = new ArrayList<>();
ShiftMaterialDetailPO shiftMaterialDetailPOChildrenNow = new ShiftMaterialDetailPO(); ShiftMaterialDetailPO shiftMaterialDetailPOChildrenNow = new ShiftMaterialDetailPO();
BeanUtils.copyProperties(shiftMaterialDetailPO, shiftMaterialDetailPOChildrenNow, "children"); BeanUtils.copyProperties(shiftMaterialDetailPO, shiftMaterialDetailPOChildrenNow, "children");
// parent_copy 首次显示时 shiftQuantity 等于计划数量
if (shiftMaterialDetailPOChildrenNow.getShiftQuantity() == null || shiftMaterialDetailPOChildrenNow.getShiftQuantity().compareTo(BigDecimal.ZERO) == 0) {
shiftMaterialDetailPOChildrenNow.setShiftQuantity(shiftMaterialDetailPOChildrenNow.getQuantity() != null ? shiftMaterialDetailPOChildrenNow.getQuantity() : BigDecimal.ZERO);
}
List<OutMaterialDetailSerialNumberPO> materialDetailSerialNumberList = inMaterialDetailSerialNumberMap.get(shiftMaterialDetailPO.getUniqueId()); List<OutMaterialDetailSerialNumberPO> materialDetailSerialNumberList = inMaterialDetailSerialNumberMap.get(shiftMaterialDetailPO.getUniqueId());
if (!CollectionUtils.isEmpty(materialDetailSerialNumberList)){ if (!CollectionUtils.isEmpty(materialDetailSerialNumberList)){
shiftMaterialDetailPOChildrenNow.setMaterialDetailSerialNumberList(materialDetailSerialNumberList); shiftMaterialDetailPOChildrenNow.setMaterialDetailSerialNumberList(materialDetailSerialNumberList);
@@ -126,18 +134,24 @@ public class ShiftManageDomainService {
shiftMaterialDetailPOChildrenNowList.add(shiftMaterialDetailPOChildrenNow); shiftMaterialDetailPOChildrenNowList.add(shiftMaterialDetailPOChildrenNow);
//子集 //子集
List<ShiftMaterialDetailPO> shiftMaterialDetailPOChildrenList = shiftMaterialDetailPO.getChildren(); List<ShiftMaterialDetailPO> shiftMaterialDetailPOChildrenList = shiftMaterialDetailPO.getChildren();
shiftMaterialDetailPOChildrenList.forEach(receiptMaterialDetailPOChildren -> { if (shiftMaterialDetailPOChildrenList != null) {
fillMaterialMoreDetailForShiftDetail(receiptMaterialDetailPOChildren); shiftMaterialDetailPOChildrenList.forEach(receiptMaterialDetailPOChildren -> {
fillTotalWeightVolumeArea(receiptMaterialDetailPOChildren); // 第一次移位显示:子项 shiftQuantity 等于计划数量
fillNewStorageLocationName(receiptMaterialDetailPOChildren); if (receiptMaterialDetailPOChildren.getShiftQuantity() == null || receiptMaterialDetailPOChildren.getShiftQuantity().compareTo(BigDecimal.ZERO) == 0) {
List<OutMaterialDetailSerialNumberPO> materialDetailSerialNumberChildrenList = inMaterialDetailSerialNumberMap.get(shiftMaterialDetailPO.getUniqueId()); receiptMaterialDetailPOChildren.setShiftQuantity(receiptMaterialDetailPOChildren.getQuantity() != null ? receiptMaterialDetailPOChildren.getQuantity() : BigDecimal.ZERO);
if (!CollectionUtils.isEmpty(materialDetailSerialNumberChildrenList)){ }
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(materialDetailSerialNumberChildrenList); fillMaterialMoreDetailForShiftDetail(receiptMaterialDetailPOChildren);
}else { fillTotalWeightVolumeArea(receiptMaterialDetailPOChildren);
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(new ArrayList<>()); fillNewStorageLocationName(receiptMaterialDetailPOChildren);
} List<OutMaterialDetailSerialNumberPO> materialDetailSerialNumberChildrenList = inMaterialDetailSerialNumberMap.get(shiftMaterialDetailPO.getUniqueId());
}); if (!CollectionUtils.isEmpty(materialDetailSerialNumberChildrenList)){
shiftMaterialDetailPOChildrenNowList.addAll(shiftMaterialDetailPOChildrenList); receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(materialDetailSerialNumberChildrenList);
}else {
receiptMaterialDetailPOChildren.setMaterialDetailSerialNumberList(new ArrayList<>());
}
});
shiftMaterialDetailPOChildrenNowList.addAll(shiftMaterialDetailPOChildrenList);
}
shiftMaterialDetailPO.setChildren(shiftMaterialDetailPOChildrenNowList); shiftMaterialDetailPO.setChildren(shiftMaterialDetailPOChildrenNowList);
}); });
shiftManagePO.setShiftMaterialDetailList(shiftMaterialDetailPOList); shiftManagePO.setShiftMaterialDetailList(shiftMaterialDetailPOList);
@@ -676,10 +690,14 @@ public class ShiftManageDomainService {
ShiftMaterialDetailDO shiftMaterialDetailDO = new ShiftMaterialDetailDO(); ShiftMaterialDetailDO shiftMaterialDetailDO = new ShiftMaterialDetailDO();
shiftMaterialDetailDO.setShiftNumber(shiftNumber); shiftMaterialDetailDO.setShiftNumber(shiftNumber);
List<ShiftMaterialDetailPO> shiftMaterialDetailPOList = shiftMaterialDetailService.queryListChildren(shiftMaterialDetailDO); List<ShiftMaterialDetailPO> shiftMaterialDetailPOList = shiftMaterialDetailService.queryListChildren(shiftMaterialDetailDO);
Map<String, List<MaterialMoreDetailPO>> MaterialMoreDetailMap = shiftMaterialDetailList.stream().collect(Collectors.toMap( // 避免 NPEgetMaterialMoreDetailList 可能为 null;同一 shift 下 shiftNumber 重复需合并
ShiftMaterialDetailDO::getShiftNumber, Map<String, List<MaterialMoreDetailPO>> MaterialMoreDetailMap = shiftMaterialDetailList.stream()
ShiftMaterialDetailDO::getMaterialMoreDetailList .filter(d -> d.getShiftNumber() != null)
)); .collect(Collectors.toMap(
ShiftMaterialDetailDO::getShiftNumber,
d -> d.getMaterialMoreDetailList() != null ? d.getMaterialMoreDetailList() : new ArrayList<>(),
(a, b) -> a
));
for (ShiftMaterialDetailPO shiftMaterialDetailPO : shiftMaterialDetailPOList){ for (ShiftMaterialDetailPO shiftMaterialDetailPO : shiftMaterialDetailPOList){
MaterialInventory materialInventoryOldDb = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId()); MaterialInventory materialInventoryOldDb = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId());
BigDecimal shiftQuantity = shiftMaterialDetailPO.getShiftQuantity(); BigDecimal shiftQuantity = shiftMaterialDetailPO.getShiftQuantity();
@@ -1,9 +1,17 @@
package com.mhd.wms.interfaces.assember.shiftManage; package com.mhd.wms.interfaces.assember.shiftManage;
import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.databind.ObjectMapper;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.wms.domain.shiftManage.repository.todo.ShiftManageDO; import com.mhd.wms.domain.shiftManage.repository.todo.ShiftManageDO;
import com.mhd.wms.domain.shiftMaterialDetail.repository.todo.ShiftMaterialDetailDO;
import com.mhd.wms.interfaces.dto.shiftManage.ShiftManageDTO; import com.mhd.wms.interfaces.dto.shiftManage.ShiftManageDTO;
import com.mhd.wms.interfaces.dto.shiftMaterialDetail.ShiftMaterialDetailDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/** /**
* 移位管理Assembler * 移位管理Assembler
@@ -14,11 +22,41 @@ import org.springframework.stereotype.Component;
@Component @Component
public class ShiftManageAssembler { public class ShiftManageAssembler {
@Autowired
private ObjectMapper objectMapper;
/** /**
* 转换实体 * 转换实体
* ObjectMapper.convertValue 对嵌套 List 的泛型转换可能失败空或 LinkedHashMap 等错误类型
* 因此当 DTO 有物料明细时始终使用 BeanUtils 手动递归转换确保类型正确
*/ */
public ShiftManageDO toDO(ShiftManageDTO shiftManageDTO) { public ShiftManageDO toDO(ShiftManageDTO shiftManageDTO) {
return JSONUtil.toBean(JSONUtil.toJsonStr(shiftManageDTO), ShiftManageDO.class); ShiftManageDO shiftManageDO = objectMapper.convertValue(shiftManageDTO, ShiftManageDO.class);
// 修复始终手动转换 shiftMaterialDetailList避免 ObjectMapper 泛型擦除导致空列表或错误类型
if (!CollectionUtils.isEmpty(shiftManageDTO.getShiftMaterialDetailList())) {
List<ShiftMaterialDetailDO> doList = new ArrayList<>();
for (ShiftMaterialDetailDTO dto : shiftManageDTO.getShiftMaterialDetailList()) {
doList.add(convertShiftMaterialDetailToDO(dto));
}
shiftManageDO.setShiftMaterialDetailList(doList);
}
return shiftManageDO;
}
/**
* 递归转换 ShiftMaterialDetailDTO ShiftMaterialDetailDO children
*/
private ShiftMaterialDetailDO convertShiftMaterialDetailToDO(ShiftMaterialDetailDTO dto) {
ShiftMaterialDetailDO doObj = new ShiftMaterialDetailDO();
BeanUtils.copyProperties(dto, doObj);
if (!CollectionUtils.isEmpty(dto.getChildren())) {
List<ShiftMaterialDetailDO> childDoList = new ArrayList<>();
for (ShiftMaterialDetailDTO childDto : dto.getChildren()) {
childDoList.add(convertShiftMaterialDetailToDO(childDto));
}
doObj.setChildren(childDoList);
}
return doObj;
} }
} }