fix: align monthly completed metrics to completion time

This commit is contained in:
Your Name 2026-02-22 18:34:24 +08:00
parent 65d77a80fe
commit e7554c746d

View File

@ -637,6 +637,25 @@ public class AnalyticsService {
int designerWithData = 0;
for (User designer : designers) {
java.util.function.Predicate<Task> mainCreatedInRange = t ->
t.getCreateTime() != null
&& !t.getCreateTime().isBefore(queryStartTime)
&& !t.getCreateTime().isAfter(queryEndTime);
java.util.function.Predicate<Task> mainCompletedInRange = t ->
"completed".equals(t.getStatus())
&& t.getActualEndTime() != null
&& !t.getActualEndTime().isBefore(queryStartTime)
&& !t.getActualEndTime().isAfter(queryEndTime);
java.util.function.Predicate<TaskItem> subCreatedInRange = t ->
t.getCreateTime() != null
&& !t.getCreateTime().isBefore(queryStartTime)
&& !t.getCreateTime().isAfter(queryEndTime);
java.util.function.Predicate<TaskItem> subCompletedInRange = t ->
"completed".equals(t.getStatus())
&& t.getCompleteTime() != null
&& !t.getCompleteTime().isBefore(queryStartTime)
&& !t.getCompleteTime().isAfter(queryEndTime);
// 获取该设计师的主任务
List<Task> 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<Long> 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<Task> completedTasks = taskMapper.selectList(
new LambdaQueryWrapper<Task>()
.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<Task> 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<Task> completedTasks = taskMapper.selectList(queryWrapper);