AdminController.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. package com.zxyj.controller.admin;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.zxyj.common.Result;
  5. import com.zxyj.entity.*;
  6. import com.zxyj.mapper.*;
  7. import com.zxyj.service.UserService;
  8. import javax.annotation.Resource;
  9. import org.springframework.web.bind.annotation.*;
  10. import java.util.Date;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. @RestController
  14. @RequestMapping("/api/admin")
  15. public class AdminController {
  16. @Resource
  17. private UserMapper userMapper;
  18. @Resource
  19. private ChildMapper childMapper;
  20. @Resource
  21. private TaskMapper taskMapper;
  22. @Resource
  23. private RewardMapper rewardMapper;
  24. @Resource
  25. private PointsLogMapper pointsLogMapper;
  26. @Resource
  27. private FamilyMapper familyMapper;
  28. @Resource
  29. private TaskTemplateMapper taskTemplateMapper;
  30. @Resource
  31. private UserService userService;
  32. // 用户管理
  33. @PostMapping("/users")
  34. public Result<Page<User>> getUsers(@RequestBody Map<String, Object> params) {
  35. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  36. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  37. Page<User> pageParam = new Page<>(page, size);
  38. Page<User> result = userMapper.selectPage(pageParam, null);
  39. return Result.success(result);
  40. }
  41. @PostMapping("/users/{id}")
  42. public Result<User> getUser(@PathVariable Long id) {
  43. return Result.success(userMapper.selectById(id));
  44. }
  45. @PutMapping("/users/{id}")
  46. public Result<Boolean> updateUser(@PathVariable Long id, @RequestBody User user) {
  47. user.setId(id);
  48. userMapper.updateById(user);
  49. return Result.success(true);
  50. }
  51. @DeleteMapping("/users/{id}")
  52. public Result<Boolean> deleteUser(@PathVariable Long id) {
  53. userMapper.deleteById(id);
  54. return Result.success(true);
  55. }
  56. // 孩子管理
  57. @PostMapping("/children")
  58. public Result<Page<Child>> getChildren(@RequestBody Map<String, Object> params) {
  59. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  60. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  61. Page<Child> pageParam = new Page<>(page, size);
  62. Page<Child> result = childMapper.selectPage(pageParam, null);
  63. return Result.success(result);
  64. }
  65. @PostMapping("/children/{id}")
  66. public Result<Child> getChild(@PathVariable Long id) {
  67. return Result.success(childMapper.selectById(id));
  68. }
  69. @PutMapping("/children/{id}")
  70. public Result<Boolean> updateChild(@PathVariable Long id, @RequestBody Child child) {
  71. child.setId(id);
  72. childMapper.updateById(child);
  73. return Result.success(true);
  74. }
  75. @PostMapping("/children/{id}/adjust-points")
  76. public Result<Map<String, Object>> adjustPoints(
  77. @PathVariable Long id,
  78. @RequestBody Map<String, Object> params) {
  79. Integer amount = (Integer) params.get("amount");
  80. String reason = (String) params.get("reason");
  81. Child child = childMapper.selectById(id);
  82. if (child == null) {
  83. return Result.error("孩子不存在");
  84. }
  85. int newBalance = child.getTotalPoints() + amount;
  86. if (newBalance < 0) {
  87. return Result.error("积分不能为负");
  88. }
  89. child.setTotalPoints(newBalance);
  90. child.setUpdatedAt(new Date());
  91. childMapper.updateById(child);
  92. // 记录积分流水
  93. PointsLog log = new PointsLog();
  94. log.setChildId(id);
  95. log.setAmount(amount);
  96. log.setType("adjust");
  97. log.setDescription(reason);
  98. log.setCreatedAt(new Date());
  99. pointsLogMapper.insert(log);
  100. Map<String, Object> result = new HashMap<>();
  101. result.put("newBalance", newBalance);
  102. return Result.success(result);
  103. }
  104. // 任务管理
  105. @PostMapping("/tasks")
  106. public Result<Page<Task>> getTasks(@RequestBody Map<String, Object> params) {
  107. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  108. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  109. String status = (String) params.get("status");
  110. Long familyId = params.get("familyId") != null ? ((Number) params.get("familyId")).longValue() : null;
  111. Page<Task> pageParam = new Page<>(page, size);
  112. LambdaQueryWrapper<Task> wrapper = new LambdaQueryWrapper<>();
  113. if (status != null && !status.isEmpty()) {
  114. wrapper.eq(Task::getStatus, status);
  115. }
  116. if (familyId != null) {
  117. wrapper.eq(Task::getFamilyId, familyId);
  118. }
  119. wrapper.orderByDesc(Task::getCreatedAt);
  120. Page<Task> result = taskMapper.selectPage(pageParam, wrapper);
  121. return Result.success(result);
  122. }
  123. @PostMapping("/tasks/stats")
  124. public Result<Map<String, Object>> getTaskStats() {
  125. Map<String, Object> stats = new HashMap<>();
  126. Long total = taskMapper.selectCount(null);
  127. Long today = taskMapper.selectCount(new LambdaQueryWrapper<Task>()
  128. .ge(Task::getDeadline, new Date()));
  129. stats.put("total", total);
  130. stats.put("today", today);
  131. return Result.success(stats);
  132. }
  133. // 奖励管理
  134. @PostMapping("/rewards")
  135. public Result<Page<Reward>> getRewards(@RequestBody Map<String, Object> params) {
  136. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  137. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  138. String status = (String) params.get("status");
  139. Long familyId = params.get("familyId") != null ? ((Number) params.get("familyId")).longValue() : null;
  140. Page<Reward> pageParam = new Page<>(page, size);
  141. LambdaQueryWrapper<Reward> wrapper = new LambdaQueryWrapper<>();
  142. if (status != null && !status.isEmpty()) {
  143. wrapper.eq(Reward::getStatus, status);
  144. }
  145. if (familyId != null) {
  146. wrapper.eq(Reward::getFamilyId, familyId);
  147. }
  148. wrapper.orderByDesc(Reward::getCreatedAt);
  149. Page<Reward> result = rewardMapper.selectPage(pageParam, wrapper);
  150. return Result.success(result);
  151. }
  152. @PostMapping("/rewards/templates")
  153. public Result<Object> getRewardTemplates(@RequestAttribute("userId") Long userId) {
  154. // 获取用户的家庭 ID,只返回该家庭的模板
  155. com.zxyj.entity.User user = userService.getUserInfo(userId);
  156. if (user == null || user.getFamilyId() == null) {
  157. return Result.error("用户必须属于某个家庭");
  158. }
  159. return Result.success(rewardMapper.selectList(new LambdaQueryWrapper<Reward>()
  160. .eq(Reward::getIsTemplate, 1)
  161. .eq(Reward::getFamilyId, user.getFamilyId()))); // 按家庭 ID 过滤
  162. }
  163. @PostMapping("/rewards/create")
  164. public Result<Long> createRewardTemplate(@RequestBody Reward reward, @RequestAttribute("userId") Long userId) {
  165. // 强制关联家庭
  166. com.zxyj.entity.User user = userService.getUserInfo(userId);
  167. if (user == null || user.getFamilyId() == null) {
  168. return Result.error("用户必须属于某个家庭");
  169. }
  170. reward.setFamilyId(user.getFamilyId());
  171. reward.setIsTemplate(1);
  172. reward.setCreatedAt(new Date());
  173. reward.setUpdatedAt(new Date());
  174. rewardMapper.insert(reward);
  175. return Result.success(reward.getId());
  176. }
  177. @DeleteMapping("/rewards/templates/{id}")
  178. public Result<Boolean> deleteRewardTemplate(@PathVariable Long id, @RequestAttribute("userId") Long userId) {
  179. // 验证家庭归属
  180. com.zxyj.entity.User user = userService.getUserInfo(userId);
  181. if (user != null && user.getFamilyId() != null) {
  182. Reward reward = rewardMapper.selectById(id);
  183. if (reward != null && !reward.getFamilyId().equals(user.getFamilyId())) {
  184. return Result.error("无权删除其他家庭的模板");
  185. }
  186. }
  187. rewardMapper.deleteById(id);
  188. return Result.success(true);
  189. }
  190. @PutMapping("/rewards/templates/{id}")
  191. public Result<Boolean> updateRewardTemplate(@PathVariable Long id, @RequestBody Reward reward, @RequestAttribute("userId") Long userId) {
  192. // 验证家庭归属
  193. com.zxyj.entity.User user = userService.getUserInfo(userId);
  194. if (user == null || user.getFamilyId() == null) {
  195. return Result.error("用户必须属于某个家庭");
  196. }
  197. Reward existingReward = rewardMapper.selectById(id);
  198. if (existingReward != null && !existingReward.getFamilyId().equals(user.getFamilyId())) {
  199. return Result.error("无权修改其他家庭的模板");
  200. }
  201. reward.setId(id);
  202. reward.setFamilyId(user.getFamilyId()); // 确保更新时保持家庭关联
  203. reward.setUpdatedAt(new Date());
  204. rewardMapper.updateById(reward);
  205. return Result.success(true);
  206. }
  207. @PostMapping("/rewards/{id}/approve")
  208. public Result<Boolean> approveReward(@PathVariable Long id, @RequestBody Map<String, Boolean> params) {
  209. Boolean approved = params.get("approved");
  210. Reward reward = rewardMapper.selectById(id);
  211. if (reward == null) {
  212. return Result.error("奖励不存在");
  213. }
  214. if (approved) {
  215. reward.setStatus("exchanged");
  216. reward.setExchangeApproved(1);
  217. reward.setExchangedAt(new Date());
  218. } else {
  219. // 拒绝,返还积分
  220. Child child = childMapper.selectById(reward.getChildId());
  221. if (child != null) {
  222. child.setTotalPoints(child.getTotalPoints() + reward.getPointsRequired());
  223. childMapper.updateById(child);
  224. PointsLog log = new PointsLog();
  225. log.setChildId(reward.getChildId());
  226. log.setAmount(reward.getPointsRequired());
  227. log.setType("refund");
  228. log.setDescription("奖励兑换被拒绝,积分退还");
  229. log.setCreatedAt(new Date());
  230. pointsLogMapper.insert(log);
  231. }
  232. reward.setStatus("rejected");
  233. reward.setExchangeApproved(0);
  234. }
  235. reward.setUpdatedAt(new Date());
  236. rewardMapper.updateById(reward);
  237. return Result.success(true);
  238. }
  239. // 积分管理
  240. @PostMapping("/points/logs")
  241. public Result<Page<PointsLog>> getPointsLogs(@RequestBody Map<String, Object> params) {
  242. Integer page = 1;
  243. Integer size = 10;
  244. Long childId = null;
  245. // 安全解析page
  246. if (params.get("page") != null) {
  247. if (params.get("page") instanceof Integer) {
  248. page = (Integer) params.get("page");
  249. } else if (params.get("page") instanceof Number) {
  250. page = ((Number) params.get("page")).intValue();
  251. } else {
  252. try { page = Integer.parseInt(params.get("page").toString()); } catch (Exception e) {}
  253. }
  254. }
  255. // 安全解析size
  256. if (params.get("size") != null) {
  257. if (params.get("size") instanceof Integer) {
  258. size = (Integer) params.get("size");
  259. } else if (params.get("size") instanceof Number) {
  260. size = ((Number) params.get("size")).intValue();
  261. } else {
  262. try { size = Integer.parseInt(params.get("size").toString()); } catch (Exception e) {}
  263. }
  264. }
  265. // 安全解析childId
  266. if (params.get("childId") != null) {
  267. if (params.get("childId") instanceof Number) {
  268. childId = ((Number) params.get("childId")).longValue();
  269. } else {
  270. try { childId = Long.parseLong(params.get("childId").toString()); } catch (Exception e) {}
  271. }
  272. }
  273. String type = (String) params.get("type");
  274. Page<PointsLog> pageParam = new Page<>(page, size);
  275. LambdaQueryWrapper<PointsLog> wrapper = new LambdaQueryWrapper<>();
  276. if (childId != null) {
  277. wrapper.eq(PointsLog::getChildId, childId);
  278. }
  279. if (type != null && !type.isEmpty()) {
  280. wrapper.eq(PointsLog::getType, type);
  281. }
  282. wrapper.orderByDesc(PointsLog::getCreatedAt);
  283. Page<PointsLog> result = pointsLogMapper.selectPage(pageParam, wrapper);
  284. return Result.success(result);
  285. }
  286. @PostMapping("/points/stats")
  287. public Result<Map<String, Object>> getPointsStats() {
  288. Map<String, Object> stats = new HashMap<>();
  289. Long totalChildren = childMapper.selectCount(null);
  290. stats.put("totalChildren", totalChildren);
  291. return Result.success(stats);
  292. }
  293. // 家庭管理
  294. @PostMapping("/families")
  295. public Result<Page<Family>> getFamilies(@RequestBody Map<String, Object> params) {
  296. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  297. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  298. String name = (String) params.get("name");
  299. Page<Family> pageParam = new Page<>(page, size);
  300. LambdaQueryWrapper<Family> wrapper = new LambdaQueryWrapper<>();
  301. if (name != null && !name.isEmpty()) {
  302. wrapper.like(Family::getName, name);
  303. }
  304. wrapper.orderByDesc(Family::getCreatedAt);
  305. Page<Family> result = familyMapper.selectPage(pageParam, wrapper);
  306. return Result.success(result);
  307. }
  308. @PostMapping("/families/{id}")
  309. public Result<Family> getFamily(@PathVariable Long id) {
  310. return Result.success(familyMapper.selectById(id));
  311. }
  312. @PostMapping("/families/{id}/members")
  313. public Result<Map<String, Object>> getFamilyMembers(@PathVariable Long id) {
  314. Family family = familyMapper.selectById(id);
  315. if (family == null) {
  316. return Result.error("家庭不存在");
  317. }
  318. // 查询家长
  319. LambdaQueryWrapper<User> parentWrapper = new LambdaQueryWrapper<>();
  320. parentWrapper.eq(User::getFamilyId, id).eq(User::getRole, "parent");
  321. java.util.List<User> parents = userMapper.selectList(parentWrapper);
  322. // 查询孩子
  323. LambdaQueryWrapper<Child> childWrapper = new LambdaQueryWrapper<>();
  324. childWrapper.eq(Child::getFamilyId, id);
  325. java.util.List<Child> children = childMapper.selectList(childWrapper);
  326. Map<String, Object> result = new HashMap<>();
  327. result.put("family", family);
  328. result.put("parents", parents);
  329. result.put("children", children);
  330. return Result.success(result);
  331. }
  332. @PutMapping("/families/{id}")
  333. public Result<Boolean> updateFamily(@PathVariable Long id, @RequestBody Family family) {
  334. family.setId(id);
  335. family.setUpdatedAt(new Date());
  336. familyMapper.updateById(family);
  337. return Result.success(true);
  338. }
  339. @DeleteMapping("/families/{id}")
  340. public Result<Boolean> deleteFamily(@PathVariable Long id) {
  341. familyMapper.deleteById(id);
  342. return Result.success(true);
  343. }
  344. // 任务模板管理
  345. @PostMapping("/task-templates")
  346. public Result<Page<TaskTemplate>> getTaskTemplates(@RequestBody Map<String, Object> params) {
  347. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  348. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  349. String category = (String) params.get("category");
  350. String difficulty = (String) params.get("difficulty");
  351. Integer isActive = params.get("isActive") != null ? (Integer) params.get("isActive") : null;
  352. Page<TaskTemplate> pageParam = new Page<>(page, size);
  353. LambdaQueryWrapper<TaskTemplate> wrapper = new LambdaQueryWrapper<>();
  354. if (category != null && !category.isEmpty()) {
  355. wrapper.eq(TaskTemplate::getCategory, category);
  356. }
  357. if (difficulty != null && !difficulty.isEmpty()) {
  358. wrapper.eq(TaskTemplate::getDifficulty, difficulty);
  359. }
  360. if (isActive != null) {
  361. wrapper.eq(TaskTemplate::getIsActive, isActive);
  362. }
  363. wrapper.orderByDesc(TaskTemplate::getCreatedAt);
  364. Page<TaskTemplate> result = taskTemplateMapper.selectPage(pageParam, wrapper);
  365. return Result.success(result);
  366. }
  367. @PostMapping("/task-templates/{id}")
  368. public Result<TaskTemplate> getTaskTemplate(@PathVariable Long id) {
  369. return Result.success(taskTemplateMapper.selectById(id));
  370. }
  371. @PostMapping("/task-templates/create")
  372. public Result<Long> createTaskTemplate(@RequestBody TaskTemplate template) {
  373. template.setCreatedAt(new Date());
  374. template.setUpdatedAt(new Date());
  375. if (template.getIsActive() == null) {
  376. template.setIsActive(1);
  377. }
  378. taskTemplateMapper.insert(template);
  379. return Result.success(template.getId());
  380. }
  381. @PutMapping("/task-templates/{id}")
  382. public Result<Boolean> updateTaskTemplate(@PathVariable Long id, @RequestBody TaskTemplate template) {
  383. template.setId(id);
  384. template.setUpdatedAt(new Date());
  385. taskTemplateMapper.updateById(template);
  386. return Result.success(true);
  387. }
  388. @DeleteMapping("/task-templates/{id}")
  389. public Result<Boolean> deleteTaskTemplate(@PathVariable Long id) {
  390. taskTemplateMapper.deleteById(id);
  391. return Result.success(true);
  392. }
  393. // ========== 指导师相关接口 ==========
  394. /**
  395. * 获取指导师关联的家庭列表
  396. */
  397. @PostMapping("/teacher/families")
  398. public Result<Object> getTeacherFamilies(@RequestHeader("X-User-Id") Long userId) {
  399. User teacher = userMapper.selectById(userId);
  400. if (teacher == null || !"teacher".equals(teacher.getRole())) {
  401. return Result.error("非指导师账号");
  402. }
  403. String familyIds = teacher.getTeacherFamilyIds();
  404. if (familyIds == null || familyIds.isEmpty()) {
  405. return Result.success(new java.util.ArrayList<>());
  406. }
  407. // 解析家庭ID列表
  408. java.util.List<Long> ids = new java.util.ArrayList<>();
  409. for (String id : familyIds.split(",")) {
  410. try {
  411. ids.add(Long.parseLong(id.trim()));
  412. } catch (Exception e) {
  413. // 忽略
  414. }
  415. }
  416. if (ids.isEmpty()) {
  417. return Result.success(new java.util.ArrayList<>());
  418. }
  419. // 查询家庭信息
  420. java.util.List<Family> families = familyMapper.selectBatchIds(ids);
  421. return Result.success(families);
  422. }
  423. /**
  424. * 获取指导师发布的任务模板
  425. */
  426. @PostMapping("/teacher/task-templates")
  427. public Result<Object> getTeacherTaskTemplates(@RequestHeader("X-User-Id") Long userId) {
  428. User teacher = userMapper.selectById(userId);
  429. if (teacher == null || !"teacher".equals(teacher.getRole())) {
  430. return Result.error("非指导师账号");
  431. }
  432. java.util.List<TaskTemplate> templates = taskTemplateMapper.selectList(
  433. new LambdaQueryWrapper<TaskTemplate>()
  434. .eq(TaskTemplate::getTeacherId, userId)
  435. .orderByDesc(TaskTemplate::getCreatedAt)
  436. );
  437. return Result.success(templates);
  438. }
  439. /**
  440. * 指导师创建任务模板
  441. */
  442. @PostMapping("/teacher/task-templates/create")
  443. public Result<Long> createTeacherTaskTemplate(@RequestHeader("X-User-Id") Long userId,
  444. @RequestBody TaskTemplate template) {
  445. User teacher = userMapper.selectById(userId);
  446. if (teacher == null || !"teacher".equals(teacher.getRole())) {
  447. return Result.error("非指导师账号");
  448. }
  449. template.setTeacherId(userId);
  450. template.setCreatedAt(new Date());
  451. template.setUpdatedAt(new Date());
  452. if (template.getIsActive() == null) {
  453. template.setIsActive(1);
  454. }
  455. taskTemplateMapper.insert(template);
  456. return Result.success(template.getId());
  457. }
  458. /**
  459. * 指导师删除自己的任务模板
  460. */
  461. @DeleteMapping("/teacher/task-templates/{id}")
  462. public Result<Boolean> deleteTeacherTaskTemplate(@RequestHeader("X-User-Id") Long userId,
  463. @PathVariable Long id) {
  464. User teacher = userMapper.selectById(userId);
  465. if (teacher == null || !"teacher".equals(teacher.getRole())) {
  466. return Result.error("非指导师账号");
  467. }
  468. TaskTemplate template = taskTemplateMapper.selectById(id);
  469. if (template == null || !template.getTeacherId().equals(userId)) {
  470. return Result.error("模板不存在或无权限删除");
  471. }
  472. taskTemplateMapper.deleteById(id);
  473. return Result.success(true);
  474. }
  475. /**
  476. * 获取指定家庭的任务列表
  477. */
  478. @PostMapping("/teacher/families/{familyId}/tasks")
  479. public Result<Object> getTeacherFamilyTasks(@RequestHeader("X-User-Id") Long userId,
  480. @PathVariable Long familyId,
  481. @RequestBody Map<String, Object> params) {
  482. User teacher = userMapper.selectById(userId);
  483. if (teacher == null || !"teacher".equals(teacher.getRole())) {
  484. return Result.error("非指导师账号");
  485. }
  486. // 检查家庭是否在指导师关联列表中
  487. if (!isTeacherFamily(teacher, familyId)) {
  488. return Result.error("无权限查看该家庭的任务");
  489. }
  490. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  491. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  492. Page<Task> pageParam = new Page<>(page, size);
  493. Page<Task> result = taskMapper.selectPage(pageParam, new LambdaQueryWrapper<Task>()
  494. .eq(Task::getFamilyId, familyId)
  495. .orderByDesc(Task::getCreatedAt));
  496. return Result.success(result);
  497. }
  498. /**
  499. * 获取指定家庭的奖励列表
  500. */
  501. @PostMapping("/teacher/families/{familyId}/rewards")
  502. public Result<Object> getTeacherFamilyRewards(@RequestHeader("X-User-Id") Long userId,
  503. @PathVariable Long familyId,
  504. @RequestBody Map<String, Object> params) {
  505. User teacher = userMapper.selectById(userId);
  506. if (teacher == null || !"teacher".equals(teacher.getRole())) {
  507. return Result.error("非指导师账号");
  508. }
  509. // 检查家庭是否在指导师关联列表中
  510. if (!isTeacherFamily(teacher, familyId)) {
  511. return Result.error("无权限查看该家庭的奖励");
  512. }
  513. Integer page = params.get("page") != null ? (Integer) params.get("page") : 1;
  514. Integer size = params.get("size") != null ? (Integer) params.get("size") : 10;
  515. Page<Reward> pageParam = new Page<>(page, size);
  516. Page<Reward> result = rewardMapper.selectPage(pageParam, new LambdaQueryWrapper<Reward>()
  517. .eq(Reward::getFamilyId, familyId)
  518. .orderByDesc(Reward::getCreatedAt));
  519. return Result.success(result);
  520. }
  521. /**
  522. * 检查家庭是否在指导师关联列表中
  523. */
  524. private boolean isTeacherFamily(User teacher, Long familyId) {
  525. String familyIds = teacher.getTeacherFamilyIds();
  526. if (familyIds == null || familyIds.isEmpty()) {
  527. return false;
  528. }
  529. for (String id : familyIds.split(",")) {
  530. try {
  531. if (Long.parseLong(id.trim()) == familyId) {
  532. return true;
  533. }
  534. } catch (Exception e) {
  535. // 忽略
  536. }
  537. }
  538. return false;
  539. }
  540. }