liyong
2026-05-09 4402a6e3befe0c33e8f3b58641984fce3fdb0bbc
feat(stock): 添加库存盘点功能并优化出入库记录

- 添加库存盘点主表、子表相关实体类和DTO
- 实现库存盘点相关的控制器、服务层和数据访问层
- 添加盘点计划功能,支持定期、临时、抽样盘点
- 扩展出入库记录返回值为Long类型,提供更准确的ID返回
- 添加库存盘点相关的枚举类型,支持盘点入库出库操作
- 实现出库记录的审批状态初始化功能
- 添加库存查询接口,支持按商品型号分页查询
- 优化库存管理中的加减库存方法返回值类型
- 添加产品模型批量查询功能,支持按ID列表获取模型信息
- 扩展库存实体增加锁定字段,增强库存管理功能
- 重构出入库记录生成逻辑,统一订单编号生成规则
已添加27个文件
已修改16个文件
1374 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckItemController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckMainController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckPlanController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckProductController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/StockInventoryController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/dto/StockInventoryCheckItemDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/dto/StockInventoryCheckMainDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/dto/StockInventoryCheckPlanDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckItemMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckMainMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckPlanMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckProductMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInventory.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckItem.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckMain.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckPlan.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckProduct.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInRecordService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInventoryCheckItemService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInventoryCheckMainService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInventoryCheckPlanService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInventoryCheckProductService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInventoryService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockOutRecordService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckItemServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckMainServiceImpl.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckProductServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/ProductModelMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryCheckItemMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryCheckMainMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryCheckPlanMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryCheckProductMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.ProductModelDto;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.vo.ProductModelVo;
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
@@ -27,4 +28,6 @@
    ProductModel selectLatestRecord();
    List<Map<String, Object>> getProductAndModelList();
    List<ProductModelDto> selectModelByIds( @Param("list") List<Long> productIdList);
}
src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
@@ -25,7 +25,9 @@
    RETURN_UNSTOCK_IN("15", "销售退货-不合格入库"),
    PICK_RETURN_IN("20", "领料退料-合格入库"),
    PURCHASE_RETURN_STOCK_OUT("21", "采购退货"),
    FEED_RETURN_IN("22", "生产退料-合格入库");
    FEED_RETURN_IN("22", "生产退料-合格入库"),
    INVENTORY_CHECK_STOCK_IN("23", "盘点-入库"),
    INVENTORY_CHECK_STOCK_OUT("24", "盘点-出库");
src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -11,7 +11,8 @@
    PURCHASE_RETURN_STOCK_OUT("9", "采购退货"),
    SALE_SHIP_STOCK_OUT("13", "销售-发货出库"),
    PICK_STOCK_OUT("14", "生产领料出库"),
    FEED_STOCK_OUT("15", "生产补料出库");
    FEED_STOCK_OUT("15", "生产补料出库"),
    INVENTORY_CHECK_STOCK_OUT("24", "盘点-出库");
    private final String code;
    private final String value;
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -4,7 +4,9 @@
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockOutRecordDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.mapper.StockInventoryMapper;
import com.ruoyi.stock.pojo.StockInRecord;
@@ -87,14 +89,14 @@
     * @param recordType
     * @param recordId
     */
    public void addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
    public StockInRecordDto addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
        StockInventoryDto stockInventoryDto = new StockInventoryDto();
        stockInventoryDto.setRecordId(recordId);
        stockInventoryDto.setRecordType(String.valueOf(recordType));
        stockInventoryDto.setQualitity(quantity);
        stockInventoryDto.setProductModelId(productModelId);
        stockInventoryDto.setBatchNo(batchNo);
        stockInventoryService.addStockInRecordOnly(stockInventoryDto);
       return stockInventoryService.addStockInRecordOnly(stockInventoryDto);
    }
    /**
@@ -114,14 +116,14 @@
        stockInventoryService.subtractStockInventory(stockInventoryDto);
    }
    public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
    public StockOutRecordDto substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
        StockInventoryDto stockInventoryDto = new StockInventoryDto();
        stockInventoryDto.setRecordId(recordId);
        stockInventoryDto.setRecordType(String.valueOf(recordType));
        stockInventoryDto.setQualitity(quantity);
        stockInventoryDto.setProductModelId(productModelId);
        stockInventoryDto.setBatchNo(batchNo);
        stockInventoryService.subtractStockInventory(stockInventoryDto);
       return stockInventoryService.subtractStockInventory(stockInventoryDto);
    }
    //不合格库存删除
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.stock.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * åº“存盘点子表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:44
 */
@RestController
@RequestMapping("/stockInventoryCheckItem")
public class StockInventoryCheckItemController {
}
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckMainController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.ruoyi.stock.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInventoryCheckMainDto;
import com.ruoyi.stock.service.StockInventoryCheckMainService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * åº“存盘点主表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:53
 */
@RestController
@RequestMapping("/stockInventoryCheckMain")
@AllArgsConstructor
@Tag(name = "库存盘点主表")
public class StockInventoryCheckMainController {
    private final StockInventoryCheckMainService stockInventoryCheckMainService;
    @GetMapping("/listPage")
    @Operation(summary = "分页查询库存盘点主表")
    public R listPage(Page  page, StockInventoryCheckMainDto stockInventoryCheckMainDto) {
        return R.ok(stockInventoryCheckMainService.listPage(page, stockInventoryCheckMainDto));
    }
    @GetMapping("/add")
    @Operation(summary = "添加库存盘点主表")
    public R add(StockInventoryCheckMainDto stockInventoryCheckMainDto) {
        return R.ok(stockInventoryCheckMainService.add(stockInventoryCheckMainDto));
    }
    @GetMapping("/edit")
    @Operation(summary = "修改库存盘点主表")
    public R edit(StockInventoryCheckMainDto stockInventoryCheckMainDto) {
        return stockInventoryCheckMainService.updateStockInventoryCheckMainDtoById(stockInventoryCheckMainDto);
    }
}
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.stock.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInventoryCheckPlanDto;
import com.ruoyi.stock.service.StockInventoryCheckPlanService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * ç›˜ç‚¹è®¡åˆ’表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 10:00:43
 */
@RestController
@RequestMapping("/stockInventoryCheckPlan")
@AllArgsConstructor
@Tag(name = "盘点计划表")
public class StockInventoryCheckPlanController {
    private final StockInventoryCheckPlanService stockInventoryCheckPlanService;
    @GetMapping("/listPage")
    @Operation(summary = "分页查询盘点计划表")
    public R listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        return R.ok(stockInventoryCheckPlanService.listPage(page, stockInventoryCheckPlanDto));
    }
    @PostMapping("/add")
    @Operation(summary = "添加盘点计划表")
    public R add(@RequestBody StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        return stockInventoryCheckPlanService.add(stockInventoryCheckPlanDto );
    }
    @PutMapping("/update")
    @Operation(summary = "修改盘点计划表")
    public R edit(@RequestBody StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        return stockInventoryCheckPlanService.edit(stockInventoryCheckPlanDto );
    }
    @DeleteMapping("/delete")
    @Operation(summary = "删除盘点计划表")
    public R delete(@RequestBody List<Long> ids) {
        return stockInventoryCheckPlanService.delete(ids );
    }
    @Operation(summary = "开始盘点")
    @PostMapping("/start/{id}")
    public R start(@PathVariable Long id) {
        return stockInventoryCheckPlanService.start(id);
    }
    @Operation(summary = "盘点计划详情")
    @GetMapping("/detail/{id}")
    public R detail(@PathVariable Long id) {
        return R.ok(stockInventoryCheckPlanService.detail(id));
    }
    @Operation(summary = "结束盘点")
    @PostMapping("/end")
    public R end(@RequestBody StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        return stockInventoryCheckPlanService.end(stockInventoryCheckPlanDto);
    }
}
src/main/java/com/ruoyi/stock/controller/StockInventoryCheckProductController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.stock.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * åº“存盘点商品表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 02:04:26
 */
@RestController
@RequestMapping("/stockInventoryCheckProduct")
public class StockInventoryCheckProductController {
}
src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -44,6 +44,13 @@
        return R.ok(stockInventoryDtoIPage);
    }
    @GetMapping("/pagestockInventoryNoQua")
    @Operation(summary = "分页查询库存产品,不要数量")
    public R pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto) {
        IPage<StockInventoryDto> stockInventoryDtoIPage = stockInventoryService.pagestockInventoryNoQua(page, stockInventoryDto);
        return R.ok(stockInventoryDtoIPage);
    }
    @GetMapping("/pageListCombinedStockInventory")
    @Operation(summary = "分页查询联合库存列表")
    public R pageListCombinedStockInventory(Page page, StockInventoryDto stockInventoryDto) {
src/main/java/com/ruoyi/stock/dto/StockInventoryCheckItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.stock.dto;
import com.ruoyi.stock.pojo.StockInventoryCheckItem;
import lombok.Data;
@Data
public class StockInventoryCheckItemDto extends StockInventoryCheckItem {
}
src/main/java/com/ruoyi/stock/dto/StockInventoryCheckMainDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.stock.dto;
import com.ruoyi.stock.pojo.StockInventoryCheckMain;
import lombok.Data;
import java.util.List;
@Data
public class StockInventoryCheckMainDto extends StockInventoryCheckMain {
    private List<StockInventoryCheckItemDto> stockInventoryCheckItemDtos;
}
src/main/java/com/ruoyi/stock/dto/StockInventoryCheckPlanDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.stock.dto;
import com.ruoyi.stock.pojo.StockInventoryCheckItem;
import com.ruoyi.stock.pojo.StockInventoryCheckPlan;
import com.ruoyi.stock.pojo.StockInventoryCheckProduct;
import lombok.Data;
import java.util.List;
@Data
public class StockInventoryCheckPlanDto extends StockInventoryCheckPlan {
    private List<Long> productIdList;
    private String createBy;
    private String  startTime;
    private String  endTime;
    private List<StockInventoryCheckProduct> items;
    private List<StockInventoryCheckItem> checkItems;
}
src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -15,6 +15,7 @@
    private String productName;
    private String model;
    private String unit;
    private String specificationModel;
    //入库类型
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.stock.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.stock.pojo.StockInventoryCheckItem;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * åº“存盘点子表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:44
 */
@Mapper
public interface StockInventoryCheckItemMapper extends BaseMapper<StockInventoryCheckItem> {
}
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckMainMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.stock.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.stock.pojo.StockInventoryCheckMain;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * åº“存盘点主表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:53
 */
@Mapper
public interface StockInventoryCheckMainMapper extends BaseMapper<StockInventoryCheckMain> {
}
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.stock.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.stock.dto.StockInventoryCheckPlanDto;
import com.ruoyi.stock.pojo.StockInventoryCheckPlan;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * ç›˜ç‚¹è®¡åˆ’表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 10:00:43
 */
@Mapper
public interface StockInventoryCheckPlanMapper extends BaseMapper<StockInventoryCheckPlan> {
    IPage<StockInventoryCheckPlanDto> listPage(Page page,@Param("ew") StockInventoryCheckPlanDto stockInventoryCheckPlanDto);
}
src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.stock.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.stock.pojo.StockInventoryCheckProduct;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * åº“存盘点商品表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 02:04:26
 */
@Mapper
public interface StockInventoryCheckProductMapper extends BaseMapper<StockInventoryCheckProduct> {
}
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -56,4 +56,8 @@
    List<StockInventory> listSelectableBatchNoByProductModelIds(@Param("productModelIds") List<Long> productModelIds);
    List<StockInventory> getByModelId(@Param("productModelId") Long productModelId);
    List<StockInventoryDto> selectStockInvenrory(Long productModelId);
    IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, @Param("ew") StockInventoryDto stockInventoryDto);
}
src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -72,4 +72,6 @@
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
    @Schema(description = "是否锁定")
    private Boolean locked;
}
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.ruoyi.stock.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * åº“存盘点子表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:44
 */
@Getter
@Setter
@ToString
@TableName("stock_inventory_check_item")
@ApiModel(value = "StockInventoryCheckItem对象", description = "库存盘点子表")
public class StockInventoryCheckItem implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @Schema(description ="主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * ä¸»è¡¨ID
     */
    @Schema(description ="主表ID")
    private Long mainId;
    /**
     * å•†å“ID
     */
    @Schema(description ="商品ID")
    private Long productModelId;
    /**
     * å•†å“ç¼–码
     */
    @Schema(description ="商品编码")
    private String productCode;
    /**
     * å•†å“åç§°
     */
    @Schema(description ="商品名称")
    private String productName;
    /**
     * è§„格型号
     */
    @Schema(description ="规格型号")
    private String model;
    /**
     * å•位
     */
    @Schema(description ="单位")
    private String unit;
    /**
     * æ‰¹å·
     */
    @Schema(description ="批号")
    private String batchNo;
    /**
     * ç³»ç»Ÿåº“存数量
     */
    @Schema(description ="系统库存数量")
    private BigDecimal systemQuantity;
    /**
     * å®žé™…盘点数量
     */
    @Schema(description ="实际盘点数量")
    private BigDecimal actualQuantity;
    /**
     * å·®å¼‚数量(实际-系统)
     */
    @Schema(description ="差异数量(实际-系统)")
    private BigDecimal differenceQuantity;
    /**
     * å¤‡æ³¨
     */
    @Schema(description ="备注")
    private String remark;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @Schema(description ="创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @Schema(description ="更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    private Long deptId;
}
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckMain.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
package com.ruoyi.stock.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * åº“存盘点主表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:53
 */
@Getter
@Setter
@ToString
@TableName("stock_inventory_check_main")
@ApiModel(value = "StockInventoryCheckMain对象", description = "库存盘点主表")
public class StockInventoryCheckMain implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @Schema(description ="主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * ç›˜ç‚¹å•号
     */
    @Schema(description ="盘点单号")
    private String checkNo;
    /**
     * ç›˜ç‚¹ç±»åž‹ï¼š1-定期盘点,2-临时盘点,3-抽样盘点
     */
    @Schema(description ="盘点类型:1-定期盘点,2-临时盘点,3-抽样盘点")
    private String checkType;
    /**
     * ç›˜ç‚¹æ€»æ•°é‡
     */
    @Schema(description ="盘点总数量")
    private BigDecimal totalQuantity;
    /**
     * æ¥æºç±»åž‹ï¼š1-计划生成,2-手动创建
     */
    @Schema(description ="来源类型:1-计划生成,2-手动创建")
    private String sourceType;
    /**
     * æ¥æºID(关联盘点计划ID)
     */
    @Schema(description ="来源ID(关联盘点计划ID)")
    private Long sourceId;
    /**
     * çŠ¶æ€ï¼š0-待盘点,1-盘点中,2-已完成,3-已审核,4-已取消
     */
    @Schema(description ="状态:0-待盘点,1-盘点中,2-已完成,3-已审核,4-已取消")
    private Integer status;
    /**
     * ç›˜ç‚¹æ—¥æœŸ
     */
    @Schema(description ="盘点日期")
    private LocalDate checkDate;
    /**
     * è´Ÿè´£äººID
     */
    @Schema(description ="负责人ID")
    private Long responsiblePersonId;
    /**
     * è´Ÿè´£äººå§“名
     */
    @Schema(description ="负责人姓名")
    private String responsiblePersonName;
    /**
     * å¤‡æ³¨
     */
    @Schema(description ="备注")
    private String remark;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @Schema(description ="创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºäºº
     */
    @Schema(description ="创建人")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @Schema(description ="更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * æ›´æ–°äºº
     */
    @Schema(description ="更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    private Long deptId;
}
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.ruoyi.stock.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * ç›˜ç‚¹è®¡åˆ’表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 10:00:43
 */
@Getter
@Setter
@ToString
@TableName("stock_inventory_check_plan")
@ApiModel(value = "StockInventoryCheckPlan对象", description = "盘点计划表")
public class StockInventoryCheckPlan implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @Schema(description = "主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * è®¡åˆ’编号
     */
    @Schema(description = "计划编号")
    private String planNo;
    /**
     * è´Ÿè´£äººID
     */
    @Schema(description = "盘点人id")
    private Long checkerId;
    /**
     * è´Ÿè´£äººå§“名
     */
    @Schema(description = "盘点人名字")
    private String checkerName;
    /**
     * è®¡åˆ’日期
     */
    @Schema(description = "计划日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate planDate;
    /**
     * çŠ¶æ€ï¼š0-待执行,1-执行中,2-已完成,3-已取消
     */
    @Schema(description = "状态:0-待执行,1-执行中,2-已完成,3-已取消")
    private Integer status;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @Schema(description = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDate createTime;
    /**
     * åˆ›å»ºäºº
     */
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @Schema(description = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * æ›´æ–°äºº
     */
    @Schema(description = "更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * å¤‡æ³¨
     */
    @Schema(description = "备注")
    private String remark;
    /**
     * åˆ é™¤æ ‡å¿—(0代表存在 1代表删除)
     */
    @Schema(description = "删除标志(0代表存在 1代表删除)")
    private String delFlag;
    private Long deptId;
}
src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ruoyi.stock.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * <p>
 * åº“存盘点商品表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 02:04:26
 */
@Getter
@Setter
@ToString
@TableName("stock_inventory_check_product")
@ApiModel(value = "StockInventoryCheckProduct对象", description = "库存盘点商品表")
public class StockInventoryCheckProduct implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @ApiModelProperty("主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private Long inventoryCheckPlanId;
    /**
     * å•†å“ID
     */
    @ApiModelProperty("商品ID")
    private Long productModelId;
    /**
     * å•†å“åç§°
     */
    @ApiModelProperty("商品名称")
    private String productName;
    /**
     * è§„格型号
     */
    @ApiModelProperty("规格型号")
    private String model;
    /**
     * å•位
     */
    @ApiModelProperty("单位")
    private String unit;
    /**
     * ç³»ç»Ÿåº“存数量
     */
    @ApiModelProperty("系统库存数量")
    private BigDecimal systemQuantity;
}
src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -12,7 +12,7 @@
public interface StockInRecordService extends IService<StockInRecord> {
    IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto);
    int add(StockInRecordDto stockInRecordDto);
    Long add(StockInRecordDto stockInRecordDto);
    int update(Long id, StockInRecordDto stockInRecordDto);
src/main/java/com/ruoyi/stock/service/StockInventoryCheckItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.stock.service;
import com.ruoyi.stock.pojo.StockInventoryCheckItem;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * åº“存盘点子表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:44
 */
public interface StockInventoryCheckItemService extends IService<StockInventoryCheckItem> {
}
src/main/java/com/ruoyi/stock/service/StockInventoryCheckMainService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.stock.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInventoryCheckMainDto;
import com.ruoyi.stock.pojo.StockInventoryCheckMain;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * åº“存盘点主表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:53
 */
public interface StockInventoryCheckMainService extends IService<StockInventoryCheckMain> {
    IPage<StockInventoryCheckMainDto> listPage(Page page, StockInventoryCheckMainDto stockInventoryCheckMainDto);
    Boolean add(StockInventoryCheckMainDto stockInventoryCheckMainDto);
    R updateStockInventoryCheckMainDtoById(StockInventoryCheckMainDto stockInventoryCheckMainDto);
}
src/main/java/com/ruoyi/stock/service/StockInventoryCheckPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.stock.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInventoryCheckPlanDto;
import com.ruoyi.stock.pojo.StockInventoryCheckPlan;
import java.util.List;
/**
 * <p>
 * ç›˜ç‚¹è®¡åˆ’表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 10:00:43
 */
public interface StockInventoryCheckPlanService extends IService<StockInventoryCheckPlan> {
    R add(StockInventoryCheckPlanDto stockInventoryCheckPlanDto);
    R edit(StockInventoryCheckPlanDto stockInventoryCheckPlanDto);
    R delete(List<Long> ids);
    IPage<StockInventoryCheckPlanDto> listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto);
    R start(Long id);
    R end(StockInventoryCheckPlanDto stockInventoryCheckPlanDto);
    StockInventoryCheckPlanDto detail(Long id);
}
src/main/java/com/ruoyi/stock/service/StockInventoryCheckProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.stock.service;
import com.ruoyi.stock.pojo.StockInventoryCheckProduct;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * åº“存盘点商品表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 02:04:26
 */
public interface StockInventoryCheckProductService extends IService<StockInventoryCheckProduct> {
}
src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -6,6 +6,7 @@
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockOutRecordDto;
import com.ruoyi.stock.pojo.StockInventory;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
@@ -28,9 +29,9 @@
    Boolean addstockInventory(StockInventoryDto stockInventoryDto);
    Boolean subtractStockInventory(StockInventoryDto stockInventoryDto);
    StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto);
    Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto);
    StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto);
    Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto);
@@ -47,4 +48,8 @@
    Boolean thawStock(StockInventoryDto stockInventoryDto);
    List<StockInventory> getByModelId(Long modelId);
    List<StockInventoryDto> selectStockInvenrory(Long productModelId);
    IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto);
}
src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
@@ -20,7 +20,7 @@
public interface StockOutRecordService extends IService<StockOutRecord> {
    IPage<StockOutRecordDto> listPage(Page page, StockOutRecordDto stockOutRecordDto);
    int add(StockOutRecordDto stockOutRecordDto);
    Long add(StockOutRecordDto stockOutRecordDto);
    int update(Long id, StockOutRecordDto stockOutRecordDto);
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -48,12 +48,13 @@
    // æ–°å¢žå…¥åº“
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int add(StockInRecordDto stockInRecordDto) {
    public Long add(StockInRecordDto stockInRecordDto) {
        String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches");
        stockInRecordDto.setInboundBatches(no);
        StockInRecord stockInRecord = new StockInRecord();
        BeanUtils.copyProperties(stockInRecordDto, stockInRecord);
        return stockInRecordMapper.insert(stockInRecord);
        stockInRecordMapper.insert(stockInRecord);
        return stockInRecord.getId();
    }
    @Override
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.stock.service.impl;
import com.ruoyi.stock.pojo.StockInventoryCheckItem;
import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper;
import com.ruoyi.stock.service.StockInventoryCheckItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * åº“存盘点子表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:44
 */
@Service
public class StockInventoryCheckItemServiceImpl extends ServiceImpl<StockInventoryCheckItemMapper, StockInventoryCheckItem> implements StockInventoryCheckItemService {
}
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckMainServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.stock.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInventoryCheckItemDto;
import com.ruoyi.stock.dto.StockInventoryCheckMainDto;
import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper;
import com.ruoyi.stock.mapper.StockInventoryCheckMainMapper;
import com.ruoyi.stock.pojo.StockInventoryCheckItem;
import com.ruoyi.stock.pojo.StockInventoryCheckMain;
import com.ruoyi.stock.service.StockInventoryCheckMainService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
/**
 * <p>
 * åº“存盘点主表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 09:57:53
 */
@Service
@RequiredArgsConstructor
public class StockInventoryCheckMainServiceImpl extends ServiceImpl<StockInventoryCheckMainMapper, StockInventoryCheckMain> implements StockInventoryCheckMainService {
    private final StockInventoryCheckItemMapper stockInventoryCheckItemMapper;
    private final StockInventoryCheckMainMapper stockInventoryCheckMainMapper;
    @Override
    public IPage<StockInventoryCheckMainDto> listPage(Page page, StockInventoryCheckMainDto stockInventoryCheckMainDto) {
        return null;
    }
    @Override
    public Boolean add(StockInventoryCheckMainDto stockInventoryCheckMainDto) {
        String checkNo = OrderUtils.countTodayByCreateTime(stockInventoryCheckMainMapper, "PD", "check_no");
        stockInventoryCheckMainDto.setCheckNo(checkNo);
        this.save(stockInventoryCheckMainDto);
        ArrayList<StockInventoryCheckItem> stockInventoryCheckItems = new ArrayList<>();
        for (StockInventoryCheckItemDto itemDto : stockInventoryCheckMainDto.getStockInventoryCheckItemDtos()) {
            StockInventoryCheckItem stockInventoryCheckItem = new StockInventoryCheckItem();
            BeanUtils.copyProperties(itemDto, stockInventoryCheckItem);
            stockInventoryCheckItem.setMainId(stockInventoryCheckMainDto.getId());
            stockInventoryCheckItems.add(stockInventoryCheckItem);
        }
        stockInventoryCheckItemMapper.insert(stockInventoryCheckItems);
        return true;
    }
    @Override
    public R updateStockInventoryCheckMainDtoById(StockInventoryCheckMainDto stockInventoryCheckMainDto) {
        return null;
    }
}
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,235 @@
package com.ruoyi.stock.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.stock.dto.*;
import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper;
import com.ruoyi.stock.mapper.StockInventoryCheckPlanMapper;
import com.ruoyi.stock.mapper.StockInventoryCheckProductMapper;
import com.ruoyi.stock.pojo.*;
import com.ruoyi.stock.service.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
 * <p>
 * ç›˜ç‚¹è®¡åˆ’表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 10:00:43
 */
@Service
@RequiredArgsConstructor
public class StockInventoryCheckPlanServiceImpl extends ServiceImpl<StockInventoryCheckPlanMapper, StockInventoryCheckPlan> implements StockInventoryCheckPlanService {
    private final StockInventoryCheckPlanMapper stockInventoryCheckPlanMapper;
    private final StockInventoryCheckProductMapper stockInventoryCheckProductMapper;
    private final SysUserMapper sysUserMapper;
    private final StockInventoryCheckMainService stockInventoryCheckMainService;
    private final StockInventoryService stockInventoryService;
    private final StockInventoryCheckItemMapper stockInventoryCheckItemMapper;
    private final StockUtils stockUtils;
    private final StockInRecordService stockInRecordService;
    private final StockOutRecordService stockOutRecordService;
    @Override
    public IPage<StockInventoryCheckPlanDto> listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        IPage<StockInventoryCheckPlanDto> stockInventoryCheckPlanDtoIPage = stockInventoryCheckPlanMapper.listPage(page, stockInventoryCheckPlanDto);
        stockInventoryCheckPlanDtoIPage.getRecords().forEach(item -> {
            List<StockInventoryCheckProduct> stockInventoryCheckProducts = stockInventoryCheckProductMapper.selectList(new LambdaQueryWrapper<StockInventoryCheckProduct>().eq(StockInventoryCheckProduct::getInventoryCheckPlanId, item.getId()));
            item.setItems(stockInventoryCheckProducts);
        });
        return stockInventoryCheckPlanDtoIPage ;
    }
    @Override
    public R start(Long id) {
        StockInventoryCheckPlan stockInventoryCheckPlan = this.getById(id);
        StockInventoryCheckPlanDto stockInventoryCheckPlanDto = new StockInventoryCheckPlanDto();
        BeanUtil.copyProperties(stockInventoryCheckPlan, stockInventoryCheckPlanDto);
        List<StockInventoryCheckProduct> stockInventoryCheckProducts = stockInventoryCheckProductMapper.selectList(new LambdaQueryWrapper<StockInventoryCheckProduct>().eq(StockInventoryCheckProduct::getInventoryCheckPlanId, id));
        stockInventoryCheckPlanDto.setItems(stockInventoryCheckProducts);
        BigDecimal totalQuantity = stockInventoryCheckPlanDto.getItems().stream()
                .peek(item -> {
                    item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId());
                    List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId()));
                    BigDecimal systemQty = list.stream()
                            .map(StockInventory::getQualitity)
                            .filter(Objects::nonNull)
                            .reduce(BigDecimal.ZERO, BigDecimal::add);
                    item.setSystemQuantity(systemQty);
                })
                .map(StockInventoryCheckProduct::getSystemQuantity)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        //新增库存盘点
        ArrayList<StockInventoryCheckItemDto> stockInventoryCheckItemDtos = new ArrayList<>();
        StockInventoryCheckMainDto stockInventoryCheckMainDto = new StockInventoryCheckMainDto();
        stockInventoryCheckMainDto.setCheckType("1");
        stockInventoryCheckMainDto.setTotalQuantity(totalQuantity);
        stockInventoryCheckMainDto.setSourceType("1");
        stockInventoryCheckMainDto.setSourceId(stockInventoryCheckPlanDto.getId());
        stockInventoryCheckMainDto.setStatus(0);
        stockInventoryCheckPlanDto.getItems().forEach(item -> {
            List<StockInventoryDto> list = stockInventoryService.selectStockInvenrory(item.getProductModelId());
            //锁定库存
            list.forEach(inventory -> {
                inventory.setLocked(true);
                stockInventoryService.updateById(inventory);
            });
            for (StockInventoryDto stockInventory : list) {
                StockInventoryCheckItemDto stockInventoryCheckItemDto = new StockInventoryCheckItemDto();
                stockInventoryCheckItemDto.setProductModelId(stockInventory.getProductModelId());
                stockInventoryCheckItemDto.setBatchNo(stockInventory.getBatchNo());
                stockInventoryCheckItemDto.setSystemQuantity(stockInventory.getQualitity());
                stockInventoryCheckItemDto.setModel(stockInventory.getModel());
                stockInventoryCheckItemDto.setUnit(stockInventory.getUnit());
                stockInventoryCheckItemDto.setProductName(stockInventory.getProductName());
                stockInventoryCheckItemDtos.add(stockInventoryCheckItemDto);
            }
        });
        stockInventoryCheckMainDto.setStockInventoryCheckItemDtos(stockInventoryCheckItemDtos);
        stockInventoryCheckMainService.add(stockInventoryCheckMainDto);
        stockInventoryCheckPlan.setStatus(1);
        this.updateById(stockInventoryCheckPlan);
        return R.ok();
    }
    @Override
    public R end(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        StockInventoryCheckPlan plan = this.getById(stockInventoryCheckPlanDto.getId());
        if (plan == null) {
            return R.fail("盘点单不存在");
        }
        for (StockInventoryCheckItem item : stockInventoryCheckPlanDto.getCheckItems()) {
            if (item.getDifferenceQuantity() == null || item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) == 0) {
                continue;
            }
            StockInventoryDto stockInventoryDto = new StockInventoryDto();
            stockInventoryDto.setProductModelId(item.getProductModelId());
            stockInventoryDto.setBatchNo(item.getBatchNo());
            stockInventoryDto.setQualitity(item.getDifferenceQuantity());
            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());
                //直接审核通过
                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());
                //直接审核通过
                stockOutRecordService.batchApprove(Collections.singletonList(stockOutRecordDto.getId()), 1);
            }
        }
        stockInventoryCheckItemMapper.updateById(stockInventoryCheckPlanDto.getCheckItems());
        plan.setStatus(2);
        this.updateById(plan);
        return R.ok("盘点完成,库存已调整");
    }
    @Override
    public StockInventoryCheckPlanDto detail(Long id) {
        StockInventoryCheckPlan byId = this.getById(id);
        if (byId == null) {
            return null;
        }
        StockInventoryCheckPlanDto stockInventoryCheckPlanDto = new StockInventoryCheckPlanDto();
        BeanUtil.copyProperties(byId, stockInventoryCheckPlanDto);
        List<StockInventoryCheckProduct> items = stockInventoryCheckProductMapper.selectList(
                new LambdaQueryWrapper<StockInventoryCheckProduct>()
                        .eq(StockInventoryCheckProduct::getInventoryCheckPlanId, id));
        stockInventoryCheckPlanDto.setItems(items);
        StockInventoryCheckMain checkMain = stockInventoryCheckMainService.getOne(
                new LambdaQueryWrapper<StockInventoryCheckMain>()
                        .eq(StockInventoryCheckMain::getSourceId, id));
        if (checkMain != null) {
            List<StockInventoryCheckItem> checkItems = stockInventoryCheckItemMapper.selectList(
                    new LambdaQueryWrapper<StockInventoryCheckItem>()
                            .eq(StockInventoryCheckItem::getMainId, checkMain.getId()));
            stockInventoryCheckPlanDto.setCheckItems(checkItems);
        }
        return stockInventoryCheckPlanDto;
    }
    @Override
    public R add(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        SysUser sysUser = sysUserMapper.selectUserById(stockInventoryCheckPlanDto.getCheckerId());
        stockInventoryCheckPlanDto.setCheckerName(sysUser.getNickName());
        //生成盘点计划编号
        if (ObjectUtils.isEmpty(stockInventoryCheckPlanDto.getPlanNo())) {
            stockInventoryCheckPlanDto.setPlanNo(OrderUtils.countTodayByCreateTime(
                    stockInventoryCheckPlanMapper, "PD", "plan_no"));
        }
        //新增计划
        this.save(stockInventoryCheckPlanDto);
        //设置盘点商品关联ID并查询系统库存
        stockInventoryCheckPlanDto.getItems().forEach(item -> {
            item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId());
            List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId()));
            BigDecimal systemQty = list.stream()
                    .map(StockInventory::getQualitity)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            item.setSystemQuantity(systemQty);
        });
        //新增盘点商品
        stockInventoryCheckProductMapper.insert(stockInventoryCheckPlanDto.getItems());
        return R.ok();
    }
    @Override
    public R edit(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        SysUser sysUser = sysUserMapper.selectUserById(stockInventoryCheckPlanDto.getCheckerId());
        stockInventoryCheckPlanDto.setCheckerName(sysUser.getNickName());
        //赋值
        //设置盘点商品关联ID并查询系统库存
        stockInventoryCheckPlanDto.getItems().forEach(item -> {
            item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId());
            List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId()));
            BigDecimal systemQty = list.stream()
                    .map(StockInventory::getQualitity)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            item.setSystemQuantity(systemQty);
        });
        //更新或新增
        stockInventoryCheckProductMapper.insertOrUpdate(stockInventoryCheckPlanDto.getItems());
        return R.ok(this.updateById(stockInventoryCheckPlanDto));
    }
    @Override
    public R delete(List<Long> ids) {
        List<StockInventoryCheckPlan> list = this.list(new LambdaQueryWrapper<StockInventoryCheckPlan>().in(StockInventoryCheckPlan::getId, ids));
        boolean hasNonZeroStatus = list.stream().anyMatch(plan -> plan.getStatus() != null && plan.getStatus() != 0);
        if (hasNonZeroStatus) {
            return R.fail("存在已执行或者正在执行的盘点计划,不允许删除");
        }
        return R.ok(this.removeByIds(ids));
    }
}
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.stock.service.impl;
import com.ruoyi.stock.pojo.StockInventoryCheckProduct;
import com.ruoyi.stock.mapper.StockInventoryCheckProductMapper;
import com.ruoyi.stock.service.StockInventoryCheckProductService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * åº“存盘点商品表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-09 02:04:26
 */
@Service
public class StockInventoryCheckProductServiceImpl extends ServiceImpl<StockInventoryCheckProductMapper, StockInventoryCheckProduct> implements StockInventoryCheckProductService {
}
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -115,7 +115,7 @@
    //出库调用
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) {
    public StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto) {
        LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda()
            .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
        if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) {
@@ -130,9 +130,11 @@
        stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
        stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
        stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
        stockOutRecordDto.setApprovalStatus(0);
        stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockOutRecordDto.setType("0");
        stockOutRecordService.add(stockOutRecordDto);
        Long id = stockOutRecordService.add(stockOutRecordDto);
        stockInventoryDto.setId(id);
        StockInventory oldStockInventory = stockInventoryMapper.selectOne(eq);
@@ -148,12 +150,12 @@
        }
        stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
        return true;
        return stockOutRecordDto;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto) {
    public StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto) {
        String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo());
        if (StringUtils.isEmpty(batchNo)) {
            batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId());
@@ -165,11 +167,13 @@
        stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
        stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
        stockInRecordDto.setBatchNo(batchNo);
        stockInRecordDto.setApprovalStatus(0);
        stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockInRecordDto.setType("0");
        stockInRecordDto.setRemark(stockInventoryDto.getRemark());
        stockInRecordService.add(stockInRecordDto);
        return true;
        Long add = stockInRecordService.add(stockInRecordDto);
        stockInRecordDto.setId( add);
        return stockInRecordDto;
    }
    //规则生成:20260424-产品编号-001
@@ -434,4 +438,14 @@
    public List<StockInventory> getByModelId(Long modelId) {
        return stockInventoryMapper.getByModelId(modelId);
    }
    @Override
    public List<StockInventoryDto> selectStockInvenrory(Long productModelId) {
        return stockInventoryMapper.selectStockInvenrory(productModelId);
    }
    @Override
    public IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto) {
        return stockInventoryMapper.pagestockInventoryNoQua(page, stockInventoryDto);
    }
}
src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -5,8 +5,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.ReviewStatusEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.EnumUtil;
import com.ruoyi.common.utils.OrderUtils;
@@ -25,14 +25,12 @@
import com.ruoyi.stock.pojo.StockOutRecord;
import com.ruoyi.stock.pojo.StockUninventory;
import com.ruoyi.stock.service.StockOutRecordService;
import lombok.AllArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -56,12 +54,13 @@
    }
    @Override
    public int add(StockOutRecordDto stockOutRecordDto) {
    public Long add(StockOutRecordDto stockOutRecordDto) {
        String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches");
        stockOutRecordDto.setOutboundBatches(no);
        StockInRecord stockInRecord = new StockInRecord();
        BeanUtils.copyProperties(stockOutRecordDto, stockInRecord);
        return stockOutRecordMapper.insert(stockOutRecordDto);
        stockOutRecordMapper.insert(stockOutRecordDto);
        return stockOutRecordDto.getId();
    }
    @Override
src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -140,5 +140,18 @@
        left join product p on p.id = pm.product_id
        order by p.id,pm.id desc
    </select>
    <select id="selectModelByIds" resultType="com.ruoyi.basic.dto.ProductModelDto">
        select pm.model,p.product_name,pm.unit
        from product_model pm
        left join product p on pm.product_id = p.id
        <where>
            <if test="list != null and list.size() > 0">
                and pm.id in
                <foreach item="item" collection="list" separator="," open="(" close=")" index="index">
                  #{item}
                </foreach>
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/stock/StockInventoryCheckItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckItemMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckItem">
        <id column="id" property="id" />
        <result column="main_id" property="mainId" />
        <result column="product_id" property="productId" />
        <result column="product_code" property="productCode" />
        <result column="product_name" property="productName" />
        <result column="specification" property="specification" />
        <result column="unit" property="unit" />
        <result column="batch_no" property="batchNo" />
        <result column="system_quantity" property="systemQuantity" />
        <result column="actual_quantity" property="actualQuantity" />
        <result column="difference_quantity" property="differenceQuantity" />
        <result column="cost_price" property="costPrice" />
        <result column="total_cost" property="totalCost" />
        <result column="difference_amount" property="differenceAmount" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
    </resultMap>
</mapper>
src/main/resources/mapper/stock/StockInventoryCheckMainMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckMainMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckMain">
        <id column="id" property="id" />
        <result column="check_no" property="checkNo" />
        <result column="check_type" property="checkType" />
        <result column="warehouse_id" property="warehouseId" />
        <result column="warehouse_name" property="warehouseName" />
        <result column="total_quantity" property="totalQuantity" />
        <result column="total_amount" property="totalAmount" />
        <result column="source_type" property="sourceType" />
        <result column="source_id" property="sourceId" />
        <result column="status" property="status" />
        <result column="check_date" property="checkDate" />
        <result column="responsible_person_id" property="responsiblePersonId" />
        <result column="responsible_person_name" property="responsiblePersonName" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="create_by" property="createBy" />
        <result column="update_time" property="updateTime" />
        <result column="update_by" property="updateBy" />
        <result column="del_flag" property="delFlag" />
    </resultMap>
</mapper>
src/main/resources/mapper/stock/StockInventoryCheckPlanMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckPlanMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckPlan">
        <id column="id" property="id" />
        <result column="plan_no" property="planNo" />
        <result column="status" property="status" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="remark" property="remark" />
        <result column="del_flag" property="delFlag" />
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.stock.dto.StockInventoryCheckPlanDto">
        select stock_inventory_check_plan.* ,sys_user.nick_name as  create_by from
            stock_inventory_check_plan
        left join sys_user on stock_inventory_check_plan.create_user = sys_user.user_id
        <where>
            <if test="ew.planNo != null and ew.planNo != ''">
                and plan_no like concat('%',#{ew.planNo},'%')
            </if>
            <if test="ew.status != null">
                and status = #{ew.status}
            </if>
            <if test="ew.startTime != null">
                and plan_date_start between #{ew.startTime} and #{ew.endTime}
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/stock/StockInventoryCheckProductMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckProductMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckProduct">
        <id column="id" property="id" />
        <result column="product_id" property="productId" />
        <result column="product_name" property="productName" />
        <result column="model" property="model" />
        <result column="unit" property="unit" />
        <result column="system_qty" property="systemQty" />
    </resultMap>
</mapper>
src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -460,5 +460,34 @@
                            group by stock_inventory_id) as sd on sd.stock_inventory_id = spd.id
        where product_model_id = #{productModelId}
    </select>
    <select id="selectStockInvenrory" resultType="com.ruoyi.stock.dto.StockInventoryDto">
        select spd.id, spd.batch_no,pm.model,pm.unit,p.product_name, spd.qualitity,spd.product_model_id
        from stock_inventory spd
            left join product_model pm on pm.id = spd.product_model_id
        left join product p on p.id = pm.product_id
        where product_model_id = #{productModelId}
    </select>
    <select id="pagestockInventoryNoQua" resultType="com.ruoyi.stock.dto.StockInventoryDto">
        select
        si.product_model_id,
        pm.model ,
        pm.unit,
        p.product_name
        from stock_inventory si
        left join product_model pm on si.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        where 1 = 1
        <if test="ew.productName != null and ew.productName !=''">
            and p.product_name like concat('%',#{ew.productName},'%')
        </if>
        <if test="ew.model != null and ew.model !=''">
            and pm.model like concat('%',#{ew.model},'%')
        </if>
        group by si.product_model_id,
        pm.model,
        pm.unit,
        p.product_name
    </select>
</mapper>