refactor(oa/erp): 项目工时统计报表剔除预投项目,加上预投工时分配中实际项目工时。

- 重构项目工时报表数据查询逻辑
- 新增项目工时报表数据查询SQL片段,整合汇总和预分配数据
- 重构项目工时统计报表查询逻辑,统一数据源处理方式
dev
yangk 4 weeks ago
parent db3bbfe849
commit 2b453ee5bf

@ -62,7 +62,6 @@ public class ErpTimesheetPreAllocController extends BaseController {
/**
*
*
*/
@SaCheckPermission("oa/erp:timesheetPreAlloc:export")
@Log(title = "预投工时分配明细", businessType = BusinessType.EXPORT)

@ -165,7 +165,7 @@ public class ErpTimesheetPreAllocServiceImpl implements IErpTimesheetPreAllocSer
return JoinWrappers.lambda(ErpTimesheetPreAlloc.class)
.selectAll(ErpTimesheetPreAlloc.class)
.eq(ErpTimesheetPreAlloc::getDelFlag, DEL_FLAG_NORMAL)
.eq(deptId != null, ErpTimesheetPreAlloc::getCreateDept, deptId)
// .eq(deptId != null, ErpTimesheetPreAlloc::getCreateDept, deptId)
.eq(StringUtils.isNotBlank(bo.getAllocCode()), ErpTimesheetPreAlloc::getAllocCode, bo.getAllocCode())
.eq(StringUtils.isNotBlank(bo.getMonthCode()), ErpTimesheetPreAlloc::getMonthCode, bo.getMonthCode())
.eq(bo.getProjectId() != null, ErpTimesheetPreAlloc::getProjectId, bo.getProjectId())

@ -4,6 +4,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.oa.erp.mapper.ErpTimesheetReportMapper">
<sql id="projectManHourReportData">
SELECT
d.adjusted_project_id AS project_id,
s.dept_id AS dept_id,
d.adjusted_hours AS hours
FROM erp_timesheet_summary_detail d
JOIN erp_timesheet_summary s ON d.summary_id = s.summary_id AND s.del_flag = '0'
JOIN erp_project_info adjusted_project ON d.adjusted_project_id = adjusted_project.project_id AND adjusted_project.del_flag = '0'
LEFT JOIN erp_project_info original_project ON d.original_project_id = original_project.project_id
WHERE d.del_flag = '0'
AND d.is_project = '1'
AND adjusted_project.project_category &lt;&gt; '9'
AND (
d.original_project_id IS NULL
OR original_project.project_category IS NULL
OR original_project.project_category &lt;&gt; '4'
)
<if test="startTime != null and startTime != ''">
AND s.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND s.month_code &lt;= #{endTime}
</if>
UNION ALL
SELECT
ad.target_project_id AS project_id,
target_project.dept_id AS dept_id,
ad.alloc_hours AS hours
FROM erp_timesheet_pre_alloc a
JOIN erp_timesheet_pre_alloc_detail ad ON a.alloc_id = ad.alloc_id AND ad.del_flag = '0'
JOIN erp_project_info target_project ON ad.target_project_id = target_project.project_id AND target_project.del_flag = '0'
WHERE a.del_flag = '0'
AND ad.alloc_hours &gt; 0
AND target_project.project_category IN ('1', '2')
<if test="startTime != null and startTime != ''">
AND a.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND a.month_code &lt;= #{endTime}
</if>
</sql>
<select id="selectProjectManHourList" resultType="org.dromara.oa.erp.domain.vo.ProjectManHourReportVo">
SELECT
t_dept.dept_name,
@ -12,38 +54,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
p.project_name,
p.project_code,
p.project_category,
COALESCE(SUM(d.adjusted_hours), 0) AS total_hours,
<!-- 获取该项目在全公司的总工时(用于判断是否存在跨部门) -->
COALESCE(SUM(report_data.hours), 0) AS total_hours,
COALESCE(global_stats.total_hours, 0) AS cross_dept_hours
FROM
erp_timesheet_summary_detail d
JOIN erp_timesheet_summary s ON d.summary_id = s.summary_id AND s.del_flag = '0'
<!-- 关联项目信息表获取项目经理、类别等 -->
JOIN erp_project_info p ON d.adjusted_project_id = p.project_id AND p.del_flag = '0'
(
<include refid="projectManHourReportData"/>
) report_data
JOIN erp_project_info p ON report_data.project_id = p.project_id AND p.del_flag = '0'
LEFT JOIN sys_user u ON p.manager_id = u.user_id
<!-- 关联汇总所属部门 -->
LEFT JOIN sys_dept t_dept ON s.dept_id = t_dept.dept_id
<!-- 关联全局统计 (独立子查询,不受主查询部门条件影响) -->
LEFT JOIN sys_dept t_dept ON report_data.dept_id = t_dept.dept_id
LEFT JOIN (
SELECT
d2.adjusted_project_id AS project_id,
SUM(d2.adjusted_hours) AS total_hours
FROM erp_timesheet_summary_detail d2
JOIN erp_timesheet_summary s2 ON d2.summary_id = s2.summary_id AND s2.del_flag = '0'
WHERE d2.del_flag = '0'
AND d2.is_project = '1'
<if test="startTime != null and startTime != ''">
AND s2.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND s2.month_code &lt;= #{endTime}
</if>
GROUP BY d2.adjusted_project_id
all_report_data.project_id,
SUM(all_report_data.hours) AS total_hours
FROM
(
<include refid="projectManHourReportData"/>
) all_report_data
GROUP BY all_report_data.project_id
) global_stats ON p.project_id = global_stats.project_id
<where>
d.del_flag = '0'
AND d.is_project = '1'
AND p.project_category &lt;&gt; '9'
p.project_category &lt;&gt; '9'
<if test="bo.projectName != null and bo.projectName != ''">
AND p.project_name LIKE concat('%', #{bo.projectName}, '%')
</if>
@ -56,19 +87,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="bo.deptName != null and bo.deptName != ''">
AND t_dept.dept_name LIKE concat('%', #{bo.deptName}, '%')
</if>
<!-- 月份范围筛选 -->
<if test="startTime != null and startTime != ''">
AND s.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND s.month_code &lt;= #{endTime}
</if>
</where>
<!-- 按调整后的项目ID 和 汇总所属部门 分组 -->
GROUP BY d.adjusted_project_id, s.dept_id, global_stats.total_hours
<!-- 仅显示有工时的记录 -->
HAVING SUM(d.adjusted_hours) > 0
ORDER BY p.project_code, t_dept.dept_id
GROUP BY
report_data.project_id,
report_data.dept_id,
t_dept.dept_name,
u.nick_name,
p.project_id,
p.project_name,
p.project_code,
p.project_category,
global_stats.total_hours
HAVING SUM(report_data.hours) &gt; 0
ORDER BY p.project_code, report_data.dept_id
</select>
<!-- 查询项目-人员工时分布 (基于月汇总调整后数据) -->

Loading…
Cancel
Save