From 665369bb1707d303774777a2db4c849084af0f98 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 14 Jan 2026 10:19:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=A3=E5=88=86=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98=EF=BC=9A=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C=E4=B9=9F=E8=AE=A1=E7=AE=97=E5=AD=90=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=BB=B6=E8=AF=AF=E6=89=A3=E5=88=86=EF=BC=9B=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E5=AE=BD=E5=BA=A6=E5=B9=B6=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E6=9D=A1=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designhub/service/AnalyticsService.java | 96 +++++++++++++++++++ frontend/src/views/Analytics.vue | 24 ++++- 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/designhub/service/AnalyticsService.java b/backend/src/main/java/com/designhub/service/AnalyticsService.java index 7a1aea1..6236d18 100644 --- a/backend/src/main/java/com/designhub/service/AnalyticsService.java +++ b/backend/src/main/java/com/designhub/service/AnalyticsService.java @@ -728,6 +728,102 @@ public class AnalyticsService { } } + // 计算子任务的延误扣分(与getDesignerDeductionDetails保持一致) + try { + // 查询已完成的子任务(按完成时间查询) + List completedTaskItems = taskItemMapper.selectList( + new LambdaQueryWrapper() + .eq(TaskItem::getReceiverId, designer.getId()) + .eq(TaskItem::getStatus, "completed") + .isNotNull(TaskItem::getCompleteTime) + .ge(TaskItem::getCompleteTime, startTime) + .le(TaskItem::getCompleteTime, endTime) + ); + + // 查询进行中的子任务 + List inProgressTaskItems = taskItemMapper.selectList( + new LambdaQueryWrapper() + .eq(TaskItem::getReceiverId, designer.getId()) + .eq(TaskItem::getStatus, "in_progress") + .isNotNull(TaskItem::getEstimatedHours) + .isNotNull(TaskItem::getCreateTime) + ); + + // 处理已完成的子任务的延误扣分 + for (TaskItem item : completedTaskItems) { + if (item.getEstimatedHours() != null && item.getEstimatedHours().compareTo(BigDecimal.ZERO) > 0 + && item.getCreateTime() != null && item.getCompleteTime() != null) { + + // 计算子任务的预期deadline:createTime + estimatedHours + long estimatedMinutes = item.getEstimatedHours().multiply(BigDecimal.valueOf(60)).longValue(); + LocalDateTime expectedDeadline = item.getCreateTime().plusMinutes(estimatedMinutes); + + // 如果完成时间超过预期deadline,计算延误扣分 + if (item.getCompleteTime().isAfter(expectedDeadline)) { + BigDecimal itemScore = item.getTotalScore() != null ? BigDecimal.valueOf(item.getTotalScore()) : BigDecimal.ZERO; + + if (itemScore.compareTo(BigDecimal.ZERO) > 0) { + // 计算延误小时数 + long overdueHours = Duration.between(expectedDeadline, item.getCompleteTime()).toHours(); + + if (overdueHours > 0) { + // 计算扣分 + BigDecimal itemDeduction = itemScore + .multiply(BigDecimal.valueOf(overdueHours)) + .multiply(deductionRate) + .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + + // 扣分不能超过任务积分 + if (itemDeduction.compareTo(itemScore) > 0) { + itemDeduction = itemScore; + } + + deductionScore = deductionScore.add(itemDeduction); + } + } + } + } + } + + // 处理进行中的子任务的延误扣分 + for (TaskItem item : inProgressTaskItems) { + if (item.getEstimatedHours() != null && item.getEstimatedHours().compareTo(BigDecimal.ZERO) > 0 + && item.getCreateTime() != null) { + + // 计算子任务的预期deadline:createTime + estimatedHours + long estimatedMinutes = item.getEstimatedHours().multiply(BigDecimal.valueOf(60)).longValue(); + LocalDateTime expectedDeadline = item.getCreateTime().plusMinutes(estimatedMinutes); + + // 如果当前时间超过预期deadline,计算延误扣分 + if (now.isAfter(expectedDeadline)) { + BigDecimal itemScore = item.getTotalScore() != null ? BigDecimal.valueOf(item.getTotalScore()) : BigDecimal.ZERO; + + if (itemScore.compareTo(BigDecimal.ZERO) > 0) { + // 计算延误小时数(当前时间 - 预期deadline) + long overdueHours = Duration.between(expectedDeadline, now).toHours(); + + if (overdueHours > 0) { + // 计算扣分 + BigDecimal itemDeduction = itemScore + .multiply(BigDecimal.valueOf(overdueHours)) + .multiply(deductionRate) + .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + + // 扣分不能超过任务积分 + if (itemDeduction.compareTo(itemScore) > 0) { + itemDeduction = itemScore; + } + + deductionScore = deductionScore.add(itemDeduction); + } + } + } + } + } + } catch (Exception e) { + log.warn("计算子任务延误扣分失败: {}", e.getMessage()); + } + // 添加进度未更新扣分 try { if (progressDeductionLogMapper != null) { diff --git a/frontend/src/views/Analytics.vue b/frontend/src/views/Analytics.vue index 7344bc2..0783391 100644 --- a/frontend/src/views/Analytics.vue +++ b/frontend/src/views/Analytics.vue @@ -435,7 +435,7 @@ { border-left: none !important; border-right: none !important; } + + // 修复滚动条样式 - 确保滚动条正常显示 + .ant-table-body { + &::-webkit-scrollbar { + width: 8px !important; + height: 8px !important; + } + + &::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.05) !important; + border-radius: 4px !important; + } + + &::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.2) !important; + border-radius: 4px !important; + + &:hover { + background: rgba(255, 255, 255, 0.3) !important; + } + } + } } .deduction-detail-content {