修改人天计算方法,避免笛卡尔积问题导致人天错误

This commit is contained in:
2025-04-01 17:22:34 +08:00
parent dbc2515bf0
commit d43f063f6f
2 changed files with 80 additions and 39 deletions

View File

@@ -97,28 +97,58 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectVoListAndTime" resultType="com.ruoyi.oa.domain.vo.SysOaAttendanceVo">
SELECT ANY_VALUE(id),
user_id,
ANY_VALUE(attendance_day),
project_id,
ANY_VALUE(day_length),
ANY_VALUE(hour),
ANY_VALUE(create_time),
ANY_VALUE(create_by),
ANY_VALUE(update_time),
ANY_VALUE(update_by),
ANY_VALUE(remark),
ANY_VALUE(del_flag),
count(id) AS count,
SUM(day_length) + CEILING(SUM(hour) / 9) AS work_times,
(SUM(day_length) + CEILING(SUM(hour) / 9)) * 9 AS hour_work_times,
FLOOR(SUM(hour) / 9) AS overTime
SELECT
ANY_VALUE(id) AS id,
user_id,
ANY_VALUE(attendance_day) AS attendance_day,
project_id,
ANY_VALUE(day_length) AS day_length,
ANY_VALUE(hour) AS hour,
ANY_VALUE(create_time) AS create_time,
ANY_VALUE(create_by) AS create_by,
ANY_VALUE(update_time) AS update_time,
ANY_VALUE(update_by) AS update_by,
ANY_VALUE(remark) AS remark,
ANY_VALUE(del_flag) AS del_flag,
COUNT(id) AS count,
/*
1如果这条记录是按天统计 (day_length>0),就直接用 day_length。
2如果这条记录是按小时统计 (hour>0),那么就算作 1 天。
这样就不会把多日的小时相加再去整除 9。
*/
SUM(
CASE
WHEN day_length > 0 THEN day_length
WHEN hour > 0 THEN 1
ELSE 0
END
) AS work_times,
SUM(
CASE
WHEN day_length > 0 THEN day_length
WHEN hour > 0 THEN 1
ELSE 0
END
) *9 AS hour_work_times,
/*
overTime如果是按小时统计且 hour>9才有加班 = (hour - 9)。
如果是 day_length 统计,则一般不会再去算小时加班(你如果有需要,也可以自己按其它规则)。
*/
SUM(
CASE
WHEN hour > 9 THEN hour - 9
ELSE 0
END
) AS overTime
FROM sys_oa_attendance soa
WHERE user_id = #{userId}
AND #{lastDay} > create_time
AND create_time > #{firstDay}
AND del_flag = '0'
GROUP BY soa.project_id
GROUP BY soa.project_id;
</select>