From 4402a6e3befe0c33e8f3b58641984fce3fdb0bbc Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 09 五月 2026 18:04:52 +0800
Subject: [PATCH] feat(stock): 添加库存盘点功能并优化出入库记录

---
 src/main/java/com/ruoyi/stock/pojo/StockInventory.java                                |    2 
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java                      |    9 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckItemServiceImpl.java    |   20 
 src/main/java/com/ruoyi/stock/controller/StockInventoryCheckPlanController.java       |   72 +++
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckMainServiceImpl.java    |   62 ++
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java                       |   10 
 src/main/java/com/ruoyi/stock/service/StockInRecordService.java                       |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java              |    5 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckProductMapper.java            |   18 
 src/main/java/com/ruoyi/stock/controller/StockInventoryCheckItemController.java       |   18 
 src/main/resources/mapper/basic/ProductModelMapper.xml                                |   13 
 src/main/resources/mapper/stock/StockInventoryCheckMainMapper.xml                     |   28 +
 src/main/java/com/ruoyi/stock/controller/StockInventoryCheckProductController.java    |   18 
 src/main/java/com/ruoyi/stock/service/StockInventoryCheckProductService.java          |   16 
 src/main/java/com/ruoyi/stock/service/StockInventoryCheckItemService.java             |   16 
 src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java             |    3 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckProductServiceImpl.java |   20 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java             |   26 
 src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java              |    4 
 src/main/java/com/ruoyi/stock/service/StockInventoryCheckPlanService.java             |   36 +
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                              |    1 
 src/main/java/com/ruoyi/stock/controller/StockInventoryCheckMainController.java       |   47 ++
 src/main/java/com/ruoyi/stock/dto/StockInventoryCheckMainDto.java                     |   11 
 src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java                          |    3 
 src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckPlan.java                       |  115 +++++
 src/main/resources/mapper/stock/StockInventoryMapper.xml                              |   29 +
 src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckItem.java                       |  124 +++++
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java             |   11 
 src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckProduct.java                    |   70 +++
 src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckPlanMapper.java               |   23 +
 src/main/resources/mapper/stock/StockInventoryCheckProductMapper.xml                  |   15 
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java                |    7 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckItemMapper.java               |   18 
 src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckMain.java                       |  129 +++++
 src/main/resources/mapper/stock/StockInventoryCheckItemMapper.xml                     |   26 +
 src/main/resources/mapper/stock/StockInventoryCheckPlanMapper.xml                     |   32 +
 src/main/java/com/ruoyi/stock/service/StockOutRecordService.java                      |    2 
 src/main/java/com/ruoyi/stock/dto/StockInventoryCheckPlanDto.java                     |   21 
 src/main/java/com/ruoyi/stock/dto/StockInventoryCheckItemDto.java                     |    9 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java                        |    4 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java    |  235 ++++++++++
 src/main/java/com/ruoyi/stock/service/StockInventoryCheckMainService.java             |   26 +
 src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckMainMapper.java               |   18 
 43 files changed, 1,350 insertions(+), 24 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java b/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
index 36876d0..69d5576 100644
--- a/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
index 01c4d7e..1858dff 100644
--- a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
+++ b/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", "鐩樼偣-鍑哄簱");
 
 
 
diff --git a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
index 4fe1f6e..7641b03 100644
--- a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 5356500..5ae608e 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/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);
     }
 
     //涓嶅悎鏍煎簱瀛樺垹闄�
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckItemController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckItemController.java
new file mode 100644
index 0000000..827c036
--- /dev/null
+++ b/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 {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckMainController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckMainController.java
new file mode 100644
index 0000000..c7ef8be
--- /dev/null
+++ b/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);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckPlanController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckPlanController.java
new file mode 100644
index 0000000..bcae246
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckProductController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryCheckProductController.java
new file mode 100644
index 0000000..785ff38
--- /dev/null
+++ b/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 {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index 44fe885..31b8d8d 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/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) {
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryCheckItemDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryCheckItemDto.java
new file mode 100644
index 0000000..f6ecba1
--- /dev/null
+++ b/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 {
+}
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryCheckMainDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryCheckMainDto.java
new file mode 100644
index 0000000..1f7fcef
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryCheckPlanDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryCheckPlanDto.java
new file mode 100644
index 0000000..bc80324
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 2be6512..967a6c1 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/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;
 
 
     //鍏ュ簱绫诲瀷
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckItemMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckItemMapper.java
new file mode 100644
index 0000000..9cef281
--- /dev/null
+++ b/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> {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckMainMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckMainMapper.java
new file mode 100644
index 0000000..0cb18b8
--- /dev/null
+++ b/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> {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckPlanMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckPlanMapper.java
new file mode 100644
index 0000000..628afbe
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckProductMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckProductMapper.java
new file mode 100644
index 0000000..d6cd7ed
--- /dev/null
+++ b/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> {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index a31cf5b..c5827e2 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
index 5652ec7..320cffc 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckItem.java b/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckItem.java
new file mode 100644
index 0000000..9a40335
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckMain.java b/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckMain.java
new file mode 100644
index 0000000..9924327
--- /dev/null
+++ b/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锛堝叧鑱旂洏鐐硅鍒扞D锛�
+     */
+    @Schema(description ="鏉ユ簮ID锛堝叧鑱旂洏鐐硅鍒扞D锛�")
+    private Long sourceId;
+
+    /**
+     * 鐘舵�侊細0-寰呯洏鐐癸紝1-鐩樼偣涓紝2-宸插畬鎴愶紝3-宸插鏍革紝4-宸插彇娑�
+     */
+    @Schema(description ="鐘舵�侊細0-寰呯洏鐐癸紝1-鐩樼偣涓紝2-宸插畬鎴愶紝3-宸插鏍革紝4-宸插彇娑�")
+    private Integer status;
+
+    /**
+     * 鐩樼偣鏃ユ湡
+     */
+    @Schema(description ="鐩樼偣鏃ユ湡")
+    private LocalDate checkDate;
+
+    /**
+     * 璐熻矗浜篒D
+     */
+    @Schema(description ="璐熻矗浜篒D")
+    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;
+}
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckPlan.java b/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckPlan.java
new file mode 100644
index 0000000..19033c5
--- /dev/null
+++ b/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;
+
+
+    /**
+     * 璐熻矗浜篒D
+     */
+    @Schema(description = "鐩樼偣浜篿d")
+    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浠h〃瀛樺湪 1浠h〃鍒犻櫎锛�
+     */
+    @Schema(description = "鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 1浠h〃鍒犻櫎锛�")
+    private String delFlag;
+
+    private Long deptId;
+}
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckProduct.java b/src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckProduct.java
new file mode 100644
index 0000000..d2edacd
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
index 249f261..c558393 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
+++ b/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);
 
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryCheckItemService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryCheckItemService.java
new file mode 100644
index 0000000..93e9ef1
--- /dev/null
+++ b/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> {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryCheckMainService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryCheckMainService.java
new file mode 100644
index 0000000..9cbb42f
--- /dev/null
+++ b/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);
+
+}
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryCheckPlanService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryCheckPlanService.java
new file mode 100644
index 0000000..48482d3
--- /dev/null
+++ b/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);
+}
+
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryCheckProductService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryCheckProductService.java
new file mode 100644
index 0000000..75f93a8
--- /dev/null
+++ b/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> {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index d47cc4b..cb81339 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java b/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
index bbad1f6..324ffff 100644
--- a/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
+++ b/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);
 
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index f84a9d8..c00681c 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/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
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckItemServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckItemServiceImpl.java
new file mode 100644
index 0000000..885f555
--- /dev/null
+++ b/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 {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckMainServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckMainServiceImpl.java
new file mode 100644
index 0000000..a1da1aa
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
new file mode 100644
index 0000000..698c0a8
--- /dev/null
+++ b/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));
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckProductServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckProductServiceImpl.java
new file mode 100644
index 0000000..88964a3
--- /dev/null
+++ b/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 {
+
+}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index d712518..316029b 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/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);
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index cead7fc..268a081 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/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
diff --git a/src/main/resources/mapper/basic/ProductModelMapper.xml b/src/main/resources/mapper/basic/ProductModelMapper.xml
index 0a540bf..bd388fb 100644
--- a/src/main/resources/mapper/basic/ProductModelMapper.xml
+++ b/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>
diff --git a/src/main/resources/mapper/stock/StockInventoryCheckItemMapper.xml b/src/main/resources/mapper/stock/StockInventoryCheckItemMapper.xml
new file mode 100644
index 0000000..cc3888e
--- /dev/null
+++ b/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>
diff --git a/src/main/resources/mapper/stock/StockInventoryCheckMainMapper.xml b/src/main/resources/mapper/stock/StockInventoryCheckMainMapper.xml
new file mode 100644
index 0000000..475a189
--- /dev/null
+++ b/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>
diff --git a/src/main/resources/mapper/stock/StockInventoryCheckPlanMapper.xml b/src/main/resources/mapper/stock/StockInventoryCheckPlanMapper.xml
new file mode 100644
index 0000000..1e02e1e
--- /dev/null
+++ b/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>
diff --git a/src/main/resources/mapper/stock/StockInventoryCheckProductMapper.xml b/src/main/resources/mapper/stock/StockInventoryCheckProductMapper.xml
new file mode 100644
index 0000000..6f228e7
--- /dev/null
+++ b/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>
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 60fc90e..e8473ca 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/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>

--
Gitblit v1.9.3