diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index 6aa98028f..c33d4f4fc 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -614,8 +614,8 @@ public class StockOutOrderApplicationService { List outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda() .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber())); List materialDetailList = cn.hutool.core.bean.BeanUtil.copyToList(outMaterialDetailList, OutMaterialDetailDO.class); + List materialDetailList2 = new ArrayList<>(); for (OutMaterialDetailDO detail : materialDetailList) { - detail.setAllocationQuantity(detail.getQuantity()); String batchRefNo = detail.getBatchRefNo(); String sheetRefNo = detail.getSheetRefNo(); String boxPalletNo = detail.getBoxPalletNo(); @@ -630,15 +630,36 @@ public class StockOutOrderApplicationService { if (materialInventories == null || materialInventories.isEmpty()) { throw new ServiceException("库存不存在:" + batchRefNo + " " + sheetRefNo + " " + boxPalletNo); } - MaterialInventory materialInventory = materialInventories.get(0); - detail.setMaterialInventoryId(materialInventory.getMaterialInventoryId()); - detail.setStorageLocationId(materialInventory.getStorageLocationId()); - detail.setStorageLocationName(materialInventory.getStorageLocationName()); - detail.setStorageLocationCode(materialInventory.getStorageLocationCode()); - detail.setStorageSectionId(materialInventory.getStorageSectionId()); - detail.setStorageName(materialInventory.getStorageName()); - detail.setStorageCode(materialInventory.getStorageCode()); - detail.setInventoryQuantity(materialInventory.getInventoryQuantity()); + + BigDecimal remainingQuantity = detail.getQuantity(); // 计划数量 + for (MaterialInventory materialInventory : materialInventories) { + if (remainingQuantity.compareTo(BigDecimal.ZERO) <= 0) { + break; + } + // 当前物料的可用库存 + BigDecimal availableStock = materialInventory.getAllocationQuantity(); + // 如果当前物料没有库存,跳过 + if (availableStock == null || availableStock.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + // 计算本次能扣减的数量:取 剩余计划 和 当前库存 的较小值 + BigDecimal deductQuantity = remainingQuantity.compareTo(availableStock) <= 0 + ? remainingQuantity // 剩余计划 <= 库存,扣剩余计划 + : availableStock; // 剩余计划 > 库存,扣全部库存 + + detail.setMaterialInventoryId(materialInventory.getMaterialInventoryId()); + detail.setStorageLocationId(materialInventory.getStorageLocationId()); + detail.setStorageLocationName(materialInventory.getStorageLocationName()); + detail.setStorageLocationCode(materialInventory.getStorageLocationCode()); + detail.setStorageSectionId(materialInventory.getStorageSectionId()); + detail.setStorageName(materialInventory.getStorageName()); + detail.setStorageCode(materialInventory.getStorageCode()); + detail.setInventoryQuantity(materialInventory.getInventoryQuantity()); + detail.setAllocationQuantity(deductQuantity); + materialDetailList2.add(detail); + // 更新剩余计划数量 + remainingQuantity = remainingQuantity.subtract(deductQuantity); + } } stockOutOrderD.setMaterialDetailList(materialDetailList); StockOutOrderDO assembleStockOutOrderDO = assembleParamByOutOrder(stockOutOrderD);