From e731bf5f64d71ed93a570d505c52dc44d491175e Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 22 九月 2026 11:21:33 +0800
Subject: [PATCH] fix(home): 修复首页采购品分布和出入库趋势数据统计问题

---
 src/main/resources/mapper/stock/StockInventoryMapper.xml |  549 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 541 insertions(+), 8 deletions(-)

diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 3dd2089..82709f5 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -86,6 +86,48 @@
         </if>
     </select>
 
+    <!-- 鎶ュ簾鍝侀�夋枡锛氬彧鏌ヤ骇鍝佹爲銆屽嵄搴熷缃鐢熷嵄搴熴�嶅ぇ绫伙紙鍚叾鎵�鏈夊瓙鑺傜偣锛変笅鐨勫悎鏍煎簱瀛橈紝甯︽壒鍙枫��
+         澶х被鍚嶆寜涓氬姟鍙e緞鍐欐鍦ㄨ繖閲岋紝鏀瑰彛寰勫彧闇�鏀硅繖涓�澶勩��
+         璇ユ煡璇互 WITH 寮�澶达紝鑰屾暟鎹潈闄愭嫤鎴櫒鍙鐞� select 寮�澶寸殑 SQL锛屽洜姝や笉浼氳拷鍔� dept_id/create_user,
+         涓庛�屽簱瀛樻槸鍏辩敤鍩虹鏁版嵁銆侀�夋枡涓嶅簲鍙楀缓鍗曚汉闄愬埗銆嶇殑鍙e緞涓�鑷达紱淇濈暀 /*data_scope*/ 鏍囪璁╄繖涓剰鍥炬樉寮忓彲璇汇��
+         涓嶅奖鍝嶅師 pagestockInventory -->
+    <select id="selectScrapStockPage" resultType="com.ruoyi.stock.dto.StockInventoryDto">
+        WITH RECURSIVE scrap_product_tree AS (
+            SELECT id
+            FROM product
+            WHERE product_name = '鍗卞簾澶勭疆娆$敓鍗卞簾'
+            UNION ALL
+            SELECT p.id
+            FROM product p
+            INNER JOIN scrap_product_tree t ON p.parent_id = t.id
+        )
+        select /*data_scope*/ si.id,
+        si.product_model_id,
+        si.batch_no,
+        si.qualitity,
+        COALESCE(si.locked_quantity, 0) as locked_quantity,
+        (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity,
+        si.remark,
+        si.version,
+        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 pm.product_id in (select id from scrap_product_tree)
+        <if test="ew.productModelId != null">
+            and si.product_model_id = #{ew.productModelId}
+        </if>
+        <if test="ew.batchNo != null and ew.batchNo != ''">
+            and si.batch_no like concat('%',#{ew.batchNo},'%')
+        </if>
+        <if test="ew.productName != null and ew.productName != ''">
+            and p.product_name like concat('%',#{ew.productName},'%')
+        </if>
+        order by si.update_time desc
+    </select>
+
     <select id="pageListCombinedStockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto">
         WITH RECURSIVE product_tree AS (
         SELECT id
@@ -120,7 +162,91 @@
         unit,
         product_name,
         product_id,
-        'combined' as stockType
+        'combined' as stockType,
+        (
+        select sir.tank_no
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as tank_no,
+        (
+        select sir.oil_product
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as oil_product,
+        (
+        select sir.tank_inspection_status
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as tank_inspection_status,
+        (
+        select sir.unloading_crane_position
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as unloading_crane_position,
+        (
+        select sir.density
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as density,
+        (
+        select sir.unload_photos
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as unload_photos,
+        (
+        select sir.gross_weight
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as gross_weight,
+        (
+        select sir.tare_weight
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as tare_weight,
+        (
+        select sir.net_weight
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as net_weight,
+        (
+        select sir.loss_quantity
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as loss_quantity,
+        (
+        select sir.actual_volume
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as actual_volume,
+        (
+        select sir.pound_photos
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        order by sir.id desc
+        limit 1
+        ) as pound_photos
         from (
         select
         si.batch_no,
@@ -222,7 +348,7 @@
         unit,
         product_name,
         product_id
-        order by combined.id desc
+        order by create_time desc
     </select>
 
     <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
@@ -259,7 +385,15 @@
             unit,
             product_name,
             product_id,
-            'combined' as stockType
+            'combined' as stockType,
+            (
+            select sir.tank_no
+            from stock_in_record sir
+            where sir.product_model_id = combined.product_model_id
+            and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+            order by sir.id desc
+            limit 1
+            ) as tank_no
         from (
             select
             si.batch_no,
@@ -352,7 +486,11 @@
         su.nick_name as create_by
         from
         stock_in_record sir
-        left join stock_inventory si on sir.product_model_id = si.product_model_id
+        left join (
+            select product_model_id, sum(qualitity) as qualitity
+            from stock_inventory
+            group by product_model_id
+        ) si on sir.product_model_id = si.product_model_id
         left join product_model pm on sir.product_model_id = pm.id
         left join product p on pm.product_id = p.id
         left join sys_user su on sir.create_user = su.user_id
@@ -466,13 +604,25 @@
                 AND create_time &lt;= #{endDate}) AS combined_counts
     </select>
 
+    <!-- 鍑哄叆搴撹秼鍔匡細浜у搧鍒嗙被蹇呴』閫掑綊鍙栨暣妫靛瓙鏍戙��
+         浜у搧鏍戞槸銆屽ぇ绫� -> 鍝佺被 -> 鍏蜂綋浜у搧銆嶄笁灞傦紝浜у搧鍨嬪彿锛坧roduct_model锛夋寕鍦ㄥ彾瀛愪骇鍝佷笂锛�
+         鍙瘮瀵圭洿鎺ュ瓙鑺傜偣锛坧.parent_id = root锛夋案杩滃懡涓笉鍒板瀷鍙凤紝瓒嬪娍鍥炬亽涓虹┖銆�
+         閫掑綊 CTE 鍐欏湪鎷彿鍐咃紝璁╄鍙ヤ粛浠� SELECT 寮�澶达紝鏁版嵁鏉冮檺鎷︽埅鍣ㄧ収甯稿 stock_in_record 鐢熸晥 -->
     <select id="selectDailyStockInCounts" resultType="java.util.Map">
         SELECT DATE(sir.create_time) AS date,
                SUM(sir.stock_in_num) AS count
         FROM stock_in_record sir
                  JOIN product_model pm ON sir.product_model_id = pm.id
                  JOIN product p ON pm.product_id = p.id
-        WHERE (p.parent_id = #{rootCategoryId} OR p.id = #{rootCategoryId})
+        WHERE p.id IN (WITH RECURSIVE product_tree AS (SELECT id
+                                                       FROM product
+                                                       WHERE id = #{rootCategoryId}
+                                                       UNION ALL
+                                                       SELECT p2.id
+                                                       FROM product p2
+                                                                JOIN product_tree pt ON p2.parent_id = pt.id)
+                       SELECT id
+                       FROM product_tree)
           AND sir.create_time &gt;= #{startDate}
           AND sir.create_time &lt;= #{endDate}
         GROUP BY DATE(sir.create_time)
@@ -485,7 +635,15 @@
         FROM stock_out_record sor
                  JOIN product_model pm ON sor.product_model_id = pm.id
                  JOIN product p ON pm.product_id = p.id
-        WHERE (p.parent_id = #{rootCategoryId} OR p.id = #{rootCategoryId})
+        WHERE p.id IN (WITH RECURSIVE product_tree AS (SELECT id
+                                                       FROM product
+                                                       WHERE id = #{rootCategoryId}
+                                                       UNION ALL
+                                                       SELECT p2.id
+                                                       FROM product p2
+                                                                JOIN product_tree pt ON p2.parent_id = pt.id)
+                       SELECT id
+                       FROM product_tree)
           AND sor.create_time &gt;= #{startDate}
           AND sor.create_time &lt;= #{endDate}
         GROUP BY DATE(sor.create_time)
@@ -569,7 +727,382 @@
         MAX(version) as version,
         MAX(remark) as remark,
 
-        'combined' as stockType
+        'combined' as stockType,
+        (
+        select sir.oil_product
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as oil_product,
+        (
+        select sir.tank_inspection_status
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as tank_inspection_status,
+        (
+        select sir.unloading_crane_position
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as unloading_crane_position,
+        (
+        select sir.density
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as density,
+        (
+        select sir.unload_photos
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as unload_photos,
+        (
+        select sir.gross_weight
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as gross_weight,
+        (
+        select sir.tare_weight
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as tare_weight,
+        (
+        select sir.net_weight
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as net_weight,
+        (
+        select sir.loss_quantity
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as loss_quantity,
+        (
+        select sir.actual_volume
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as actual_volume,
+        (
+        select sir.pound_photos
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as pound_photos,
+        (
+        select sor.out_category
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_category,
+        (
+        select sor.out_date
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_date,
+        (
+        select sor.out_tonnage
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_tonnage,
+        (
+        select sor.customer_name
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_customer_name,
+        (
+        select sor.loading_inspection_status
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as loading_inspection_status,
+        (
+        select sor.loading_crane_position
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as loading_crane_position,
+        (
+        select sor.density
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_density,
+        (
+        select sor.driver_name
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_driver_name,
+        (
+        select sor.truck_plate_no
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_truck_plate_no,
+        (
+        select sor.loading_photos
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as loading_photos,
+        (
+        select sor.pound_photos
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_pound_photos,
+        (
+        select sor.oil_depot_name
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_oil_depot_name,
+        (
+        select sor.tank_no
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_tank_no,
+        (
+        select sor.oil_product
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_oil_product,
+        (
+        select sor.contact_person
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_contact_person,
+        (
+        select sor.contact_phone
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_contact_phone,
+        (
+        select sor.gross_weight
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_gross_weight,
+        (
+        select sor.tare_weight
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_tare_weight,
+        (
+        select sor.net_weight
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_net_weight,
+        (
+        select sor.loss_quantity
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_loss_quantity,
+        (
+        select sor.actual_volume
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_actual_volume,
+        (
+        select sor.driver_phone
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_driver_phone,
+        (
+        select sor.escort_name
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_escort_name,
+        (
+        select sor.escort_phone
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_escort_phone,
+        (
+        select sor.trailer_plate_no
+        from stock_out_record sor
+        where sor.product_model_id = combined.product_model_id
+        order by sor.id desc
+        limit 1
+        ) as out_trailer_plate_no,
+        (
+        select sir.oil_depot_name
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as oil_depot_name,
+        (
+        select sir.inbound_category
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as inbound_category,
+        (
+        select sir.tank_no
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as tank_no,
+        (
+        select sir.inbound_time
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as inbound_time,
+        (
+        select sir.original_quantity
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as original_quantity,
+        (
+        select sir.customer_name
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as customer_name,
+        (
+        select sir.contact_person
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as contact_person,
+        (
+        select sir.contact_phone
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as contact_phone,
+        (
+        select sir.driver_name
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as driver_name,
+        (
+        select sir.driver_phone
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as driver_phone,
+        (
+        select sir.escort_name
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as escort_name,
+        (
+        select sir.escort_phone
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as escort_phone,
+        (
+        select sir.truck_plate_no
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as truck_plate_no,
+        (
+        select sir.trailer_plate_no
+        from stock_in_record sir
+        where sir.product_model_id = combined.product_model_id
+        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
+        order by sir.id desc
+        limit 1
+        ) as trailer_plate_no
         from (
         select
         si.batch_no,
@@ -670,7 +1203,7 @@
         product_name,
         product_id
         order by
-        batch_no
+        MAX(update_time) desc
     </select>
 
 </mapper>

--
Gitblit v1.9.3