refactor(inventory): 优化库存盘点和出库逻辑

- 移除控制器方法注释中的多余空行
- 重构库存出库推荐逻辑,优先分配库位匹配的库存
- 添加物料编号为空时的验证检查
- 实现库位匹配不足时使用同物料其他库存补足机制
- 提取库存分配逻辑到独立的私有方法中
- 优化库存数量计算和更新流程
This commit is contained in:
曹鹏飞 2026-06-12 18:34:33 +08:00
parent c6fb4c27d3
commit cde1f03b98
1 changed files with 39 additions and 38 deletions

View File

@ -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<InventoryForOutVO> vos = new ArrayList<>();
qo.getItems().forEach(item -> {
InventoryForOutVO vo = new InventoryForOutVO()
.setMaterialNo(item.getMaterialNo())
.setItems(new ArrayList<>());
List<WmsInventory> 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<WmsInventory> 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<WmsInventory> 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<WmsInventory> candidates, List<WmsInventory> 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);
}
}
}
}