From 47f028513f4d7a41ec3cf429e65872e652adff2e Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 2 Feb 2026 14:14:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AD=90=E4=BB=BB=E5=8A=A1=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=97=B6=E7=AB=8B=E5=8D=B3=E5=8F=91=E6=94=BE=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E5=88=B0=E6=8E=A5=E5=8D=95=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:子任务完成后用户反馈没有结算积分 原因:submitCompletion方法中积分发放代码被注释掉了 修复: - TaskItemService注入DeptMonthlyScoreService - 子任务完成时调用addEarnedScore发放积分 - 同时判断是否延误并记录 --- .../designhub/service/TaskItemService.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index b438ea3..0e24942 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -49,6 +49,10 @@ public class TaskItemService { // 排队解锁服务(延迟注入避免循环依赖) @org.springframework.beans.factory.annotation.Autowired private TaskUnlockService taskUnlockService; + + // 部门月度积分服务(用于子任务完成时发放积分) + @org.springframework.beans.factory.annotation.Autowired + private DeptMonthlyScoreService deptMonthlyScoreService; /** * 获取可接单的子任务列表 @@ -795,8 +799,34 @@ public class TaskItemService { log.info("子任务 {} 已完成", itemId); - // 5. 设计师立即获得积分(如果需要,可以调用积分服务) - // scoreService.addScore(userId, item.getTotalScore()); + // 5. 🔥 子任务完成时立即发放积分到接单部门 + if (item.getReceiverDeptId() != null && item.getTotalScore() != null + && item.getTotalScore().compareTo(java.math.BigDecimal.ZERO) > 0) { + try { + // 计算是否延误 + boolean isDelayed = false; + java.math.BigDecimal delayHours = java.math.BigDecimal.ZERO; + if (item.getDeadline() != null && item.getCompleteTime() != null + && item.getCompleteTime().isAfter(item.getDeadline())) { + isDelayed = true; + long delayMinutes = java.time.Duration.between(item.getDeadline(), item.getCompleteTime()).toMinutes(); + delayHours = java.math.BigDecimal.valueOf(delayMinutes).divide(java.math.BigDecimal.valueOf(60), 2, java.math.RoundingMode.HALF_UP); + } + + // 发放积分到部门月度统计 + deptMonthlyScoreService.addEarnedScore( + item.getReceiverDeptId(), + item.getTotalScore(), + isDelayed, + delayHours + ); + + log.info("🎉 子任务 {} 积分已发放: deptId={}, score={}, isDelayed={}, delayHours={}", + item.getItemNo(), item.getReceiverDeptId(), item.getTotalScore(), isDelayed, delayHours); + } catch (Exception e) { + log.error("子任务积分发放失败: itemId={}, error={}", itemId, e.getMessage(), e); + } + } Map result = new HashMap<>(); result.put("completedItem", item);