diff --git a/backend/src/main/java/com/designhub/service/AnalyticsService.java b/backend/src/main/java/com/designhub/service/AnalyticsService.java index 9d4ec30..d7c911f 100644 --- a/backend/src/main/java/com/designhub/service/AnalyticsService.java +++ b/backend/src/main/java/com/designhub/service/AnalyticsService.java @@ -637,6 +637,25 @@ public class AnalyticsService { int designerWithData = 0; for (User designer : designers) { + java.util.function.Predicate mainCreatedInRange = t -> + t.getCreateTime() != null + && !t.getCreateTime().isBefore(queryStartTime) + && !t.getCreateTime().isAfter(queryEndTime); + java.util.function.Predicate mainCompletedInRange = t -> + "completed".equals(t.getStatus()) + && t.getActualEndTime() != null + && !t.getActualEndTime().isBefore(queryStartTime) + && !t.getActualEndTime().isAfter(queryEndTime); + java.util.function.Predicate subCreatedInRange = t -> + t.getCreateTime() != null + && !t.getCreateTime().isBefore(queryStartTime) + && !t.getCreateTime().isAfter(queryEndTime); + java.util.function.Predicate subCompletedInRange = t -> + "completed".equals(t.getStatus()) + && t.getCompleteTime() != null + && !t.getCompleteTime().isBefore(queryStartTime) + && !t.getCompleteTime().isAfter(queryEndTime); + // 获取该设计师的主任务 List designerTasks = tasks.stream() .filter(t -> designer.getId().equals(t.getReceiverId())) @@ -660,21 +679,25 @@ public class AnalyticsService { ); // 主任务统计 - int mainReceivedCount = designerTasks.size(); + int mainReceivedCount = (int) designerTasks.stream() + .filter(mainCreatedInRange) + .count(); int mainCompletedCount = (int) designerTasks.stream() - .filter(t -> "completed".equals(t.getStatus())) + .filter(mainCompletedInRange) .count(); int mainInProgressCount = (int) designerTasks.stream() - .filter(t -> "in_progress".equals(t.getStatus())) + .filter(t -> "in_progress".equals(t.getStatus()) && mainCreatedInRange.test(t)) .count(); // 子任务统计 - int subReceivedCount = designerTaskItems.size(); + int subReceivedCount = (int) designerTaskItems.stream() + .filter(subCreatedInRange) + .count(); int subCompletedCount = (int) designerTaskItems.stream() - .filter(t -> "completed".equals(t.getStatus())) + .filter(subCompletedInRange) .count(); int subInProgressCount = (int) designerTaskItems.stream() - .filter(t -> "in_progress".equals(t.getStatus())) + .filter(t -> "in_progress".equals(t.getStatus()) && subCreatedInRange.test(t)) .count(); // 合计(主任务 + 子任务) @@ -690,7 +713,7 @@ public class AnalyticsService { // 主任务准时率计算 for (Task task : designerTasks) { - if ("completed".equals(task.getStatus()) && task.getActualEndTime() != null) { + if (mainCompletedInRange.test(task)) { LocalDateTime start = task.getActualStartTime() != null ? task.getActualStartTime() : task.getStartTime(); if (start != null) { long hours = Duration.between(start, task.getActualEndTime()).toHours(); @@ -713,7 +736,7 @@ public class AnalyticsService { // 子任务准时率计算 for (TaskItem item : designerTaskItems) { - if ("completed".equals(item.getStatus()) && item.getCompleteTime() != null) { + if (subCompletedInRange.test(item)) { // 判断是否准时 if (item.getDeadline() != null) { if (!item.getCompleteTime().isAfter(item.getDeadline())) { @@ -737,7 +760,7 @@ public class AnalyticsService { double satisfactionRate = 0; try { List completedTaskIds = designerTasks.stream() - .filter(t -> "completed".equals(t.getStatus())) + .filter(mainCompletedInRange) .map(Task::getId) .collect(Collectors.toList()); @@ -1203,8 +1226,9 @@ public class AnalyticsService { List completedTasks = taskMapper.selectList( new LambdaQueryWrapper() .eq(Task::getStatus, "completed") - .ge(Task::getCreateTime, startTime) - .le(Task::getCreateTime, endTime) + .isNotNull(Task::getActualEndTime) + .ge(Task::getActualEndTime, startTime) + .le(Task::getActualEndTime, endTime) ); // 计算各环节平均耗时 @@ -2776,8 +2800,9 @@ public class AnalyticsService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Task::getIsPrimaryTask, 1) .eq(Task::getStatus, "completed") - .ge(Task::getCreateTime, startTime) - .le(Task::getCreateTime, endTime) + .isNotNull(Task::getCompleteTime) + .ge(Task::getCompleteTime, startTime) + .le(Task::getCompleteTime, endTime) .eq(Task::getDeleted, 0); List completedTasks = taskMapper.selectList(queryWrapper);