From 5303724901f83673d2cd0e33a80ea9a51a60c786 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 03 四月 2026 11:12:27 +0800
Subject: [PATCH] fix: 质量管理-报表管理修改

---
 src/main/resources/mapper/quality/QualityInspectMapper.xml |  435 +++++++++++++++++++++++-------------------------------
 1 files changed, 184 insertions(+), 251 deletions(-)

diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index 48fb369..0ccfbea 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -75,8 +75,23 @@
     </delete>
 
     <select id="getInspectStatistics" resultType="com.ruoyi.quality.dto.QualityInspectStatDto">
-        SELECT CASE pp.product_name
-                   WHEN '鍘熸潗鏂�' THEN 0
+        WITH RECURSIVE product_tree AS (SELECT id,
+                                               parent_id,
+                                               product_name,
+                                               id           AS root_id,
+                                               product_name AS root_name
+                                        FROM product
+                                        WHERE product_name IN ('鍘熸枡', '鍗婃垚鍝�', '鎴愬搧')
+                                        UNION ALL
+                                        SELECT p.id,
+                                               p.parent_id,
+                                               p.product_name,
+                                               pt.root_id,
+                                               pt.root_name
+                                        FROM product p
+                                                 INNER JOIN product_tree pt ON p.parent_id = pt.id)
+        SELECT CASE pt.root_name
+                   WHEN '鍘熸枡' THEN 0
                    WHEN '鍗婃垚鍝�' THEN 1
                    WHEN '鎴愬搧' THEN 2
                    END                     AS modelType,
@@ -88,110 +103,61 @@
                               ELSE 0
                    END), 0)                AS completedCount
 
-        FROM product p
-                 INNER JOIN product pp
-                            ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm
-                           ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-
-        WHERE pp.product_name IN ('鍘熸潗鏂�', '鍗婃垚鍝�', '鎴愬搧')
-
-        GROUP BY pp.product_name
-
+        FROM product_tree pt
+                 INNER JOIN product_model pm ON pm.product_id = pt.id
+                 LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
+        GROUP BY pt.root_id, pt.root_name
     </select>
 
     <select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
-        SELECT t.modelType,
+        WITH RECURSIVE product_tree AS (SELECT id,
+                                               product_name,
+                                               CASE product_name
+                                                   WHEN '鍘熸枡' THEN 0
+                                                   WHEN '鍗婃垚鍝�' THEN 1
+                                                   WHEN '鎴愬搧' THEN 2
+                                                   END AS modelType
+                                        FROM product
+                                        WHERE product_name IN ('鍘熸枡', '鍗婃垚鍝�', '鎴愬搧')
 
-               COALESCE(SUM(qi.quantity), 0) AS totalCount,
+                                        UNION ALL
 
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1 THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS completedCount,
+                                        SELECT p.id,
+                                               p.product_name,
+                                               pt.modelType
+                                        FROM product p
+                                                 INNER JOIN product_tree pt ON p.parent_id = pt.id)
 
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1
-                                        AND qi.check_result = '鍚堟牸'
-                                        THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS qualifiedCount,
+        SELECT base.modelType,
+               COALESCE(SUM(qi.quantity), 0)                                                AS totalCount,
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸' THEN qi.quantity ELSE 0 END),
+                        0)                                                                  AS qualifiedCount,
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '涓嶅悎鏍�' THEN qi.quantity ELSE 0 END),
+                        0)                                                                  AS unqualifiedCount,
 
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1
-                                        AND qi.check_result = '涓嶅悎鏍�'
-                                        THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS unqualifiedCount,
-
-            /* 瀹屾垚鐜� */
                IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
-                  ROUND(
-                          COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1 THEN qi.quantity
-                                               ELSE 0
-                                               END
-                                   ), 0)
-                              / SUM(qi.quantity) * 100, 2)
-               )                             AS completionRate,
+                  ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END)
+                            / SUM(qi.quantity) * 100, 2)
+                   )                                                                        AS completionRate,
 
-            /* 鍚堟牸鐜� */
-               IF(COALESCE(SUM(
-                                   CASE
-                                       WHEN qi.inspect_state = 1 THEN qi.quantity
-                                       ELSE 0
-                                       END
-                           ), 0) = 0, 0,
-                  ROUND(
-                          COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1
-                                                   AND qi.check_result = '鍚堟牸'
-                                                   THEN qi.quantity
-                                               ELSE 0
-                                               END
-                                   ), 0)
-                              /
-                          COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1 THEN qi.quantity
-                                               ELSE 0
-                                               END
-                                   ), 0) * 100, 2)
-               )                             AS passRate
+               IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0,
+                  ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸' THEN qi.quantity ELSE 0 END)
+                            / SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2)
+                   )                                                                        AS passRate
 
         FROM (SELECT 0 AS modelType
               UNION ALL
               SELECT 1
               UNION ALL
-              SELECT 2) t
-                 LEFT JOIN product p
-                           ON 1 = 1
-                 LEFT JOIN product pp
-                           ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm
-                           ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-                               AND (
-                                  (pp.product_name = '鍘熸潗鏂�' AND t.modelType = 0) OR
-                                  (pp.product_name = '鍗婃垚鍝�' AND t.modelType = 1) OR
-                                  (pp.product_name = '鎴愬搧' AND t.modelType = 2)
-                                  )
+              SELECT 2) base
+                 LEFT JOIN product_tree pt ON base.modelType = pt.modelType
+                 LEFT JOIN product_model pm ON pm.product_id = pt.id
+                 LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
 
-        GROUP BY t.modelType
-        ORDER BY t.modelType;
+        GROUP BY base.modelType
+        ORDER BY base.modelType
     </select>
-
 
     <select id="getMonthlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityMonthlyPassRateDto">
         WITH RECURSIVE
@@ -200,14 +166,24 @@
                        SELECT month_num + 1
                        FROM months
                        WHERE month_num &lt; 12),
-            types AS (SELECT 0 AS modelType
-                      UNION ALL
-                      SELECT 1
-                      UNION ALL
-                      SELECT 2),
-            base AS (SELECT m.month_num, t.modelType
-                     FROM months m
-                              CROSS JOIN types t)
+            product_tree AS (SELECT id,
+                                    product_name,
+                                    CASE product_name
+                                        WHEN '鍘熸枡' THEN 0
+                                        WHEN '鍗婃垚鍝�' THEN 1
+                                        WHEN '鎴愬搧' THEN 2
+                                        END AS modelType
+                             FROM product
+                             WHERE product_name IN ('鍘熸枡', '鍗婃垚鍝�', '鎴愬搧')
+
+                             UNION ALL
+
+                             SELECT p.id, p.product_name, pt.modelType
+                             FROM product p
+                                      INNER JOIN product_tree pt ON p.parent_id = pt.id),
+            base_matrix AS (SELECT m.month_num, t.modelType
+                            FROM months m
+                                     CROSS JOIN (SELECT 0 AS modelType UNION ALL SELECT 1 UNION ALL SELECT 2) t)
 
         SELECT CASE b.month_num
                    WHEN 1 THEN '涓�鏈�'
@@ -222,121 +198,102 @@
                    WHEN 10 THEN '鍗佹湀'
                    WHEN 11 THEN '鍗佷竴鏈�'
                    WHEN 12 THEN '鍗佷簩鏈�'
-                   END                       AS month,
-
+                   END                                                                      AS month,
                b.modelType,
 
-            /* 鎬绘暟閲� */
-               COALESCE(SUM(qi.quantity), 0) AS totalCount,
-
-            /* 宸插畬鎴� */
-               COALESCE(SUM(
-                                CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
-                        ), 0)                AS completedCount,
-
-            /* 鍚堟牸 */
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸'
-                                        THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS qualifiedCount,
-
-            /* 涓嶅悎鏍� */
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1 AND qi.check_result = '涓嶅悎鏍�'
-                                        THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS unqualifiedCount,
+               COALESCE(SUM(qi.quantity), 0)                                                AS totalCount,
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸' THEN qi.quantity ELSE 0 END),
+                        0)                                                                  AS qualifiedCount,
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '涓嶅悎鏍�' THEN qi.quantity ELSE 0 END),
+                        0)                                                                  AS unqualifiedCount,
 
             /* 瀹屾垚鐜� */
                IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
-                  ROUND(
-                          COALESCE(SUM(
-                                           CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
-                                   ), 0) / SUM(qi.quantity) * 100, 2
-                  )
-               )                             AS completionRate,
+                  ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) / SUM(qi.quantity) * 100, 2)
+                   )                                                                        AS completionRate,
 
             /* 鍚堟牸鐜� */
-               IF(COALESCE(SUM(
-                                   CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
-                           ), 0) = 0, 0,
-                  ROUND(
-                          COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸'
-                                                   THEN qi.quantity
-                                               ELSE 0
-                                               END
-                                   ), 0)
-                              /
-                          COALESCE(SUM(
-                                           CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
-                                   ), 0) * 100, 2
-                  )
-               )                             AS passRate
+               IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0,
+                  ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸' THEN qi.quantity ELSE 0 END)
+                            / SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2)
+                   )                                                                        AS passRate
 
-        FROM base b
-                 LEFT JOIN product p ON 1 = 1
-                 LEFT JOIN product pp ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-                               AND YEAR(qi.check_time) = #{year}
-                               AND MONTH(qi.check_time) = b.month_num
-                               AND (
-                                  (pp.product_name = '鍘熸潗鏂�' AND b.modelType = 0)
-                                      OR (pp.product_name = '鍗婃垚鍝�' AND b.modelType = 1)
-                                      OR (pp.product_name = '鎴愬搧' AND b.modelType = 2)
-                                  )
+        FROM base_matrix b
+                 LEFT JOIN product_tree pt ON b.modelType = pt.modelType
+            -- 鍏宠仈浜у搧妯″瀷
+                 LEFT JOIN product_model pm ON pm.product_id = pt.id
+            -- 鍏宠仈妫�楠屾暟鎹紝骞舵寜骞淬�佹湀銆佺被鍨嬭繃婊�
+                 LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
+            AND YEAR(qi.check_time) = #{year}
+            AND MONTH(qi.check_time) = b.month_num
 
         GROUP BY b.month_num, b.modelType
-        ORDER BY b.month_num, b.modelType;
-
+        ORDER BY b.month_num, b.modelType
     </select>
 
     <select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
+        WITH RECURSIVE
+            product_tree AS (SELECT id,
+                                    product_name,
+                                    CASE product_name
+                                        WHEN '鍘熸枡' THEN 0
+                                        WHEN '鍗婃垚鍝�' THEN 1
+                                        WHEN '鎴愬搧' THEN 2
+                                        END AS modelType
+                             FROM product
+                             WHERE product_name IN ('鍘熸枡', '鍗婃垚鍝�', '鎴愬搧')
+
+                             UNION ALL
+
+                             SELECT p.id, p.product_name, pt.modelType
+                             FROM product p
+                                      INNER JOIN product_tree pt ON p.parent_id = pt.id),
+            types AS (SELECT 0 AS modelType
+                      UNION ALL
+                      SELECT 1
+                      UNION ALL
+                      SELECT 2)
+
         SELECT t.modelType,
+               COALESCE(SUM(qi.quantity), 0)                                                AS totalCount,
 
-               COALESCE(SUM(
-                                CASE
-                                    WHEN pp.product_name = '鍘熸潗鏂�' AND t.modelType = 0 THEN qi.quantity
-                                    WHEN pp.product_name = '鍗婃垚鍝�' AND t.modelType = 1 THEN qi.quantity
-                                    WHEN pp.product_name = '鎴愬搧' AND t.modelType = 2 THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0) AS totalCount
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
 
-        FROM (SELECT 0 AS modelType
-              UNION ALL
-              SELECT 1
-              UNION ALL
-              SELECT 2) t
-                 LEFT JOIN product p ON 1 = 1
-                 LEFT JOIN product pp ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-                               AND YEAR(qi.check_time) = #{year}
-                               AND qi.inspect_state = 1
-                               AND qi.check_result = '鍚堟牸'
+               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸' THEN qi.quantity ELSE 0 END),
+                        0)                                                                  AS qualifiedCount,
+
+               IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0,
+                  ROUND(SUM(CASE WHEN qi.inspect_state = 1 AND qi.check_result = '鍚堟牸' THEN qi.quantity ELSE 0 END)
+                            / SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2)
+                   )                                                                        AS passRate
+
+        FROM types t
+                 LEFT JOIN product_tree pt ON t.modelType = pt.modelType
+                 LEFT JOIN product_model pm ON pm.product_id = pt.id
+                 LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
+            AND YEAR(qi.check_time) = #{year}
 
         GROUP BY t.modelType
-        ORDER BY t.modelType;
+        ORDER BY t.modelType
     </select>
 
-
-
     <select id="getMonthlyCompletionDetails" resultType="com.ruoyi.quality.dto.QualityMonthlyDetailDto">
-        WITH RECURSIVE months AS (SELECT 1 AS month_num
-                                  UNION ALL
-                                  SELECT month_num + 1
-                                  FROM months
-                                  WHERE month_num &lt; 12)
+        WITH RECURSIVE
+            months AS (SELECT 1 AS month_num
+                       UNION ALL
+                       SELECT month_num + 1
+                       FROM months
+                       WHERE month_num &lt; 12),
+            product_tree AS (SELECT id, product_name AS root_name
+                             FROM product
+                             WHERE product_name IN ('鍘熸枡', '鍗婃垚鍝�', '鎴愬搧')
+
+                             UNION ALL
+
+                             SELECT p.id, pt.root_name
+                             FROM product p
+                                      INNER JOIN product_tree pt ON p.parent_id = pt.id)
         SELECT CASE m.month_num
                    WHEN 1 THEN '涓�鏈�'
                    WHEN 2 THEN '浜屾湀'
@@ -350,39 +307,17 @@
                    WHEN 10 THEN '鍗佹湀'
                    WHEN 11 THEN '鍗佷竴鏈�'
                    WHEN 12 THEN '鍗佷簩鏈�'
-                   END        AS month,
+                   END                                                                      AS month,
 
-            /* 鍘熸潗鏂� */
-               COALESCE(SUM(
-                                CASE
-                                    WHEN pp.product_name = '鍘熸潗鏂�'
-                                        THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0) AS rawMaterialCount,
+               COALESCE(SUM(CASE WHEN pt.root_name = '鍘熸枡' THEN qi.quantity ELSE 0 END), 0)  AS rawMaterialCount,
 
-            /* 鍗婃垚鍝� */
-               COALESCE(SUM(
-                                CASE
-                                    WHEN pp.product_name = '鍗婃垚鍝�'
-                                        THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0) AS processCount,
+               COALESCE(SUM(CASE WHEN pt.root_name = '鍗婃垚鍝�' THEN qi.quantity ELSE 0 END), 0) AS processCount,
 
-            /* 鎴愬搧 */
-               COALESCE(SUM(
-                                CASE
-                                    WHEN pp.product_name = '鎴愬搧'
-                                        THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0) AS outgoingCount
+               COALESCE(SUM(CASE WHEN pt.root_name = '鎴愬搧' THEN qi.quantity ELSE 0 END), 0)  AS outgoingCount
 
         FROM months m
-                 LEFT JOIN product p ON 1 = 1
-                 LEFT JOIN product pp ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm ON pm.product_id = p.id
+                 LEFT JOIN product_tree pt ON 1 = 1
+                 LEFT JOIN product_model pm ON pm.product_id = pt.id
                  LEFT JOIN quality_inspect qi
                            ON qi.product_model_id = pm.id
                                AND qi.inspect_state = 1
@@ -390,33 +325,36 @@
                                AND MONTH(qi.check_time) = m.month_num
 
         GROUP BY m.month_num
-        ORDER BY m.month_num;
-
+        ORDER BY m.month_num
     </select>
 
     <select id="getTopParameters" resultType="com.ruoyi.quality.dto.QualityParameterStatDto">
-        WITH parameter_counts AS (SELECT qip.parameter_item AS name,
-                                         COUNT(*)           AS count
-                                  FROM quality_inspect_param qip
-                                           JOIN quality_inspect qi
-                                                ON qip.inspect_id = qi.id
-                                           JOIN product p
-                                                ON qi.product_id = p.id
-                                           JOIN product pp
-                                                ON p.parent_id = pp.id
-                                  WHERE qi.inspect_state = 1
-                                    AND (
-                                      (#{modelType} = 1 AND pp.product_name = '鍘熸潗鏂�')
-                                          OR (#{modelType} = 2 AND pp.product_name = '鍗婃垚鍝�')
-                                          OR (#{modelType} = 3 AND pp.product_name = '鎴愬搧')
-                                      )
-                                  GROUP BY qip.parameter_item),
-             ranked AS (SELECT name,
-                               count,
-                               ROW_NUMBER() OVER (ORDER BY count DESC) AS rn
-                        FROM parameter_counts),
-             total AS (SELECT SUM(count) AS total_count
-                       FROM parameter_counts)
+        WITH RECURSIVE
+            -- 1. 鎵惧埌瀵瑰簲鐨勬牴鑺傜偣
+            root_node AS (SELECT id, product_name
+                          FROM product
+                          WHERE (
+                                        (#{modelType} = 1 AND product_name = '鍘熸枡')
+                                        OR (#{modelType} = 2 AND product_name = '鍗婃垚鍝�')
+                                        OR (#{modelType} = 3 AND product_name = '鎴愬搧')
+                                    )),
+            target_ids AS (SELECT id
+                           FROM root_node
+                           UNION ALL
+                           SELECT p.id
+                           FROM product p
+                                    INNER JOIN target_ids ti ON p.parent_id = ti.id),
+            parameter_counts AS (SELECT qip.parameter_item AS name,
+                                        COUNT(*)           AS count
+                                 FROM quality_inspect_param qip
+                                          JOIN quality_inspect qi ON qip.inspect_id = qi.id
+                                 WHERE qi.inspect_state = 1
+                                   AND qi.product_id IN (SELECT id FROM target_ids)
+                                 GROUP BY qip.parameter_item),
+            ranked AS (SELECT name, count, ROW_NUMBER() OVER (ORDER BY count DESC) AS rn
+                       FROM parameter_counts),
+            total AS (SELECT SUM(count) AS total_count
+                      FROM parameter_counts)
 
         SELECT name,
                count,
@@ -427,17 +365,12 @@
         FROM (SELECT name, count, rn
               FROM ranked
               WHERE rn &lt;= 4
-
               UNION ALL
-
-              SELECT '鍏朵粬妫�娴�' AS name,
-                     SUM(count) AS count,
-                     5          AS rn
+              SELECT '鍏朵粬妫�娴�' AS name, SUM(count) AS count, 5 AS rn
               FROM ranked
               WHERE rn > 4
               HAVING SUM(count) > 0) t
-        ORDER BY rn;
-
+        ORDER BY rn
     </select>
 
 

--
Gitblit v1.9.3