refactor(inventory): 优化库存盘点和出库逻辑
- 移除控制器方法注释中的多余空行 - 重构库存出库推荐逻辑,优先分配库位匹配的库存 - 添加物料编号为空时的验证检查 - 实现库位匹配不足时使用同物料其他库存补足机制 - 提取库存分配逻辑到独立的私有方法中 - 优化库存数量计算和更新流程
This commit is contained in:
parent
c6fb4c27d3
commit
cde1f03b98
|
|
@ -65,7 +65,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 库存查看
|
* 库存查看
|
||||||
*
|
|
||||||
* @param request 请求参数
|
* @param request 请求参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("search")
|
@PostMapping("search")
|
||||||
|
|
@ -75,7 +74,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发起库存检测任务
|
* 发起库存检测任务
|
||||||
*
|
|
||||||
* @param request 库存检测申请参数
|
* @param request 库存检测申请参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("detection/apply")
|
@PostMapping("detection/apply")
|
||||||
|
|
@ -86,7 +84,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存库存盘点任务
|
* 保存库存盘点任务
|
||||||
*
|
|
||||||
* @param request 请求参数
|
* @param request 请求参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("check/save")
|
@PostMapping("check/save")
|
||||||
|
|
@ -97,7 +94,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询库存盘点任务
|
* 查询库存盘点任务
|
||||||
*
|
|
||||||
* @param request 请求参数
|
* @param request 请求参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("check/search")
|
@PostMapping("check/search")
|
||||||
|
|
@ -107,7 +103,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取库存盘点任务库存地点列表
|
* 获取库存盘点任务库存地点列表
|
||||||
*
|
|
||||||
* @param id 任务ID
|
* @param id 任务ID
|
||||||
* @return 库存地点列表
|
* @return 库存地点列表
|
||||||
*/
|
*/
|
||||||
|
|
@ -137,7 +132,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发布库存盘点任务
|
* 发布库存盘点任务
|
||||||
*
|
|
||||||
* @param id 任务id
|
* @param id 任务id
|
||||||
*/
|
*/
|
||||||
@PostMapping("check/publish")
|
@PostMapping("check/publish")
|
||||||
|
|
@ -148,7 +142,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除库存盘点任务
|
* 删除库存盘点任务
|
||||||
*
|
|
||||||
* @param id ID
|
* @param id ID
|
||||||
*/
|
*/
|
||||||
@PostMapping("check/delete")
|
@PostMapping("check/delete")
|
||||||
|
|
@ -167,7 +160,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 盘点任务扫码(PDA使用)
|
* 盘点任务扫码(PDA使用)
|
||||||
*
|
|
||||||
* @param request 请求参数
|
* @param request 请求参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("check/scan")
|
@PostMapping("check/scan")
|
||||||
|
|
@ -208,7 +200,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量保存盘点结果(PDA使用)
|
* 批量保存盘点结果(PDA使用)
|
||||||
*
|
|
||||||
* @param request 请求参数
|
* @param request 请求参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("check/saveScan")
|
@PostMapping("check/saveScan")
|
||||||
|
|
@ -284,7 +275,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查看盘点结果
|
* 查看盘点结果
|
||||||
*
|
|
||||||
* @param request 请求参数
|
* @param request 请求参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("check/getMaterials")
|
@PostMapping("check/getMaterials")
|
||||||
|
|
@ -294,7 +284,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询物料扫码记录
|
* 查询物料扫码记录
|
||||||
*
|
|
||||||
* @param materialId 物料记录id
|
* @param materialId 物料记录id
|
||||||
* @return 扫码记录列表
|
* @return 扫码记录列表
|
||||||
*/
|
*/
|
||||||
|
|
@ -305,7 +294,6 @@ public class InventoryController extends BaseController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取推荐出库批次信息
|
* 获取推荐出库批次信息
|
||||||
*
|
|
||||||
* @param qo 请求参数
|
* @param qo 请求参数
|
||||||
*/
|
*/
|
||||||
@PostMapping("getForOut")
|
@PostMapping("getForOut")
|
||||||
|
|
@ -314,33 +302,46 @@ public class InventoryController extends BaseController {
|
||||||
, qo.getItems().stream().map(InventoryForOutItemQO::getMaterialNo).collect(Collectors.toSet())
|
, qo.getItems().stream().map(InventoryForOutItemQO::getMaterialNo).collect(Collectors.toSet())
|
||||||
);
|
);
|
||||||
List<InventoryForOutVO> vos = new ArrayList<>();
|
List<InventoryForOutVO> vos = new ArrayList<>();
|
||||||
qo.getItems().forEach(item -> {
|
qo.getItems()
|
||||||
InventoryForOutVO vo = new InventoryForOutVO()
|
.forEach(item -> {
|
||||||
.setMaterialNo(item.getMaterialNo())
|
if (StrUtil.isBlank(item.getMaterialNo())) {
|
||||||
.setItems(new ArrayList<>());
|
return;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
BigDecimal outNum = NumberUtil.min(num, inventory.getNum());
|
InventoryForOutVO vo = new InventoryForOutVO()
|
||||||
vo.getItems().add(new InventoryForOutItemVO(inventory.getBatchNo(), inventory.getSerialNo(), inventory.getBinLocation(), outNum));
|
.setMaterialNo(item.getMaterialNo())
|
||||||
num = num.subtract(outNum);
|
.setItems(new ArrayList<>());
|
||||||
if (num.compareTo(BigDecimal.ZERO) == 0) {
|
// 优先分配库位匹配的库存
|
||||||
break;
|
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);
|
||||||
}
|
}
|
||||||
}
|
if (CollectionUtil.isNotEmpty(vo.getItems())) {
|
||||||
vos.add(vo);
|
vos.add(vo);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return ApiResult.success(vos);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue