diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceReportVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceReportVo.java index c14e5a8..bad9d1e 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceReportVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceReportVo.java @@ -32,17 +32,26 @@ public class MonthlyPerformanceReportVo { /** 明细:负责人项目(sys_oa_project.functionary) */ private List responsibleProjects; + /** 明细:延期项目(从 responsibleProjects 中筛选出延期的) */ + private List postponedProjects; + /** 明细:项目进度步骤(oa_project_schedule_step) */ private List scheduleStepDetails; /** 明细:本人负责的进度步骤(node_header=本人) */ private List myScheduleStepDetails; + /** 明细:延期进度步骤(从 myScheduleStepDetails 中筛选出延期的) */ + private List delayedScheduleStepDetails; + /** 明细:报工(oa_project_report) */ private List projectReportDetails; /** 明细:任务(sys_oa_task,含 task_item 子项) */ private List taskDetails; + + /** 明细:延期任务(从 taskDetails 中筛选出延期的) */ + private List delayedTaskDetails; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceSummaryVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceSummaryVo.java index 2d2f88a..99daeb5 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceSummaryVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/performance/MonthlyPerformanceSummaryVo.java @@ -18,10 +18,13 @@ public class MonthlyPerformanceSummaryVo { /** 项目 */ private Long responsibleProjectCount; + private Long postponedProjectCount; // 延期项目数量 + private Long totalPostponeCount; // 总延期次数 /** 进度步骤(当前人作为步骤负责人 node_header) */ private Long myScheduleStepCount; private Long myScheduleStepCompletedCount; + private Long delayedScheduleStepCount; // 延期进度步骤数量 /** 报工 */ private Long projectReportCount; @@ -30,6 +33,7 @@ public class MonthlyPerformanceSummaryVo { private Long taskCount; private Long taskCompletedCount; private Long taskItemCount; + private Long delayedTaskCount; // 延期任务数量 } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/PerformanceReportServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/PerformanceReportServiceImpl.java index b1e8bab..30ee134 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/PerformanceReportServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/PerformanceReportServiceImpl.java @@ -59,6 +59,12 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService { List responsibleProjects = performanceReportMapper.selectResponsibleProjects(vo.getNickName()); vo.setResponsibleProjects(responsibleProjects); + // 3.1) 延期项目(筛选出延期的项目) + List postponedProjects = responsibleProjects.stream() + .filter(p -> p.getIsPostpone() != null && p.getIsPostpone() > 0) + .collect(Collectors.toList()); + vo.setPostponedProjects(postponedProjects); + // 4) 项目进度步骤(按负责项目汇总出所有步骤;另给出本人负责步骤) List scheduleSteps = buildScheduleStepsByProjects(responsibleProjects, startDate, endDate); vo.setScheduleStepDetails(scheduleSteps); @@ -68,6 +74,25 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService { .collect(Collectors.toList()); vo.setMyScheduleStepDetails(mySteps); + // 4.1) 延期进度步骤(未完成 && planEnd < 当前时间) + // 注意:mySteps 已经是在查询时间范围内的步骤,所以不需要再限制 planEnd 的范围 + Date now = new Date(); + List delayedSteps = mySteps.stream() + .filter(s -> { + // 未完成:status != 1 + if (s.getStatus() == null || s.getStatus() == 1) { + return false; + } + // 有预计结束时间 + if (s.getPlanEnd() == null) { + return false; + } + // 预计结束时间已过期(当前时间已超过计划结束时间) + return s.getPlanEnd().before(now) || s.getPlanEnd().equals(now); + }) + .collect(Collectors.toList()); + vo.setDelayedScheduleStepDetails(delayedSteps); + // 5) 报工明细(oa_project_report) OaProjectReportBo reportBo = new OaProjectReportBo(); reportBo.setUserId(userId); @@ -80,8 +105,26 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService { List taskDetails = sysOaTaskMapper.selectPerformanceTaskList(userId, startDate, endDate); vo.setTaskDetails(taskDetails); + // 6.1) 延期任务(未完成 && finishTime < 当前时间) + // 注意:taskDetails 已经是在查询时间范围内的任务,所以不需要再限制 finishTime 的范围 + List delayedTasks = taskDetails.stream() + .filter(t -> { + // 未完成:completedTime == null + if (t.getCompletedTime() != null) { + return false; + } + // 有预计结束时间 + if (t.getFinishTime() == null) { + return false; + } + // 预计结束时间已过期(当前时间已超过预计结束时间) + return t.getFinishTime().before(now) || t.getFinishTime().equals(now); + }) + .collect(Collectors.toList()); + vo.setDelayedTaskDetails(delayedTasks); + // 7) 汇总 - vo.setSummary(buildSummary(attendanceDetails, leaveDetails, responsibleProjects, mySteps, projectReports, taskDetails)); + vo.setSummary(buildSummary(attendanceDetails, leaveDetails, responsibleProjects, mySteps, delayedSteps, projectReports, taskDetails, delayedTasks)); return vo; } @@ -192,8 +235,10 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService { List leaveDetails, List responsibleProjects, List mySteps, + List delayedSteps, List projectReports, - List tasks) { + List tasks, + List delayedTasks) { MonthlyPerformanceSummaryVo s = new MonthlyPerformanceSummaryVo(); // 考勤 @@ -227,6 +272,22 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService { // 项目 s.setResponsibleProjectCount(responsibleProjects == null ? 0L : (long) responsibleProjects.size()); + + // 延期项目统计 + long postponedCount = 0; + long totalPostponeCount = 0; + if (responsibleProjects != null) { + for (SysOaProjectVo p : responsibleProjects) { + if (p.getIsPostpone() != null && p.getIsPostpone() > 0) { + postponedCount++; + if (p.getPostponeCount() != null) { + totalPostponeCount += p.getPostponeCount(); + } + } + } + } + s.setPostponedProjectCount(postponedCount); + s.setTotalPostponeCount(totalPostponeCount); // 进度步骤(本人负责) s.setMyScheduleStepCount(mySteps == null ? 0L : (long) mySteps.size()); @@ -239,6 +300,8 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService { } } s.setMyScheduleStepCompletedCount(myCompleted); + // 延期进度步骤统计 + s.setDelayedScheduleStepCount(delayedSteps == null ? 0L : (long) delayedSteps.size()); // 报工 s.setProjectReportCount(projectReports == null ? 0L : (long) projectReports.size()); @@ -259,6 +322,8 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService { } s.setTaskCompletedCount(taskCompleted); s.setTaskItemCount(taskItemCount); + // 延期任务统计 + s.setDelayedTaskCount(delayedTasks == null ? 0L : (long) delayedTasks.size()); return s; } } diff --git a/ruoyi-oa/src/main/resources/mapper/oa/PerformanceReportMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/PerformanceReportMapper.xml index abfc0fb..c543002 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/PerformanceReportMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/PerformanceReportMapper.xml @@ -41,6 +41,7 @@ functionary AS functionary, begin_time AS beginTime, finish_time AS finishTime, + original_finish_time AS originalFinishTime, introduction AS introduction, project_grade AS projectGrade, project_status AS projectStatus, @@ -52,10 +53,13 @@ create_by AS createBy, create_time AS createTime, update_by AS updateBy, - update_time AS updateTime + update_time AS updateTime, + is_postpone AS isPostpone, + postpone_reason AS postponeReason, + postpone_time AS postponeTime, + postpone_count AS postponeCount FROM sys_oa_project - WHERE del_flag = 0 - AND functionary IS NOT NULL + WHERE functionary IS NOT NULL AND functionary LIKE CONCAT('%', #{nickName}, '%') ORDER BY update_time DESC, create_time DESC