yuan
5 天以前 66d041ed14b3ed3ed7183a28a5c588e235fc21d0
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -4,6 +4,10 @@
    <select id="qualityInspectListPage" resultType="com.ruoyi.quality.dto.QualityInspectDto">
        SELECT
        qi.*,
        CASE
            WHEN (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) = 0 THEN 0
            ELSE ROUND(IFNULL(qi.qualified_quantity, 0) / (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) * 100, 2)
        END AS passRate,
        <choose>
            <when test="qualityInspect.inspectType == 0">
                pl.purchase_contract_number as purchase_contract_no
@@ -59,7 +63,11 @@
    <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect">
        SELECT
        *
        qi.*,
        CASE
            WHEN (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) = 0 THEN 0
            ELSE ROUND(IFNULL(qi.qualified_quantity, 0) / (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) * 100, 2)
        END AS passRate
        FROM quality_inspect
        where
        inspect_type=#{qualityInspect.inspectType}
@@ -86,11 +94,7 @@
    </delete>
    <select id="getInspectStatistics" resultType="com.ruoyi.quality.dto.QualityInspectStatDto">
        SELECT CASE pp.product_name
                   WHEN '原材料' THEN 0
                   WHEN '半成品' THEN 1
                   WHEN '成品' THEN 2
                   END                     AS modelType,
        SELECT qi.inspect_type AS modelType,
               IFNULL(SUM(qi.quantity), 0) AS totalCount,
@@ -99,107 +103,44 @@
                              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
        FROM quality_inspect qi
        WHERE pp.product_name IN ('原材料', '半成品', '成品')
        GROUP BY pp.product_name
        GROUP BY qi.inspect_type
    </select>
    <select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
        SELECT t.modelType,
               t.totalCount,
               t.completedCount,
               t.qualifiedCount,
               t.unqualifiedCount,
               COALESCE(SUM(qi.quantity), 0) AS totalCount,
            /* 完成率:
               如果总数为 0 则返回 0;否则计算比例,使用 TRUNCATE 保留 4 位小数(如 99.9992)
            */
               IF(t.totalCount = 0, 0,
                  TRUNCATE((t.completedCount / t.totalCount) * 100, 2)
               ) AS completionRate,
               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,
            /* 合格率 */
               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
        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)
                                  )
        GROUP BY t.modelType
            /* 合格率:
               如果完工数为 0 则返回 0;使用 TRUNCATE 截断,防止极其接近 100% 的数据被四舍五入成 100
            */
               IF(t.completedCount = 0, 0,
                  TRUNCATE((t.qualifiedCount / t.completedCount) * 100, 2)
               ) AS passRate
        FROM (
                 /* 先通过子查询把基础数据进行聚合统计,避免外层重复编写复杂的 CASE WHEN */
                 SELECT qi.inspect_type                                                                          AS 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 THEN qi.qualified_quantity ELSE 0 END),
                                 0)                                                                              AS qualifiedCount,
                        COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity ELSE 0 END),
                                 0)                                                                              AS unqualifiedCount
                 FROM quality_inspect qi
                 GROUP BY qi.inspect_type) t
        ORDER BY t.modelType;
    </select>
@@ -220,45 +161,74 @@
                     FROM months m
                              CROSS JOIN types t)
        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,
        SELECT
            CASE t.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.modelType,
        t.modelType,
        t.totalCount,
        t.completedCount,
        t.qualifiedCount,
        t.unqualifiedCount,
            /* 总数量 */
        IF(t.totalCount = 0, 0,
           TRUNCATE((t.completedCount / t.totalCount) * 100, 2)
        ) AS completionRate,
        IF(t.completedCount = 0, 0,
           TRUNCATE((t.qualifiedCount / t.completedCount) * 100, 2)
        ) AS passRate
        FROM (
            SELECT
            b.month_num,
            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 THEN qi.qualified_quantity ELSE 0 END), 0) AS qualifiedCount,
            COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity ELSE 0 END), 0) AS unqualifiedCount
            FROM base b
            LEFT JOIN quality_inspect qi ON qi.inspect_type = b.modelType
            AND YEAR(qi.check_time) = #{year}
            AND MONTH(qi.check_time) = b.month_num
            GROUP BY b.month_num, b.modelType
            ) t
        ORDER BY t.month_num, t.modelType;
    </select>
    <select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
        SELECT qi.inspect_type AS 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
                                    WHEN qi.inspect_state = 1 THEN qi.quantity
                                    ELSE 0
                                    END
                        ), 0)                AS completedCount,
               COALESCE(SUM(
                                CASE
                                    WHEN qi.inspect_state = 1 THEN qi.qualified_quantity
                                    ELSE 0
                                    END
                        ), 0)                AS qualifiedCount,
            /* 不合格 */
               COALESCE(SUM(
                                CASE
                                    WHEN qi.inspect_state = 1 AND qi.check_result = '不合格'
                                        THEN qi.quantity
                                    WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity
                                    ELSE 0
                                    END
                        ), 0)                AS unqualifiedCount,
@@ -268,8 +238,8 @@
                  ROUND(
                          COALESCE(SUM(
                                           CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
                                   ), 0) / SUM(qi.quantity) * 100, 2
                  )
                                   ), 0)
                              / SUM(qi.quantity) * 100, 2)
               )                             AS completionRate,
            /* 合格率 */
@@ -278,66 +248,18 @@
                           ), 0) = 0, 0,
                  ROUND(
                          COALESCE(SUM(
                                           CASE
                                               WHEN qi.inspect_state = 1 AND qi.check_result = '合格'
                                                   THEN qi.quantity
                                               ELSE 0
                                               END
                                           CASE WHEN qi.inspect_state = 1 THEN qi.qualified_quantity ELSE 0 END
                                   ), 0)
                              /
                          COALESCE(SUM(
                                           CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
                                   ), 0) * 100, 2
                  )
                                   ), 0) * 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)
                                  )
        GROUP 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,
               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
        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 = '合格'
        GROUP BY t.modelType
        ORDER BY t.modelType;
        FROM quality_inspect qi
        WHERE YEAR(qi.check_time) = #{year}
        GROUP BY qi.inspect_type
        ORDER BY qi.inspect_type;
    </select>
@@ -366,7 +288,7 @@
            /* 原材料 */
               COALESCE(SUM(
                                CASE
                                    WHEN pp.product_name = '原材料'
                                    WHEN qi.inspect_type = 0
                                        THEN qi.quantity
                                    ELSE 0
                                    END
@@ -375,7 +297,7 @@
            /* 半成品 */
               COALESCE(SUM(
                                CASE
                                    WHEN pp.product_name = '半成品'
                                    WHEN qi.inspect_type = 1
                                        THEN qi.quantity
                                    ELSE 0
                                    END
@@ -384,19 +306,15 @@
            /* 成品 */
               COALESCE(SUM(
                                CASE
                                    WHEN pp.product_name = '成品'
                                    WHEN qi.inspect_type = 2
                                        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 quality_inspect qi
                           ON qi.product_model_id = pm.id
                               AND qi.inspect_state = 1
                           ON qi.inspect_state = 1
                               AND YEAR(qi.check_time) = #{year}
                               AND MONTH(qi.check_time) = m.month_num
@@ -411,16 +329,8 @@
                                  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 = '成品')
                                      )
                                    AND qi.inspect_type = #{modelType} - 1
                                  GROUP BY qip.parameter_item),
             ranked AS (SELECT name,
                               count,