<?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 <> '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)) || ',') > 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 <= (
|
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 <= 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 <= 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 <> '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>
|