blob: bd04661f085682ac80759fa9b0f8a3d214cddddd [file] [log] [blame]
223011381c359102025-06-03 15:19:59 +08001package com.example.myproject.service;
2
3import com.example.myproject.entity.Level;
4import com.example.myproject.entity.Task;
5import com.example.myproject.entity.UserTaskStatus;
6import com.example.myproject.repository.LevelRepository;
7import com.example.myproject.repository.TaskRepository;
8import com.example.myproject.repository.UserTaskStatusRepository;
9import org.springframework.beans.factory.annotation.Autowired;
10import org.springframework.stereotype.Service;
11import com.example.myproject.entity.Users;
12import com.example.myproject.repository.UserRepository;
13
14import java.util.*;
15
16@Service
17public 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}