22301138 | 1c35910 | 2025-06-03 15:19:59 +0800 | [diff] [blame^] | 1 | package com.example.myproject.service; |
| 2 | |
| 3 | import com.example.myproject.entity.Level; |
| 4 | import com.example.myproject.entity.Task; |
| 5 | import com.example.myproject.entity.UserTaskStatus; |
| 6 | import com.example.myproject.repository.LevelRepository; |
| 7 | import com.example.myproject.repository.TaskRepository; |
| 8 | import com.example.myproject.repository.UserTaskStatusRepository; |
| 9 | import org.springframework.beans.factory.annotation.Autowired; |
| 10 | import org.springframework.stereotype.Service; |
| 11 | import com.example.myproject.entity.Users; |
| 12 | import com.example.myproject.repository.UserRepository; |
| 13 | |
| 14 | import java.util.*; |
| 15 | |
| 16 | @Service |
| 17 | public class TaskService { |
| 18 | |
| 19 | @Autowired |
| 20 | private TaskRepository taskRepository; |
| 21 | |
| 22 | @Autowired |
| 23 | private UserTaskStatusRepository userTaskStatusRepository; |
| 24 | |
| 25 | @Autowired |
| 26 | private UserRepository userRepository; |
| 27 | |
| 28 | @Autowired |
| 29 | private LevelRepository levelRepository; |
| 30 | |
| 31 | public Map<String, Object> getAllTasksForUser(Long userId) { |
| 32 | // 获取所有任务 |
| 33 | List<Task> tasks = taskRepository.findAll(); |
| 34 | List<Map<String, Object>> taskList = new ArrayList<>(); |
| 35 | |
| 36 | for (Task task : tasks) { |
| 37 | Optional<UserTaskStatus> userTaskStatus = userTaskStatusRepository |
| 38 | .findByUserIdAndTaskId(userId, task.getTaskId()); |
| 39 | |
| 40 | Map<String, Object> taskData = new LinkedHashMap<>(); |
| 41 | taskData.put("task_id", task.getTaskId()); |
| 42 | taskData.put("title", task.getTitle()); |
| 43 | taskData.put("description", task.getDescription()); |
| 44 | taskData.put("status", userTaskStatus.isPresent() ? userTaskStatus.get().getStatus() : "pending"); |
| 45 | taskData.put("progress", userTaskStatus.isPresent() ? userTaskStatus.get().getCurrentProgress() : 0); |
| 46 | |
| 47 | // 奖励 |
| 48 | Map<String, Integer> reward = new LinkedHashMap<>(); |
| 49 | reward.put("experience", task.getRewardExperience()); |
| 50 | reward.put("points", task.getRewardPoints()); |
| 51 | taskData.put("reward", reward); |
| 52 | |
| 53 | taskList.add(taskData); |
| 54 | } |
| 55 | |
| 56 | Map<String, Object> response = new LinkedHashMap<>(); |
| 57 | response.put("tasks", taskList); |
| 58 | return response; |
| 59 | } |
| 60 | |
| 61 | public Map<String, Object> updateTaskStatus(Long userId, String taskId) { |
| 62 | // 获取用户任务状态 |
| 63 | Optional<UserTaskStatus> userTaskStatusOpt = userTaskStatusRepository.findByUserIdAndTaskId(userId, taskId); |
| 64 | UserTaskStatus userTaskStatus = userTaskStatusOpt.get(); |
| 65 | |
| 66 | // 检查任务进度 |
| 67 | if (userTaskStatus.getCurrentProgress() == 100f) { |
| 68 | Optional<Task> taskOpt = taskRepository.findById(taskId); |
| 69 | Task task = taskOpt.get(); |
| 70 | |
| 71 | // 更新任务状态为已完成 |
| 72 | userTaskStatus.setStatus("completed"); |
| 73 | userTaskStatus.setCurrentExperience(task.getRewardExperience()); |
| 74 | userTaskStatus.setCurrentPoints(task.getRewardPoints()); |
| 75 | |
| 76 | userTaskStatusRepository.save(userTaskStatus); |
| 77 | |
| 78 | // 构建返回数据 |
| 79 | Map<String, Object> response = new HashMap<>(); |
| 80 | response.put("status", "success"); |
| 81 | response.put("message", "任务状态已更新"); |
| 82 | |
| 83 | Map<String, Integer> currentReward = new HashMap<>(); |
| 84 | currentReward.put("current_experience", task.getRewardExperience()); |
| 85 | currentReward.put("current_points", task.getRewardPoints()); |
| 86 | response.put("current_reward", currentReward); |
| 87 | |
| 88 | return response; |
| 89 | } else { |
| 90 | Map<String, Object> errorResponse = new HashMap<>(); |
| 91 | errorResponse.put("status", "failure"); |
| 92 | errorResponse.put("message", "任务未完成,无法更新状态"); |
| 93 | return errorResponse; |
| 94 | } |
| 95 | } |
| 96 | |
| 97 | public Map<String, Object> getUserExperience(Long userId) { |
| 98 | // 获取用户信息 |
| 99 | Optional<Users> userOpt = userRepository.findById(userId); |
| 100 | if (!userOpt.isPresent()) { |
| 101 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 102 | errorResponse.put("status", "failure"); |
| 103 | errorResponse.put("message", "用户不存在"); |
| 104 | return errorResponse; |
| 105 | } |
| 106 | |
| 107 | Users user = userOpt.get(); |
| 108 | Integer currentExperience = user.getCurrentExperience(); |
| 109 | Optional<Level> levelOpt = levelRepository.findById(user.getLevel()); |
| 110 | String levelName = levelOpt.isPresent() ? levelOpt.get().getLevelName() : "未知等级"; |
| 111 | |
| 112 | List<UserTaskStatus> completedTasks = userTaskStatusRepository.findByUserIdAndStatus(userId, "completed"); |
| 113 | |
| 114 | int totalExperience = 0; |
| 115 | int totalPoints = 0; |
| 116 | for (UserTaskStatus taskStatus : completedTasks) { |
| 117 | Optional<Task> taskOpt = taskRepository.findById(taskStatus.getTaskId()); |
| 118 | if (taskOpt.isPresent()) { |
| 119 | Task task = taskOpt.get(); |
| 120 | totalExperience += task.getRewardExperience(); |
| 121 | totalPoints += task.getRewardPoints(); |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | // 构建返回数据 |
| 126 | Map<String, Object> response = new LinkedHashMap<>(); |
| 127 | response.put("user_id", userId); |
| 128 | response.put("current_experience", currentExperience); |
| 129 | response.put("level", levelName); |
| 130 | response.put("tasks_completed", completedTasks.size()); |
| 131 | |
| 132 | Map<String, Integer> reward = new LinkedHashMap<>(); |
| 133 | reward.put("experience", totalExperience); |
| 134 | reward.put("points", totalPoints); |
| 135 | |
| 136 | response.put("reward", reward); |
| 137 | |
| 138 | return response; |
| 139 | } |
| 140 | |
| 141 | public Map<String, Object> getNewStep(Long userId) { |
| 142 | // 获取用户的第一个未完成任务 |
| 143 | Optional<UserTaskStatus> userTaskStatusOpt = userTaskStatusRepository.findFirstByUserIdAndStatus(userId, "pending"); |
| 144 | |
| 145 | if (!userTaskStatusOpt.isPresent()) { |
| 146 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 147 | errorResponse.put("status", "failure"); |
| 148 | errorResponse.put("message", "用户当前没有未完成的任务"); |
| 149 | return errorResponse; |
| 150 | } |
| 151 | |
| 152 | UserTaskStatus userTaskStatus = userTaskStatusOpt.get(); |
| 153 | String taskId = userTaskStatus.getTaskId(); |
| 154 | |
| 155 | // 获取该任务的描述 |
| 156 | Optional<Task> taskOpt = taskRepository.findById(taskId); |
| 157 | if (!taskOpt.isPresent()) { |
| 158 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 159 | errorResponse.put("status", "failure"); |
| 160 | errorResponse.put("message", "任务不存在"); |
| 161 | return errorResponse; |
| 162 | } |
| 163 | |
| 164 | Task task = taskOpt.get(); |
| 165 | |
| 166 | // 获取总任务数 |
| 167 | long totalTasks = taskRepository.count(); |
| 168 | |
| 169 | // 构建返回数据 |
| 170 | Map<String, Object> response = new LinkedHashMap<>(); |
| 171 | response.put("current_step", taskId); |
| 172 | response.put("total_steps", totalTasks); |
| 173 | response.put("step_description", task.getDescription()); |
| 174 | |
| 175 | return response; |
| 176 | } |
| 177 | |
| 178 | public Map<String, Object> updateTaskProgress(Long userId, String taskId, Integer progress) { |
| 179 | Optional<UserTaskStatus> userTaskStatusOpt = userTaskStatusRepository.findByUserIdAndTaskId(userId, taskId); |
| 180 | |
| 181 | if (!userTaskStatusOpt.isPresent()) { |
| 182 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 183 | errorResponse.put("status", "failure"); |
| 184 | errorResponse.put("message", "任务不存在或该任务不属于用户"); |
| 185 | return errorResponse; |
| 186 | } |
| 187 | |
| 188 | UserTaskStatus userTaskStatus = userTaskStatusOpt.get(); |
| 189 | userTaskStatus.setCurrentProgress(Float.valueOf(progress)); |
| 190 | userTaskStatusRepository.save(userTaskStatus); |
| 191 | Map<String, Object> response = new LinkedHashMap<>(); |
| 192 | response.put("status", "success"); |
| 193 | response.put("message", "进度已更新"); |
| 194 | |
| 195 | return response; |
| 196 | } |
| 197 | |
| 198 | public Map<String, Object> claimReward(Long userId, String taskId) { |
| 199 | // 获取用户任务状态 |
| 200 | Optional<UserTaskStatus> userTaskStatusOpt = userTaskStatusRepository.findByUserIdAndTaskId(userId, taskId); |
| 201 | |
| 202 | if (!userTaskStatusOpt.isPresent()) { |
| 203 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 204 | errorResponse.put("status", "failure"); |
| 205 | errorResponse.put("message", "任务状态不存在"); |
| 206 | return errorResponse; |
| 207 | } |
| 208 | |
| 209 | UserTaskStatus userTaskStatus = userTaskStatusOpt.get(); |
| 210 | |
| 211 | if (userTaskStatus.getCurrentProgress() == 100f) { |
| 212 | if (userTaskStatus.getIsRewardClaimed()) { |
| 213 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 214 | errorResponse.put("status", "failure"); |
| 215 | errorResponse.put("message", "奖励已经领取过了"); |
| 216 | return errorResponse; |
| 217 | } |
| 218 | |
| 219 | Optional<Task> taskOpt = taskRepository.findById(taskId); |
| 220 | if (!taskOpt.isPresent()) { |
| 221 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 222 | errorResponse.put("status", "failure"); |
| 223 | errorResponse.put("message", "任务不存在"); |
| 224 | return errorResponse; |
| 225 | } |
| 226 | |
| 227 | Task task = taskOpt.get(); |
| 228 | |
| 229 | userTaskStatus.setIsRewardClaimed(true); |
| 230 | userTaskStatus.setCurrentExperience(task.getRewardExperience()); |
| 231 | userTaskStatus.setCurrentPoints(task.getRewardPoints()); |
| 232 | |
| 233 | userTaskStatusRepository.save(userTaskStatus); |
| 234 | |
| 235 | Optional<Users> userOpt = userRepository.findById(userId); |
| 236 | if (!userOpt.isPresent()) { |
| 237 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 238 | errorResponse.put("status", "failure"); |
| 239 | errorResponse.put("message", "用户不存在"); |
| 240 | return errorResponse; |
| 241 | } |
| 242 | |
| 243 | Users user = userOpt.get(); |
| 244 | |
| 245 | // 将任务奖励加到用户的积分和经验 |
| 246 | user.setUserPoints(user.getUserPoints() + task.getRewardPoints()); |
| 247 | user.setCurrentExperience(user.getCurrentExperience() + task.getRewardExperience()); |
| 248 | |
| 249 | userRepository.save(user); |
| 250 | |
| 251 | Map<String, Object> response = new LinkedHashMap<>(); |
| 252 | response.put("status", "success"); |
| 253 | response.put("message", "奖励已领取"); |
| 254 | |
| 255 | Map<String, Integer> reward = new LinkedHashMap<>(); |
| 256 | reward.put("experience", task.getRewardExperience()); |
| 257 | reward.put("points", task.getRewardPoints()); |
| 258 | response.put("reward", reward); |
| 259 | |
| 260 | return response; |
| 261 | } else { |
| 262 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 263 | errorResponse.put("status", "failure"); |
| 264 | errorResponse.put("message", "任务未完成,无法领取奖励"); |
| 265 | return errorResponse; |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | public Map<String, Object> checkRewardStatus(Long userId, String taskId) { |
| 270 | // 获取用户任务状态 |
| 271 | Optional<UserTaskStatus> userTaskStatusOpt = userTaskStatusRepository.findByUserIdAndTaskId(userId, taskId); |
| 272 | |
| 273 | if (!userTaskStatusOpt.isPresent()) { |
| 274 | Map<String, Object> errorResponse = new LinkedHashMap<>(); |
| 275 | errorResponse.put("status", "failure"); |
| 276 | errorResponse.put("message", "任务状态不存在"); |
| 277 | return errorResponse; |
| 278 | } |
| 279 | |
| 280 | UserTaskStatus userTaskStatus = userTaskStatusOpt.get(); |
| 281 | |
| 282 | // 检查奖励是否已领取 |
| 283 | if (userTaskStatus.getIsRewardClaimed()) { |
| 284 | Map<String, Object> response = new LinkedHashMap<>(); |
| 285 | response.put("status", "reward_issued"); |
| 286 | response.put("message", "任务奖励已被领取"); |
| 287 | return response; |
| 288 | } |
| 289 | |
| 290 | Map<String, Object> response = new LinkedHashMap<>(); |
| 291 | response.put("status", "reward_not_issued"); |
| 292 | response.put("message", "任务奖励未被领取"); |
| 293 | return response; |
| 294 | } |
| 295 | } |