package com.train.controller.admin; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.train.common.Result; import com.train.entity.*; import com.train.mapper.*; import com.train.service.ScoreService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.*; @Tag(name = "管理端-统计与导出", description = "班级/机构统计、积分榜、导出用数据") @RestController @RequestMapping("/api/admin") public class AdminStatsController { @Resource private TrainClassMapper trainClassMapper; @Resource private TrainUserMapper trainUserMapper; @Resource private TrainGroupMapper trainGroupMapper; @Resource private TrainGroupMemberMapper trainGroupMemberMapper; @Resource private TrainSubmissionMapper trainSubmissionMapper; @Resource private TrainTeachingCardMapper trainTeachingCardMapper; @Resource private TrainCheckinMapper trainCheckinMapper; @Resource private TrainPrepCheckMapper trainPrepCheckMapper; @Resource private TrainSurveyMapper trainSurveyMapper; @Resource private TrainVoteMapper trainVoteMapper; @Resource private TrainPlanMapper trainPlanMapper; @Resource private TrainRoadmapMapper trainRoadmapMapper; @Resource private TrainCouponMapper trainCouponMapper; @Resource private TrainScoreMapper trainScoreMapper; @Resource private ScoreService scoreService; @Operation(summary = "班级整体统计") @PostMapping("/stats/overview") public Result> overview(@RequestBody(required = false) Map body) { Map data = new HashMap<>(); data.put("totalClasses", count(trainClassMapper.selectList(null))); data.put("totalUsers", count(trainUserMapper.selectList(null))); data.put("totalGroups", count(trainGroupMapper.selectList(null))); data.put("totalSubmissions", count(trainSubmissionMapper.selectList(null))); data.put("totalCheckins", count(trainCheckinMapper.selectList(null))); data.put("totalCards", count(trainTeachingCardMapper.selectList(null))); data.put("totalVotes", count(trainVoteMapper.selectList(null))); data.put("totalPlans", count(trainPlanMapper.selectList(null))); data.put("totalCoupons", count(trainCouponMapper.selectList(null))); // 按班级统计学员/组/成果 List> classStats = new ArrayList<>(); List classes = trainClassMapper.selectList(null); for (TrainClass c : classes) { Map row = new HashMap<>(); row.put("classId", c.getId()); row.put("className", c.getName()); row.put("userCount", count(trainUserMapper.selectList( new LambdaQueryWrapper().eq(TrainUser::getClassId, c.getId())))); row.put("groupCount", count(trainGroupMapper.selectList( new LambdaQueryWrapper().eq(TrainGroup::getClassId, c.getId())))); classStats.add(row); } data.put("classStats", classStats); return Result.success(data); } @Operation(summary = "积分榜(管理端,可筛选班级)") @PostMapping("/stats/scoreboard") public Result>> scoreboard(@RequestBody(required = false) Map body) { LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); if (body != null && body.get("classId") != null) { qw.eq(TrainGroup::getClassId, Long.valueOf(body.get("classId").toString())); } List groups = trainGroupMapper.selectList(qw); List> board = new ArrayList<>(); for (TrainGroup g : groups) { Map row = new HashMap<>(); row.put("groupId", g.getId()); row.put("groupName", g.getName()); row.put("slogan", g.getSlogan()); List scores = trainScoreMapper.selectList( new LambdaQueryWrapper().eq(TrainScore::getGroupId, g.getId())); row.put("groupTotal", scores.stream().mapToInt(TrainScore::getPoints).sum()); row.put("memberTotal", scoreService.groupMemberTotal(g.getId())); Long mc = trainGroupMemberMapper.selectCount( new LambdaQueryWrapper().eq(TrainGroupMember::getGroupId, g.getId())); row.put("memberCount", mc == null ? 0 : mc); board.add(row); } board.sort((a, b) -> Integer.compare((int) b.get("groupTotal"), (int) a.get("groupTotal"))); return Result.success(board); } @Operation(summary = "个人积分榜") @PostMapping("/stats/user-scoreboard") public Result>> userScoreboard(@RequestBody(required = false) Map body) { LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); if (body != null && body.get("classId") != null) { qw.eq(TrainUser::getClassId, Long.valueOf(body.get("classId").toString())); } List users = trainUserMapper.selectList(qw); List> board = new ArrayList<>(); for (TrainUser u : users) { Map row = new HashMap<>(); row.put("uid", u.getId()); row.put("name", u.getName()); row.put("role", u.getRole()); row.put("total", scoreService.userTotal(u.getId())); board.add(row); } board.sort((a, b) -> Integer.compare((int) b.get("total"), (int) a.get("total"))); return Result.success(board); } private long count(List list) { return list == null ? 0 : list.size(); } }