From 33b6ddd0d78f22e34c262cc31e20c5944ab14733 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 15 Jan 2026 18:25:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=97=B6=E5=9B=9E=E9=80=80=E5=B7=B2=E5=AE=8C=E6=88=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=9A=84=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/DeptMonthlyScoreService.java | 29 ++++++++++++ .../com/designhub/service/TaskService.java | 46 ++++++++++++++++++- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/DeptMonthlyScoreService.java b/backend/src/main/java/com/designhub/service/DeptMonthlyScoreService.java index bb9ecb5..c1f8810 100644 --- a/backend/src/main/java/com/designhub/service/DeptMonthlyScoreService.java +++ b/backend/src/main/java/com/designhub/service/DeptMonthlyScoreService.java @@ -102,6 +102,35 @@ public class DeptMonthlyScoreService { deptMonthlyScoreMapper.updateById(record); } + /** + * 扣除部门获得积分(删除已完成任务时调用,用于回退积分) + */ + @Transactional(rollbackFor = Exception.class) + public void deductEarnedScore(Long deptId, BigDecimal score) { + DeptMonthlyScore record = getOrCreateCurrentMonth(deptId); + + // 扣除获得积分(不能小于0) + BigDecimal newEarnedScore = record.getEarnedScore().subtract(score); + if (newEarnedScore.compareTo(BigDecimal.ZERO) < 0) { + newEarnedScore = BigDecimal.ZERO; + } + record.setEarnedScore(newEarnedScore); + + // 减少完成任务数(不能小于0) + int newCompletedCount = record.getCompletedTaskCount() - 1; + if (newCompletedCount < 0) { + newCompletedCount = 0; + } + record.setCompletedTaskCount(newCompletedCount); + + // 重新计算净积分 + record.setNetScore(record.getEarnedScore().subtract(record.getDeductedScore())); + record.setUpdateTime(LocalDateTime.now()); + + deptMonthlyScoreMapper.updateById(record); + log.info("已扣除部门月度积分: deptId={}, score={}, newEarnedScore={}", deptId, score, newEarnedScore); + } + /** * 获取部门当月积分 */ diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 9576843..222529d 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -3356,14 +3356,56 @@ public class TaskService { Long taskId = task.getId(); - // 1. 删除所有子任务 + // 1. 如果任务已完成,需要回退积分 + if ("completed".equals(task.getStatus())) { + // 回退主任务积分 + if (task.getReceiverDeptId() != null && task.getScoreReward() != null + && task.getScoreReward().compareTo(BigDecimal.ZERO) > 0) { + try { + // 从团队积分池扣除已奖励的积分 + teamScorePoolService.deductScore(task.getReceiverDeptId(), task.getScoreReward().intValue()); + log.info("已回退主任务积分: deptId={}, score={}", task.getReceiverDeptId(), task.getScoreReward()); + + // 回退部门月度积分统计 + deptMonthlyScoreService.deductEarnedScore(task.getReceiverDeptId(), task.getScoreReward()); + log.info("已回退部门月度积分: deptId={}, score={}", task.getReceiverDeptId(), task.getScoreReward()); + } catch (Exception e) { + log.warn("回退主任务积分失败: {}", e.getMessage()); + } + } + } + + // 2. 查询所有子任务,回退已完成子任务的积分 + List subTasks = taskItemMapper.selectList( + new LambdaQueryWrapper() + .eq(TaskItem::getTaskId, taskId) + ); + + for (TaskItem item : subTasks) { + if ("completed".equals(item.getStatus()) && item.getReceiverDeptId() != null + && item.getTotalScore() != null && item.getTotalScore().compareTo(BigDecimal.ZERO) > 0) { + try { + // 从团队积分池扣除已奖励的积分 + teamScorePoolService.deductScore(item.getReceiverDeptId(), item.getTotalScore().intValue()); + log.info("已回退子任务积分: itemNo={}, deptId={}, score={}", + item.getItemNo(), item.getReceiverDeptId(), item.getTotalScore()); + + // 回退部门月度积分统计 + deptMonthlyScoreService.deductEarnedScore(item.getReceiverDeptId(), item.getTotalScore()); + } catch (Exception e) { + log.warn("回退子任务积分失败: itemNo={}, error={}", item.getItemNo(), e.getMessage()); + } + } + } + + // 3. 删除所有子任务 int deletedItems = taskItemMapper.delete( new LambdaQueryWrapper() .eq(TaskItem::getTaskId, taskId) ); log.info("已删除 {} 个子任务", deletedItems); - // 2. 删除主任务 + // 4. 删除主任务 taskMapper.deleteById(taskId); log.info("已删除主任务: taskNo={}, taskId={}", taskNo, taskId); }