From a85ac2fba03244c3e93a74e498681483e466dc08 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期六, 25 四月 2026 14:23:03 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_New_pro

---
 src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java    |   16 +
 src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java                    |    5 
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java            |    4 
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                    |   26 +-
 src/main/java/com/ruoyi/stock/pojo/StockInRecord.java                       |    4 
 src/main/resources/mapper/stock/StockInventoryMapper.xml                    |   37 +++
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java   |   89 +++++++++
 src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java            |    3 
 src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java                      |    4 
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java      |   16 +
 src/main/java/com/ruoyi/stock/service/StockInRecordService.java             |    4 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java    |  104 +++++++++++
 src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java                     |    5 
 src/main/java/com/ruoyi/stock/controller/StockInRecordController.java       |   21 ++
 src/main/java/com/ruoyi/stock/service/StockOutRecordService.java            |    4 
 src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java      |   22 ++
 src/main/java/com/ruoyi/basic/utils/FileUtil.java                           |    6 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java              |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java |   61 ++++++
 src/main/resources/mapper/stock/StockUninventoryMapper.xml                  |    9 +
 src/main/java/com/ruoyi/stock/service/StockUninventoryService.java          |    4 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java   |   60 ++++++
 22 files changed, 487 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/utils/FileUtil.java b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
index 9d202f1..8a33947 100644
--- a/src/main/java/com/ruoyi/basic/utils/FileUtil.java
+++ b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
@@ -55,9 +55,6 @@
      * @param storageBlobDTOS 鏂囦欢淇℃伅
      */
     public void saveStorageAttachment(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, List<StorageBlobDTO> storageBlobDTOS) {
-        if (CollectionUtils.isEmpty(storageBlobDTOS)) {
-            throw new RuntimeException("鏂囦欢淇℃伅涓嶈兘涓虹┖");
-        }
         if (application == null) {
             throw new RuntimeException("鏂囦欢鐢ㄩ�斾笉鑳戒负绌�");
         }
@@ -69,6 +66,9 @@
         }
         // 鍒犻櫎鏃ч檮浠朵俊鎭�
         deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId);
+        if (CollectionUtils.isEmpty(storageBlobDTOS)) {
+            return;
+        }
         List<StorageAttachment> storageAttachments = new ArrayList<>();
         for (StorageBlobDTO storageBlobDTO : storageBlobDTOS) {
             StorageAttachment storageAttachment = new StorageAttachment();
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
index ac89cc9..1887b27 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -43,10 +43,31 @@
         return AjaxResult.success(stockInRecordService.batchDelete(ids));
     }
 
+    @DeleteMapping("/pending")
+    @Log(title = "鍏ュ簱绠$悊-鍒犻櫎寰呭鎵瑰叆搴�", businessType = BusinessType.DELETE)
+    @Operation(summary = "鍒犻櫎寰呭鎵圭殑鍏ュ簱璁板綍")
+    public AjaxResult deletePending(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        return AjaxResult.success(stockInRecordService.batchDeletePending(ids));
+    }
+
     @PostMapping("/exportStockInRecord")
     @Operation(summary = "瀵煎嚭鍏ュ簱璁板綍")
     public void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto) {
         stockInRecordService.exportStockInRecord(response,stockInRecordDto);
     }
 
+    @PostMapping("/approve")
+    @Log(title = "鍏ュ簱绠$悊-瀹℃壒鍏ュ簱", businessType = BusinessType.UPDATE)
+    @Operation(summary = "鎵归噺瀹℃壒鍏ュ簱璁板綍")
+    public AjaxResult approve(@RequestBody StockInRecordDto approveDto) {
+        if(CollectionUtils.isEmpty(approveDto.getIds())){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        stockInRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus());
+        return AjaxResult.success();
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index 02a25fd..2096b6d 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -68,6 +68,22 @@
         return R.ok(stockInventoryService.subtractStockInventory(stockInventoryDto));
     }
 
+    @PostMapping("/addStockInRecordOnly")
+    @Operation(summary = "鏂板鍏ュ簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
+    public R addStockInRecordOnly(@RequestBody StockInventoryDto stockInventoryDto) {
+        stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode()));
+        stockInventoryDto.setRecordId(0L);
+        return R.ok(stockInventoryService.addStockInRecordOnly(stockInventoryDto));
+    }
+
+    @PostMapping("/addStockOutRecordOnly")
+    @Operation(summary = "鏂板鍑哄簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
+    public R addStockOutRecordOnly(@RequestBody StockInventoryDto stockInventoryDto) {
+        stockInventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_OUT.getCode()));
+        stockInventoryDto.setRecordId(0L);
+        return R.ok(stockInventoryService.addStockOutRecordOnly(stockInventoryDto));
+    }
+
 
     @PostMapping("importStockInventory")
     @Operation(summary = "瀵煎叆搴撳瓨")
diff --git a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
index c4d74c2..7351890 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
@@ -10,7 +10,6 @@
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -61,10 +60,31 @@
         return AjaxResult.success(stockOutRecordService.batchDelete(ids));
     }
 
+    @DeleteMapping("/pending")
+    @Log(title = "鍑哄簱绠$悊-鍒犻櫎寰呭鎵瑰嚭搴�", businessType = BusinessType.DELETE)
+    @Operation(summary = "鍒犻櫎寰呭鎵圭殑鍑哄簱璁板綍")
+    public AjaxResult deletePending(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        return AjaxResult.success(stockOutRecordService.batchDeletePending(ids));
+    }
+
     @PostMapping("/exportStockOutRecord")
     @Operation(summary = "瀵煎嚭鍑哄簱璁板綍")
     public void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto) {
         stockOutRecordService.exportStockOutRecord(response,stockOutRecordDto);
     }
 
+    @PostMapping("/approve")
+    @Log(title = "鍑哄簱绠$悊-瀹℃壒鍑哄簱", businessType = BusinessType.UPDATE)
+    @Operation(summary = "鎵归噺瀹℃壒鍑哄簱璁板綍")
+    public AjaxResult approve(@RequestBody StockOutRecordDto approveDto) {
+        if(CollectionUtils.isEmpty(approveDto.getIds())){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        stockOutRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus());
+        return AjaxResult.success();
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
index ebdbd07..477a68d 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -51,6 +51,22 @@
         return R.ok(stockUninventoryService.subtractStockUninventory(stockUninventoryDto));
     }
 
+    @PostMapping("/addStockInRecordOnly")
+    @Operation(summary = "鏂板鍏ュ簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
+    public R addStockInRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
+        stockUninventoryDto.setRecordType(String.valueOf(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
+        stockUninventoryDto.setRecordId(0L);
+        return R.ok(stockUninventoryService.addStockInRecordOnly(stockUninventoryDto));
+    }
+
+    @PostMapping("/addStockOutRecordOnly")
+    @Operation(summary = "鏂板鍑哄簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
+    public R addStockOutRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
+        stockUninventoryDto.setRecordType(String.valueOf(StockOutUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+        stockUninventoryDto.setRecordId(0L);
+        return R.ok(stockUninventoryService.addStockOutRecordOnly(stockUninventoryDto));
+    }
+
     @PostMapping("/exportStockUninventory")
     @Operation(summary = "瀵煎嚭搴撳瓨")
     public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
index 05c1960..56ad762 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -4,6 +4,8 @@
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.List;
+
 
 @Data
 public class StockInRecordDto extends StockInRecord {
@@ -30,4 +32,7 @@
     @Schema(description = "椤堕儴鐖朵骇鍝乮d")
     private Long topParentProductId;
 
+    @Schema(description = "璁板綍ID鍒楄〃")
+    private List<Long> ids;
+
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 9cc1fe6..2be6512 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -43,31 +43,37 @@
 
     @Schema(description = "椤堕儴鐖朵骇鍝乮d")
     private Long topParentProductId;
-    
+
     @Schema(description = "搴撳瓨绫诲瀷锛歲ualified(鍚堟牸)銆乽nqualified(涓嶅悎鏍�)")
     private String stockType;
-    
+
     @Schema(description = "鍚堟牸搴撳瓨鏁伴噺")
     private BigDecimal qualifiedQuantity;
-    
+
     @Schema(description = "涓嶅悎鏍煎簱瀛樻暟閲�")
     private BigDecimal unQualifiedQuantity;
-    
+
     @Schema(description = "鍚堟牸搴撳瓨鍐荤粨鏁伴噺")
     private BigDecimal qualifiedLockedQuantity;
-    
+
     @Schema(description = "涓嶅悎鏍煎簱瀛樺喕缁撴暟閲�")
     private BigDecimal unQualifiedLockedQuantity;
-    
+
     @Schema(description = "鍚堟牸搴撳瓨鏈喕缁撴暟閲�")
     private BigDecimal qualifiedUnLockedQuantity;
-    
+
     @Schema(description = "涓嶅悎鏍煎簱瀛樻湭鍐荤粨鏁伴噺")
     private BigDecimal unQualifiedUnLockedQuantity;
-    
+
+    @Schema(description = "鍚堟牸搴撳瓨寰呭鏍稿嚭搴撴暟閲忥紙涓嶅崰鐢ㄥ簱瀛樹絾宸茬敵璇峰嚭搴擄級")
+    private BigDecimal qualifiedPendingOutQuantity;
+
+    @Schema(description = "涓嶅悎鏍煎簱瀛樺緟瀹℃牳鍑哄簱鏁伴噺")
+    private BigDecimal unQualifiedPendingOutQuantity;
+
     @Schema(description = "鍚堟牸搴撳瓨ID")
     private Long qualifiedId;
-    
+
     @Schema(description = "涓嶅悎鏍煎簱瀛業D")
     private Long unQualifiedId;
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
index f09d78d..022be78 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
@@ -6,6 +6,8 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.List;
+
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
@@ -29,4 +31,7 @@
 
     @Schema(description = "椤堕儴鐖朵骇鍝乮d")
     private Long topParentProductId;
+
+    @Schema(description = "璁板綍ID鍒楄〃")
+    private List<Long> ids;
 }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index 9f493d2..f17065a 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -50,4 +50,6 @@
     List<Map<String, Object>> selectDailyStockOutCounts(@Param("rootCategoryId") Long rootCategoryId, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
     BigDecimal selectTotalByDate(@Param("now") LocalDate now);
+
+    BigDecimal selectPendingOutQuantity(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("type") String type);
 }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
index 89e9b17..d6abdff 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
@@ -9,6 +9,7 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -26,6 +27,8 @@
 
     int updateSubtractStockUnInventory(@Param("ew") StockUninventoryDto stockUninventoryDto);
 
+    BigDecimal selectPendingOutQuantity(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("type") String type);
+
     int updateAddStockUnInventory(@Param("ew") StockUninventoryDto stockUninventoryDto);
 
     List<StockUnInventoryExportData> listStockInventoryExportData(@Param("ew") StockUninventoryDto stockUninventoryDto);
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index 370eeed..6b8a807 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.enums.ReviewStatusEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -65,6 +66,9 @@
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Integer updateUser;
 
+    @Schema(description = "瀹℃壒鐘舵��  0-寰呭鎵� 1-閫氳繃 2-椹冲洖", implementation = ReviewStatusEnum.class)
+    private Integer approvalStatus;
+
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index 9d25895..20ea4a2 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.enums.ReviewStatusEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
@@ -74,6 +75,9 @@
     @Schema(description = "绫诲瀷  0鍚堟牸鍏ュ簱 1涓嶅悎鏍煎叆搴�")
     private String type;
 
+    @Schema(description = "瀹℃壒鐘舵��  0-寰呭鎵� 1-閫氳繃 2-椹冲洖", implementation = ReviewStatusEnum.class)
+    private Integer approvalStatus;
+
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
index 12be000..249f261 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -18,5 +18,9 @@
 
     int batchDelete(List<Long> ids);
 
+    int batchDeletePending(List<Long> ids);
+
     void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto);
+
+    int batchApprove(List<Long> ids, Integer approvalStatus);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 986af11..008ec6a 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -29,6 +29,10 @@
 
     Boolean subtractStockInventory(StockInventoryDto stockInventoryDto);
 
+    Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto);
+
+    Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto);
+
     R importStockInventory(MultipartFile file);
 
     void exportStockInventory(HttpServletResponse response, 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 bf00410..bbad1f6 100644
--- a/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
@@ -26,5 +26,9 @@
 
     int batchDelete(List<Long> ids);
 
+    int batchDeletePending(List<Long> ids);
+
     void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto);
+
+    int batchApprove(List<Long> ids, Integer approvalStatus);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java b/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
index e31da8b..ffc1ebe 100644
--- a/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
@@ -25,6 +25,10 @@
 
     Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto);
 
+    Integer addStockInRecordOnly(StockUninventoryDto stockUninventoryDto);
+
+    Integer addStockOutRecordOnly(StockUninventoryDto stockUninventoryDto);
+
     void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto);
 
     Boolean frozenStock(StockInventoryDto stockInventoryDto);
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 ef5e170..f84a9d8 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -4,6 +4,7 @@
 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.enums.ReviewStatusEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
@@ -26,6 +27,7 @@
 import lombok.AllArgsConstructor;
 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;
@@ -127,4 +129,106 @@
         ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
         util.exportExcel(response,list, "鍏ュ簱璁板綍淇℃伅");
     }
+
+    private StockInventory getStockInventory(Long productModelId, String batchNo) {
+        LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>();
+        eq.eq(StockInventory::getProductModelId, productModelId);
+        if (StringUtils.isEmpty(batchNo)) {
+            eq.isNull(StockInventory::getBatchNo);
+        } else {
+            eq.eq(StockInventory::getBatchNo, batchNo);
+        }
+        return stockInventoryMapper.selectOne(eq);
+    }
+
+    private StockUninventory getStockUninventory(Long productModelId, String batchNo) {
+        LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>();
+        eq.eq(StockUninventory::getProductModelId, productModelId);
+        if (StringUtils.isEmpty(batchNo)) {
+            eq.isNull(StockUninventory::getBatchNo);
+        } else {
+            eq.eq(StockUninventory::getBatchNo, batchNo);
+        }
+        return stockUninventoryMapper.selectOne(eq);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchDeletePending(List<Long> ids) {
+        for (Long id : ids) {
+            StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
+            if (stockInRecord == null) {
+                throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶鍒犻櫎!!!");
+            }
+            if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
+                throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘鍒犻櫎,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+            }
+        }
+        return stockInRecordMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchApprove(List<Long> ids, Integer approvalStatus) {
+        if (CollectionUtils.isEmpty(ids)) {
+            throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        if (approvalStatus == null || (!ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus) && !ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus))) {
+            throw new BaseException("瀹℃壒鐘舵�佸�兼棤鏁�");
+        }
+        for (Long id : ids) {
+            StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
+            if (stockInRecord == null) {
+                throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶瀹℃壒!!!");
+            }
+            if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
+                throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+            }
+            stockInRecord.setApprovalStatus(approvalStatus);
+            stockInRecordMapper.updateById(stockInRecord);
+            // 瀹℃壒閫氳繃鏃讹紝搴撳瓨澧炲姞
+            if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) {
+                if ("0".equals(stockInRecord.getType())) {
+                    // 鍚堟牸鍏ュ簱 -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
+                    StockInventory stockInventory = getStockInventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
+                    StockInventoryDto stockInventoryDto = new StockInventoryDto();
+                    stockInventoryDto.setProductModelId(stockInRecord.getProductModelId());
+                    stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
+                    stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
+                    stockInventoryDto.setRemark(stockInRecord.getRemark());
+                    if (stockInventory == null) {
+                        stockInventoryMapper.insert(new StockInventory() {{
+                            setProductModelId(stockInRecord.getProductModelId());
+                            setQualitity(stockInRecord.getStockInNum());
+                            setBatchNo(stockInRecord.getBatchNo());
+                            setRemark(stockInRecord.getRemark());
+                            setVersion(1);
+                        }});
+                    } else {
+                        stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
+                    }
+                } else if ("1".equals(stockInRecord.getType())) {
+                    // 涓嶅悎鏍煎叆搴� -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
+                    StockUninventory stockUninventory = getStockUninventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
+                    StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
+                    stockUninventoryDto.setProductModelId(stockInRecord.getProductModelId());
+                    stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo());
+                    stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
+                    stockUninventoryDto.setRemark(stockInRecord.getRemark());
+                    if (stockUninventory == null) {
+                        stockUninventoryMapper.insert(new StockUninventory() {{
+                            setProductModelId(stockInRecord.getProductModelId());
+                            setQualitity(stockInRecord.getStockInNum());
+                            setBatchNo(stockInRecord.getBatchNo());
+                            setRemark(stockInRecord.getRemark());
+                            setVersion(1);
+                        }});
+                    } else {
+                        stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
+                    }
+                }
+            }
+        }
+        return ids.size();
+    }
 }
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 e3c88e5..4d525c3 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -8,7 +8,8 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
@@ -145,6 +146,63 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto) {
+        StockInRecordDto stockInRecordDto = new StockInRecordDto();
+        stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
+        stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
+        stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
+        stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
+        stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+        stockInRecordDto.setType("0");
+        stockInRecordDto.setRemark(stockInventoryDto.getRemark());
+        stockInRecordService.add(stockInRecordDto);
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto) {
+        LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>();
+        eq.eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
+        if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) {
+            eq.isNull(StockInventory::getBatchNo);
+        } else {
+            eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo());
+        }
+        StockInventory stockInventory = stockInventoryMapper.selectOne(eq);
+        if (stockInventory == null) {
+            throw new ServiceException("搴撳瓨璁板綍涓嶅瓨鍦�");
+        }
+        BigDecimal lockedQty = stockInventory.getLockedQuantity();
+        if (lockedQty == null) {
+            lockedQty = BigDecimal.ZERO;
+        }
+        BigDecimal pendingOut = stockInventoryMapper.selectPendingOutQuantity(
+                stockInventoryDto.getProductModelId(),
+                stockInventoryDto.getBatchNo(),
+                "0"
+        );
+        if (pendingOut == null) {
+            pendingOut = BigDecimal.ZERO;
+        }
+        BigDecimal availableQty = stockInventory.getQualitity().subtract(lockedQty).subtract(pendingOut);
+        if (stockInventoryDto.getQualitity().compareTo(availableQty) > 0) {
+            throw new ServiceException("鐢宠鏁伴噺瓒呰繃鍙敤搴撳瓨锛屽綋鍓嶅彲鐢ㄥ簱瀛樹负锛�" + availableQty);
+        }
+        StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
+        stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
+        stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
+        stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
+        stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
+        stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+        stockOutRecordDto.setType("0");
+        stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
+        stockOutRecordService.add(stockOutRecordDto);
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public R importStockInventory(MultipartFile file) {
         try {
             // 鏌ヨ鎵�鏈夌殑浜у搧骞舵瀯寤烘槧灏勶紝鎻愰珮鏌ユ壘鏁堢巼
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 a28969c..8919523 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -4,6 +4,7 @@
 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.enums.ReviewStatusEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
@@ -26,6 +27,8 @@
 import com.ruoyi.stock.service.StockOutRecordService;
 import lombok.AllArgsConstructor;
 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;
@@ -130,4 +133,90 @@
         ExcelUtil<StockOutRecordExportData> util = new ExcelUtil<>(StockOutRecordExportData.class);
         util.exportExcel(response,list, "鍑哄簱璁板綍淇℃伅");
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchDeletePending(List<Long> ids) {
+        for (Long id : ids) {
+            StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id);
+            if (stockOutRecord == null) {
+                throw new BaseException("鍑哄簱璁板綍涓嶅瓨鍦�,鏃犳硶鍒犻櫎!!!");
+            }
+            if (stockOutRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockOutRecord.getApprovalStatus())) {
+                throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘鍒犻櫎,鍑哄簱鎵规:" + stockOutRecord.getOutboundBatches());
+            }
+        }
+        return stockOutRecordMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchApprove(List<Long> ids, Integer approvalStatus) {
+        if (CollectionUtils.isEmpty(ids)) {
+            throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        if (approvalStatus == null || (!ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus) && !ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus))) {
+            throw new BaseException("瀹℃壒鐘舵�佸�兼棤鏁�");
+        }
+        for (Long id : ids) {
+            StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id);
+            if (stockOutRecord == null) {
+                throw new BaseException("鍑哄簱璁板綍涓嶅瓨鍦�,鏃犳硶瀹℃壒!!!");
+            }
+            if (stockOutRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockOutRecord.getApprovalStatus())) {
+                throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍑哄簱鎵规:" + stockOutRecord.getOutboundBatches());
+            }
+            stockOutRecord.setApprovalStatus(approvalStatus);
+            stockOutRecordMapper.updateById(stockOutRecord);
+            // 瀹℃壒閫氳繃鏃讹紝鎵e噺搴撳瓨
+            if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) {
+                if ("0".equals(stockOutRecord.getType())) {
+                    // 鍚堟牸鍑哄簱 -> 鍏堟煡搴撳瓨鏄惁瀛樺湪锛屽瓨鍦ㄦ墠鎵e噺
+                    StockInventory stockInventory = getStockInventory(stockOutRecord.getProductModelId(), stockOutRecord.getBatchNo());
+                    if (stockInventory == null) {
+                        throw new BaseException("鍚堟牸搴撳瓨璁板綍涓嶅瓨鍦�,鍑哄簱鎵规:" + stockOutRecord.getOutboundBatches());
+                    }
+                    StockInventoryDto stockInventoryDto = new StockInventoryDto();
+                    stockInventoryDto.setProductModelId(stockOutRecord.getProductModelId());
+                    stockInventoryDto.setBatchNo(stockOutRecord.getBatchNo());
+                    stockInventoryDto.setQualitity(stockOutRecord.getStockOutNum());
+                    stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
+                } else if ("1".equals(stockOutRecord.getType())) {
+                    // 涓嶅悎鏍煎嚭搴� -> 鍏堟煡搴撳瓨鏄惁瀛樺湪锛屽瓨鍦ㄦ墠鎵e噺
+                    StockUninventory stockUninventory = getStockUninventory(stockOutRecord.getProductModelId(), stockOutRecord.getBatchNo());
+                    if (stockUninventory == null) {
+                        throw new BaseException("涓嶅悎鏍煎簱瀛樿褰曚笉瀛樺湪,鍑哄簱鎵规:" + stockOutRecord.getOutboundBatches());
+                    }
+                    StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
+                    stockUninventoryDto.setProductModelId(stockOutRecord.getProductModelId());
+                    stockUninventoryDto.setBatchNo(stockOutRecord.getBatchNo());
+                    stockUninventoryDto.setQualitity(stockOutRecord.getStockOutNum());
+                    stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
+                }
+            }
+        }
+        return ids.size();
+    }
+
+    private StockInventory getStockInventory(Long productModelId, String batchNo) {
+        LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>();
+        eq.eq(StockInventory::getProductModelId, productModelId);
+        if (StringUtils.isEmpty(batchNo)) {
+            eq.isNull(StockInventory::getBatchNo);
+        } else {
+            eq.eq(StockInventory::getBatchNo, batchNo);
+        }
+        return stockInventoryMapper.selectOne(eq);
+    }
+
+    private StockUninventory getStockUninventory(Long productModelId, String batchNo) {
+        LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>();
+        eq.eq(StockUninventory::getProductModelId, productModelId);
+        if (StringUtils.isEmpty(batchNo)) {
+            eq.isNull(StockUninventory::getBatchNo);
+        } else {
+            eq.eq(StockUninventory::getBatchNo, batchNo);
+        }
+        return stockUninventoryMapper.selectOne(eq);
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
index f7bd4f2..4c92e39 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -6,6 +6,7 @@
 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.exception.base.BaseException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.stock.dto.StockInRecordDto;
@@ -24,6 +25,8 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import jakarta.servlet.http.HttpServletResponse;
+
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -95,6 +98,7 @@
         stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType());
         stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity());
         stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
+        stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
         stockOutRecordDto.setType("1");
         stockOutRecordService.add(stockOutRecordDto);
         StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda().eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId()));
@@ -107,6 +111,63 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Integer addStockInRecordOnly(StockUninventoryDto stockUninventoryDto) {
+        StockInRecordDto stockInRecordDto = new StockInRecordDto();
+        stockInRecordDto.setRecordId(stockUninventoryDto.getRecordId());
+        stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType());
+        stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
+        stockInRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
+        stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
+        stockInRecordDto.setType("1");
+        stockInRecordDto.setRemark(stockUninventoryDto.getRemark());
+        stockInRecordService.add(stockInRecordDto);
+        return 1;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Integer addStockOutRecordOnly(StockUninventoryDto stockUninventoryDto) {
+        LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>();
+        eq.eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId());
+        if (StringUtils.isEmpty(stockUninventoryDto.getBatchNo())) {
+            eq.isNull(StockUninventory::getBatchNo);
+        } else {
+            eq.eq(StockUninventory::getBatchNo, stockUninventoryDto.getBatchNo());
+        }
+        StockUninventory stockUninventory = stockUninventoryMapper.selectOne(eq);
+        if (stockUninventory == null) {
+            throw new BaseException("搴撳瓨璁板綍涓嶅瓨鍦�");
+        }
+        BigDecimal lockedQty = stockUninventory.getLockedQuantity();
+        if (lockedQty == null) {
+            lockedQty = BigDecimal.ZERO;
+        }
+        BigDecimal pendingOut = stockUninventoryMapper.selectPendingOutQuantity(
+                stockUninventoryDto.getProductModelId(),
+                stockUninventoryDto.getBatchNo(),
+                "1"
+        );
+        if (pendingOut == null) {
+            pendingOut = BigDecimal.ZERO;
+        }
+        BigDecimal availableQty = stockUninventory.getQualitity().subtract(lockedQty).subtract(pendingOut);
+        if (stockUninventoryDto.getQualitity().compareTo(availableQty) > 0) {
+            throw new BaseException("鐢宠鏁伴噺瓒呰繃鍙敤搴撳瓨锛屽綋鍓嶅彲鐢ㄥ簱瀛樹负锛�" + availableQty);
+        }
+        StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
+        stockOutRecordDto.setRecordId(stockUninventoryDto.getRecordId());
+        stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType());
+        stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity());
+        stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
+        stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
+        stockOutRecordDto.setType("1");
+        stockOutRecordDto.setRemark(stockUninventoryDto.getRemark());
+        stockOutRecordService.add(stockOutRecordDto);
+        return 1;
+    }
+
+    @Override
     public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
         List<StockUnInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto);
         ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class);
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index a7dab00..6e8a3bc 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -106,8 +106,10 @@
             SUM(unQualifiedQuantity) as unQualifiedQuantity,
             SUM(qualifiedLockedQuantity) as qualifiedLockedQuantity,
             SUM(unQualifiedLockedQuantity) as unQualifiedLockedQuantity,
-            SUM(qualifiedQuantity - qualifiedLockedQuantity) as qualifiedUnLockedQuantity,
-            SUM(unQualifiedQuantity - unQualifiedLockedQuantity) as unQualifiedUnLockedQuantity,
+            SUM(qualifiedQuantity - qualifiedLockedQuantity - IFNULL(qualifiedPendingOut, 0)) as qualifiedUnLockedQuantity,
+            SUM(unQualifiedQuantity - unQualifiedLockedQuantity - IFNULL(unQualifiedPendingOut, 0)) as unQualifiedUnLockedQuantity,
+            SUM(IFNULL(qualifiedPendingOut, 0)) as qualifiedPendingOutQuantity,
+            SUM(IFNULL(unQualifiedPendingOut, 0)) as unQualifiedPendingOutQuantity,
             product_model_id,
             MAX(create_time) as create_time,
             MAX(update_time) as update_time,
@@ -139,7 +141,16 @@
             si.remark,
             pm.unit,
             p.product_name,
-            p.id as product_id
+            p.id as product_id,
+            (
+                select IFNULL(SUM(sor.stock_out_num), 0)
+                from stock_out_record sor
+                where sor.product_model_id = si.product_model_id
+                  and (si.batch_no is null and sor.batch_no is null or si.batch_no = sor.batch_no)
+                  and sor.type = '0'
+                  and sor.approval_status = 0
+            ) as qualifiedPendingOut,
+            0 as unqualifiedPendingOut
             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
@@ -165,7 +176,16 @@
             su.remark,
             pm.unit,
             p.product_name,
-            p.id as product_id
+            p.id as product_id,
+            0 as qualifiedPendingOut,
+            (
+                select IFNULL(SUM(sor.stock_out_num), 0)
+                from stock_out_record sor
+                where sor.product_model_id = su.product_model_id
+                  and (su.batch_no is null and sor.batch_no is null or su.batch_no = sor.batch_no)
+                  and sor.type = '1'
+                  and sor.approval_status = 0
+            ) as unqualifiedPendingOut
             from stock_uninventory su
             left join product_model pm on su.product_model_id = pm.id
             left join product p on pm.product_id = p.id
@@ -410,4 +430,13 @@
         ORDER BY DATE(sor.create_time) ASC
     </select>
 
+    <select id="selectPendingOutQuantity" resultType="java.math.BigDecimal">
+        SELECT IFNULL(SUM(sor.stock_out_num), 0)
+        FROM stock_out_record sor
+        WHERE sor.product_model_id = #{productModelId}
+          AND (sor.batch_no = #{batchNo} OR (#{batchNo} IS NULL AND sor.batch_no IS NULL))
+          AND sor.type = #{type}
+          AND sor.approval_status = 0
+    </select>
+
 </mapper>
diff --git a/src/main/resources/mapper/stock/StockUninventoryMapper.xml b/src/main/resources/mapper/stock/StockUninventoryMapper.xml
index 70943e7..582542c 100644
--- a/src/main/resources/mapper/stock/StockUninventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockUninventoryMapper.xml
@@ -95,4 +95,13 @@
         </if>
     </select>
 
+    <select id="selectPendingOutQuantity" resultType="java.math.BigDecimal">
+        SELECT IFNULL(SUM(sor.stock_out_num), 0)
+        FROM stock_out_record sor
+        WHERE sor.product_model_id = #{productModelId}
+          AND (sor.batch_no = #{batchNo} OR (#{batchNo} IS NULL AND sor.batch_no IS NULL))
+          AND sor.type = #{type}
+          AND sor.approval_status = 0
+    </select>
+
 </mapper>

--
Gitblit v1.9.3