liyong
2026-05-11 d6388d041cc58b9f2be3ddcddfb6042e7af094f7
fix(stock): 修复库存盘点计划中的出入库记录类型错误

- 修正库存盘点计划中差异数量大于0时应为入库记录类型,小于0时应为出库记录类型
- 更新库存记录时使用绝对值作为数量参数确保正确定义库存变动
- 在库存盘点完成后添加库存锁定状态更新功能
- 修正StockUtils工具类中的subtractStock方法调用为addStockOutRecordOnly
- 修改addStockOutRecordOnly方法返回类型从Boolean改为StockOutRecordDto以正确返回记录信息
- 新增updateLocked方法用于更新库存锁定状态,支持按产品型号和批次号进行锁定操作
已修改6个文件
45 ■■■■ 文件已修改
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInventoryService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -123,7 +123,7 @@
        stockInventoryDto.setQualitity(quantity);
        stockInventoryDto.setProductModelId(productModelId);
        stockInventoryDto.setBatchNo(batchNo);
       return stockInventoryService.subtractStockInventory(stockInventoryDto);
       return stockInventoryService.addStockOutRecordOnly(stockInventoryDto);
    }
    //不合格库存删除
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -60,4 +60,6 @@
    List<StockInventoryDto> selectStockInvenrory(Long productModelId);
    IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, @Param("ew") StockInventoryDto stockInventoryDto);
    int updateLocked(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("locked") boolean b);
}
src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -9,6 +9,7 @@
import com.ruoyi.stock.dto.StockOutRecordDto;
import com.ruoyi.stock.pojo.StockInventory;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -33,7 +34,7 @@
    StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto);
    Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto);
    StockOutRecordDto addStockOutRecordOnly(StockInventoryDto stockInventoryDto);
    R importStockInventory(MultipartFile file);
@@ -52,4 +53,6 @@
    List<StockInventoryDto> selectStockInvenrory(Long productModelId);
    IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto);
    boolean updateLocked(@NotBlank(message = "不能为空") Long productModelId, String batchNo, boolean b);
}
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
@@ -129,17 +129,18 @@
            stockInventoryDto.setRecordId(stockInventoryCheckPlanDto.getId());
            if (item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) > 0) {
                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode());
                StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode());
                StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs (), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                //直接审核通过
                stockInRecordService.batchApprove(Collections.singletonList(stockInRecordDto.getId()), 1);
            }else {
                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode());
                StockOutRecordDto stockOutRecordDto = stockUtils.substractStock(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode());
                StockOutRecordDto stock = stockUtils.substractStock(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                //直接审核通过
                stockOutRecordService.batchApprove(Collections.singletonList(stockOutRecordDto.getId()), 1);
                stockOutRecordService.batchApprove(Collections.singletonList(stock.getId()), 1);
            }
            //更新库存锁定状态
            stockInventoryService.updateLocked(stockInventoryDto.getProductModelId(),stockInventoryDto.getBatchNo(), true);
        }
        stockInventoryCheckItemMapper.updateById(stockInventoryCheckPlanDto.getCheckItems());
        plan.setStatus(2);
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -254,7 +254,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto) {
    public StockOutRecordDto addStockOutRecordOnly(StockInventoryDto stockInventoryDto) {
        LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>();
        eq.eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
        if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) {
@@ -290,8 +290,9 @@
        stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockOutRecordDto.setType("0");
        stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
        stockOutRecordService.add(stockOutRecordDto);
        return true;
        Long add = stockOutRecordService.add(stockOutRecordDto);
        stockInventoryDto.setId(add);
        return stockOutRecordDto;
    }
    @Override
@@ -448,4 +449,9 @@
    public IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto) {
        return stockInventoryMapper.pagestockInventoryNoQua(page, stockInventoryDto);
    }
    @Override
    public boolean updateLocked(Long productModelId, String batchNo, boolean b) {
        return stockInventoryMapper.updateLocked(productModelId, batchNo, b) > 0;
    }
}
src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -63,6 +63,17 @@
                and batch_no = #{ew.batchNo}
            </if>
    </update>
    <update id="updateLocked">
        update stock_inventory
        set locked = #{locked}
        where product_model_id = #{ew.productModelId}
        <if test="batchNo == null">
            and batch_no is null
        </if>
            <if test="batchNo != null">
                and batch_no = #{ew.batchNo}
            </if>
    </update>
    <select id="pagestockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto">
        select si.id,
        si.qualitity,