From 3414785be38fab3d33fac4109b83dd6969ee76e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Mon, 20 Apr 2026 17:04:49 +0800 Subject: [PATCH] =?UTF-8?q?PDABug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MaterialInventoryApplicationService.java | 34 ++++++++++++++-- .../service/PickingOrderDomainService.java | 40 +++++++++++++++++++ .../service/ReviewOrderDomainService.java | 17 ++++++++ .../service/StockOutOrderDomainService.java | 33 +++++++++++++++ .../StockOutTaskOrderDomainService.java | 14 ++++++- 5 files changed, 133 insertions(+), 5 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialInventory/MaterialInventoryApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialInventory/MaterialInventoryApplicationService.java index 64c5085a2..823313caa 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/materialInventory/MaterialInventoryApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/materialInventory/MaterialInventoryApplicationService.java @@ -457,10 +457,36 @@ public class MaterialInventoryApplicationService { */ public List materialQueryList(MaterialInventoryQueryListDO materialInventoryQueryListDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null){ - Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); - if (topOrganizationId != null && topOrganizationId != 1){ - materialInventoryQueryListDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + //topOrganizationId 会查到一级组织下全部子组织 + if (loginUser != null && loginUser.getUserPo() != null) { + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = materialInventoryQueryListDO.getOrganizationId(); + if (userOrganizationId != null && userOrganizationId == 2827L) { + if (frontendOrganizationId != null) { + materialInventoryQueryListDO.setOrganizationId(frontendOrganizationId); + materialInventoryQueryListDO.setTopOrganizationId(null); + } else { + materialInventoryQueryListDO.setOrganizationId(null); + materialInventoryQueryListDO.setTopOrganizationId(null); + } + } else { + if (frontendOrganizationId != null && userOrganizationId != null) { + if (!frontendOrganizationId.equals(userOrganizationId)) { + materialInventoryQueryListDO.setOrganizationId(userOrganizationId); + } + } else { + if (userOrganizationId != null) { + materialInventoryQueryListDO.setOrganizationId(userOrganizationId); + } + } + if (materialInventoryQueryListDO.getOrganizationId() == null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + materialInventoryQueryListDO.setTopOrganizationId(topOrganizationId); + } + } else { + materialInventoryQueryListDO.setTopOrganizationId(2827L); + } } } List list = materialInventoryDomainService.materialQueryList(materialInventoryQueryListDO); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java index 1935e4742..233eb59f0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.mhd.common.core.constant.SnowFlakeConstants; import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.OrderSequence; +import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.bean.BeanUtils; import com.mhd.common.core.utils.uuid.IdGenerator; import com.mhd.common.security.utils.SecurityUtils; @@ -22,6 +23,8 @@ import com.mhd.wms.domain.inventoryStandingDetail.repository.facade.IInventorySt import com.mhd.wms.domain.inventoryStandingDetail.repository.todo.InventoryStandingDetailDO; import com.mhd.wms.domain.materialBaseInfo.entity.MaterialBaseInfo; import com.mhd.wms.domain.materialBaseInfo.repository.mapper.MaterialBaseInfoMapper; +import com.mhd.wms.domain.materialBarCode.repository.facade.IMaterialBarCodeService; +import com.mhd.wms.domain.materialBarCode.repository.po.MaterialBarCodePO; import com.mhd.wms.domain.materialInventory.entity.MaterialInventory; import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService; import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO; @@ -120,6 +123,8 @@ public class PickingOrderDomainService { @Resource private MaterialBaseInfoMapper materialBaseInfoMapper; @Autowired + private IMaterialBarCodeService materialBarCodeService; + @Autowired private CopyCodeReferenceDomainService copyCodeReferenceDomainService; @@ -523,6 +528,39 @@ public class PickingOrderDomainService { } } + /** + * 拣货单明细表可能未存物料编码/名称/条码,作业明细从物料主数据(及条码表)补齐,与详情接口从主数据回填一致。 + */ + private void fillTaskPickingMaterialDetailMaterialInfo(TaskPickingMaterialDetailDO detail) { + if (detail == null || detail.getMaterialBaseInfoId() == null) { + return; + } + boolean needCode = StringUtils.isBlank(detail.getMaterialCode()); + boolean needName = StringUtils.isBlank(detail.getMaterialName()); + boolean needBar = StringUtils.isBlank(detail.getBarCode()); + if (!needCode && !needName && !needBar) { + return; + } + MaterialBaseInfo m = materialBaseInfoMapper.selectById(detail.getMaterialBaseInfoId()); + if (m != null) { + if (needCode && StringUtils.isNotBlank(m.getMaterialCode())) { + detail.setMaterialCode(m.getMaterialCode()); + } + if (needName && StringUtils.isNotBlank(m.getMaterialName())) { + detail.setMaterialName(m.getMaterialName()); + } + if (needBar && StringUtils.isNotBlank(m.getBarCode())) { + detail.setBarCode(m.getBarCode()); + } + } + if (StringUtils.isBlank(detail.getBarCode())) { + List barList = materialBarCodeService.getInfoByMaterialBaseInfoIds(detail.getMaterialBaseInfoId()); + if (!CollectionUtils.isEmpty(barList) && StringUtils.isNotBlank(barList.get(0).getBarCode())) { + detail.setBarCode(barList.get(0).getBarCode()); + } + } + } + /** * @description 按单生成拣货作业单 * @author ZhouGY @@ -562,6 +600,7 @@ public class PickingOrderDomainService { TaskPickingMaterialDetailDO taskPickingMaterialDetailDO = new TaskPickingMaterialDetailDO(); BeanUtils.copyProperties(materialDetailPO, taskPickingMaterialDetailDO); taskPickingMaterialDetailDO.setPickingUniqueId(materialDetailPO.getUniqueId()); + fillTaskPickingMaterialDetailMaterialInfo(taskPickingMaterialDetailDO); taskPickingMaterialDetailDOList.add(taskPickingMaterialDetailDO); }); stockOutTaskOrderDO.setTaskPickingMaterialDetailList(taskPickingMaterialDetailDOList); @@ -608,6 +647,7 @@ public class PickingOrderDomainService { TaskPickingMaterialDetailDO taskPickingMaterialDetailDO = new TaskPickingMaterialDetailDO(); BeanUtils.copyProperties(pickingMaterialDetail, taskPickingMaterialDetailDO); taskPickingMaterialDetailDO.setPickingUniqueId(pickingMaterialDetail.getUniqueId()); + fillTaskPickingMaterialDetailMaterialInfo(taskPickingMaterialDetailDO); taskPickingMaterialDetailDOList.add(taskPickingMaterialDetailDO); stockOutTaskOrderDO.setTaskPickingMaterialDetailList(taskPickingMaterialDetailDOList); stockOutTaskOrderDOList.add(stockOutTaskOrderDO); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java index 878d71705..2e75023fb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java @@ -129,6 +129,23 @@ public class ReviewOrderDomainService { header.setWarehouseId(stockOutOrder.getWarehouseId()); header.setWarehouseCode(stockOutOrder.getWarehouseCode()); header.setWarehouseName(stockOutOrder.getWarehouseName()); + // 出库单上仓库编码常为空,拣货单上一般有 QZ 等编码,与拣货作业单展示一致 + if (!StringUtils.hasText(header.getWarehouseCode()) || !StringUtils.hasText(header.getWarehouseName()) || header.getWarehouseId() == null) { + for (PickingOrder p : pickingOrders) { + if (StringUtils.hasText(header.getWarehouseCode()) && StringUtils.hasText(header.getWarehouseName()) && header.getWarehouseId() != null) { + break; + } + if (!StringUtils.hasText(header.getWarehouseCode()) && StringUtils.hasText(p.getWarehouseCode())) { + header.setWarehouseCode(p.getWarehouseCode()); + } + if (!StringUtils.hasText(header.getWarehouseName()) && StringUtils.hasText(p.getWarehouseName())) { + header.setWarehouseName(p.getWarehouseName()); + } + if (header.getWarehouseId() == null && p.getWarehouseId() != null) { + header.setWarehouseId(p.getWarehouseId()); + } + } + } header.setCustomerId(stockOutOrder.getCustomerId()); header.setCustomerCode(stockOutOrder.getCustomerCode()); header.setCustomerName(stockOutOrder.getCustomerName()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index e85793e79..bfc782689 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -631,6 +631,20 @@ public class StockOutOrderDomainService { pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH")); pickingOrderDO.setQuantity(p.getAllocationQuantity()); List outMaterialDetailPOS = outMaterialDetailPOListMap.get(p.getOutOrderNumber()); + // 出库单头 warehouse_code 常为空,用已分配明细(含子行)第一条有仓库编码的行兜底 + OutMaterialDetailPO warehouseFromDetail = firstOutDetailWithWarehouse(outMaterialDetailPOS); + if (warehouseFromDetail != null) { + if (StringUtils.isBlank(pickingOrderDO.getWarehouseCode())) { + pickingOrderDO.setWarehouseCode(warehouseFromDetail.getWarehouseCode()); + } + if (StringUtils.isBlank(pickingOrderDO.getWarehouseName()) + && StringUtils.isNotBlank(warehouseFromDetail.getWarehouseName())) { + pickingOrderDO.setWarehouseName(warehouseFromDetail.getWarehouseName()); + } + if (pickingOrderDO.getWarehouseId() == null && warehouseFromDetail.getWarehouseId() != null) { + pickingOrderDO.setWarehouseId(warehouseFromDetail.getWarehouseId()); + } + } List pickingMaterialDetailList = new ArrayList<>(); if (!CollectionUtils.isEmpty(outMaterialDetailPOS)){ outMaterialDetailPOS.forEach(outMaterialDetailPO -> { @@ -709,6 +723,25 @@ public class StockOutOrderDomainService { return pickingOrderDomainService.batchInsert(pickingOrderDOList); } + /** + * 从出库明细树中取第一条带仓库编码的行(父行优先,再递归子行) + */ + private static OutMaterialDetailPO firstOutDetailWithWarehouse(List lines) { + if (CollectionUtils.isEmpty(lines)) { + return null; + } + for (OutMaterialDetailPO line : lines) { + if (StringUtils.isNotBlank(line.getWarehouseCode())) { + return line; + } + OutMaterialDetailPO fromChild = firstOutDetailWithWarehouse(line.getChildren()); + if (fromChild != null) { + return fromChild; + } + } + return null; + } + /** * @description 补货 * @author ZhouGY diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java index 7af7482b3..9f6425d1c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java @@ -34,6 +34,7 @@ import com.mhd.wms.domain.pickingOrder.entity.PickingOrder; import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService; import com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO; import com.mhd.wms.domain.pickingOrder.repository.todo.PickingOrderDO; +import com.mhd.wms.domain.pickingOrder.service.ReviewOrderDomainService; import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO; import com.mhd.wms.domain.stockInOrder.service.StockInOrderDomainService; import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder; @@ -107,6 +108,8 @@ public class StockOutTaskOrderDomainService { private IMaterialBaseInfoService materialBaseInfoService; @Autowired private CopyCodeReferenceDomainService copyCodeReferenceDomainService; + @Autowired + private ReviewOrderDomainService reviewOrderDomainService; @Resource private OutMaterialDetailMapper outMaterialDetailMapper; @@ -882,8 +885,17 @@ public class StockOutTaskOrderDomainService { stockOutOrder.setUpdateBy(loginUser.getUserid()); stockOutOrder.setUpdateByName(loginUser.getUsername()); stockOutOrder.setUpdateTime(new Date()); - return stockOutOrderService.update(stockOutOrder, + boolean stockOutUpdated = stockOutOrderService.update(stockOutOrder, new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); + // 与 PickingOrderDomainService.picking 一致:PDA 按物料拣货/作业单路径拣满时只走本方法,需触发生成复核单 + if (stockOutUpdated) { + StockOutOrder so = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); + if (so != null) { + reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, so); + } + } + return stockOutUpdated; }else { //波次单 WaveOrder waveOrderDb = waveOrderService.getOne(new QueryWrapper().lambda()