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 a8e42c4c3..b4db95550 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 @@ -1033,7 +1033,8 @@ public class StockShelfOrderApplicationService { //未进行上架直接跳过 continue; } - BigDecimal actualQuantity = BigDecimal.ZERO;//当前作业上架数 + BigDecimal mainItemActualQuantity = shelvesQuantity;//主项本次上架数(不含子项) + BigDecimal childrenActualQuantity = BigDecimal.ZERO;//子项本次上架总数 // PDA 权重/体积/面积:记录“本次增量” BigDecimal netIncrement = BigDecimal.ZERO; BigDecimal grossIncrement = BigDecimal.ZERO; @@ -1047,8 +1048,7 @@ public class StockShelfOrderApplicationService { // setContainerInfo(shelfMaterialDetailDO); //上架后 设置该记录不允许被修改 shelfMaterialDetailDO.setAllowModify(2); - //未上过架 统计到当前收货单作业收货数 - actualQuantity = shelfMaterialDetailDO.getShelvesQuantity(); + // 未上过架:主项本次上架数量已由 shelvesQuantity 表示 } //判断是否存在子项 List returnShelfMaterialDetailDOChildList = new ArrayList<>(); @@ -1058,7 +1058,7 @@ public class StockShelfOrderApplicationService { // 从而 alreadyShelvesQuantity 不累计(覆盖问题的根因)。 // 当没有子项时,actualQuantity 应直接等于本次上架数量 shelvesQuantity。 if (CollectionUtils.isEmpty(shelfMaterialDetailDOChildList)) { - actualQuantity = shelvesQuantity; + mainItemActualQuantity = shelvesQuantity; if (fromApp) { // 若本次未上架数量(shelvesQuantity=0),则不允许用 PDA 提交的重量更新累计值 // 否则会出现:数量仍为 0,但 total_* 已经被累加到计划值 => pending 全 0 @@ -1100,11 +1100,16 @@ public class StockShelfOrderApplicationService { areaIncrement = areaIncrement.add(childAreaInc); } if (shelfMaterialDetailPOChildDb != null){ - // 子项已存在:累加上架数量,并加入返回列表供 batchShelfUpdate 更新(与收货一致,避免重复提交/漏更新) - actualQuantity = actualQuantity.add(childShelvesQty); + // 子项已存在:仅累计到子项总量,不能并到主项累计 + childrenActualQuantity = childrenActualQuantity.add(childShelvesQty); ShelfMaterialDetailDO returnShelfMaterialDetailDOChild = new ShelfMaterialDetailDO(); BeanUtils.copyProperties(shelfMaterialDetailPOChildDb, returnShelfMaterialDetailDOChild); BeanUtils.copyProperties(shelfMaterialDetailDOChild, returnShelfMaterialDetailDOChild, IgnoreNullUtil.getNullPropertyNames(shelfMaterialDetailDOChild)); + BigDecimal childDbAlreadyQty = shelfMaterialDetailPOChildDb.getAlreadyShelvesQuantity() != null + ? shelfMaterialDetailPOChildDb.getAlreadyShelvesQuantity() + : BigDecimal.ZERO; + // PC:already_shelves_quantity 使用本次上架量;PDA 保持累计口径 + returnShelfMaterialDetailDOChild.setAlreadyShelvesQuantity(fromApp ? childDbAlreadyQty.add(childShelvesQty) : childShelvesQty); if (fromApp) { // 子项已存在:total* 回传的是“本次增量”,需要累加到已有 already(并不超过计划) // oldAlready:优先用 DB 的累计值 total_*。 @@ -1177,6 +1182,8 @@ public class StockShelfOrderApplicationService { returnShelfMaterialDetailDOChild.setAllowModify(2); returnShelfMaterialDetailDOChild.setLevel(2); returnShelfMaterialDetailDOChild.setParentUniqueId(shelfMaterialDetailPO.getUniqueId()); + // 子项不维护独立计划数量,计划量仅由主项承载 + returnShelfMaterialDetailDOChild.setQuantity(null); returnShelfMaterialDetailDOChild.setActualQuantity(childShelvesQty); returnShelfMaterialDetailDOChildList.add(returnShelfMaterialDetailDOChild); continue; @@ -1232,6 +1239,8 @@ public class StockShelfOrderApplicationService { returnShelfMaterialDetailDOChild.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId)); returnShelfMaterialDetailDOChild.setLevel(2); returnShelfMaterialDetailDOChild.setParentUniqueId(shelfMaterialDetailPO.getUniqueId()); + // 子项不维护独立计划数量,计划量仅由主项承载 + returnShelfMaterialDetailDOChild.setQuantity(null); if (shelfMaterialDetailPO.getSerialNumberManage() == 1){ if (CollectionUtils.isEmpty(shelfMaterialDetailPO.getMaterialDetailSerialNumberList())){ throw new ServiceException("物料【" + shelfMaterialDetailPO.getMaterialName() + "】开启了序列号管理的序列号不能为空"); @@ -1239,12 +1248,15 @@ public class StockShelfOrderApplicationService { } returnShelfMaterialDetailDOChild.setMaterialDetailSerialNumberList(shelfMaterialDetailDO.getMaterialDetailSerialNumberList()); returnShelfMaterialDetailDOChild.setActualQuantity(returnShelfMaterialDetailDOChild.getShelvesQuantity()); + returnShelfMaterialDetailDOChild.setAlreadyShelvesQuantity(childShelvesQty); returnShelfMaterialDetailDOChildList.add(returnShelfMaterialDetailDOChild); - actualQuantity = actualQuantity.add(returnShelfMaterialDetailDOChild.getShelvesQuantity()); + childrenActualQuantity = childrenActualQuantity.add(returnShelfMaterialDetailDOChild.getShelvesQuantity()); } } - //现在已上架数量=之前已上架数量+现在作业数量 - shelfMaterialDetailDO.setAlreadyShelvesQuantity(shelfMaterialDetailPO.getAlreadyShelvesQuantity().add(actualQuantity)); + BigDecimal dbParentAlready = shelfMaterialDetailPO.getAlreadyShelvesQuantity() != null + ? shelfMaterialDetailPO.getAlreadyShelvesQuantity() : BigDecimal.ZERO; + // PC:already_shelves_quantity 使用本次上架量;PDA 保持累计口径 + shelfMaterialDetailDO.setAlreadyShelvesQuantity(fromApp ? dbParentAlready.add(mainItemActualQuantity) : mainItemActualQuantity); if (fromApp) { // 父项:total* 回传的是“本次增量”,需要累加到已有 already(并不超过计划) // oldAlready:优先用 DB 的累计值 total_*。 @@ -1297,11 +1309,25 @@ public class StockShelfOrderApplicationService { shelfMaterialDetailDO.setTotalVolume(newAlreadyVol); shelfMaterialDetailDO.setTotalArea(newAlreadyArea); } - //记录本次上架单上架总数 - totalActualQuantity = totalActualQuantity.add(actualQuantity); - //判断上架数量是否大于计划数量 - Integer shelvesStatus = judgeShelfQuantity(shelfMaterialDetailDO.getAlreadyShelvesQuantity(), shelfMaterialDetailPO.getQuantity()); + // 记录本次上架单上架总数:主项 + 子项(与收货口径一致) + totalActualQuantity = totalActualQuantity.add(mainItemActualQuantity.add(childrenActualQuantity)); + // 主项上架状态按「主项 + 子项」组内累计与主项计划比较(子项不单独维护计划量) + BigDecimal groupShelved = shelfMaterialDetailDO.getAlreadyShelvesQuantity() != null + ? shelfMaterialDetailDO.getAlreadyShelvesQuantity() : BigDecimal.ZERO; + if (!CollectionUtils.isEmpty(returnShelfMaterialDetailDOChildList)) { + for (ShelfMaterialDetailDO ch : returnShelfMaterialDetailDOChildList) { + BigDecimal childAlready = ch.getAlreadyShelvesQuantity() != null ? ch.getAlreadyShelvesQuantity() : BigDecimal.ZERO; + groupShelved = groupShelved.add(childAlready); + } + } + Integer shelvesStatus = judgeShelfQuantity(groupShelved, shelfMaterialDetailPO.getQuantity()); shelfMaterialDetailDO.setShelvesStatus(shelvesStatus); + // 子项状态与所属主项一致(主子共用主项计划量) + if (!CollectionUtils.isEmpty(returnShelfMaterialDetailDOChildList)) { + for (ShelfMaterialDetailDO ch : returnShelfMaterialDetailDOChildList) { + ch.setShelvesStatus(shelvesStatus); + } + } if (shelvesStatus > 2){ totalActualShelfMaterialQuantity += 1; } 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 af1fcd521..24f9e1c0e 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 @@ -542,11 +542,15 @@ public class StockShelfOrderDomainService { stockShelfOrder.setShelfOrderId(stockShelfOrderDO.getShelfOrderId()); stockShelfOrder.setStatus(2); BigDecimal currentShelvesQuantity = stockShelfOrderPO.getShelvesQuantity() != null ? stockShelfOrderPO.getShelvesQuantity() : BigDecimal.ZERO; - BigDecimal actualQuantity = stockShelfOrderDO.getActualQuantity() != null ? stockShelfOrderDO.getActualQuantity() : BigDecimal.ZERO; - BigDecimal reduce = stockShelfOrderDO.getMaterialDetailList().stream().map(ShelfMaterialDetailDO::getShelvesQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); - // PDA(fromApp=true)累加已有上架数量;PC 直接覆盖 + BigDecimal orderIncrementQuantity = stockShelfOrderDO.getActualQuantity() != null ? stockShelfOrderDO.getActualQuantity() : BigDecimal.ZERO; + // PDA(fromApp=true):本单本次作业量 = assembleParamByShelf 汇总的 actualQuantity(含主行+子行),累加到单头 + // PC:单头「上架数量」= 各明细累计已上架数量之和(递归含子行),不可仅顶层 shelvesQuantity 汇总,否则子行数量漏计、统计与完成判断错误 boolean fromApp = Boolean.TRUE.equals(stockShelfOrderDO.getFromApp()); - stockShelfOrder.setShelvesQuantity(fromApp ? currentShelvesQuantity.add(reduce) : reduce); + if (fromApp) { + stockShelfOrder.setShelvesQuantity(currentShelvesQuantity.add(orderIncrementQuantity)); + } else { + stockShelfOrder.setShelvesQuantity(sumShelfDetailAlreadyShelvesQuantityRecursive(stockShelfOrderDO.getMaterialDetailList())); + } stockShelfOrder.setShelvesMaterialQuantity(stockShelfOrderPO.getShelvesMaterialQuantity() + stockShelfOrderDO.getActualReceiptMaterialQuantity()); stockShelfOrder.setUpdateBy(loginUser.getUserid()); stockShelfOrder.setUpdateByName(loginUser.getUsername()); @@ -560,6 +564,26 @@ public class StockShelfOrderDomainService { return true; } + /** + * 递归汇总上架明细的累计已上架数量(主行 + 子行),用于 PC 端写入上架单头 shelves_quantity。 + */ + private BigDecimal sumShelfDetailAlreadyShelvesQuantityRecursive(List list) { + if (CollectionUtils.isEmpty(list)) { + return BigDecimal.ZERO; + } + BigDecimal sum = BigDecimal.ZERO; + for (ShelfMaterialDetailDO d : list) { + if (d == null) { + continue; + } + if (d.getAlreadyShelvesQuantity() != null) { + sum = sum.add(d.getAlreadyShelvesQuantity()); + } + sum = sum.add(sumShelfDetailAlreadyShelvesQuantityRecursive(d.getChildren())); + } + return sum; + } + /** * @param stockShelfOrderPO * @param status 入库状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入