From cde1f03b98d9005b02fe42d12dbf5c7f4ed9049a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 12 Jun 2026 18:34:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor(inventory):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E7=9B=98=E7=82=B9=E5=92=8C=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除控制器方法注释中的多余空行 - 重构库存出库推荐逻辑,优先分配库位匹配的库存 - 添加物料编号为空时的验证检查 - 实现库位匹配不足时使用同物料其他库存补足机制 - 提取库存分配逻辑到独立的私有方法中 - 优化库存数量计算和更新流程 --- .../admin/controller/InventoryController.java | 77 ++++++++++--------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InventoryController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InventoryController.java index e177bfbb..d8c57492 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InventoryController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InventoryController.java @@ -65,7 +65,6 @@ public class InventoryController extends BaseController { /** * 库存查看 - * * @param request 请求参数 */ @PostMapping("search") @@ -75,7 +74,6 @@ public class InventoryController extends BaseController { /** * 发起库存检测任务 - * * @param request 库存检测申请参数 */ @PostMapping("detection/apply") @@ -86,7 +84,6 @@ public class InventoryController extends BaseController { /** * 保存库存盘点任务 - * * @param request 请求参数 */ @PostMapping("check/save") @@ -97,7 +94,6 @@ public class InventoryController extends BaseController { /** * 查询库存盘点任务 - * * @param request 请求参数 */ @PostMapping("check/search") @@ -107,7 +103,6 @@ public class InventoryController extends BaseController { /** * 获取库存盘点任务库存地点列表 - * * @param id 任务ID * @return 库存地点列表 */ @@ -137,7 +132,6 @@ public class InventoryController extends BaseController { /** * 发布库存盘点任务 - * * @param id 任务id */ @PostMapping("check/publish") @@ -148,7 +142,6 @@ public class InventoryController extends BaseController { /** * 删除库存盘点任务 - * * @param id ID */ @PostMapping("check/delete") @@ -167,7 +160,6 @@ public class InventoryController extends BaseController { /** * 盘点任务扫码(PDA使用) - * * @param request 请求参数 */ @PostMapping("check/scan") @@ -208,7 +200,6 @@ public class InventoryController extends BaseController { /** * 批量保存盘点结果(PDA使用) - * * @param request 请求参数 */ @PostMapping("check/saveScan") @@ -284,7 +275,6 @@ public class InventoryController extends BaseController { /** * 查看盘点结果 - * * @param request 请求参数 */ @PostMapping("check/getMaterials") @@ -294,7 +284,6 @@ public class InventoryController extends BaseController { /** * 查询物料扫码记录 - * * @param materialId 物料记录id * @return 扫码记录列表 */ @@ -305,7 +294,6 @@ public class InventoryController extends BaseController { /** * 获取推荐出库批次信息 - * * @param qo 请求参数 */ @PostMapping("getForOut") @@ -314,33 +302,46 @@ public class InventoryController extends BaseController { , qo.getItems().stream().map(InventoryForOutItemQO::getMaterialNo).collect(Collectors.toSet()) ); List vos = new ArrayList<>(); - qo.getItems().forEach(item -> { - InventoryForOutVO vo = new InventoryForOutVO() - .setMaterialNo(item.getMaterialNo()) - .setItems(new ArrayList<>()); - List mis = inventories.stream() - .filter(inventory -> StrUtil.equals(inventory.getMaterialNo(), item.getMaterialNo())) - .toList(); - if (CollectionUtil.isNotEmpty(mis)) { - BigDecimal num = item.getNum(); - for (WmsInventory inventory : mis) { - InventoryForOutItemQO mqo=qo.getItems().stream() - .filter(q -> StrUtil.equals(q.getMaterialNo(), inventory.getMaterialNo())) - .findFirst() - .get(); - if (StrUtil.isNotBlank(mqo.getBinNo()) && !StrUtil.equals(mqo.getBinNo(), inventory.getBinLocation())){ - continue; + qo.getItems() + .forEach(item -> { + if (StrUtil.isBlank(item.getMaterialNo())) { + return; } - BigDecimal outNum = NumberUtil.min(num, inventory.getNum()); - vo.getItems().add(new InventoryForOutItemVO(inventory.getBatchNo(), inventory.getSerialNo(), inventory.getBinLocation(), outNum)); - num = num.subtract(outNum); - if (num.compareTo(BigDecimal.ZERO) == 0) { - break; + InventoryForOutVO vo = new InventoryForOutVO() + .setMaterialNo(item.getMaterialNo()) + .setItems(new ArrayList<>()); + // 优先分配库位匹配的库存 + List binMatched = inventories.stream() + .filter(inventory -> StrUtil.equals(inventory.getMaterialNo(), item.getMaterialNo()) + && StrUtil.equals(inventory.getBinLocation(), item.getBinNo())) + .toList(); + getForOut(vo, binMatched, inventories, item); + // 库位匹配不足时,使用同物料的其他库存补足 + if (item.getNum().compareTo(BigDecimal.ZERO) > 0) { + List materialMatched = inventories.stream() + .filter(inventory -> StrUtil.equals(inventory.getMaterialNo(), item.getMaterialNo())) + .toList(); + getForOut(vo, materialMatched, inventories, item); } - } - vos.add(vo); - } - }); + if (CollectionUtil.isNotEmpty(vo.getItems())) { + vos.add(vo); + } + }); return ApiResult.success(vos); } -} + + private void getForOut(InventoryForOutVO vo, List candidates, List inventories, InventoryForOutItemQO item) { + for (WmsInventory inventory : candidates) { + if (item.getNum().compareTo(BigDecimal.ZERO) == 0) { + break; + } + BigDecimal outNum = NumberUtil.min(item.getNum(), inventory.getNum()); + vo.getItems().add(new InventoryForOutItemVO(inventory.getBatchNo(), inventory.getSerialNo(), inventory.getBinLocation(), outNum)); + item.setNum(item.getNum().subtract(outNum)); + inventory.setNum(inventory.getNum().subtract(outNum)); + if (inventory.getNum().compareTo(BigDecimal.ZERO) == 0) { + inventories.remove(inventory); + } + } + } +} \ No newline at end of file