这个死财务提的莫名其妙的需求

This commit is contained in:
2025-06-12 17:43:56 +08:00
parent cc6bba96f6
commit e8adc2b14d
13 changed files with 317 additions and 60 deletions

View File

@@ -7,31 +7,31 @@
<resultMap id="OaAttendanceRecordResult"
type="com.ruoyi.oa.domain.vo.OaAttendanceRecordVo">
<!-- ① 主键 -->
<id property="recordId" column="record_id"/>
<id property="recordId" column="record_id"/>
<!-- ② 其他主字段 -->
<result property="userId" column="user_id"/>
<result property="userId" column="user_id"/>
<result property="relationMonth" column="relation_month"/>
<result property="calcTime" column="calc_time"/>
<result property="nickName" column="nick_name"/>
<result property="trips" column="trips"/>
<result property="notNum" column="not_num"/>
<result property="works" column="works"/>
<result property="projectIds" column="project_ids"/>
<result property="overNum" column="over_num"/>
<result property="laborCost" column="labor_cost"/>
<result property="remark" column="remark"/>
<result property="calcTime" column="calc_time"/>
<result property="nickName" column="nick_name"/>
<result property="trips" column="trips"/>
<result property="notNum" column="not_num"/>
<result property="works" column="works"/>
<result property="projectIds" column="project_ids"/>
<result property="overNum" column="over_num"/>
<result property="laborCost" column="labor_cost"/>
<result property="remark" column="remark"/>
<!-- ③ ▶︎ 项目维度汇总列表 -->
<collection property="projectList"
ofType="com.ruoyi.oa.domain.vo.ProjectAttendanceSummaryVo"
javaType="list">
<result property="projectId" column="project_id"/>
<result property="projectName" column="project_name"/>
<result property="color" column="color"/>
<result property="workTimes" column="work_times"/>
<result property="hourWorkTimes" column="hour_work_times"/>
<result property="overTime" column="over_time"/>
<result property="tripDays" column="trip_days"/>
<result property="projectId" column="project_id"/>
<result property="projectName" column="project_name"/>
<result property="color" column="color"/>
<result property="workTimes" column="work_times"/>
<result property="hourWorkTimes" column="hour_work_times"/>
<result property="overTime" column="over_time"/>
<result property="tripDays" column="trip_days"/>
</collection>
</resultMap>
@@ -45,7 +45,7 @@
r.relation_month,
r.calc_time,
r.nick_name,
u.labor_cost,
u.labor_cost,
r.trips,
r.not_num,
r.works,
@@ -72,7 +72,7 @@
LEFT JOIN (SELECT user_id,
project_id,
DATE_FORMAT(create_time, '%Y-%m') AS relation_month,
DATE_FORMAT(create_time, '%Y-%m') AS relation_month,
COUNT(CASE WHEN project_id != 0 and project_id != 1 THEN 1 END) AS work_times,
@@ -95,7 +95,7 @@
GROUP BY user_id, project_id, relation_month) m
ON m.user_id = r.user_id
AND m.project_id = p.project_id
AND m.relation_month =DATE_FORMAT( r.relation_month , '%Y-%m')
AND m.relation_month = DATE_FORMAT(r.relation_month, '%Y-%m')
WHERE r.del_flag = 0
AND r.record_id = #{recordId}
@@ -117,9 +117,78 @@
and DAY(calc_time) = DAY(#{date})
and YEAR(relation_month) = YEAR(#{firstDay})
and MONTH(relation_month) = month(#{firstDay})
and del_flag = 0
and del_flag = 0
</select>
<!-- 查询每个用户的出勤记录,包括合并好的 project_ids -->
<select id="getAttendance" resultType="com.ruoyi.oa.domain.ProjectAttendance">
SELECT
oar.user_id,
oar.nick_name,
oar.relation_month,
oar.project_ids
FROM
oa_attendance_record oar
WHERE
oar.user_id IN
<foreach item="userId" collection="userIds" open="(" separator="," close=")">
#{userId}
</foreach>
AND oar.del_flag = '0'
AND YEAR(oar.relation_month) = YEAR(#{relationMonth})
AND MONTH(oar.relation_month) = MONTH(#{relationMonth})
</select>
<!-- 根据 project_id 获取项目名称 -->
<select id="getProjectById" resultType="com.ruoyi.oa.domain.vo.SysOaProjectVo">
SELECT project_name
FROM sys_oa_project
WHERE project_id = #{projectId}
</select>
<!-- 根据 userId 和 project_id 获取出勤天数 -->
<select id="getWorkDays" resultType="java.lang.Long">
SELECT COALESCE(SUM(CASE
WHEN (oas.day_length > 0 OR oas.hour > 0)
AND (oas.project_id != 1 OR oas.project_id = 0)
THEN 1
ELSE 0 END), 0) AS work_days
FROM sys_oa_attendance oas
WHERE oas.user_id = #{userId}
AND FIND_IN_SET(oas.project_id, #{projectIds}) > 0
AND oas.del_flag = '0'
AND oas.create_time BETWEEN
DATE_FORMAT(#{relationMonth}, '%Y-%m-01')
AND IF(#{calcTime} IS NOT NULL, #{calcTime}, NOW())
</select>
<select id="selectProjectIds" resultType="java.lang.String">
SELECT
oar.project_ids
FROM
oa_attendance_record oar
WHERE
oar.user_id IN
<foreach item="userId" collection="userIds" open="(" separator="," close=")">
#{userId}
</foreach>
AND oar.del_flag = '0'
AND YEAR(oar.relation_month) = YEAR(#{relationMonth})
AND MONTH(oar.relation_month) = MONTH(#{relationMonth})
AND (
-- 如果 calcTime 不为空,查询 calcTime 对应的记录
(#{calcTime} IS NOT NULL AND oar.calc_time = #{calcTime})
OR
-- 如果 calcTime 为空,查询该用户在该月的最新 calc_time
(#{calcTime} IS NULL AND oar.calc_time =
(SELECT MAX(oar2.calc_time)
FROM oa_attendance_record oar2
WHERE oar2.user_id = oar.user_id
AND YEAR(oar2.calc_time) = YEAR(#{relationMonth})
AND MONTH(oar2.calc_time) = MONTH(#{relationMonth}))
)
)
</select>
</mapper>

View File

@@ -305,6 +305,27 @@
GROUP BY m.month
ORDER BY m.month DESC; -- 本月在前,上月在后
</select>
<select id="getWorkDaysByUserIdAndProjectId" resultType="java.lang.Long">
SELECT
COALESCE(SUM(CASE
WHEN (day_length > 0 OR hour > 0)
OR project_id = 0
THEN 1 ELSE 0 END), 0) AS work_days
FROM sys_oa_attendance oas
WHERE oas.user_id = #{userId}
AND oas.project_id = #{projectId}
AND oas.del_flag = 0
AND (
<!-- 如果 calcTime 不为空,查询 calcTime 对应的出勤记录 -->
(#{calcTime} IS NOT NULL AND #{calcTime} >= oas.create_time)
<!-- 如果 calcTime 为空,查询整个 relationMonth -->
OR (#{calcTime} IS NULL AND oas.create_time BETWEEN
-- 提取relationMonth的年月部分并构造第一天
DATE_FORMAT(#{relationMonth}, '%Y-%m-01')
AND LAST_DAY(STR_TO_DATE(#{relationMonth}, '%Y-%m-%d'))
)
)
</select>
</mapper>