| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long adjustMaterialStock(MesWmMaterialStockAdjustReqVO reqVO) { |
| | | public Long adjustMaterialStockIn(MesWmMaterialStockAdjustReqVO reqVO) { |
| | | return doAdjustMaterialStock(reqVO, true); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long adjustMaterialStockOut(MesWmMaterialStockAdjustReqVO reqVO) { |
| | | return doAdjustMaterialStock(reqVO, false); |
| | | } |
| | | |
| | | /** |
| | | * 执行库存调整 |
| | | * |
| | | * @param reqVO 调整请求 |
| | | * @param isInbound 是否为入库(true=入库,false=出库) |
| | | * @return 库存记录ID |
| | | */ |
| | | private Long doAdjustMaterialStock(MesWmMaterialStockAdjustReqVO reqVO, boolean isInbound) { |
| | | // 1. 校验物料存在且启用 |
| | | MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | |
| | | // 2. 判断是入库还是出库 |
| | | BigDecimal quantity = reqVO.getQuantity(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) == 0) { |
| | | throw exception(WM_MATERIAL_STOCK_QUANTITY_INVALID); |
| | | } |
| | | boolean isInbound = quantity.compareTo(BigDecimal.ZERO) > 0; |
| | | int bizType = isInbound ? MesBizTypeConstants.WM_STOCK_ADJUST_IN : MesBizTypeConstants.WM_STOCK_ADJUST_OUT; |
| | | |
| | | // 3. 校验库位混放规则 |
| | | // 2. 校验库位混放规则 |
| | | checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId()); |
| | | |
| | | // 4. 获取或创建库存记录 |
| | | // 3. 获取或创建库存记录 |
| | | MesWmMaterialStockDO stock = getOrCreateMaterialStock( |
| | | reqVO.getItemId(), |
| | | reqVO.getWarehouseId(), |
| | |
| | | LocalDateTime.now() |
| | | ); |
| | | |
| | | // 4. 计算变动数量:入库为正,出库为负 |
| | | BigDecimal quantity = isInbound ? reqVO.getQuantity() : reqVO.getQuantity().negate(); |
| | | |
| | | // 5. 更新库存数量(出库时校验库存充足) |
| | | updateMaterialStockQuantity(stock.getId(), quantity, !isInbound); |
| | | |
| | | // 6. 创建库存事务流水 |
| | | int bizType = isInbound ? MesBizTypeConstants.WM_STOCK_ADJUST_IN : MesBizTypeConstants.WM_STOCK_ADJUST_OUT; |
| | | MesWmTransactionSaveReqDTO transaction = new MesWmTransactionSaveReqDTO() |
| | | .setType(isInbound ? MesWmTransactionTypeEnum.IN.getType() : MesWmTransactionTypeEnum.OUT.getType()) |
| | | .setBizType(bizType) |