172 lines
6.6 KiB
XML
172 lines
6.6 KiB
XML
<?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>
|