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

172 lines
6.6 KiB
XML
Raw Normal View History

<?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>