gongchunyi
4 天以前 5303724901f83673d2cd0e33a80ea9a51a60c786
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -3,30 +3,49 @@
<mapper namespace="com.ruoyi.quality.mapper.QualityInspectMapper">
    <select id="qualityInspectListPage" resultType="com.ruoyi.quality.pojo.QualityInspect">
        SELECT
        *
        FROM quality_inspect
        where
        qi.*,
        <choose>
            <when test="qualityInspect.inspectType == 0">
                pl.purchase_contract_number as purchase_contract_no
            </when>
            <otherwise>
                pwo.work_order_no
            </otherwise>
        </choose>
        FROM
        quality_inspect qi
        <choose>
            <when test="qualityInspect.inspectType == 0 ">
                LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id
            </when>
            <otherwise>
                LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id
                LEFT JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
            </otherwise>
        </choose>
        WHERE
        inspect_type=#{qualityInspect.inspectType}
        <if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">
            AND supplier like concat('%',#{qualityInspect.supplier},'%')
            AND qi.supplier like concat('%',#{qualityInspect.supplier},'%')
        </if>
        <if test="qualityInspect.customer != null and qualityInspect.customer != '' ">
            AND customer like concat('%',#{qualityInspect.customer},'%')
            AND qi.customer like concat('%',#{qualityInspect.customer},'%')
        </if>
        <if test="qualityInspect.process != null and qualityInspect.process != '' ">
            AND process like concat('%',#{qualityInspect.process},'%')
            AND qi.process like concat('%',#{qualityInspect.process},'%')
        </if>
        <if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
            AND product_name like concat('%',#{qualityInspect.productName},'%')
            AND qi.product_name like concat('%',#{qualityInspect.productName},'%')
        </if>
        <if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' ">
            AND check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')
            AND qi.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 qi.check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
        </if>
        ORDER BY check_time DESC
        ORDER BY qi.check_time DESC
    </select>
    <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect">
        SELECT
        *
@@ -55,4 +74,304 @@
        </foreach>
    </delete>
    <select id="getInspectStatistics" resultType="com.ruoyi.quality.dto.QualityInspectStatDto">
        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,
               IFNULL(SUM(qi.quantity), 0) AS totalCount,
               IFNULL(SUM(CASE
                              WHEN qi.inspect_state = 1 THEN qi.quantity
                              ELSE 0
                   END), 0)                AS completedCount
        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">
        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,
               IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
                  ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END)
                            / SUM(qi.quantity) * 100, 2)
                   )                                                                        AS completionRate,
               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) 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 base.modelType
        ORDER BY base.modelType
    </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),
            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 '一月'
                   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,
               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(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) / SUM(qi.quantity) * 100, 2)
                   )                                                                        AS completionRate,
            /* 合格率 */
               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_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
    </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 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}
        GROUP 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),
            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 '二月'
                   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(SUM(CASE WHEN pt.root_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 processCount,
               COALESCE(SUM(CASE WHEN pt.root_name = '成品' THEN qi.quantity ELSE 0 END), 0)  AS outgoingCount
        FROM months m
                 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
                               AND YEAR(qi.check_time) = #{year}
                               AND MONTH(qi.check_time) = m.month_num
        GROUP BY m.month_num
        ORDER BY m.month_num
    </select>
    <select id="getTopParameters" resultType="com.ruoyi.quality.dto.QualityParameterStatDto">
        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,
               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 > 4
              HAVING SUM(count) > 0) t
        ORDER BY rn
    </select>
</mapper>