From 6f6fa749081c6a71ce5dbb49cefccb46331fb325 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 Mar 2026 14:02:12 +0800 Subject: [PATCH] =?UTF-8?q?PDA=E4=B8=8A=E6=9E=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockReceiptOrderApplicationService.java | 6 +- .../StockShelfOrderApplicationService.java | 205 +++++++++++++++--- .../persistence/ShelfMaterialDetailImpl.java | 102 ++++++++- .../StockReceiptOrderDomainService.java | 3 +- .../stockShelfOrder/StockShelfOrderMapper.xml | 1 + 5 files changed, 270 insertions(+), 47 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java index 2d8487638..79f9e8455 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java @@ -1024,10 +1024,10 @@ public class StockReceiptOrderApplicationService { if (firstChildBaseInfoId != null && parentBaseInfoId != null && !firstChildBaseInfoId.equals(parentBaseInfoId)) { return false; } - // 6. PDA 未传 materialDetailId/uniqueId 时:getInfoByApp 的 parent_copy 总是 children 第一条, - // 真实子项通常会有 materialDetailId,故无 id 时视为 parent_copy 并合并 + // 6. 子项无 materialDetailId 且无 uniqueId:可能是新创建的子项(同一次收 250+250),不能视为 parent_copy + // 收货 getInfoByApp 不添加 parent_copy,parent_copy 必有 materialDetailId 或 uniqueId 与主项相同 if (firstChildId == null && firstChildUniqueId == null) { - return true; + return false; } return false; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java index 561aa9689..83d424a8b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java @@ -337,36 +337,152 @@ public class StockShelfOrderApplicationService { */ public Boolean upShelfByApp(StockShelfOrderDO stockReceiptOrderDO){ List shelfMaterialDetailDOList = stockReceiptOrderDO.getMaterialDetailList(); - shelfMaterialDetailDOList.forEach(shelfMaterialDetailDO -> { - List shelfMaterialDetailDOChildrenList1 = shelfMaterialDetailDO.getChildren(); - if (shelfMaterialDetailDOChildrenList1 != null && !shelfMaterialDetailDOChildrenList1.isEmpty() && shelfMaterialDetailDOChildrenList1.size() > 0) { - ShelfMaterialDetailDO shelfMaterialDetailDOChildren = null; - List shelfMaterialDetailDOChildrenList11 = shelfMaterialDetailDO.getChildren().stream() - .filter(p -> p.getLevel() != null && 1 == p.getLevel()) - .collect(Collectors.toList()); - if (shelfMaterialDetailDOChildrenList11 != null && !shelfMaterialDetailDOChildrenList11.isEmpty() && shelfMaterialDetailDOChildrenList11.size() > 0) shelfMaterialDetailDOChildren = shelfMaterialDetailDOChildrenList11.get(0); - if (shelfMaterialDetailDOChildren != null) { - shelfMaterialDetailDO.setMaterialDetailId(shelfMaterialDetailDOChildren.getMaterialDetailId()); - shelfMaterialDetailDO.setShelvesQuantity(shelfMaterialDetailDOChildren.getShelvesQuantity()); - shelfMaterialDetailDO.setWarehouseId(shelfMaterialDetailDOChildren.getWarehouseId()); - shelfMaterialDetailDO.setStorageSectionId(shelfMaterialDetailDOChildren.getStorageSectionId()); - shelfMaterialDetailDO.setStorageLocationId(shelfMaterialDetailDOChildren.getStorageLocationId()); - shelfMaterialDetailDO.setContainerId(shelfMaterialDetailDOChildren.getContainerId()); - shelfMaterialDetailDO.setLevel(shelfMaterialDetailDOChildren.getLevel()); - shelfMaterialDetailDO.setMaterialDetailSerialNumberList(shelfMaterialDetailDOChildren.getMaterialDetailSerialNumberList()); + boolean firstItemHadChildrenBefore = !CollectionUtils.isEmpty(shelfMaterialDetailDOList) + && !CollectionUtils.isEmpty(shelfMaterialDetailDOList.get(0).getChildren()); + // PDA 平铺结构转父子结构(与收货一致) + ensureFirstItemAsParentForShelf(stockReceiptOrderDO); + if (firstItemHadChildrenBefore) { + // 主项子项结构:将 children 第一条(parent_copy)赋值给主项并删除,与收货 assignFirstChildToParentAndRemove 一致 + assignFirstChildToParentAndRemoveForShelf(stockReceiptOrderDO); + } else { + // 非 getInfoByApp 结构:取第一个子项赋值给主项,保留其余子项 + shelfMaterialDetailDOList = stockReceiptOrderDO.getMaterialDetailList(); + shelfMaterialDetailDOList.forEach(shelfMaterialDetailDO -> { + List shelfMaterialDetailDOChildrenList1 = shelfMaterialDetailDO.getChildren(); + if (shelfMaterialDetailDOChildrenList1 != null && !shelfMaterialDetailDOChildrenList1.isEmpty()) { + ShelfMaterialDetailDO firstChild = shelfMaterialDetailDOChildrenList1.get(0); + shelfMaterialDetailDO.setMaterialDetailId(firstChild.getMaterialDetailId()); + shelfMaterialDetailDO.setShelvesQuantity(firstChild.getShelvesQuantity()); + shelfMaterialDetailDO.setWarehouseId(firstChild.getWarehouseId()); + shelfMaterialDetailDO.setStorageSectionId(firstChild.getStorageSectionId()); + shelfMaterialDetailDO.setStorageLocationId(firstChild.getStorageLocationId()); + shelfMaterialDetailDO.setContainerId(firstChild.getContainerId()); + shelfMaterialDetailDO.setLevel(firstChild.getLevel()); + shelfMaterialDetailDO.setMaterialDetailSerialNumberList(firstChild.getMaterialDetailSerialNumberList()); + // 保留其余子项(从索引1开始),统一设为 level 2 + List restChildren = new ArrayList<>(); + for (int i = 1; i < shelfMaterialDetailDOChildrenList1.size(); i++) { + ShelfMaterialDetailDO c = shelfMaterialDetailDOChildrenList1.get(i); + c.setLevel(2); + restChildren.add(c); + } + shelfMaterialDetailDO.setChildren(restChildren); } - //只留二级 - List shelfMaterialDetailDOChildrenList2 = shelfMaterialDetailDOChildrenList1.stream() - .filter(p -> p.getLevel() != null && 2 == p.getLevel()) - .collect(Collectors.toList()); - shelfMaterialDetailDO.setChildren(shelfMaterialDetailDOChildrenList2); - } - }); + }); + } //上架装配参数 StockShelfOrderDO assembleStockShelfOrderDO = assembleParamByShelf(stockReceiptOrderDO); return stockShelfOrderDomainService.upShelf(assembleStockShelfOrderDO); } + /** + * PDA 上架回传时,将 materialDetailList 的第一项作为主项(level 1),其余项作为其子项(level 2) + * 仅当数据库中第二项为 level 2(真实子项)时才转换,与收货 ensureFirstItemAsParent 逻辑一致 + */ + private void ensureFirstItemAsParentForShelf(StockShelfOrderDO stockShelfOrderDO) { + List list = stockShelfOrderDO.getMaterialDetailList(); + if (CollectionUtils.isEmpty(list) || list.size() <= 1) { + return; + } + if (!CollectionUtils.isEmpty(list.get(0).getChildren())) { + return; + } + StockShelfOrderPO stockShelfOrderPO = stockShelfOrderDomainService.getInfo(stockShelfOrderDO.getShelfOrderId()); + if (stockShelfOrderPO == null) { + return; + } + ShelfMaterialDetailDO shelfMaterialDetailDOByQuery = new ShelfMaterialDetailDO(); + shelfMaterialDetailDOByQuery.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber()); + List shelfMaterialDetailPODbList = shelfMaterialDetailDomainService.queryList(shelfMaterialDetailDOByQuery); + Map dbMap = shelfMaterialDetailPODbList.stream() + .collect(Collectors.toMap(ShelfMaterialDetailPO::getMaterialDetailId, Function.identity())); + Map dbMapByUniqueId = shelfMaterialDetailPODbList.stream() + .filter(po -> po.getUniqueId() != null) + .collect(Collectors.toMap(ShelfMaterialDetailPO::getUniqueId, Function.identity())); + ShelfMaterialDetailDO first = list.get(0); + ShelfMaterialDetailPO firstPO = dbMap.get(first.getMaterialDetailId()); + if (firstPO == null && first.getUniqueId() != null) { + firstPO = dbMapByUniqueId.get(first.getUniqueId()); + } + if (firstPO == null || firstPO.getUniqueId() == null) { + return; + } + ShelfMaterialDetailDO second = list.get(1); + if (second != null) { + ShelfMaterialDetailPO secondPO = dbMap.get(second.getMaterialDetailId()); + if (secondPO == null && second.getUniqueId() != null) { + secondPO = dbMapByUniqueId.get(second.getUniqueId()); + } + if (secondPO != null && secondPO.getLevel() != null && secondPO.getLevel() == 1) { + return; + } + } + Long parentUniqueId = firstPO.getUniqueId(); + List children = new ArrayList<>(); + for (int i = 1; i < list.size(); i++) { + ShelfMaterialDetailDO child = list.get(i); + child.setLevel(2); + child.setParentUniqueId(parentUniqueId); + children.add(child); + } + first.setLevel(1); + first.setChildren(children); + List newList = new ArrayList<>(); + newList.add(first); + stockShelfOrderDO.setMaterialDetailList(newList); + } + + /** + * 上架时:将 children 中第一条(parent_copy)的值赋给主项,并删除第一条;与收货 assignFirstChildToParentAndRemove 一致。 + * getInfoByApp 有子项时会将 parent_copy 作为 children 第一条,PDA 提交时需将其值回填主项并移除。 + */ + private void assignFirstChildToParentAndRemoveForShelf(StockShelfOrderDO stockShelfOrderDO) { + List list = stockShelfOrderDO.getMaterialDetailList(); + if (CollectionUtils.isEmpty(list)) { + return; + } + for (ShelfMaterialDetailDO parent : list) { + List children = parent.getChildren(); + if (CollectionUtils.isEmpty(children)) { + continue; + } + ShelfMaterialDetailDO firstChild = children.get(0); + if (!isShelfParentCopy(parent, firstChild)) { + continue; + } + BeanUtils.copyProperties(firstChild, parent, "children", "parentUniqueId", "uniqueId", "materialDetailId"); + List newChildren = new ArrayList<>(); + for (int i = 1; i < children.size(); i++) { + ShelfMaterialDetailDO c = children.get(i); + c.setLevel(2); + newChildren.add(c); + } + parent.setChildren(newChildren); + } + } + + /** + * 判断第一条子项是否为 parent_copy(主项拷贝)。与主项同 materialDetailId/uniqueId 则为 parent_copy。 + */ + private boolean isShelfParentCopy(ShelfMaterialDetailDO parent, ShelfMaterialDetailDO firstChild) { + Long parentId = parent.getMaterialDetailId(); + Long firstChildId = firstChild.getMaterialDetailId(); + Long parentUniqueId = parent.getUniqueId(); + Long firstChildUniqueId = firstChild.getUniqueId(); + if (parentId != null && parentId.equals(firstChildId)) { + return true; + } + if (parentUniqueId != null && parentUniqueId.equals(firstChildUniqueId)) { + return true; + } + if (firstChildId != null && parentId != null && !firstChildId.equals(parentId)) { + return false; + } + if (firstChildUniqueId != null && parentUniqueId != null && !firstChildUniqueId.equals(parentUniqueId)) { + return false; + } + return firstChildId == null && firstChildUniqueId == null; + } private MaterialInventory getParam(ShelfMaterialDetailDO shelfMaterialDetailDO, List fieldNames,Long shipperId){ MaterialInventory param = new MaterialInventory(); @@ -471,13 +587,22 @@ public class StockShelfOrderApplicationService { ShelfMaterialDetailDO shelfMaterialDetailDOByQuery = new ShelfMaterialDetailDO(); shelfMaterialDetailDOByQuery.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber()); List shelfMaterialDetailPODbList = shelfMaterialDetailDomainService.queryList(shelfMaterialDetailDOByQuery); - Map receiptMaterialDetailDbMap = shelfMaterialDetailPODbList.stream().collect(Collectors.toMap(ShelfMaterialDetailPO::getMaterialDetailId, Function.identity())); + Map shelfMaterialDetailDbMap = shelfMaterialDetailPODbList.stream().collect(Collectors.toMap(ShelfMaterialDetailPO::getMaterialDetailId, Function.identity())); + Map shelfMaterialDetailDbMapByUniqueId = shelfMaterialDetailPODbList.stream() + .filter(po -> po.getUniqueId() != null) + .collect(Collectors.toMap(ShelfMaterialDetailPO::getUniqueId, Function.identity())); BigDecimal totalActualQuantity = BigDecimal.ZERO;//上架单当前作业收货数 int totalActualShelfMaterialQuantity = 0;//上架单收货物料种数 List returnShelfMaterialDetailDOList = new ArrayList<>(); for (ShelfMaterialDetailDO shelfMaterialDetailDO : stockShelfOrderDO.getMaterialDetailList()){ - //设置物料更多属性信息 - ShelfMaterialDetailPO shelfMaterialDetailPO = receiptMaterialDetailDbMap.get(shelfMaterialDetailDO.getMaterialDetailId()); + //设置物料更多属性信息:优先用 materialDetailId 查找,若为空则用 uniqueId 查找(兼容 PDA 只传 uniqueId 的场景,与收货一致) + ShelfMaterialDetailPO shelfMaterialDetailPO = shelfMaterialDetailDbMap.get(shelfMaterialDetailDO.getMaterialDetailId()); + if (shelfMaterialDetailPO == null && shelfMaterialDetailDO.getUniqueId() != null) { + shelfMaterialDetailPO = shelfMaterialDetailDbMapByUniqueId.get(shelfMaterialDetailDO.getUniqueId()); + if (shelfMaterialDetailPO != null) { + shelfMaterialDetailDO.setMaterialDetailId(shelfMaterialDetailPO.getMaterialDetailId()); + } + } if (shelfMaterialDetailPO == null){ throw new ServiceException("物料明细不存在"); } @@ -512,32 +637,44 @@ public class StockShelfOrderApplicationService { List shelfMaterialDetailDOChildList = shelfMaterialDetailDO.getChildren(); if (!CollectionUtils.isEmpty(shelfMaterialDetailDOChildList)){ for (ShelfMaterialDetailDO shelfMaterialDetailDOChild : shelfMaterialDetailDOChildList){ - ShelfMaterialDetailPO shelfMaterialDetailPOChildDb = receiptMaterialDetailDbMap.get(shelfMaterialDetailDOChild.getMaterialDetailId()); + ShelfMaterialDetailPO shelfMaterialDetailPOChildDb = shelfMaterialDetailDbMap.get(shelfMaterialDetailDOChild.getMaterialDetailId()); + if (shelfMaterialDetailPOChildDb == null && shelfMaterialDetailDOChild.getUniqueId() != null) { + shelfMaterialDetailPOChildDb = shelfMaterialDetailDbMapByUniqueId.get(shelfMaterialDetailDOChild.getUniqueId()); + if (shelfMaterialDetailPOChildDb != null) { + shelfMaterialDetailDOChild.setMaterialDetailId(shelfMaterialDetailPOChildDb.getMaterialDetailId()); + } + } + BigDecimal childShelvesQty = shelfMaterialDetailDOChild.getShelvesQuantity() != null ? shelfMaterialDetailDOChild.getShelvesQuantity() : BigDecimal.ZERO; if (shelfMaterialDetailPOChildDb != null){ + // 子项已存在:累加上架数量,并加入返回列表供 batchShelfUpdate 更新(与收货一致,避免重复提交/漏更新) + actualQuantity = actualQuantity.add(childShelvesQty); + ShelfMaterialDetailDO returnShelfMaterialDetailDOChild = new ShelfMaterialDetailDO(); + BeanUtils.copyProperties(shelfMaterialDetailPOChildDb, returnShelfMaterialDetailDOChild); + BeanUtils.copyProperties(shelfMaterialDetailDOChild, returnShelfMaterialDetailDOChild, IgnoreNullUtil.getNullPropertyNames(shelfMaterialDetailDOChild)); + setStorageLocationInfo(returnShelfMaterialDetailDOChild); + returnShelfMaterialDetailDOChild.setAllowModify(2); + returnShelfMaterialDetailDOChild.setLevel(2); + returnShelfMaterialDetailDOChild.setParentUniqueId(shelfMaterialDetailPO.getUniqueId()); + returnShelfMaterialDetailDOChild.setActualQuantity(childShelvesQty); + returnShelfMaterialDetailDOChildList.add(returnShelfMaterialDetailDOChild); continue; } ShelfMaterialDetailDO returnShelfMaterialDetailDOChild = new ShelfMaterialDetailDO(); BeanUtils.copyProperties(shelfMaterialDetailPO, returnShelfMaterialDetailDOChild, "materialDetailId","createBy","createByName","createTime", "updateBy","updateByName","updateTime"); BeanUtils.copyProperties(shelfMaterialDetailDOChild, returnShelfMaterialDetailDOChild, IgnoreNullUtil.getNullPropertyNames(shelfMaterialDetailDOChild)); - //设置上架信息 setStorageLocationInfo(shelfMaterialDetailDOChild); - //设置容器信息 -// setContainerInfo(returnShelfMaterialDetailDOChild); - //上架后 设置该记录不允许被修改 returnShelfMaterialDetailDOChild.setAllowModify(2); returnShelfMaterialDetailDOChild.setMaterialDetailSerialNumberList(shelfMaterialDetailDOChild.getMaterialDetailSerialNumberList()); returnShelfMaterialDetailDOChild.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId)); returnShelfMaterialDetailDOChild.setLevel(2); returnShelfMaterialDetailDOChild.setParentUniqueId(shelfMaterialDetailPO.getUniqueId()); - //是否开启了序列号管理 if (shelfMaterialDetailPO.getSerialNumberManage() == 1){ if (CollectionUtils.isEmpty(shelfMaterialDetailPO.getMaterialDetailSerialNumberList())){ throw new ServiceException("物料【" + shelfMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空"); } } returnShelfMaterialDetailDOChild.setMaterialDetailSerialNumberList(shelfMaterialDetailDO.getMaterialDetailSerialNumberList()); - //设置子项的实际数量(等于上架数量) returnShelfMaterialDetailDOChild.setActualQuantity(returnShelfMaterialDetailDOChild.getShelvesQuantity()); returnShelfMaterialDetailDOChildList.add(returnShelfMaterialDetailDOChild); actualQuantity = actualQuantity.add(returnShelfMaterialDetailDOChild.getShelvesQuantity()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java index d10b0a559..41cacc98b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/persistence/ShelfMaterialDetailImpl.java @@ -20,6 +20,8 @@ import com.mhd.wms.domain.shelfMaterialDetail.repository.mapper.ShelfMaterialDet import com.mhd.wms.domain.shelfMaterialDetail.repository.po.ShelfMaterialDetailPO; import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO; import com.mhd.wms.domain.stockShelfOrder.repository.todo.StockShelfOrderDO; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.system.api.domain.BatchDetailFeignPO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -66,19 +68,19 @@ public class ShelfMaterialDetailImpl extends ServiceImpl queryListChildren(ShelfMaterialDetailDO shelfMaterialDetailDO) { List shelfMaterialDetailPOList = shelfMaterialDetailMapper.queryList(shelfMaterialDetailDO); - //回显带上更多属性值(批次标签) + //回显带上更多属性值(批次标签):根据物料绑定的批次属性动态显示,与收货一致 shelfMaterialDetailPOList.forEach(shelfMaterialDetailPO -> { MaterialMoreDetailDO materialMoreDetailDO = new MaterialMoreDetailDO(); materialMoreDetailDO.setMaterialDetailUniqueId(shelfMaterialDetailPO.getUniqueId()); List materialMoreDetailList = IMaterialMoreDetailService.queryList(materialMoreDetailDO); - //如果上架单的物料批属性还没存入值,那么需要从批属性表获取 - AjaxResult ajaxResult = null; if (CollectionUtils.isEmpty(materialMoreDetailList)) { - ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(shelfMaterialDetailPO.getMaterialBaseInfoId()); + AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(shelfMaterialDetailPO.getMaterialBaseInfoId()); if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { - materialMoreDetailList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), MaterialMoreDetailPO.class); + List batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); + materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList); } } + fillAttributeValueFromShelfMaterialDetail(shelfMaterialDetailPO, materialMoreDetailList); shelfMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList); }); @@ -92,14 +94,14 @@ public class ShelfMaterialDetailImpl extends ServiceImpl materialMoreDetailList = IMaterialMoreDetailService.queryList(materialMoreDetailDO); - //如果上架单的物料批属性还没存入值,那么需要从批属性表获取 - AjaxResult ajaxResult = null; if (CollectionUtils.isEmpty(materialMoreDetailList)) { - ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(childrenDetailPO.getMaterialBaseInfoId()); + AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(childrenDetailPO.getMaterialBaseInfoId()); if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) { - materialMoreDetailList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), MaterialMoreDetailPO.class); + List batchList = JSON.parseArray(JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class); + materialMoreDetailList = filterAndConvertToMaterialMoreDetail(batchList); } } + fillAttributeValueFromShelfMaterialDetail(childrenDetailPO, materialMoreDetailList); childrenDetailPO.setMaterialMoreDetailList(materialMoreDetailList); }); materialDetailPO.setChildren(children); @@ -107,6 +109,88 @@ public class ShelfMaterialDetailImpl extends ServiceImpl filterAndConvertToMaterialMoreDetail(List batchList) { + List result = new ArrayList<>(); + if (CollectionUtils.isEmpty(batchList)) { + return result; + } + for (BatchDetailFeignPO po : batchList) { + if (po.getIsDisplay() == null || po.getIsDisplay() != 1) { + continue; + } + MaterialMoreDetailPO mpo = new MaterialMoreDetailPO(); + mpo.setBatchId(po.getBatchId()); + mpo.setBatchDetailId(po.getBatchDetailId()); + mpo.setBatchLabels(po.getBatchLabels()); + mpo.setInputControl(po.getInputControl()); + mpo.setAttributeFormat(po.getAttributeFormat()); + mpo.setAttributeOption(po.getAttributeOption()); + result.add(mpo); + } + return result; + } + + /** + * 从上架明细中获取收货数量、重量、体积、面积、批次属性值并填充到 materialMoreDetailList 的 attributeValue + */ + private void fillAttributeValueFromShelfMaterialDetail(ShelfMaterialDetailPO shelfMaterialDetailPO, List materialMoreDetailList) { + if (CollectionUtils.isEmpty(materialMoreDetailList)) { + return; + } + for (MaterialMoreDetailPO materialMoreDetail : materialMoreDetailList) { + String attributeOption = materialMoreDetail.getAttributeOption(); + String batchLabels = materialMoreDetail.getBatchLabels(); + if (materialMoreDetail.getAttributeValue() != null && !materialMoreDetail.getAttributeValue().trim().isEmpty()) { + continue; + } + String refVal = null; + if ("InvoiceNo".equalsIgnoreCase(attributeOption) || "Invoice No".equalsIgnoreCase(batchLabels) || "发票号".equals(batchLabels)) { + refVal = shelfMaterialDetailPO.getExtAttr1(); + } else if ("BatchRefNo".equalsIgnoreCase(attributeOption) || "Batch Ref NO's".equalsIgnoreCase(batchLabels) || "批次参考号".equals(batchLabels)) { + refVal = shelfMaterialDetailPO.getBatchRefNo(); + } else if ("SheetRefNo".equalsIgnoreCase(attributeOption) || "Sheet Ref NO's".equalsIgnoreCase(batchLabels) || "单据参考号".equals(batchLabels)) { + refVal = shelfMaterialDetailPO.getSheetRefNo(); + } else if ("BoxPalletNo".equalsIgnoreCase(attributeOption) || "Box No./Pallet No.".equalsIgnoreCase(batchLabels) || "箱号/卡板号".equals(batchLabels)) { + refVal = shelfMaterialDetailPO.getBoxPalletNo(); + } + if (refVal != null) { + materialMoreDetail.setAttributeValue(refVal); + } else if (StringUtils.isNotBlank(batchLabels)) { + String val = null; + switch (batchLabels.trim()) { + case "总净重": + case "净重(KG)": + case "净重": + val = shelfMaterialDetailPO.getTotalNetWeight() != null ? shelfMaterialDetailPO.getTotalNetWeight().toString() : null; + break; + case "总毛重": + case "毛重(KG)": + case "毛重": + val = shelfMaterialDetailPO.getTotalGrossWeight() != null ? shelfMaterialDetailPO.getTotalGrossWeight().toString() : null; + break; + case "总体积": + case "体积(CBM)": + case "体积": + val = shelfMaterialDetailPO.getTotalVolume() != null ? shelfMaterialDetailPO.getTotalVolume().toString() : null; + break; + case "总面积": + case "面积(SQM)": + case "面积": + val = shelfMaterialDetailPO.getTotalArea() != null ? shelfMaterialDetailPO.getTotalArea().toString() : null; + break; + default: + break; + } + if (val != null) { + materialMoreDetail.setAttributeValue(val); + } + } + } + } + private List getChildren(Long parentUniqueId, List shelfMaterialDetailPOList, Integer maxLevel){ List childrenCityList = shelfMaterialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(childrenCityList)){ 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 d2eeb99ee..68bfb6967 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 @@ -985,7 +985,8 @@ public class StockReceiptOrderDomainService { //获取收货单明细 ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO(); receiptMaterialDetailDO.setReceiptOrderNumber(stockReceiptOrderPO.getReceiptOrderNumber()); - List receiptMaterialDetailPOS = receiptMaterialDetailService.queryList(receiptMaterialDetailDO); + // 使用 queryListChildren 获取父子结构,避免重复添加(只添加 level 1 主项,主项 receiptQuantity 已含子项汇总) + List receiptMaterialDetailPOS = receiptMaterialDetailService.queryListChildren(receiptMaterialDetailDO); //上架单明细集合 List shelfMaterialDetailDOList = new ArrayList<>(); // 批量查询入库单明细,用于获取净重、毛重、体积、面积等字段 diff --git a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml index 5a608fbb0..fd9c1af89 100644 --- a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml @@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +