From f05753606a24addc52e1a7874f3e801f640cf5cf Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期五, 15 五月 2026 13:59:19 +0800
Subject: [PATCH] fix:1.仓库导入添加审核记录 2.库存展示更改

---
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java          |    2 
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                  |    3 
 src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java                  |    3 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java            |    2 
 src/main/resources/mapper/stock/StockInventoryMapper.xml                  |  324 +++++++++++++++++++++++++++++++++------------
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java    |   20 ++
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java |   42 +++--
 7 files changed, 284 insertions(+), 112 deletions(-)

diff --git a/src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java b/src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java
index fdd7503..5003107 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java
@@ -5,6 +5,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -16,7 +17,7 @@
  */
 @Data
 @TableName("product_record")
-public class ProductRecord {
+public class ProductRecord implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index 44fe885..a0a9fa5 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -51,6 +51,19 @@
         return R.ok(stockInventoryDtoIPage);
     }
 
+    /**
+     * 鏌ヨ瀵瑰簲鎵瑰彿鍜屾暟閲�
+     * @param page
+     * @param stockInventoryDto
+     * @return
+     */
+    @GetMapping("/getBatchNoQty")
+    @Operation(summary = "鏌ヨ瀵瑰簲鎵瑰彿鍜屾暟閲�")
+    public R getBatchNoQty(Page page, StockInventoryDto stockInventoryDto) {
+        IPage<StockInventoryDto> stockInventoryDtoIPage = stockInventoryService.getBatchNoQty(page, stockInventoryDto);
+        return R.ok(stockInventoryDtoIPage);
+    }
+
     @PostMapping("/addstockInventory")
     @Operation(summary = "鏂板搴撳瓨")
     public R addstockInventory(@RequestBody StockInventoryDto stockInventoryDto) {
@@ -85,7 +98,7 @@
     }
 
 
-    @PostMapping("importStockInventory")
+    @PostMapping("/importStockInventory")
     @Operation(summary = "瀵煎叆搴撳瓨")
     public R importStockInventory(MultipartFile file) {
         return stockInventoryService.importStockInventory(file);
@@ -105,13 +118,13 @@
         stockInventoryService.exportStockInventory(response, stockInventoryDto);
     }
 
-    @GetMapping("stockInventoryPage")
+    @GetMapping("/stockInventoryPage")
     @Operation(summary = "搴撳瓨鎶ヨ〃鏌ヨ")
     public R stockInventoryPage(Page page, StockInventoryDto stockInventoryDto) {
         return R.ok(stockInventoryService.stockInventoryPage(stockInventoryDto,page));
     }
 
-    @GetMapping("stockInAndOutRecord")
+    @GetMapping("/stockInAndOutRecord")
     @Operation(summary = "缁熻鍚勪釜浜у搧鐨勫叆搴撳拰鍑哄簱璁板綍")
     public R stockInAndOutRecord(StockInventoryDto stockInventoryDto,Page page) {
         return R.ok(stockInventoryService.stockInAndOutRecord(stockInventoryDto,page));
@@ -128,7 +141,6 @@
     public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
         return R.ok(stockInventoryService.thawStock(stockInventoryDto));
     }
-
 
     @GetMapping("/getByModelId")
     @Operation(summary = "鏍规嵁浜у搧瑙勬牸ID鑾峰彇鍏ュ簱璁板綍")
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 2be6512..bc08eee 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -76,4 +76,7 @@
 
     @Schema(description = "涓嶅悎鏍煎簱瀛業D")
     private Long unQualifiedId;
+
+    @Schema(description = "浜у搧id")
+    private Long productId;
 }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index a31cf5b..dbc271b 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -56,4 +56,6 @@
     List<StockInventory> listSelectableBatchNoByProductModelIds(@Param("productModelIds") List<Long> productModelIds);
 
     List<StockInventory> getByModelId(@Param("productModelId") Long productModelId);
+
+    IPage<StockInventoryDto> getBatchNoQty(Page page, @Param("ew") StockInventoryDto stockInventoryDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index d47cc4b..5d534d5 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -47,4 +47,6 @@
     Boolean thawStock(StockInventoryDto stockInventoryDto);
 
     List<StockInventory> getByModelId(Long modelId);
+
+    IPage<StockInventoryDto> getBatchNoQty(Page page, StockInventoryDto stockInventoryDto);
 }
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 3808916..24605ba 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -29,7 +29,7 @@
 import com.ruoyi.stock.service.StockOutRecordService;
 import com.ruoyi.stock.service.StockUninventoryService;
 import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -51,15 +51,16 @@
  * @since 2026-01-21 04:16:36
  */
 @Service
-@AllArgsConstructor
+@RequiredArgsConstructor
 public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
 
-    private  StockInventoryMapper stockInventoryMapper;
-    private StockInRecordService stockInRecordService;
-    private StockOutRecordService stockOutRecordService;
-    private StockUninventoryService stockUninventoryService;
-    private SalesLedgerProductMapper salesLedgerProductMapper;
-    private ProductModelMapper productModelMapper;
+    private final StockInventoryMapper stockInventoryMapper;
+    private final StockInRecordService stockInRecordService;
+    private final StockOutRecordService stockOutRecordService;
+    private final StockUninventoryService stockUninventoryService;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final ProductModelMapper productModelMapper;
+
     @Override
     public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
         return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
@@ -105,8 +106,8 @@
             newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
             newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
             stockInventoryMapper.insert(newStockInventory);
-        }else {
-             stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
+        } else {
+            stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
         }
         return true;
     }
@@ -116,7 +117,7 @@
     @Transactional(rollbackFor = Exception.class)
     public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) {
         LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda()
-            .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
+                .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
         if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) {
             eq.isNull(StockInventory::getBatchNo);
             stockInventoryDto.setBatchNo(null);
@@ -336,7 +337,7 @@
                         }
 
                         stockInventoryDto.setProductModelId(matchedProduct.getProductModelId());
-                        this.addstockInventory(stockInventoryDto);
+                        this.addStockInRecordOnly(stockInventoryDto);
                         successCount++;
                     }
 
@@ -392,28 +393,28 @@
 
         List<StockInventoryExportData> list = stockInventoryMapper.listStockInventoryExportData(stockInventoryDto);
         ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
-        util.exportExcel(response,list, "搴撳瓨淇℃伅");
+        util.exportExcel(response, list, "搴撳瓨淇℃伅");
     }
 
     @Override
     public IPage<StockInRecordDto> stockInventoryPage(StockInventoryDto stockInventoryDto, Page page) {
-        return stockInventoryMapper.stockInventoryPage(stockInventoryDto,page);
+        return stockInventoryMapper.stockInventoryPage(stockInventoryDto, page);
     }
 
     @Override
     public IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto, Page page) {
-        return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto,page);
+        return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto, page);
     }
 
     @Override
     public Boolean frozenStock(StockInventoryDto stockInventoryDto) {
         StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
-        if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+        if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity()) < 0) {
             throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃搴撳瓨鏁伴噺");
         }
         if (ObjectUtils.isEmpty(stockInventory.getLockedQuantity())) {
             stockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
-        }else {
+        } else {
             stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity()));
         }
         return this.updateById(stockInventory);
@@ -422,7 +423,7 @@
     @Override
     public Boolean thawStock(StockInventoryDto stockInventoryDto) {
         StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
-        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity()) < 0) {
             throw new RuntimeException("瑙e喕鏁伴噺涓嶈兘瓒呰繃鍐荤粨鏁伴噺");
         }
         stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
@@ -433,4 +434,9 @@
     public List<StockInventory> getByModelId(Long modelId) {
         return stockInventoryMapper.getByModelId(modelId);
     }
+
+    @Override
+    public IPage<StockInventoryDto> getBatchNoQty(Page page, StockInventoryDto stockInventoryDto) {
+        return stockInventoryMapper.getBatchNoQty(page, stockInventoryDto);
+    }
 }
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 4e7adf6..32aebe1 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -99,96 +99,102 @@
         INNER JOIN product_tree pt ON p.parent_id = pt.id
         )
         select
-            batch_no,
-            MAX(qualifiedId) as qualifiedId,
-            MAX(unQualifiedId) as unQualifiedId,
-            SUM(qualifiedQuantity) as qualifiedQuantity,
-            SUM(unQualifiedQuantity) as unQualifiedQuantity,
-            SUM(qualifiedLockedQuantity) as qualifiedLockedQuantity,
-            SUM(unQualifiedLockedQuantity) as unQualifiedLockedQuantity,
-            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,
-            MAX(warn_num) as warn_num,
-            MAX(version) as version,
-            model,
-            MAX(remark) as remark,
-            unit,
-            product_name,
-            product_id,
-            'combined' as stockType
+        GROUP_CONCAT(DISTINCT batch_no ORDER BY batch_no SEPARATOR ',') as batch_no,
+        MAX(qualifiedId) as qualifiedId,
+        MAX(unQualifiedId) as unQualifiedId,
+        SUM(qualifiedQuantity) as qualifiedQuantity,
+        SUM(unQualifiedQuantity) as unQualifiedQuantity,
+        SUM(qualifiedLockedQuantity) as qualifiedLockedQuantity,
+        SUM(unQualifiedLockedQuantity) as unQualifiedLockedQuantity,
+        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,
+        MAX(warn_num) as warn_num,
+        MAX(version) as version,
+        model,
+        MAX(remark) as remark,
+        unit,
+        product_name,
+        product_id,
+        'combined' as stockType
         from (
-            select
-            si.batch_no,
-            si.id as qualifiedId,
-            null as unQualifiedId,
-            si.qualitity as qualifiedQuantity,
-            0 as unQualifiedQuantity,
-            COALESCE(si.locked_quantity, 0) as locked_quantity,
-            COALESCE(si.locked_quantity, 0) as qualifiedLockedQuantity,
-            0 as unQualifiedLockedQuantity,
-            si.product_model_id,
-            si.create_time,
-            si.update_time,
-            COALESCE(si.warn_num, 0) as warn_num,
-            si.version,
-            (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity,
-            pm.model,
-            si.remark,
-            pm.unit,
-            p.product_name,
-            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
+        select
+        si.batch_no,
+        si.id as qualifiedId,
+        null as unQualifiedId,
+        si.qualitity as qualifiedQuantity,
+        0 as unQualifiedQuantity,
+        COALESCE(si.locked_quantity, 0) as locked_quantity,
+        COALESCE(si.locked_quantity, 0) as qualifiedLockedQuantity,
+        0 as unQualifiedLockedQuantity,
+        si.product_model_id,
+        si.create_time,
+        si.update_time,
+        COALESCE(si.warn_num, 0) as warn_num,
+        si.version,
+        (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity,
+        pm.model,
+        si.remark,
+        pm.unit,
+        p.product_name,
+        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
 
-            union all
+        union all
 
-            select
-            su.batch_no,
-            null as qualifiedId,
-            su.id as unQualifiedId,
-            0 as qualifiedQuantity,
-            su.qualitity as unQualifiedQuantity,
-            COALESCE(su.locked_quantity, 0) as locked_quantity,
-            0 as qualifiedLockedQuantity,
-            COALESCE(su.locked_quantity, 0) as unQualifiedLockedQuantity,
-            su.product_model_id,
-            su.create_time,
-            su.update_time,
-            0 as warn_num,
-            su.version,
-            (su.qualitity - COALESCE(su.locked_quantity, 0)) as un_locked_quantity,
-            pm.model,
-            su.remark,
-            pm.unit,
-            p.product_name,
-            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
+        select
+        su.batch_no,
+        null as qualifiedId,
+        su.id as unQualifiedId,
+        0 as qualifiedQuantity,
+        su.qualitity as unQualifiedQuantity,
+        COALESCE(su.locked_quantity, 0) as locked_quantity,
+        0 as qualifiedLockedQuantity,
+        COALESCE(su.locked_quantity, 0) as unQualifiedLockedQuantity,
+        su.product_model_id,
+        su.create_time,
+        su.update_time,
+        0 as warn_num,
+        su.version,
+        (su.qualitity - COALESCE(su.locked_quantity, 0)) as un_locked_quantity,
+        pm.model,
+        su.remark,
+        pm.unit,
+        p.product_name,
+        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
         ) as combined
         <where>
             <if test="ew.productName != null and ew.productName !=''">
@@ -196,14 +202,20 @@
                 select distinct p.product_name
                 from product p
                 left join product_model pm on p.id = pm.product_id
-                where p.product_name like concat('%',#{ew.productName},'%') or pm.model like concat('%',#{ew.productName},'%')
+                where p.product_name like concat('%',#{ew.productName},'%')
+                or pm.model like concat('%',#{ew.productName},'%')
                 )
             </if>
             <if test="ew.topParentProductId != null and ew.topParentProductId > 0">
                 and combined.product_id in (select id from product_tree)
             </if>
         </where>
-        group by batch_no, product_model_id, model, unit, product_name, product_id
+        group by
+        product_model_id,
+        model,
+        unit,
+        product_name,
+        product_id
     </select>
 
     <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
@@ -476,4 +488,138 @@
         where si.product_model_id = #{productModelId}
     </select>
 
+    <select id="getBatchNoQty" resultType="com.ruoyi.stock.dto.StockInventoryDto">
+        select
+        batch_no,
+        MAX(qualifiedId) as qualifiedId,
+        MAX(unQualifiedId) as unQualifiedId,
+
+        SUM(qualifiedQuantity) as qualifiedQuantity,
+        SUM(unQualifiedQuantity) as unQualifiedQuantity,
+
+        SUM(qualifiedLockedQuantity) as qualifiedLockedQuantity,
+        SUM(unQualifiedLockedQuantity) as unQualifiedLockedQuantity,
+
+        SUM(IFNULL(qualifiedPendingOut, 0)) as qualifiedPendingOutQuantity,
+        SUM(IFNULL(unQualifiedPendingOut, 0)) as unQualifiedPendingOutQuantity,
+
+        SUM(qualifiedQuantity - qualifiedLockedQuantity - IFNULL(qualifiedPendingOut, 0)) as qualifiedUnLockedQuantity,
+        SUM(unQualifiedQuantity - unQualifiedLockedQuantity - IFNULL(unQualifiedPendingOut, 0)) as unQualifiedUnLockedQuantity,
+
+        product_model_id,
+        model,
+        unit,
+        product_name,
+        product_id,
+
+        MAX(create_time) as create_time,
+        MAX(update_time) as update_time,
+        MAX(warn_num) as warn_num,
+        MAX(version) as version,
+        MAX(remark) as remark,
+
+        'combined' as stockType
+        from (
+        select
+        si.batch_no,
+        si.id as qualifiedId,
+        null as unQualifiedId,
+
+        si.qualitity as qualifiedQuantity,
+        0 as unQualifiedQuantity,
+
+        COALESCE(si.locked_quantity, 0) as qualifiedLockedQuantity,
+        0 as unQualifiedLockedQuantity,
+
+        si.product_model_id,
+        pm.model,
+        pm.unit,
+        p.product_name,
+        p.id as product_id,
+
+        si.create_time,
+        si.update_time,
+        COALESCE(si.warn_num, 0) as warn_num,
+        si.version,
+        si.remark,
+
+        (
+        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
+
+        union all
+
+        select
+        su.batch_no,
+        null as qualifiedId,
+        su.id as unQualifiedId,
+
+        0 as qualifiedQuantity,
+        su.qualitity as unQualifiedQuantity,
+
+        0 as qualifiedLockedQuantity,
+        COALESCE(su.locked_quantity, 0) as unQualifiedLockedQuantity,
+
+        su.product_model_id,
+        pm.model,
+        pm.unit,
+        p.product_name,
+        p.id as product_id,
+
+        su.create_time,
+        su.update_time,
+        0 as warn_num,
+        su.version,
+        su.remark,
+
+        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
+        ) as combined
+        <where>
+            <if test="ew.productModelId != null and ew.productModelId > 0">
+                and combined.product_model_id = #{ew.productModelId}
+            </if>
+
+            <if test="ew.productId != null and ew.productId > 0">
+                and combined.product_id = #{ew.productId}
+            </if>
+        </where>
+        group by
+        batch_no,
+        product_model_id,
+        model,
+        unit,
+        product_name,
+        product_id
+        order by
+        batch_no
+    </select>
+
 </mapper>

--
Gitblit v1.9.3