diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetReportController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetReportController.java index a7f88759..bcb402fd 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetReportController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetReportController.java @@ -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> dataList = new ArrayList<>(); + BigDecimal rowTotalSum = BigDecimal.ZERO; + Map userTotals = new HashMap<>(); + for (String key : userKeys) { + userTotals.put(key, BigDecimal.ZERO); + } + if (rows != null) { for (Map row : rows) { List 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 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"); diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetReportMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetReportMapper.xml index 0264bab6..1f93ca27 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetReportMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpTimesheetReportMapper.xml @@ -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' - AND ti2.start_time >= #{startTime} + AND s2.month_code >= #{startTime} - AND ti2.end_time <= #{endTime} + AND s2.month_code <= #{endTime} - GROUP BY tp2.project_id + GROUP BY d2.adjusted_project_id ) global_stats ON p.project_id = global_stats.project_id - p.del_flag = '0' + d.del_flag = '0' + AND d.is_project = '1' AND p.project_category <> '9' AND p.project_name LIKE concat('%', #{bo.projectName}, '%') @@ -58,87 +56,84 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND t_dept.dept_name LIKE concat('%', #{bo.deptName}, '%') - - + - AND ti.start_time >= #{startTime} + AND s.month_code >= #{startTime} - AND ti.end_time <= #{endTime} + AND s.month_code <= #{endTime} - - AND ti.timesheet_status = '3' - - GROUP BY p.project_id, ti.dept_id, global_stats.total_hours + + 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 - + - +