1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.report.mapper.PassRateMapper">
 
    <!-- 原材料合格率 -->
    <select id="getRawMaterialPassRate" resultType="java.util.Map">
        SELECT
            s.sample AS sampleName,
            o.entrust_code AS batchNo,
            COUNT(*) AS totalCount,
            SUM(CASE WHEN p.ins_result = 1 THEN 1 ELSE 0 END) AS qualifiedCount,
            SUM(CASE WHEN p.ins_result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount,
            ROUND(SUM(CASE WHEN p.ins_result = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS passRate
        FROM ins_product p
        LEFT JOIN ins_sample s ON p.ins_sample_id = s.id
        LEFT JOIN ins_order o ON s.ins_order_id = o.id
        WHERE p.ins_result IS NOT NULL AND o.order_type = '1'
        <if test="dto.startTime != null and dto.startTime != ''">
            AND o.ins_time >= #{dto.startTime}
        </if>
        <if test="dto.endTime != null and dto.endTime != ''">
            AND o.ins_time &lt;= #{dto.endTime}
        </if>
        <if test="dto.sampleName != null and dto.sampleName != ''">
            AND s.sample LIKE CONCAT('%', #{dto.sampleName}, '%')
        </if>
        <if test="dto.supplierName != null and dto.supplierName != ''">
            AND o.custom LIKE CONCAT('%', #{dto.supplierName}, '%')
        </if>
        GROUP BY s.sample, o.entrust_code
        ORDER BY passRate ASC
    </select>
 
    <!-- 供应商不合格统计 -->
    <select id="getSupplierUnqualified" resultType="java.util.Map">
        SELECT
            o.custom AS supplierName,
            COUNT(*) AS totalCount,
            SUM(CASE WHEN p.ins_result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount
        FROM ins_product p
        LEFT JOIN ins_sample s ON p.ins_sample_id = s.id
        LEFT JOIN ins_order o ON s.ins_order_id = o.id
        WHERE p.ins_result IS NOT NULL AND o.order_type = '1'
        <if test="dto.startTime != null and dto.startTime != ''">
            AND o.ins_time >= #{dto.startTime}
        </if>
        <if test="dto.endTime != null and dto.endTime != ''">
            AND o.ins_time &lt;= #{dto.endTime}
        </if>
        GROUP BY o.custom
        HAVING unqualifiedCount > 0
        ORDER BY unqualifiedCount DESC
    </select>
 
    <!-- 不合格项目统计(用于帕累托图) -->
    <select id="getUnqualifiedItemStats" resultType="java.util.Map">
        SELECT
            p.inspection_item AS itemName,
            COUNT(*) AS unqualifiedCount
        FROM ins_product p
        LEFT JOIN ins_sample s ON p.ins_sample_id = s.id
        LEFT JOIN ins_order o ON s.ins_order_id = o.id
        WHERE p.ins_result = 0
        <if test="dto.startTime != null and dto.startTime != ''">
            AND o.ins_time >= #{dto.startTime}
        </if>
        <if test="dto.endTime != null and dto.endTime != ''">
            AND o.ins_time &lt;= #{dto.endTime}
        </if>
        <if test="dto.orderType != null and dto.orderType != ''">
            AND o.order_type = #{dto.orderType}
        </if>
        GROUP BY p.inspection_item
        ORDER BY unqualifiedCount DESC
    </select>
 
    <!-- 工序合格率 -->
    <select id="getProcessPassRate" resultType="java.util.Map">
        SELECT
            o.laboratory AS processName,
            COUNT(*) AS totalCount,
            SUM(CASE WHEN p.ins_result = 1 THEN 1 ELSE 0 END) AS qualifiedCount,
            SUM(CASE WHEN p.ins_result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount,
            ROUND(SUM(CASE WHEN p.ins_result = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS passRate
        FROM ins_product p
        LEFT JOIN ins_sample s ON p.ins_sample_id = s.id
        LEFT JOIN ins_order o ON s.ins_order_id = o.id
        WHERE p.ins_result IS NOT NULL
        <if test="dto.startTime != null and dto.startTime != ''">
            AND o.ins_time >= #{dto.startTime}
        </if>
        <if test="dto.endTime != null and dto.endTime != ''">
            AND o.ins_time &lt;= #{dto.endTime}
        </if>
        <if test="dto.orderType != null and dto.orderType != ''">
            AND o.order_type = #{dto.orderType}
        </if>
        GROUP BY o.laboratory
        ORDER BY passRate ASC
    </select>
 
    <!-- 机台不合格统计 -->
    <select id="getMachineUnqualified" resultType="java.util.Map">
        SELECT
            p.factory AS machineNo,
            COUNT(*) AS totalCount,
            SUM(CASE WHEN p.ins_result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount
        FROM ins_product p
        LEFT JOIN ins_sample s ON p.ins_sample_id = s.id
        LEFT JOIN ins_order o ON s.ins_order_id = o.id
        WHERE p.ins_result IS NOT NULL
        <if test="dto.startTime != null and dto.startTime != ''">
            AND o.ins_time >= #{dto.startTime}
        </if>
        <if test="dto.endTime != null and dto.endTime != ''">
            AND o.ins_time &lt;= #{dto.endTime}
        </if>
        <if test="dto.orderType != null and dto.orderType != ''">
            AND o.order_type = #{dto.orderType}
        </if>
        GROUP BY p.factory
        HAVING unqualifiedCount > 0
        ORDER BY unqualifiedCount DESC
    </select>
 
</mapper>