gongchunyi
2 天以前 5303724901f83673d2cd0e33a80ea9a51a60c786
fix: 质量管理-报表管理修改
已修改1个文件
387 ■■■■■ 文件已修改
src/main/resources/mapper/quality/QualityInspectMapper.xml 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 ('原料', '半成品', '成品')
                                        UNION ALL
                                        SELECT p.id,
                                               p.product_name,
                                               pt.modelType
                                        FROM product p
                                                 INNER JOIN product_tree pt ON p.parent_id = pt.id)
        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 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)
                  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)
               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
            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 1
                      UNION ALL
                      SELECT 2),
            base AS (SELECT m.month_num, t.modelType
                             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 types t)
                                     CROSS JOIN (SELECT 0 AS modelType UNION ALL SELECT 1 UNION ALL SELECT 2) t)
        SELECT CASE b.month_num
                   WHEN 1 THEN '一月'
@@ -223,120 +199,101 @@
                   WHEN 11 THEN '十一月'
                   WHEN 12 THEN '十二月'
                   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(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
                  )
                  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
                  )
               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
        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
                               AND (
                                  (pp.product_name = '原材料' AND b.modelType = 0)
                                      OR (pp.product_name = '半成品' AND b.modelType = 1)
                                      OR (pp.product_name = '成品' AND b.modelType = 2)
                                  )
        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">
        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(
                                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
                             UNION ALL
        FROM (SELECT 0 AS modelType
                             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) 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
                      SELECT 2)
        SELECT t.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,
               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}
                               AND qi.inspect_state = 1
                               AND qi.check_result = '合格'
        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
        WITH RECURSIVE
            months AS (SELECT 1 AS month_num
                                  UNION ALL
                                  SELECT month_num + 1
                                  FROM months
                                  WHERE month_num &lt; 12)
                       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 '二月'
@@ -352,37 +309,15 @@
                   WHEN 12 THEN '十二月'
                   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,30 +325,33 @@
                               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,
        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
                                           JOIN product p
                                                ON qi.product_id = p.id
                                           JOIN product pp
                                                ON p.parent_id = pp.id
                                          JOIN quality_inspect qi ON qip.inspect_id = qi.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 = '成品')
                                      )
                                   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
            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)
@@ -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>