From 02d4eca559b5bb82db7f7d6b40dcc48aeb6b5613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Sun, 15 Mar 2026 15:08:37 +0800 Subject: [PATCH] =?UTF-8?q?PDA=E7=AB=AF=E5=AE=B9=E5=99=A8=E7=A7=BB?= =?UTF-8?q?=E4=BD=8D=E5=BA=93=E5=AD=98=E8=B0=83=E6=95=B4=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ShiftManageDomainService.java | 74 +++++-- .../facade/IShiftMaterialDetailService.java | 7 + .../persistence/ShiftMaterialDetailImpl.java | 199 ++++++++++++++---- 3 files changed, 218 insertions(+), 62 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/service/ShiftManageDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/service/ShiftManageDomainService.java index f24ee0b24..6c40bf5f5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/service/ShiftManageDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftManage/service/ShiftManageDomainService.java @@ -570,7 +570,7 @@ public class ShiftManageDomainService { } /** - * @description app 容器移位 + * @description app 容器移位(PDA 端直接调用 PC 端移位流程:insert + finishShiftByPC) * @author ZhouGY * @date 2024/7/30 14:24 * @param containerShiftDOList @@ -580,7 +580,11 @@ public class ShiftManageDomainService { public Boolean appMoveContainShift(List containerShiftDOList){ LoginUser loginUser = SecurityUtils.getLoginUser(); String shiftNumber = OrderSequence.getOrderCode("YW"); - List shiftMaterialDetailDOList = shiftMaterialDetailService.appMoveContainShift(containerShiftDOList, shiftNumber); + // 仅构建移位明细结构,不执行库存变更(库存变更由 PC finishShiftByPC 统一处理) + List shiftMaterialDetailDOList = shiftMaterialDetailService.buildShiftMaterialDetailListFromContainerShift(containerShiftDOList); + if (CollectionUtils.isEmpty(shiftMaterialDetailDOList)) { + throw new ServiceException("容器移位明细不能为空"); + } ShiftManageDO shiftManageDO = new ShiftManageDO(); AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); shiftManageDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); @@ -588,7 +592,7 @@ public class ShiftManageDomainService { shiftManageDO.setWarehouseName(associationWarehouseCacheDO.getWarehouseName()); shiftManageDO.setShiftNumber(shiftNumber); shiftManageDO.setRemark("容器移位生成"); - shiftManageDO.setShiftStatus(4);//默认以为完成 + shiftManageDO.setShiftStatus(1);// 先创建为已创建状态,由 finishShiftByPC 完成 shiftManageDO.setAuditStatus(3); shiftManageDO.setAuditBy(loginUser.getUserid()); shiftManageDO.setAuditByName(loginUser.getUsername()); @@ -601,12 +605,22 @@ public class ShiftManageDomainService { shiftManageDO.setQuantity(quantity); shiftManageDO.setShiftQuantity(quantity); shiftManageDO.setShiftMaterialDetailList(shiftMaterialDetailDOList); - //新增移位单 + // 1. 新增移位单(PC insert) insert(shiftManageDO); - //生成移位追溯记录 + // 2. 获取新创建的移位单 ShiftManagePO shiftManagePO = shiftManageService.getInfoByShiftNumber(shiftManageDO.getShiftNumber()); - genInventoryStandingDetail(shiftManagePO); - return true; + if (shiftManagePO == null) { + throw new ServiceException("容器移位单创建失败"); + } + // 3. 调用 PC 完成移位(库存变更、库存调整记录、移位追溯由 finishShiftByPC 统一处理) + ShiftManageDO finishShiftDO = new ShiftManageDO(); + finishShiftDO.setShiftManageId(shiftManagePO.getShiftManageId()); + ShiftMaterialDetailDO queryDO = new ShiftMaterialDetailDO(); + queryDO.setShiftNumber(shiftNumber); + List shiftMaterialDetailPOList = shiftMaterialDetailService.queryListChildren(queryDO); + List finishDetailList = shiftMaterialDetailPOList.stream().map(po -> convertShiftDetailPOToDO(po)).collect(Collectors.toList()); + finishShiftDO.setShiftMaterialDetailList(finishDetailList); + return finishShiftByPC(finishShiftDO); } /** @@ -701,21 +715,24 @@ public class ShiftManageDomainService { )); for (ShiftMaterialDetailPO shiftMaterialDetailPO : shiftMaterialDetailPOList){ MaterialInventory materialInventoryOldDb = materialInventoryService.getById(shiftMaterialDetailPO.getMaterialInventoryId()); - BigDecimal shiftQuantity = shiftMaterialDetailPO.getShiftQuantity(); - //构建新物料库存信息 - shiftMaterialDetailPO.setMaterialMoreDetailList(MaterialMoreDetailMap.get(shiftMaterialDetailPO.getShiftNumber())); -// shiftMaterialDetailPO.setNetWeight(materialInventoryOldDb.getNetWeight()); -// shiftMaterialDetailPO.setGrossWeight(materialInventoryOldDb.getGrossWeight()); -// shiftMaterialDetailPO.setVolume(materialInventoryOldDb.getVolume()); -// shiftMaterialDetailPO.setArea(materialInventoryOldDb.getArea()); -// shiftMaterialDetailPO.setMaterialInventoryId(materialInventoryOldDb.getMaterialInventoryId()); - materialInventoryNowList.add(genMaterialInventory(shiftMaterialDetailPO)); List shiftMaterialDetailPOChildrenList = shiftMaterialDetailPO.getChildren(); - for (ShiftMaterialDetailPO shiftMaterialDetailPOChildren : shiftMaterialDetailPOChildrenList){ - shiftQuantity = shiftQuantity.add(shiftMaterialDetailPOChildren.getShiftQuantity()); - //构建新物料库存信息 - materialInventoryNowList.add(genMaterialInventory(shiftMaterialDetailPOChildren)); - }; + boolean hasChildren = !CollectionUtils.isEmpty(shiftMaterialDetailPOChildrenList); + // 有子项时仅用子项参与库存计算,避免父项+子项重复累加(容器移位已改为扁平结构无子项,此处主要防护按单移位的父子同目标场景) + BigDecimal shiftQuantity; + if (hasChildren) { + shiftQuantity = shiftMaterialDetailPOChildrenList.stream() + .map(c -> c.getShiftQuantity() != null ? c.getShiftQuantity() : BigDecimal.ZERO) + .reduce(BigDecimal.ZERO, BigDecimal::add); + shiftMaterialDetailPO.setMaterialMoreDetailList(MaterialMoreDetailMap.get(shiftMaterialDetailPO.getShiftNumber())); + for (ShiftMaterialDetailPO shiftMaterialDetailPOChildren : shiftMaterialDetailPOChildrenList) { + shiftMaterialDetailPOChildren.setMaterialMoreDetailList(MaterialMoreDetailMap.get(shiftMaterialDetailPO.getShiftNumber())); + materialInventoryNowList.add(genMaterialInventory(shiftMaterialDetailPOChildren)); + } + } else { + shiftQuantity = shiftMaterialDetailPO.getShiftQuantity() != null ? shiftMaterialDetailPO.getShiftQuantity() : BigDecimal.ZERO; + shiftMaterialDetailPO.setMaterialMoreDetailList(MaterialMoreDetailMap.get(shiftMaterialDetailPO.getShiftNumber())); + materialInventoryNowList.add(genMaterialInventory(shiftMaterialDetailPO)); + } if (materialInventoryOldDb.getInventoryQuantity().compareTo(shiftQuantity) < 0){ throw new ServiceException("物料原库位下的物料库存不足,不能进行移位"); } @@ -850,6 +867,9 @@ public class ShiftManageDomainService { } private void BatchAttributeAssignment(List materialMoreDetailList, MaterialInventoryDO materialInventoryDONow) { + if (CollectionUtils.isEmpty(materialMoreDetailList)) { + return; + } for (MaterialMoreDetailPO materialMoreDetailPO : materialMoreDetailList) { if (materialMoreDetailPO == null || materialMoreDetailPO.getBatchLabels() == null) { continue; @@ -894,4 +914,16 @@ public class ShiftManageDomainService { throw new RuntimeException(e); } } + + /** PO 转 DO,含 children 递归转换 */ + private ShiftMaterialDetailDO convertShiftDetailPOToDO(ShiftMaterialDetailPO po) { + ShiftMaterialDetailDO d = new ShiftMaterialDetailDO(); + BeanUtils.copyProperties(po, d, "children"); + if (!CollectionUtils.isEmpty(po.getChildren())) { + List childList = po.getChildren().stream() + .map(this::convertShiftDetailPOToDO).collect(Collectors.toList()); + d.setChildren(childList); + } + return d; + } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/facade/IShiftMaterialDetailService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/facade/IShiftMaterialDetailService.java index 7fcb83295..7acd7960e 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/facade/IShiftMaterialDetailService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/facade/IShiftMaterialDetailService.java @@ -81,6 +81,13 @@ public interface IShiftMaterialDetailService extends IService appMoveContainShift(List containerShiftDOList, String shiftNumber); + /** + * 容器移位:仅构建移位明细结构(供 PDA 调用 PC 移位流程使用,不执行库存变更) + * @param containerShiftDOList 容器移位明细 + * @return 移位物料明细列表(主项含 children 子项) + */ + public List buildShiftMaterialDetailListFromContainerShift(List containerShiftDOList); + /** * @description 批量修改物料信息 * @author ZhouGY diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java index 27b1e5aae..5794ad190 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java @@ -408,6 +408,62 @@ public class ShiftMaterialDetailImpl extends ServiceImpl buildShiftMaterialDetailListFromContainerShift(List containerShiftDOList) { + List shiftMaterialDetailDOList = new ArrayList<>(); + for (ContainerShiftDO containerShiftDO : containerShiftDOList){ + List shiftMoveMaterialQuantityList = containerShiftDO.getChildren(); + if (CollectionUtils.isEmpty(shiftMoveMaterialQuantityList)) continue; + BigDecimal totalShiftQuantity = BigDecimal.ZERO; + for (ShiftMoveMaterialQuantityPO c : shiftMoveMaterialQuantityList) { + if (c.getShiftQuantity() != null && c.getShiftQuantity().compareTo(BigDecimal.ZERO) > 0) { + totalShiftQuantity = totalShiftQuantity.add(c.getShiftQuantity()); + } + } + if (totalShiftQuantity.compareTo(BigDecimal.ZERO) <= 0) continue; + MaterialInventory materialInventoryOldDb = materialInventoryMapper.selectById(containerShiftDO.getMaterialInventoryId()); + if (ObjectUtil.isNull(materialInventoryOldDb)){ + throw new ServiceException("原库位【" + containerShiftDO.getContainerTypeName() + "】不存在,不能进行移位"); + } + if (materialInventoryOldDb.getInventoryQuantity().compareTo(totalShiftQuantity) < 0){ + throw new ServiceException("容器【" + containerShiftDO.getContainerTypeName() + "】下的物料库存不足,不能进行移位"); + } + // 容器移位只生成扁平明细(每条目标一条记录),不生成父项,避免 insert 时父+子两条记录、updateMaterialInventory 重复计算 + for (ShiftMoveMaterialQuantityPO shiftMoveMaterialQuantityPO : shiftMoveMaterialQuantityList) { + if (ObjectUtil.isNull(shiftMoveMaterialQuantityPO.getShiftQuantity()) || shiftMoveMaterialQuantityPO.getShiftQuantity().compareTo(BigDecimal.ZERO) == 0){ + continue; + } + ShiftMaterialDetailDO detailDO = new ShiftMaterialDetailDO(); + detailDO.setMaterialInventoryId(containerShiftDO.getMaterialInventoryId()); + detailDO.setMaterialBaseInfoId(containerShiftDO.getMaterialBaseInfoId()); + detailDO.setQuantity(shiftMoveMaterialQuantityPO.getShiftQuantity()); + detailDO.setShiftQuantity(shiftMoveMaterialQuantityPO.getShiftQuantity()); + detailDO.setNewStorageLocationId(shiftMoveMaterialQuantityPO.getNewStorageLocationId()); + detailDO.setNewStorageSectionId(shiftMoveMaterialQuantityPO.getNewStorageSectionId()); + detailDO.setNewStorageCode(shiftMoveMaterialQuantityPO.getNewStorageCode()); + detailDO.setNewStorageName(shiftMoveMaterialQuantityPO.getNewStorageName()); + detailDO.setNewStorageLocationCode(shiftMoveMaterialQuantityPO.getNewStorageLocationCode()); + detailDO.setNewStorageLocationName(shiftMoveMaterialQuantityPO.getNewStorageLocationName()); + detailDO.setContainerId(shiftMoveMaterialQuantityPO.getContainerId()); + detailDO.setContainerCode(shiftMoveMaterialQuantityPO.getContainerCode()); + detailDO.setContainerType(shiftMoveMaterialQuantityPO.getContainerType()); + detailDO.setContainerTypeName(shiftMoveMaterialQuantityPO.getContainerTypeName()); + detailDO.setLevel(1); + detailDO.setChildren(null); + if (shiftMoveMaterialQuantityPO.getNetWeight() != null) detailDO.setNetWeight(shiftMoveMaterialQuantityPO.getNetWeight()); + if (shiftMoveMaterialQuantityPO.getGrossWeight() != null) detailDO.setGrossWeight(shiftMoveMaterialQuantityPO.getGrossWeight()); + if (shiftMoveMaterialQuantityPO.getVolume() != null) detailDO.setVolume(shiftMoveMaterialQuantityPO.getVolume()); + if (shiftMoveMaterialQuantityPO.getArea() != null) detailDO.setArea(shiftMoveMaterialQuantityPO.getArea()); + shiftMaterialDetailDOList.add(detailDO); + } + } + return shiftMaterialDetailDOList; + } + /** * 容器移位生成库存调整记录:原库位减少记录 + 各目标库位增加记录 */ @@ -416,9 +472,9 @@ public class ShiftMaterialDetailImpl extends ServiceImpl shiftMoveMaterialQuantityList, String shiftNumber) { LoginUser loginUser = SecurityUtils.getLoginUser(); MaterialBaseInfoPO materialBaseInfo = materialBaseInfoService.getInfo(containerShiftDO.getMaterialBaseInfoId()); - String materialCode = materialBaseInfo != null ? materialBaseInfo.getMaterialCode() : ""; - String materialName = materialBaseInfo != null ? materialBaseInfo.getMaterialName() : ""; - String barCode = materialBaseInfo != null ? materialBaseInfo.getBarCode() : ""; + String materialCode = materialBaseInfo != null && materialBaseInfo.getMaterialCode() != null ? materialBaseInfo.getMaterialCode() : ""; + String materialName = materialBaseInfo != null && materialBaseInfo.getMaterialName() != null ? materialBaseInfo.getMaterialName() : ""; + String barCode = materialBaseInfo != null && materialBaseInfo.getBarCode() != null ? materialBaseInfo.getBarCode() : ""; BigDecimal oldQty = materialInventoryOldDb.getInventoryQuantity() != null ? materialInventoryOldDb.getInventoryQuantity() : BigDecimal.ZERO; BigDecimal oldAlloc = materialInventoryOldDb.getAllocationQuantity() != null ? materialInventoryOldDb.getAllocationQuantity() : BigDecimal.ZERO; BigDecimal newQty = oldQty.subtract(totalShiftQuantity).max(BigDecimal.ZERO); @@ -442,13 +498,15 @@ public class ShiftMaterialDetailImpl extends ServiceImpl qw = new LambdaQueryWrapper<>(); + qw.eq(MaterialInventory::getWarehouseId, shiftMaterialDetailDO.getNewWarehouseId()); + qw.eq(MaterialInventory::getStorageSectionId, shiftMaterialDetailDO.getNewStorageSectionId()); + qw.eq(MaterialInventory::getStorageLocationId, shiftMaterialDetailDO.getNewStorageLocationId()); + qw.eq(MaterialInventory::getMaterialBaseInfoId, shiftMaterialDetailDO.getMaterialBaseInfoId()); + qw.eq(MaterialInventory::getBatchNumber, shiftMaterialDetailDO.getBatchNumber() != null ? shiftMaterialDetailDO.getBatchNumber() : ""); + qw.eq(MaterialInventory::getMaterialStatusCode, shiftMaterialDetailDO.getMaterialStatusCode() != null ? shiftMaterialDetailDO.getMaterialStatusCode() : ""); + if (ObjectUtil.isNotNull(shiftMaterialDetailDO.getContainerId()) && shiftMaterialDetailDO.getContainerId() != 0) { + qw.eq(MaterialInventory::getContainerId, shiftMaterialDetailDO.getContainerId()); + } else { + qw.and(w -> w.isNull(MaterialInventory::getContainerId).or().eq(MaterialInventory::getContainerId, 0)); + } + try { + return materialInventoryService.getOne(qw); + } catch (Exception e) { + return null; + } } /**