ah_jjzhgd_service/securitycontrol-model/securitycontrol-screen/src/main/resources/mapper/OverallEfficiencyAnalysisMa...

172 lines
6.6 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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.securitycontrol.screen.mapper.OverallEfficiencyAnalysisMapper">
<select id="selectOverallEfficiencyData" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
select weather,count(id) as 'day'
from sj_efficiency_analysis
where create_time between #{startTime} and #{endTime}
GROUP BY weather
</select>
<select id="getPlanDay" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
SELECT
SUM(
DATEDIFF(LEAST(plan_end_time, #{endTime}), GREATEST(plan_start_time, #{startTime})) + 1
) AS planDay,
SUM(
CASE
WHEN start_time IS NOT NULL AND end_time IS NOT NULL THEN
GREATEST(
0,
DATEDIFF(
LEAST(end_time, #{endTime}),
GREATEST(start_time, #{startTime})
) + 1
)
ELSE 0
END
) AS effectiveDay
FROM
sj_construction_progress
WHERE
( #{endTime} >= plan_start_time AND plan_end_time >= #{startTime})
OR
(start_time IS NOT NULL AND end_time IS NOT NULL AND #{endTime} >= start_time AND end_time >= #{startTime});
</select>
<select id="getSjProjectQuality" resultType="com.securitycontrol.entity.background.vo.SjProjectQualityVo">
SELECT
-- 总验收项合计(需排除空值,避免计算错误)
SUM(CASE WHEN total_item != '' THEN CAST(total_item AS UNSIGNED) ELSE 0 END) AS totalItem,
-- 已验收项合计(同样处理空值)
SUM(CASE WHEN accept_item != '' THEN CAST(accept_item AS UNSIGNED) ELSE 0 END) AS acceptItem,
-- 整体验收率保留2位小数避免除数为0
CASE
WHEN SUM(CASE WHEN total_item != '' THEN CAST(total_item AS UNSIGNED) ELSE 0 END) = 0 THEN 0
ELSE ROUND(
SUM(CASE WHEN accept_item != '' THEN CAST(accept_item AS UNSIGNED) ELSE 0 END)
/ SUM(CASE WHEN total_item != '' THEN CAST(total_item AS UNSIGNED) ELSE 0 END)
* 100,
2
)
END AS acceptRate,
-- 主设备试验调试一次通过总数
SUM(CASE WHEN main_one_accept_num != '' THEN CAST(main_one_accept_num AS UNSIGNED) ELSE 0 END) AS mainOneAcceptNum,
-- 主设备试验调试通过总数
SUM(CASE WHEN main_accept_num != '' THEN CAST(main_accept_num AS UNSIGNED) ELSE 0 END) AS mainAcceptNum,
-- 主设备试验调试一次通过率保留2位小数避免除数为0
CASE
WHEN SUM(CASE WHEN main_accept_num != '' THEN CAST(main_accept_num AS UNSIGNED) ELSE 0 END) = 0 THEN 0
ELSE ROUND(
SUM(CASE WHEN main_one_accept_num != '' THEN CAST(main_one_accept_num AS UNSIGNED) ELSE 0 END)
/ SUM(CASE WHEN main_accept_num != '' THEN CAST(main_accept_num AS UNSIGNED) ELSE 0 END)
* 100,
2
)
END AS mainAcceptRate
FROM
sj_project_quality;
</select>
<select id="getSjProjectSafety" resultType="com.securitycontrol.screen.domain.SjProjectSafety">
select name,count(id) as num
from sj_video_safety
where create_time between #{startTime} and #{endTime}
GROUP BY name
</select>
<select id="getProgress" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
SELECT
-- 计划进度:查询区间内的计划工作天数占总天数的百分比
ROUND(
SUM(
GREATEST(
0,
DATEDIFF(
LEAST(plan_end_time, #{startTime}),
GREATEST(plan_start_time, #{startTime})
) + 1
)
) / sum(NULLIF(DATEDIFF(plan_end_time, plan_start_time) + 1, 0)) * 100,
2
) AS planProgress,
-- 实际进度:查询区间内的实际工作天数占总天数的百分比
ROUND(
SUM(
CASE
-- 已完成工序:取实际时间与查询区间的交集天数
WHEN start_time IS NOT NULL AND end_time IS NOT NULL THEN
GREATEST(
0,
DATEDIFF(
LEAST(end_time, #{startTime}),
GREATEST(start_time, #{startTime})
) + 1
)
-- 进行中工序:从实际开始到查询结束的天数
WHEN start_time IS NOT NULL AND end_time IS NULL AND #{startTime} >=start_time THEN
GREATEST(
0,
DATEDIFF(#{startTime}, GREATEST(start_time, #{startTime})) + 1
)
-- 未开始或不相关工序计为0
ELSE 0
END
) / sum(NULLIF(DATEDIFF(end_time, start_time) + 1, 0)) * 100,
2
) AS currentProgress,
-- 进度偏差:实际进度 - 计划进度(正数表示超前,负数表示滞后)
ROUND(
(
SUM(
CASE
WHEN start_time IS NOT NULL AND end_time IS NOT NULL THEN
GREATEST(
0,
DATEDIFF(
LEAST(end_time, #{startTime}),
GREATEST(start_time, #{startTime})
) + 1
)
WHEN start_time IS NOT NULL AND end_time IS NULL AND #{startTime} >= start_time THEN
GREATEST(
0,
DATEDIFF(#{startTime}, GREATEST(start_time, #{startTime})) + 1
)
ELSE 0
END
) / sum(NULLIF(DATEDIFF(end_time, start_time) + 1, 0)) * 100
) -
(
SUM(
GREATEST(
0,
DATEDIFF(
LEAST(plan_end_time, #{startTime}),
GREATEST(plan_start_time, #{startTime})
) + 1
)
) / sum(NULLIF(DATEDIFF(plan_end_time, plan_start_time) + 1, 0)) * 100
),
2
) AS deviationPercent
FROM
sj_construction_progress
WHERE
-- 筛选与查询时间段相关的记录
( #{startTime} >=plan_start_time AND plan_end_time >= #{startTime}) -- 计划时间在区间内
OR
(start_time IS NOT NULL AND #{startTime} >=start_time) -- 实际已开始且在区间内
</select>
<select id="getCost" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
select sum(COALESCE(data_money, 0)) as dataMoney
from sj_project_manage where data_type= #{dataType}
and date_time between #{startTime} and #{endTime}
</select>
</mapper>