From 17103690aac059dc36bb195ed5b09a389047d62f 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, 16 Mar 2026 15:24:50 +0800 Subject: [PATCH] =?UTF-8?q?PDA=E6=94=B6=E8=B4=A7=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BF=AE=E6=94=B91111?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HandoverTaskOrderDomainService.java | 19 ++++++++------ .../service/PickingOrderDomainService.java | 22 ++++++++++++++-- .../persistence/ShiftMaterialDetailImpl.java | 10 +++++++- .../StockOutTaskOrderDomainService.java | 3 +-- .../service/StockShelfOrderDomainService.java | 25 ++++++++++++++++++- 5 files changed, 66 insertions(+), 13 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index be4d499bb..66f8801f9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -339,13 +339,17 @@ public class HandoverTaskOrderDomainService { //库存数量 BigDecimal oldInventoryQuantity = materialInventoryPO.getInventoryQuantity(); oldInventoryQuantity = oldInventoryQuantity != null ? oldInventoryQuantity : BigDecimal.ZERO; - //冻结数量 + //可用数量 + BigDecimal oldAllocationQuantity = materialInventoryPO.getAllocationQuantity(); + oldAllocationQuantity = oldAllocationQuantity != null ? oldAllocationQuantity : BigDecimal.ZERO; + //冻结数量(出库交接不变动冻结数量) BigDecimal oldFreezeQuantity = materialInventoryPO.getFreezeQuantity(); oldFreezeQuantity = oldFreezeQuantity != null ? oldFreezeQuantity : BigDecimal.ZERO; - //分配后库存数量 + //扣减后库存数量 BigDecimal newInventoryQuantity = oldInventoryQuantity.subtract(checkQuantity); - //分配后冻结数量 - BigDecimal newFreezeQuantity = oldFreezeQuantity.subtract(checkQuantity); + //扣减后可用数量 + BigDecimal newAllocationQuantity = oldAllocationQuantity.subtract(checkQuantity); + BigDecimal newFreezeQuantity = oldFreezeQuantity; @@ -366,6 +370,7 @@ public class HandoverTaskOrderDomainService { BigDecimal newNetWeight = oldNetWeight.subtract(checkNetWeight); materialInventoryPO.setInventoryQuantity(newInventoryQuantity); + materialInventoryPO.setAllocationQuantity(newAllocationQuantity); materialInventoryPO.setFreezeQuantity(newFreezeQuantity); materialInventoryPO.setArea(newArea); materialInventoryPO.setVolume(newVolume); @@ -415,8 +420,8 @@ public class HandoverTaskOrderDomainService { UserPo userPo = loginUser.getUserPo(); if (userPo != null) inventoryAdjustmentRecord.setCreateByName(userPo.getUserName()); inventoryAdjustmentRecord.setCreateTime(new Date()); - inventoryAdjustmentRecord.setAllocationAfterQuantity(materialInventoryPO.getAllocationQuantity()); - inventoryAdjustmentRecord.setAllocationBeforeQuantity(materialInventoryPO.getAllocationQuantity()); + inventoryAdjustmentRecord.setAllocationBeforeQuantity(oldAllocationQuantity); + inventoryAdjustmentRecord.setAllocationAfterQuantity(newAllocationQuantity); inventoryAdjustmentRecord.setFreezeBeforeQuantity(oldFreezeQuantity); inventoryAdjustmentRecord.setFreezeAfterQuantity(newFreezeQuantity); inventoryAdjustmentRecord.setInventoryBeforeQuantity(oldInventoryQuantity); @@ -523,4 +528,4 @@ public class HandoverTaskOrderDomainService { -} \ No newline at end of file +} 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 97bb41e56..d54dd57c5 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 @@ -417,7 +417,9 @@ public class PickingOrderDomainService { .map(PickingOrder::getQuantity).filter(java.util.Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal thresholdQuantity = (totalPickingPlanQuantity != null && totalPickingPlanQuantity.compareTo(BigDecimal.ZERO) > 0) ? totalPickingPlanQuantity : (stockOutOrderDb.getQuantity() != null ? stockOutOrderDb.getQuantity() : BigDecimal.ZERO); - if (pickingQuantity.compareTo(thresholdQuantity) >= 0){ + // 所有拣货单都已完成(status=3)时直接视为拣货完成,不依赖数量比较 + boolean allPickingOrdersDone = allPickingOrders.stream().allMatch(o -> o.getStatus() != null && o.getStatus() == 3); + if (allPickingOrdersDone || pickingQuantity.compareTo(thresholdQuantity) >= 0){ status = 7; if (pickingOrderPODb.getReview() == 2){ status = 9; @@ -627,6 +629,8 @@ public class PickingOrderDomainService { .set(PickingOrder::getUpdateByName, loginUser.getUsername()) .set(PickingOrder::getUpdateTime, new Date()) .eq(PickingOrder::getPickingOrderId, pickingOrderDO.getPickingOrderId())); + // 同步内存状态,确保后续 updateStockOutOrder 查DB时该单已是 status=3 + pickingOrderPO.setStatus(3); if (pickingOrderPO.getType() == 2){ //将分配数量分给子单 pickingMaterialDetailService.waveAssignUpdate(pickingOrderPO.getOrderNumber(), 2); @@ -641,6 +645,20 @@ public class PickingOrderDomainService { outOrderAbnormalService.genOutOrderAbnormal(outOrderAbnormalBaseDO, 1); //更新出库单状态 updateStockOutOrder(pickingOrderPO); + // 点击完成拣货时,不管数量多少,强制将出库单状态推进到拣货完成(7)或已出库(9) + if (1 == pickingOrderPO.getType()) { + StockOutOrder forceUpdate = new StockOutOrder(); + forceUpdate.setOutOrderNumber(pickingOrderPO.getOrderNumber()); + int forceStatus = (pickingOrderPO.getReview() != null && pickingOrderPO.getReview() == 2) ? 9 : 7; + forceUpdate.setStatus(forceStatus); + forceUpdate.setUpdateBy(loginUser.getUserid()); + forceUpdate.setUpdateByName(loginUser.getUsername()); + forceUpdate.setUpdateTime(new Date()); + stockOutOrderService.update(forceUpdate, new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, pickingOrderPO.getOrderNumber())); + if (pickingOrderPO.getReview() != null && pickingOrderPO.getReview() == 2) { + genHandoverTaskOrder(pickingOrderPO); + } + } //同步BMS结算系统,生成业务单据 //这里只有不需要复核的时候才推送,需要复核的在复核流程推送 if(stockOutOrder.getReview()==2){ @@ -811,4 +829,4 @@ public class PickingOrderDomainService { } deliveTaskService.batchInsert(deliveTaskDOList); } -} \ No newline at end of file +} 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 5794ad190..8c807f43d 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 @@ -737,7 +737,15 @@ public class ShiftMaterialDetailImpl extends ServiceImpl xgkc) //设置拣货单拣货需要更新的数据数据 updateStockOutTaskOrder(stockOutTaskOrderPO, stockOutTaskOrderPODb, 2); return true; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index 6c95e6edb..3badbb476 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -33,6 +33,8 @@ import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.todo.InMateria import com.mhd.wms.domain.inOrderAbnormal.repository.facade.IInOrderAbnormalService; import com.mhd.wms.domain.inOrderAbnormal.repository.todo.InOrderAbnormalBaseDO; import com.mhd.wms.domain.inventoryAdjustmentRecord.entity.InventoryAdjustmentRecord; +import com.mhd.wms.domain.materialBarCode.repository.facade.IMaterialBarCodeService; +import com.mhd.wms.domain.materialBarCode.repository.po.MaterialBarCodePO; import com.mhd.wms.domain.inventoryAdjustmentRecord.repository.mapper.InventoryAdjustmentRecordMapper; import com.mhd.wms.domain.inventoryStandingDetail.repository.facade.IInventoryStandingDetailService; import com.mhd.wms.domain.inventoryStandingDetail.repository.todo.InventoryStandingDetailDO; @@ -118,6 +120,8 @@ public class StockShelfOrderDomainService { @Autowired private MaterialInventoryMapper materialInventoryMapper; @Autowired + private IMaterialBarCodeService materialBarCodeService; + @Autowired private IMaterialGoodsRuleService materialGoodsRuleService; @Autowired private InventoryAdjustmentRecordMapper inventoryAdjustmentRecordMapper; @@ -718,7 +722,26 @@ public class StockShelfOrderDomainService { inventoryAdjustmentRecord.setMaterialBaseInfoId(materialInventory.getMaterialBaseInfoId()); inventoryAdjustmentRecord.setMaterialCode(shelfMaterialDetail.getMaterialCode()); inventoryAdjustmentRecord.setMaterialName(shelfMaterialDetail.getMaterialName()); - inventoryAdjustmentRecord.setBarCode(shelfMaterialDetail.getBarCode()); + // 条码优先取上架明细上的条码;如果为空,则根据物料基础信息ID从物料条码表中获取(单位代码为EA的条码) + String shelfBarCode = shelfMaterialDetail.getBarCode(); + if (StringUtils.isBlank(shelfBarCode) && shelfMaterialDetail.getMaterialBaseInfoId() != null) { + try { + java.util.List barCodeList = materialBarCodeService.getInfoByMaterialBaseInfoIds(shelfMaterialDetail.getMaterialBaseInfoId()); + if (barCodeList != null && !barCodeList.isEmpty()) { + // 优先选择单位代码为EA的条码,若不存在则取第一条 + MaterialBarCodePO eaBarCode = barCodeList.stream() + .filter(po -> "EA".equals(po.getUnitCode())) + .findFirst() + .orElse(barCodeList.get(0)); + if (eaBarCode != null && StringUtils.isNotBlank(eaBarCode.getBarCode())) { + shelfBarCode = eaBarCode.getBarCode(); + } + } + } catch (Exception e) { + log.warn("根据物料基础信息ID获取条码失败,materialBaseInfoId={},错误:{}", shelfMaterialDetail.getMaterialBaseInfoId(), e.getMessage()); + } + } + inventoryAdjustmentRecord.setBarCode(shelfBarCode); inventoryAdjustmentRecord.setMaterialBaseInfoId(shelfMaterialDetail.getMaterialBaseInfoId()); inventoryAdjustmentRecord.setOrganizationId(stockReceiptOrderDO.getOrganizationId()); inventoryAdjustmentRecord.setOrganizationName(stockReceiptOrderDO.getOrganizationName());