Merge remote-tracking branch 'origin/dev' into dev

dev
yinq 2 months ago
commit 8787d44366

@ -117,9 +117,12 @@ public class ErpTimesheetReportController {
heads.add(Collections.singletonList("项目编号"));
heads.add(Collections.singletonList("项目类别"));
String totalHoursTitle = "当月工时";
String totalHoursTitle = "工时";
if (startTime != null && !startTime.isEmpty() && endTime != null && !endTime.isEmpty()) {
totalHoursTitle = totalHoursTitle + " (" + startTime + " 至 " + endTime + ")";
// startTime/endTime 现在是 monthCode 格式(如 202604
String fmtStart = startTime.substring(0, 4) + "年" + startTime.substring(4) + "月";
String fmtEnd = endTime.substring(0, 4) + "年" + endTime.substring(4) + "月";
totalHoursTitle = totalHoursTitle + " (" + fmtStart + " 至 " + fmtEnd + ")";
}
heads.add(Collections.singletonList(totalHoursTitle));
@ -174,23 +177,51 @@ public class ErpTimesheetReportController {
// 2. 构建数据行
List<List<Object>> dataList = new ArrayList<>();
BigDecimal rowTotalSum = BigDecimal.ZERO;
Map<String, BigDecimal> userTotals = new HashMap<>();
for (String key : userKeys) {
userTotals.put(key, BigDecimal.ZERO);
}
if (rows != null) {
for (Map<String, Object> row : rows) {
List<Object> dataRow = new ArrayList<>();
dataRow.add(row.get("deptName"));
dataRow.add(row.get("projectName"));
dataRow.add(row.get("projectCode"));
dataRow.add(row.get("rowTotal")); // 对应“汇总”列
// 人员列数据
// 汇总列处理与累加
Object rowTotalObj = row.get("rowTotal");
BigDecimal rowTotalVal = rowTotalObj instanceof Number ? new BigDecimal(rowTotalObj.toString()) : BigDecimal.ZERO;
dataRow.add(rowTotalObj);
rowTotalSum = rowTotalSum.add(rowTotalVal);
// 人员列数据处理与累加
for (String key : userKeys) {
Object hours = row.get(key);
dataRow.add(hours != null ? hours : "");
Object hoursObj = row.get(key);
BigDecimal hoursVal = hoursObj instanceof Number ? new BigDecimal(hoursObj.toString()) : BigDecimal.ZERO;
dataRow.add(hoursObj != null ? hoursObj : "");
userTotals.put(key, userTotals.get(key).add(hoursVal));
}
dataRow.add(row.get("remark"));
dataList.add(dataRow);
}
// 3. 添加“总计”行
List<Object> totalRowData = new ArrayList<>();
totalRowData.add("总计");
totalRowData.add("");
totalRowData.add("");
totalRowData.add(rowTotalSum.compareTo(BigDecimal.ZERO) == 0 ? "" : rowTotalSum);
// 人员列合计
for (String key : userKeys) {
BigDecimal userSum = userTotals.get(key);
totalRowData.add(userSum.compareTo(BigDecimal.ZERO) == 0 ? "" : userSum);
}
totalRowData.add("");
dataList.add(totalRowData);
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

@ -12,39 +12,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
p.project_name,
p.project_code,
p.project_category,
COALESCE(SUM(tp.hours), 0) AS total_hours,
COALESCE(SUM(d.adjusted_hours), 0) AS total_hours,
<!-- 获取该项目在全公司的总工时(用于判断是否存在跨部门) -->
COALESCE(global_stats.total_hours, 0) AS cross_dept_hours
FROM
erp_project_info p
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'
LEFT JOIN sys_user u ON p.manager_id = u.user_id
<!-- 关联工时明细 -->
LEFT JOIN erp_timesheet_project tp ON p.project_id = tp.project_id AND tp.del_flag = '0'
<!-- 关联工时主表以获取日期和人员(从而获取填报部门) -->
LEFT JOIN erp_timesheet_info ti ON tp.timesheet_id = ti.timesheet_id AND ti.del_flag = '0'
<!-- 关联填报部门 -->
LEFT JOIN sys_dept t_dept ON ti.dept_id = t_dept.dept_id
<!-- 关联项目所属部门,用于部门筛选 -->
LEFT JOIN sys_dept p_dept ON p.dept_id = p_dept.dept_id
<!-- 关联汇总所属部门 -->
LEFT JOIN sys_dept t_dept ON s.dept_id = t_dept.dept_id
<!-- 关联全局统计 (独立子查询,不受主查询部门条件影响) -->
LEFT JOIN (
SELECT
tp2.project_id,
SUM(tp2.hours) AS total_hours
FROM erp_timesheet_project tp2
JOIN erp_timesheet_info ti2 ON tp2.timesheet_id = ti2.timesheet_id AND ti2.del_flag = '0'
WHERE tp2.del_flag = '0'
AND ti2.timesheet_status = '3'
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 ti2.start_time >= #{startTime}
AND s2.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND ti2.end_time &lt;= #{endTime}
AND s2.month_code &lt;= #{endTime}
</if>
GROUP BY tp2.project_id
GROUP BY d2.adjusted_project_id
) global_stats ON p.project_id = global_stats.project_id
<where>
p.del_flag = '0'
d.del_flag = '0'
AND d.is_project = '1'
AND p.project_category &lt;&gt; '9'
<if test="bo.projectName != null and bo.projectName != ''">
AND p.project_name LIKE concat('%', #{bo.projectName}, '%')
@ -58,87 +56,84 @@ 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 ti.start_time >= #{startTime}
AND s.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND ti.end_time &lt;= #{endTime}
AND s.month_code &lt;= #{endTime}
</if>
<!-- 仅统计已审批的工时 (3=已审批) -->
AND ti.timesheet_status = '3'
</where>
<!--项目ID 和 填报部门ID 分组 -->
GROUP BY p.project_id, ti.dept_id, global_stats.total_hours
<!-- 按调整后的项目ID 和 汇总所属部门 分组 -->
GROUP BY d.adjusted_project_id, s.dept_id, global_stats.total_hours
<!-- 仅显示有工时的记录 -->
HAVING SUM(tp.hours) > 0
HAVING SUM(d.adjusted_hours) > 0
ORDER BY p.project_code, t_dept.dept_id
</select>
<!-- 查询项目-人员工时分布 -->
<!-- 查询项目-人员工时分布 (基于月汇总调整后数据) -->
<select id="selectProjectPersonnelHours" resultType="java.util.Map">
SELECT
p.project_id AS projectId,
p.dept_id AS projectDeptId,
p.project_name AS projectName,
p.project_code AS projectCode,
u.user_id AS userId,
d.staff_user_id AS userId,
u.nick_name AS nickName,
COALESCE(SUM(tp.hours), 0) AS hours
FROM erp_timesheet_project tp
JOIN erp_timesheet_info ti ON tp.timesheet_id = ti.timesheet_id AND ti.del_flag = '0'
JOIN erp_project_info p ON tp.project_id = p.project_id AND p.del_flag = '0'
JOIN sys_user u ON ti.user_id = u.user_id AND u.del_flag = '0'
WHERE ti.timesheet_status = '3'
AND tp.del_flag = '0'
COALESCE(SUM(d.adjusted_hours), 0) 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 p ON d.adjusted_project_id = p.project_id AND p.del_flag = '0'
JOIN sys_user u ON d.staff_user_id = u.user_id AND u.del_flag = '0'
WHERE d.del_flag = '0'
AND d.is_project = '1'
AND p.project_category &lt;&gt; '9'
<if test="deptId != null">
AND ti.dept_id = #{deptId}
AND s.dept_id = #{deptId}
</if>
<if test="startTime != null and startTime != ''">
AND ti.start_time >= #{startTime}
AND s.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND ti.end_time &lt;= #{endTime}
AND s.month_code &lt;= #{endTime}
</if>
GROUP BY p.project_id, u.user_id
GROUP BY d.adjusted_project_id, d.staff_user_id
</select>
<!-- 查询项目在全公司的总工时(用于跨部门判断) -->
<!-- 查询项目在全公司的总工时(用于跨部门判断, 基于月汇总调整后数据) -->
<select id="selectProjectTotalHours" resultType="java.util.Map">
SELECT
tp.project_id AS projectId,
COALESCE(SUM(tp.hours), 0) AS totalHours
FROM erp_timesheet_project tp
JOIN erp_timesheet_info ti ON tp.timesheet_id = ti.timesheet_id AND ti.del_flag = '0'
JOIN erp_project_info p ON tp.project_id = p.project_id AND p.del_flag = '0'
WHERE ti.timesheet_status = '3'
AND tp.del_flag = '0'
d.adjusted_project_id AS projectId,
COALESCE(SUM(d.adjusted_hours), 0) AS totalHours
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'
WHERE d.del_flag = '0'
AND d.is_project = '1'
AND p.project_category &lt;&gt; '9'
<if test="startTime != null and startTime != ''">
AND ti.start_time >= #{startTime}
AND s.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND ti.end_time &lt;= #{endTime}
AND s.month_code &lt;= #{endTime}
</if>
<!-- 仅统计涉及到的项目 -->
AND tp.project_id IN
<!-- 仅统计涉及到的项目(当前部门参与的项目) -->
AND d.adjusted_project_id IN
(
SELECT DISTINCT tpp.project_id
FROM erp_timesheet_project tpp
JOIN erp_timesheet_info tii ON tpp.timesheet_id = tii.timesheet_id
WHERE tpp.del_flag = '0'
AND tii.dept_id = #{deptId}
AND tii.timesheet_status = '3'
SELECT DISTINCT d3.adjusted_project_id
FROM erp_timesheet_summary_detail d3
JOIN erp_timesheet_summary s3 ON d3.summary_id = s3.summary_id AND s3.del_flag = '0'
WHERE d3.del_flag = '0'
AND d3.is_project = '1'
AND s3.dept_id = #{deptId}
<if test="startTime != null and startTime != ''">
AND tii.start_time >= #{startTime}
AND s3.month_code &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND tii.end_time &lt;= #{endTime}
AND s3.month_code &lt;= #{endTime}
</if>
)
GROUP BY tp.project_id
GROUP BY d.adjusted_project_id
</select>
<!-- 查询部门的所有人员 -->

Loading…
Cancel
Save