bug:逾期后结束不被统计,已经被修复

This commit is contained in:
2026-02-28 19:58:05 +08:00
parent 7ca8a3521f
commit 4fcbc78655

View File

@@ -60,8 +60,36 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService {
vo.setResponsibleProjects(responsibleProjects);
// 3.1) 延期项目(筛选出延期的项目)
// 规则:
// 1显式标记延期isPostpone > 0
// 2时间上发生逾期
// - 如果存在 postponeTime则 finishTime > postponeTime 视为逾期完成
// - 否则,如果存在 originalFinishTime则 finishTime > originalFinishTime 视为逾期完成
// - 对于仍未完成的项目,如果当前时间 > (postponeTime 或 originalFinishTime),也视为逾期中
Date now = new Date();
List<SysOaProjectVo> postponedProjects = responsibleProjects.stream()
.filter(p -> p.getIsPostpone() != null && p.getIsPostpone() > 0)
.filter(p -> {
// 条件 1显式延期标记
if (p.getIsPostpone() != null && p.getIsPostpone() > 0) {
return true;
}
Date finishTime = p.getFinishTime();
Date postponeTime = p.getPostponeTime();
Date originalFinishTime = p.getOriginalFinishTime();
// 计算“应完成时间”
Date dueTime = postponeTime != null ? postponeTime : originalFinishTime;
if (dueTime == null) {
return false;
}
// 条件 2已完成但完成时间晚于应完成时间
if (finishTime != null && finishTime.after(dueTime)) {
return true;
}
// 条件 3未完成当前时间已经晚于应完成时间
return finishTime == null && now.after(dueTime);
})
.collect(Collectors.toList());
vo.setPostponedProjects(postponedProjects);
@@ -74,21 +102,26 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService {
.collect(Collectors.toList());
vo.setMyScheduleStepDetails(mySteps);
// 4.1) 延期进度步骤(未完成 && planEnd < 当前时间)
// 注意mySteps 已经是在查询时间范围内的步骤,所以不需要再限制 planEnd 的范围
// 4.1) 延期进度步骤
// 规则:
// 1有计划结束时间 planEnd
// 2若已完成actualEnd 不为空),则 actualEnd > planEnd 视为“逾期完成”
// 3若未完成actualEnd 为空),则当前时间 now > planEnd 视为“正在逾期”
// 说明mySteps 已经限定在本次查询时间范围内
Date now = new Date();
List<OaProjectScheduleStepVo> delayedSteps = mySteps.stream()
.filter(s -> {
// 未完成status != 1
if (s.getStatus() == null || s.getStatus() == 1) {
Date planEnd = s.getPlanEnd();
if (planEnd == null) {
return false;
}
// 有预计结束时间
if (s.getPlanEnd() == null) {
return false;
Date actualEnd = s.getActualEnd();
// 已完成:完成时间晚于计划结束时间
if (actualEnd != null) {
return actualEnd.after(planEnd);
}
// 预计结束时间已过期(当前时间已超过计划结束时间
return s.getPlanEnd().before(now) || s.getPlanEnd().equals(now);
// 未完成:当前时间已晚于计划结束时间
return now.after(planEnd);
})
.collect(Collectors.toList());
vo.setDelayedScheduleStepDetails(delayedSteps);
@@ -105,20 +138,25 @@ public class PerformanceReportServiceImpl implements IPerformanceReportService {
List<SysOaTaskVo> taskDetails = sysOaTaskMapper.selectPerformanceTaskList(userId, startDate, endDate);
vo.setTaskDetails(taskDetails);
// 6.1) 延期任务(未完成 && finishTime < 当前时间)
// 注意taskDetails 已经是在查询时间范围内的任务,所以不需要再限制 finishTime 的范围
// 6.1) 延期任务
// 规则:
// 1有预计结束时间 finishTime
// 2若已完成completedTime 不为空),则 completedTime > finishTime 视为“逾期完成”
// 3若未完成completedTime 为空),则当前时间 now > finishTime 视为“正在逾期”
// 说明taskDetails 已经限定在本次查询时间范围内
List<SysOaTaskVo> delayedTasks = taskDetails.stream()
.filter(t -> {
// 未完成completedTime == null
if (t.getCompletedTime() != null) {
Date finishTime = t.getFinishTime();
if (finishTime == null) {
return false;
}
// 有预计结束时间
if (t.getFinishTime() == null) {
return false;
Date completedTime = t.getCompletedTime();
// 已完成:完成时间晚于预计结束时间
if (completedTime != null) {
return completedTime.after(finishTime);
}
// 预计结束时间已过期(当前时间已超过预计结束时间
return t.getFinishTime().before(now) || t.getFinishTime().equals(now);
// 未完成:当前时间已晚于预计结束时间
return now.after(finishTime);
})
.collect(Collectors.toList());
vo.setDelayedTaskDetails(delayedTasks);