xyc
3 天以前 53052625c7c520744a4ca061e204ec9594ca67f8
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
<?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.emergencyrepair.business.mapper.ReportMapper">
    <resultMap id="metricResultMap" type="com.emergencyrepair.business.dto.report.ReportMetricDto">
        <result column="NAME" property="name"/>
        <result column="METRIC_VALUE" property="value"/>
    </resultMap>
 
    <resultMap id="overviewResultMap" type="com.emergencyrepair.business.dto.report.ReportOverviewDto">
        <result column="ENGINEERING_TOTAL" property="engineeringTotal"/>
        <result column="MAJOR_FAULT" property="majorFault"/>
        <result column="H_RELATED" property="hRelated"/>
        <result column="MONITOR_ITEM" property="monitorItem"/>
        <result column="UNFINISHED" property="unfinished"/>
        <result column="COMPLETED" property="completed"/>
        <result column="WAIT_TEST" property="waitTest"/>
        <result column="CANCELLED" property="cancelled"/>
    </resultMap>
 
    <resultMap id="teamResultMap" type="com.emergencyrepair.business.dto.report.ReportTeamDto">
        <result column="NAME" property="name"/>
        <result column="FAULT_COUNT" property="faultCount"/>
        <result column="PARTS_COUNT" property="partsCount"/>
    </resultMap>
 
    <resultMap id="contractorResultMap" type="com.emergencyrepair.business.dto.report.ReportContractorDto">
        <result column="NAME" property="name"/>
        <result column="TOTAL_COUNT" property="total"/>
        <result column="UNFINISHED_COUNT" property="unfinished"/>
        <result column="COMPLETED_COUNT" property="completed"/>
        <result column="AVERAGE_SCORE" property="averageScore"/>
    </resultMap>
 
    <resultMap id="trendResultMap" type="com.emergencyrepair.business.dto.report.ReportTrendDto">
        <result column="YEAR_NAME" property="name"/>
        <result column="FAULT_COUNT" property="faultCount"/>
        <result column="PARTS_COUNT" property="partsCount"/>
    </resultMap>
 
    <select id="selectOverview" resultMap="overviewResultMap">
        SELECT f.ENGINEERING_TOTAL,
               f.MAJOR_FAULT,
               f.H_RELATED,
               f.MONITOR_ITEM,
               w.UNFINISHED,
               w.COMPLETED,
               w.WAIT_TEST,
               f.CANCELLED
        FROM (
            SELECT COUNT(*) AS ENGINEERING_TOTAL,
                   NVL(SUM(CASE WHEN FAULT_NATURE = '重大' THEN 1 ELSE 0 END), 0) AS MAJOR_FAULT,
                   NVL(SUM(CASE WHEN IS_H_RELATED = 1 THEN 1 ELSE 0 END), 0) AS H_RELATED,
                   NVL(SUM(CASE WHEN IS_MONITOR_ITEM = 1 THEN 1 ELSE 0 END), 0) AS MONITOR_ITEM,
                   NVL(SUM(CASE WHEN TASK_STATUS = 'CANCELLED' THEN 1 ELSE 0 END), 0) AS CANCELLED
            FROM LX.T_FAULT
        ) f
        CROSS JOIN (
            SELECT NVL(SUM(CASE WHEN COMPLETION_STATUS IS NULL OR COMPLETION_STATUS &lt;&gt; 'COMPLETED' THEN 1 ELSE 0 END), 0) AS UNFINISHED,
                   NVL(SUM(CASE WHEN COMPLETION_STATUS = 'COMPLETED' THEN 1 ELSE 0 END), 0) AS COMPLETED,
                   NVL(SUM(CASE WHEN COMPLETION_STATUS = 'WAIT_TEST' THEN 1 ELSE 0 END), 0) AS WAIT_TEST
            FROM LX.T_WORK_ORDER
        ) w
    </select>
 
    <select id="selectTopEquipment" resultMap="metricResultMap">
        WITH explicit_link AS (
            SELECT DISTINCT f.ID AS FAULT_ID,
                            b.ID AS BASE_ID,
                            b.NAME AS BASE_NAME
            FROM LX.T_FAULT f
            JOIN LX.T_PRODUCT_TREE p
              ON p.NODE_LEVEL = 5
             AND p.BASE_EQUIPMENT_ID IS NOT NULL
             AND (
                  INSTR(',' || NVL(f.EQUIPMENT_IDS, '') || ',',
                        ',' || CAST(p.ID AS VARCHAR(40)) || ',') &gt; 0
                  OR (NVL(f.EQUIPMENT_IDS, '') = '' AND f.EQUIPMENT_ID = p.ID)
             )
            JOIN LX.T_BASE_EQUIPMENT b ON b.ID = p.BASE_EQUIPMENT_ID
        ),
        splitter AS (
            SELECT LEVEL AS N
            FROM DUAL
            CONNECT BY LEVEL &lt;= (
                SELECT NVL(MAX(REGEXP_COUNT(
                    REPLACE(REPLACE(REPLACE(NVL(EQUIPMENT_NAME, ''), ',', '、'), ',', '、'), CHR(10), '、'),
                    '、'
                )), 0) + 1
                FROM LX.T_FAULT
            )
        ),
        fallback_names AS (
            SELECT f.ID AS FAULT_ID,
                   NVL(TRIM(REGEXP_SUBSTR(
                       REPLACE(REPLACE(REPLACE(NVL(f.EQUIPMENT_NAME, ''), ',', '、'), ',', '、'), CHR(10), '、'),
                       '[^、]+',
                       1,
                       sp.N
                   )), '未填写设备') AS EQUIPMENT_NAME
            FROM LX.T_FAULT f
            JOIN splitter sp
              ON sp.N &lt;= REGEXP_COUNT(
                  REPLACE(REPLACE(REPLACE(NVL(f.EQUIPMENT_NAME, ''), ',', '、'), ',', '、'), CHR(10), '、'),
                  '、'
              ) + 1
        ),
        fallback_link AS (
            SELECT DISTINCT fn.FAULT_ID,
                            b.ID AS BASE_ID,
                            b.NAME AS BASE_NAME
            FROM fallback_names fn
            JOIN LX.T_FAULT f ON f.ID = fn.FAULT_ID
            JOIN LX.T_PRODUCT_TREE p5
              ON p5.NODE_LEVEL = 5
             AND p5.NAME = fn.EQUIPMENT_NAME
             AND p5.BASE_EQUIPMENT_ID IS NOT NULL
            JOIN LX.T_PRODUCT_TREE p4 ON p4.ID = p5.PARENT_ID
            JOIN LX.T_PRODUCT_TREE p3 ON p3.ID = p4.PARENT_ID
            JOIN LX.T_PRODUCT_TREE x
              ON x.ID = p3.PARENT_ID
             AND x.NODE_LEVEL = 2
             AND x.NAME = f.X_NO
            JOIN LX.T_BASE_EQUIPMENT b ON b.ID = p5.BASE_EQUIPMENT_ID
            WHERE NOT EXISTS (
                SELECT 1
                FROM explicit_link el
                WHERE el.FAULT_ID = fn.FAULT_ID
            )
        ),
        all_link AS (
            SELECT FAULT_ID, BASE_ID, BASE_NAME FROM explicit_link
            UNION
            SELECT FAULT_ID, BASE_ID, BASE_NAME FROM fallback_link
        ),
        base_count AS (
            SELECT BASE_NAME AS NAME,
                   COUNT(*) AS METRIC_VALUE
            FROM all_link
            GROUP BY BASE_NAME
        ),
        unlinked_count AS (
            SELECT fn.EQUIPMENT_NAME AS NAME,
                   COUNT(*) AS METRIC_VALUE
            FROM fallback_names fn
            WHERE NOT EXISTS (
                SELECT 1
                FROM all_link al
                WHERE al.FAULT_ID = fn.FAULT_ID
            )
            GROUP BY fn.EQUIPMENT_NAME
        ),
        combined AS (
            SELECT NAME, METRIC_VALUE FROM base_count
            UNION ALL
            SELECT NAME, METRIC_VALUE FROM unlinked_count
        )
        SELECT NAME, METRIC_VALUE
        FROM (
            SELECT NAME, METRIC_VALUE
            FROM combined
            ORDER BY METRIC_VALUE DESC, NAME ASC
        )
        WHERE ROWNUM &lt;= 10
    </select>
 
    <select id="selectByTeam" resultMap="teamResultMap">
        WITH fault_agg AS (
            SELECT CASE
                       WHEN TRIM(TEAM_MAJOR) IS NULL OR TRIM(TEAM_MAJOR) = '' THEN '未填写T队专业'
                       ELSE TRIM(TEAM_MAJOR)
                   END AS NAME,
                   COUNT(*) AS FAULT_COUNT
            FROM LX.T_FAULT
            GROUP BY CASE
                         WHEN TRIM(TEAM_MAJOR) IS NULL OR TRIM(TEAM_MAJOR) = '' THEN '未填写T队专业'
                         ELSE TRIM(TEAM_MAJOR)
                     END
        ),
        parts_agg AS (
            SELECT CASE
                       WHEN f.TEAM_MAJOR IS NULL OR TRIM(f.TEAM_MAJOR) = '' THEN '未填写T队专业'
                       ELSE TRIM(f.TEAM_MAJOR)
                   END AS NAME,
                   NVL(SUM(NVL(ci.CONSUMABLE_COUNT, 0)), 0) AS PARTS_COUNT
            FROM LX.T_COMPLETION_INFO ci
            JOIN LX.T_WORK_ORDER w ON w.ID = ci.WORK_ORDER_ID
            LEFT JOIN LX.T_FAULT f ON f.ID = w.FAULT_ID
            GROUP BY CASE
                         WHEN f.TEAM_MAJOR IS NULL OR TRIM(f.TEAM_MAJOR) = '' THEN '未填写T队专业'
                         ELSE TRIM(f.TEAM_MAJOR)
                     END
        ),
        team_keys AS (
            SELECT NAME FROM fault_agg
            UNION
            SELECT NAME FROM parts_agg
        )
        SELECT k.NAME,
               NVL(fa.FAULT_COUNT, 0) AS FAULT_COUNT,
               NVL(pa.PARTS_COUNT, 0) AS PARTS_COUNT
        FROM team_keys k
        LEFT JOIN fault_agg fa ON fa.NAME = k.NAME
        LEFT JOIN parts_agg pa ON pa.NAME = k.NAME
        ORDER BY k.NAME
    </select>
 
    <select id="selectContractors" resultMap="contractorResultMap">
        SELECT CONTRACTOR_NAME AS NAME,
               COUNT(*) AS TOTAL_COUNT,
               NVL(SUM(CASE WHEN COMPLETION_STATUS IS NULL OR COMPLETION_STATUS &lt;&gt; 'COMPLETED' THEN 1 ELSE 0 END), 0) AS UNFINISHED_COUNT,
               NVL(SUM(CASE WHEN COMPLETION_STATUS = 'COMPLETED' THEN 1 ELSE 0 END), 0) AS COMPLETED_COUNT,
               NVL(ROUND(AVG(SCORE), 1), 0) AS AVERAGE_SCORE
        FROM LX.T_WORK_ORDER
        GROUP BY CONTRACTOR_NAME
        ORDER BY TOTAL_COUNT DESC, CONTRACTOR_NAME ASC
    </select>
 
    <select id="selectYearlyTrend" resultMap="trendResultMap">
        WITH fault_agg AS (
            SELECT EXTRACT(YEAR FROM REPORT_DATE) AS REPORT_YEAR,
                   COUNT(*) AS FAULT_COUNT
            FROM LX.T_FAULT
            WHERE REPORT_DATE IS NOT NULL
            GROUP BY EXTRACT(YEAR FROM REPORT_DATE)
        ),
        parts_agg AS (
            SELECT EXTRACT(YEAR FROM f.REPORT_DATE) AS REPORT_YEAR,
                   NVL(SUM(NVL(ci.CONSUMABLE_COUNT, 0)), 0) AS PARTS_COUNT
            FROM LX.T_COMPLETION_INFO ci
            JOIN LX.T_WORK_ORDER w ON w.ID = ci.WORK_ORDER_ID
            JOIN LX.T_FAULT f ON f.ID = w.FAULT_ID
            WHERE f.REPORT_DATE IS NOT NULL
            GROUP BY EXTRACT(YEAR FROM f.REPORT_DATE)
        ),
        report_years AS (
            SELECT REPORT_YEAR FROM fault_agg
            UNION
            SELECT REPORT_YEAR FROM parts_agg
        )
        SELECT CAST(y.REPORT_YEAR AS VARCHAR(4)) || '年' AS YEAR_NAME,
               NVL(fa.FAULT_COUNT, 0) AS FAULT_COUNT,
               NVL(pa.PARTS_COUNT, 0) AS PARTS_COUNT
        FROM report_years y
        LEFT JOIN fault_agg fa ON fa.REPORT_YEAR = y.REPORT_YEAR
        LEFT JOIN parts_agg pa ON pa.REPORT_YEAR = y.REPORT_YEAR
        ORDER BY y.REPORT_YEAR
    </select>
</mapper>