AdminStatsController.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package com.train.controller.admin;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.train.common.Result;
  4. import com.train.entity.*;
  5. import com.train.mapper.*;
  6. import com.train.service.ScoreService;
  7. import io.swagger.v3.oas.annotations.Operation;
  8. import io.swagger.v3.oas.annotations.tags.Tag;
  9. import org.springframework.web.bind.annotation.*;
  10. import javax.annotation.Resource;
  11. import java.util.*;
  12. @Tag(name = "管理端-统计与导出", description = "班级/机构统计、积分榜、导出用数据")
  13. @RestController
  14. @RequestMapping("/api/admin")
  15. public class AdminStatsController {
  16. @Resource
  17. private TrainClassMapper trainClassMapper;
  18. @Resource
  19. private TrainUserMapper trainUserMapper;
  20. @Resource
  21. private TrainGroupMapper trainGroupMapper;
  22. @Resource
  23. private TrainGroupMemberMapper trainGroupMemberMapper;
  24. @Resource
  25. private TrainSubmissionMapper trainSubmissionMapper;
  26. @Resource
  27. private TrainTeachingCardMapper trainTeachingCardMapper;
  28. @Resource
  29. private TrainCheckinMapper trainCheckinMapper;
  30. @Resource
  31. private TrainPrepCheckMapper trainPrepCheckMapper;
  32. @Resource
  33. private TrainSurveyMapper trainSurveyMapper;
  34. @Resource
  35. private TrainVoteMapper trainVoteMapper;
  36. @Resource
  37. private TrainPlanMapper trainPlanMapper;
  38. @Resource
  39. private TrainRoadmapMapper trainRoadmapMapper;
  40. @Resource
  41. private TrainCouponMapper trainCouponMapper;
  42. @Resource
  43. private TrainScoreMapper trainScoreMapper;
  44. @Resource
  45. private ScoreService scoreService;
  46. @Operation(summary = "班级整体统计")
  47. @PostMapping("/stats/overview")
  48. public Result<Map<String, Object>> overview(@RequestBody(required = false) Map<String, Object> body) {
  49. Map<String, Object> data = new HashMap<>();
  50. data.put("totalClasses", count(trainClassMapper.selectList(null)));
  51. data.put("totalUsers", count(trainUserMapper.selectList(null)));
  52. data.put("totalGroups", count(trainGroupMapper.selectList(null)));
  53. data.put("totalSubmissions", count(trainSubmissionMapper.selectList(null)));
  54. data.put("totalCheckins", count(trainCheckinMapper.selectList(null)));
  55. data.put("totalCards", count(trainTeachingCardMapper.selectList(null)));
  56. data.put("totalVotes", count(trainVoteMapper.selectList(null)));
  57. data.put("totalPlans", count(trainPlanMapper.selectList(null)));
  58. data.put("totalCoupons", count(trainCouponMapper.selectList(null)));
  59. // 按班级统计学员/组/成果
  60. List<Map<String, Object>> classStats = new ArrayList<>();
  61. List<TrainClass> classes = trainClassMapper.selectList(null);
  62. for (TrainClass c : classes) {
  63. Map<String, Object> row = new HashMap<>();
  64. row.put("classId", c.getId());
  65. row.put("className", c.getName());
  66. row.put("userCount", count(trainUserMapper.selectList(
  67. new LambdaQueryWrapper<TrainUser>().eq(TrainUser::getClassId, c.getId()))));
  68. row.put("groupCount", count(trainGroupMapper.selectList(
  69. new LambdaQueryWrapper<TrainGroup>().eq(TrainGroup::getClassId, c.getId()))));
  70. classStats.add(row);
  71. }
  72. data.put("classStats", classStats);
  73. return Result.success(data);
  74. }
  75. @Operation(summary = "积分榜(管理端,可筛选班级)")
  76. @PostMapping("/stats/scoreboard")
  77. public Result<List<Map<String, Object>>> scoreboard(@RequestBody(required = false) Map<String, Object> body) {
  78. LambdaQueryWrapper<TrainGroup> qw = new LambdaQueryWrapper<>();
  79. if (body != null && body.get("classId") != null) {
  80. qw.eq(TrainGroup::getClassId, Long.valueOf(body.get("classId").toString()));
  81. }
  82. List<TrainGroup> groups = trainGroupMapper.selectList(qw);
  83. List<Map<String, Object>> board = new ArrayList<>();
  84. for (TrainGroup g : groups) {
  85. Map<String, Object> row = new HashMap<>();
  86. row.put("groupId", g.getId());
  87. row.put("groupName", g.getName());
  88. row.put("slogan", g.getSlogan());
  89. List<TrainScore> scores = trainScoreMapper.selectList(
  90. new LambdaQueryWrapper<TrainScore>().eq(TrainScore::getGroupId, g.getId()));
  91. row.put("groupTotal", scores.stream().mapToInt(TrainScore::getPoints).sum());
  92. row.put("memberTotal", scoreService.groupMemberTotal(g.getId()));
  93. Long mc = trainGroupMemberMapper.selectCount(
  94. new LambdaQueryWrapper<TrainGroupMember>().eq(TrainGroupMember::getGroupId, g.getId()));
  95. row.put("memberCount", mc == null ? 0 : mc);
  96. board.add(row);
  97. }
  98. board.sort((a, b) -> Integer.compare((int) b.get("groupTotal"), (int) a.get("groupTotal")));
  99. return Result.success(board);
  100. }
  101. @Operation(summary = "个人积分榜")
  102. @PostMapping("/stats/user-scoreboard")
  103. public Result<List<Map<String, Object>>> userScoreboard(@RequestBody(required = false) Map<String, Object> body) {
  104. LambdaQueryWrapper<TrainUser> qw = new LambdaQueryWrapper<>();
  105. if (body != null && body.get("classId") != null) {
  106. qw.eq(TrainUser::getClassId, Long.valueOf(body.get("classId").toString()));
  107. }
  108. List<TrainUser> users = trainUserMapper.selectList(qw);
  109. List<Map<String, Object>> board = new ArrayList<>();
  110. for (TrainUser u : users) {
  111. Map<String, Object> row = new HashMap<>();
  112. row.put("uid", u.getId());
  113. row.put("name", u.getName());
  114. row.put("role", u.getRole());
  115. row.put("total", scoreService.userTotal(u.getId()));
  116. board.add(row);
  117. }
  118. board.sort((a, b) -> Integer.compare((int) b.get("total"), (int) a.get("total")));
  119. return Result.success(board);
  120. }
  121. private long count(List<?> list) {
  122. return list == null ? 0 : list.size();
  123. }
  124. }