From a0914318549b357ef3c438d0c2a3714f58ea3487 Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期五, 23 一月 2026 14:14:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New

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

diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index 4e8a057..8058455 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -23,7 +23,7 @@
             AND check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')
         </if>
         <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
-            AND  check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
+            AND check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
         </if>
         ORDER BY check_time DESC
     </select>
@@ -55,4 +55,292 @@
         </foreach>
     </delete>
 
+    <select id="getInspectStatistics" resultType="com.ruoyi.quality.dto.QualityInspectStatDto">
+        SELECT 0                                                                                   AS inspectType,
+               COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 1), 0) +
+               COALESCE((SELECT SUM(quantity) FROM quality_unqualified WHERE inspect_type = 0), 0) AS totalCount,
+               COALESCE((SELECT SUM(inbound_num)
+                         FROM procurement_record_storage
+                         WHERE type = 1
+                           AND quality_inspect_id != 0
+                           AND quality_inspect_id IS NOT NULL), 0) +
+               COALESCE((SELECT SUM(quantity) FROM quality_unqualified WHERE inspect_type = 0), 0) AS completedCount
+        UNION ALL
+        SELECT 1                                                   AS inspectType,
+               COALESCE((SELECT SUM(inbound_num)
+                         FROM procurement_record_storage
+                         WHERE type = 2
+                           AND sales_ledger_product_id = 0), 0)    AS totalCount,
+               COALESCE((SELECT SUM(inbound_num)
+                         FROM procurement_record_storage
+                         WHERE type = 2
+                           AND sales_ledger_product_id = 0
+                           AND quality_inspect_id != 0
+                           AND quality_inspect_id IS NOT NULL), 0) AS completedCount
+        UNION ALL
+        SELECT 2                                                   AS inspectType,
+               COALESCE((SELECT SUM(inbound_num)
+                         FROM procurement_record_storage
+                         WHERE type = 2
+                           AND sales_ledger_product_id != 0), 0)   AS totalCount,
+               COALESCE((SELECT SUM(inbound_num)
+                         FROM procurement_record_storage
+                         WHERE type = 2
+                           AND sales_ledger_product_id != 0
+                           AND quality_inspect_id != 0
+                           AND quality_inspect_id IS NOT NULL), 0) AS completedCount
+    </select>
+
+    <select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
+        SELECT t.inspectType,
+               COALESCE(prs.totalCount, 0)                                            AS totalCount,
+               COALESCE(qi.completedCount, 0)                                         AS completedCount,
+               COALESCE(qi.qualifiedCount, 0)                                         AS qualifiedCount,
+               COALESCE(qi.unqualifiedCount, 0)                                       AS unqualifiedCount,
+               IF(COALESCE(prs.totalCount, 0) = 0, 0,
+                  ROUND(COALESCE(qi.completedCount, 0) / prs.totalCount * 100, 2))    AS completionRate,
+               IF(COALESCE(qi.completedCount, 0) = 0, 0,
+                  ROUND(COALESCE(qi.qualifiedCount, 0) / qi.completedCount * 100, 2)) AS passRate
+        FROM (SELECT 0 AS inspectType
+              UNION ALL
+              SELECT 1
+              UNION ALL
+              SELECT 2) t
+                 LEFT JOIN (SELECT inspect_type,
+                                   SUM(quantity)                                 AS completedCount,
+                                   SUM(IF(check_result = '鍚堟牸', quantity, 0))   AS qualifiedCount,
+                                   SUM(IF(check_result = '涓嶅悎鏍�', quantity, 0)) AS unqualifiedCount
+                            FROM quality_inspect
+                            WHERE inspect_state = 1
+                            GROUP BY inspect_type) qi
+                           ON t.inspectType = qi.inspect_type
+                 LEFT JOIN (SELECT 0           AS inspectType,
+                                   COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 1),
+                                            0) +
+                                   COALESCE((SELECT SUM(quantity) FROM quality_unqualified WHERE inspect_type = 0),
+                                            0) AS totalCount
+                            UNION ALL
+                            SELECT 1                                                AS inspectType,
+                                   COALESCE((SELECT SUM(inbound_num)
+                                             FROM procurement_record_storage
+                                             WHERE type = 2
+                                               AND sales_ledger_product_id = 0), 0) AS totalCount
+                            UNION ALL
+                            SELECT 2                                                 AS inspectType,
+                                   COALESCE((SELECT SUM(inbound_num)
+                                             FROM procurement_record_storage
+                                             WHERE type = 2
+                                               AND sales_ledger_product_id != 0), 0) AS totalCount) prs
+                           ON t.inspectType = prs.inspectType
+        ORDER BY t.inspectType;
+    </select>
+
+    <select id="getMonthlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityMonthlyPassRateDto">
+        WITH RECURSIVE
+            months AS (SELECT 1 AS month_num
+                       UNION ALL
+                       SELECT month_num + 1
+                       FROM months
+                       WHERE month_num &lt; 12),
+            types AS (SELECT 0 AS inspectType
+                      UNION ALL
+                      SELECT 1
+                      UNION ALL
+                      SELECT 2),
+            base AS (SELECT m.month_num, t.inspectType
+                     FROM months m,
+                          types t),
+            qi_data AS (SELECT MONTH(check_time)                                               AS month_num,
+                               inspect_type,
+                               SUM(quantity)                                                   AS completedCount,
+                               SUM(CASE WHEN check_result = '鍚堟牸' THEN quantity ELSE 0 END)   AS qualifiedCount,
+                               SUM(CASE WHEN check_result = '涓嶅悎鏍�' THEN quantity ELSE 0 END) AS unqualifiedCount
+                        FROM quality_inspect
+                        WHERE YEAR(check_time) = #{year}
+                          AND inspect_state = 1
+                        GROUP BY MONTH(check_time), inspect_type),
+            prs_data AS (SELECT month_num,
+                                inspectType,
+                                SUM(totalCount) AS totalCount
+                         FROM (SELECT MONTH(create_time) AS month_num,
+                                      0                  AS inspectType,
+                                      inbound_num        AS totalCount
+                               FROM procurement_record_storage
+                               WHERE type = 1
+                                 AND YEAR(create_time) = #{year}
+                               UNION ALL
+                               SELECT MONTH(check_time) AS month_num,
+                                      0                 AS inspectType,
+                                      quantity          AS totalCount
+                               FROM quality_unqualified
+                               WHERE inspect_type = 0
+                                 AND YEAR(check_time) = #{year}
+                               UNION ALL
+                               SELECT MONTH(create_time) AS month_num,
+                                      CASE
+                                          WHEN sales_ledger_product_id = 0 THEN 1
+                                          ELSE 2
+                                          END            AS inspectType,
+                                      inbound_num        AS totalCount
+                               FROM procurement_record_storage
+                               WHERE type = 2
+                                 AND YEAR(create_time) = #{year}) sub
+                         GROUP BY month_num, inspectType)
+        SELECT CASE b.month_num
+                   WHEN 1 THEN '涓�鏈�'
+                   WHEN 2 THEN '浜屾湀'
+                   WHEN 3 THEN '涓夋湀'
+                   WHEN 4 THEN '鍥涙湀'
+                   WHEN 5 THEN '浜旀湀'
+                   WHEN 6 THEN '鍏湀'
+                   WHEN 7 THEN '涓冩湀'
+                   WHEN 8 THEN '鍏湀'
+                   WHEN 9 THEN '涔濇湀'
+                   WHEN 10 THEN '鍗佹湀'
+                   WHEN 11 THEN '鍗佷竴鏈�'
+                   WHEN 12 THEN '鍗佷簩鏈�'
+                   END                         AS month,
+               b.inspectType,
+               COALESCE(p.totalCount, 0)       AS totalCount,
+               COALESCE(q.completedCount, 0)   AS completedCount,
+               COALESCE(q.qualifiedCount, 0)   AS qualifiedCount,
+               COALESCE(q.unqualifiedCount, 0) AS unqualifiedCount,
+               CASE
+                   WHEN COALESCE(p.totalCount, 0) = 0 THEN 0
+                   ELSE ROUND(COALESCE(q.completedCount, 0) / p.totalCount * 100, 2)
+                   END                         AS completionRate,
+               CASE
+                   WHEN COALESCE(q.completedCount, 0) = 0 THEN 0
+                   ELSE ROUND(COALESCE(q.qualifiedCount, 0) / q.completedCount * 100, 2)
+                   END                         AS passRate
+        FROM base b
+                 LEFT JOIN qi_data q ON b.month_num = q.month_num AND b.inspectType = q.inspect_type
+                 LEFT JOIN prs_data p ON b.month_num = p.month_num AND b.inspectType = p.inspectType
+        ORDER BY b.month_num, b.inspectType
+    </select>
+
+    <select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
+        SELECT t.inspectType,
+               COALESCE(prs.totalCount, 0)      AS totalCount,
+               COALESCE(qi.completedCount, 0)   AS completedCount,
+               COALESCE(qi.qualifiedCount, 0)   AS qualifiedCount,
+               COALESCE(qi.unqualifiedCount, 0) AS unqualifiedCount,
+               CASE
+                   WHEN COALESCE(prs.totalCount, 0) = 0 THEN 0
+                   ELSE ROUND(COALESCE(qi.completedCount, 0) / prs.totalCount * 100, 2)
+                   END                          AS completionRate,
+               CASE
+                   WHEN COALESCE(qi.completedCount, 0) = 0 THEN 0
+                   ELSE ROUND(COALESCE(qi.qualifiedCount, 0) / qi.completedCount * 100, 2)
+                   END                          AS passRate
+        FROM (SELECT 0 AS inspectType
+              UNION ALL
+              SELECT 1
+              UNION ALL
+              SELECT 2) t
+                 LEFT JOIN (SELECT inspect_type,
+                                   SUM(quantity)                                                   AS completedCount,
+                                   SUM(CASE WHEN check_result = '鍚堟牸' THEN quantity ELSE 0 END)   AS qualifiedCount,
+                                   SUM(CASE WHEN check_result = '涓嶅悎鏍�' THEN quantity ELSE 0 END) AS unqualifiedCount
+                            FROM quality_inspect
+                            WHERE YEAR(check_time) = #{year}
+                              AND inspect_state = 1
+                            GROUP BY inspect_type) qi
+                           ON t.inspectType = qi.inspect_type
+                 LEFT JOIN (SELECT 0                                               AS inspectType,
+                                   COALESCE((SELECT SUM(inbound_num)
+                                             FROM procurement_record_storage
+                                             WHERE type = 1
+                                               AND YEAR(create_time) = #{year}), 0) +
+                                   COALESCE((SELECT SUM(quantity)
+                                             FROM quality_unqualified
+                                             WHERE inspect_type = 0
+                                               AND YEAR(check_time) = #{year}), 0) AS totalCount
+                            UNION ALL
+                            SELECT 1                                                AS inspectType,
+                                   COALESCE((SELECT SUM(inbound_num)
+                                             FROM procurement_record_storage
+                                             WHERE type = 2
+                                               AND sales_ledger_product_id = 0
+                                               AND YEAR(create_time) = #{year}), 0) AS totalCount
+                            UNION ALL
+                            SELECT 2                                                AS inspectType,
+                                   COALESCE((SELECT SUM(inbound_num)
+                                             FROM procurement_record_storage
+                                             WHERE type = 2
+                                               AND sales_ledger_product_id != 0
+                                               AND YEAR(create_time) = #{year}), 0) AS totalCount) prs
+                           ON t.inspectType = prs.inspectType
+        ORDER BY t.inspectType
+    </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),
+            qi_data AS (SELECT MONTH(check_time)                                        AS month_num,
+                               SUM(CASE WHEN inspect_type = 0 THEN quantity ELSE 0 END) AS rawMaterialCount,
+                               SUM(CASE WHEN inspect_type = 1 THEN quantity ELSE 0 END) AS processCount,
+                               SUM(CASE WHEN inspect_type = 2 THEN quantity ELSE 0 END) AS outgoingCount
+                        FROM quality_inspect
+                        WHERE YEAR(check_time) = #{year}
+                          AND inspect_state = 1
+                        GROUP BY MONTH(check_time))
+        SELECT CASE m.month_num
+                   WHEN 1 THEN '涓�鏈�'
+                   WHEN 2 THEN '浜屾湀'
+                   WHEN 3 THEN '涓夋湀'
+                   WHEN 4 THEN '鍥涙湀'
+                   WHEN 5 THEN '浜旀湀'
+                   WHEN 6 THEN '鍏湀'
+                   WHEN 7 THEN '涓冩湀'
+                   WHEN 8 THEN '鍏湀'
+                   WHEN 9 THEN '涔濇湀'
+                   WHEN 10 THEN '鍗佹湀'
+                   WHEN 11 THEN '鍗佷竴鏈�'
+                   WHEN 12 THEN '鍗佷簩鏈�'
+                   END                         AS month,
+               COALESCE(d.rawMaterialCount, 0) AS rawMaterialCount,
+               COALESCE(d.processCount, 0)     AS processCount,
+               COALESCE(d.outgoingCount, 0)    AS outgoingCount
+        FROM months m
+                 LEFT JOIN qi_data d ON m.month_num = d.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,
+                                         SUM(COALESCE(qi.quantity, 0)) AS count
+                                  FROM quality_inspect qi
+                                           JOIN quality_inspect_param qip ON qip.inspect_id = qi.id
+                                  WHERE qi.inspect_type = #{inspectType}
+                                  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,
+               CASE
+                   WHEN (SELECT total_count FROM total) = 0 THEN 0
+                   ELSE ROUND(count / (SELECT total_count FROM total) * 100, 2)
+                   END AS percentage
+        FROM (SELECT name, count, rn
+              FROM ranked
+              WHERE rn &lt;= 4
+              UNION ALL
+              SELECT '鍏朵粬妫�娴�' AS name,
+                     SUM(count) AS count,
+                     5          AS rn
+              FROM ranked
+              WHERE rn &gt; 4
+              HAVING SUM(count) &gt; 0) t
+        ORDER BY rn
+    </select>
+
 </mapper>

--
Gitblit v1.9.3