|
@@ -252,4 +252,564 @@ public class GameScoreServiceImpl implements IGameScoreService {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据运动员ID和项目ID查询成绩
|
|
|
+ * @param athleteId
|
|
|
+ * @param projectId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public GameScoreVo getScoreByAthleteIdAndProjectId(Long athleteId, Long projectId) {
|
|
|
+ return baseMapper.selectVoByAthleteIdAndProjectId(athleteId, projectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取项目成绩综合数据(包含运动员/队伍信息)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<Map<String, Object>> getProjectScoreData(Long eventId, Long projectId, String classification, String searchValue, PageQuery pageQuery) {
|
|
|
+ log.info("开始获取项目成绩数据: eventId={}, projectId={}, classification={}, searchValue={}, pageNum={}, pageSize={}",
|
|
|
+ eventId, projectId, classification, searchValue, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+
|
|
|
+ List<Map<String, Object>> allDataList = new ArrayList<>();
|
|
|
+
|
|
|
+ if ("0".equals(classification)) {
|
|
|
+ // 个人项目:获取运动员数据
|
|
|
+ log.info("处理个人项目数据");
|
|
|
+ allDataList = getIndividualProjectData(eventId, projectId, searchValue, pageQuery);
|
|
|
+ } else {
|
|
|
+ // 团体项目:获取队伍数据
|
|
|
+ log.info("处理团体项目数据");
|
|
|
+ allDataList = getTeamProjectData(eventId, projectId, searchValue, pageQuery);
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("获取到总数据量: {}", allDataList.size());
|
|
|
+
|
|
|
+ // 计算总数
|
|
|
+ int total = allDataList.size();
|
|
|
+
|
|
|
+ // 手动分页处理
|
|
|
+ int pageNum = pageQuery.getPageNum();
|
|
|
+ int pageSize = pageQuery.getPageSize();
|
|
|
+ int startIndex = (pageNum - 1) * pageSize;
|
|
|
+ int endIndex = Math.min(startIndex + pageSize, total);
|
|
|
+
|
|
|
+ log.info("分页参数: pageNum={}, pageSize={}, startIndex={}, endIndex={}", pageNum, pageSize, startIndex, endIndex);
|
|
|
+
|
|
|
+ // 获取当前页的数据
|
|
|
+ List<Map<String, Object>> pageData = new ArrayList<>();
|
|
|
+ if (startIndex < total) {
|
|
|
+ pageData = allDataList.subList(startIndex, endIndex);
|
|
|
+ log.info("当前页数据量: {}", pageData.size());
|
|
|
+ } else {
|
|
|
+ log.warn("分页索引超出范围: startIndex={}, total={}", startIndex, total);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建分页结果
|
|
|
+ Page<Map<String, Object>> page = new Page<>(pageNum, pageSize);
|
|
|
+ page.setRecords(pageData);
|
|
|
+ page.setTotal(total);
|
|
|
+
|
|
|
+ log.info("分页结果: 总数={}, 当前页数据量={}", total, pageData.size());
|
|
|
+ return TableDataInfo.build(page);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取个人项目数据
|
|
|
+ */
|
|
|
+ private List<Map<String, Object>> getIndividualProjectData(Long eventId, Long projectId, String searchValue, PageQuery pageQuery) {
|
|
|
+ log.info("开始获取个人项目数据: eventId={}, projectId={}, searchValue={}", eventId, projectId, searchValue);
|
|
|
+
|
|
|
+ List<Map<String, Object>> resultList = new ArrayList<>();
|
|
|
+
|
|
|
+ // 查询参与该项目的运动员
|
|
|
+ List<GameAthleteVo> athletes = gameAthleteService.queryListByEventIdAndProjectId(eventId, projectId, searchValue);
|
|
|
+ log.info("查询到运动员数量: {}", athletes.size());
|
|
|
+
|
|
|
+ for (GameAthleteVo athlete : athletes) {
|
|
|
+ log.info("处理运动员: athleteId={}, name={}, teamId={}", athlete.getAthleteId(), athlete.getName(), athlete.getTeamId());
|
|
|
+
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
+ data.put("id", athlete.getAthleteId());
|
|
|
+ data.put("athleteId", athlete.getAthleteId());
|
|
|
+ data.put("userId", athlete.getUserId());
|
|
|
+ data.put("eventId", eventId);
|
|
|
+ data.put("projectId", projectId);
|
|
|
+ data.put("teamId", athlete.getTeamId());
|
|
|
+ data.put("athleteCode", athlete.getAthleteCode());
|
|
|
+ data.put("name", athlete.getName());
|
|
|
+ data.put("unit", athlete.getUnit());
|
|
|
+ data.put("groupType", athlete.getGroupType());
|
|
|
+// data.put("number", athlete.getNumber());
|
|
|
+
|
|
|
+ // 查询队伍信息,获取队伍名称
|
|
|
+ String teamName = "";
|
|
|
+ if (athlete.getTeamId() != null) {
|
|
|
+ GameTeamVo team = gameTeamService.queryById(athlete.getTeamId());
|
|
|
+ if (team != null) {
|
|
|
+ teamName = team.getTeamName();
|
|
|
+ log.debug("获取到队伍名称: teamId={}, teamName={}", athlete.getTeamId(), teamName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ data.put("teamName", teamName); // 添加teamName字段
|
|
|
+
|
|
|
+ // 查询成绩信息
|
|
|
+ GameScoreVo score = getScoreByAthleteIdAndProjectId(athlete.getAthleteId(), projectId);
|
|
|
+ if (score != null) {
|
|
|
+ data.put("scoreId", score.getScoreId());
|
|
|
+ data.put("scorePoint", score.getScorePoint());
|
|
|
+ data.put("individualPerformance", score.getIndividualPerformance());
|
|
|
+ data.put("teamPerformance", score.getTeamPerformance());
|
|
|
+ data.put("scoreRank", score.getScoreRank());
|
|
|
+ data.put("updateTime", score.getUpdateTime());
|
|
|
+ log.info("获取到成绩信息: scoreId={}, scorePoint={}", score.getScoreId(), score.getScorePoint());
|
|
|
+ } else {
|
|
|
+ data.put("scoreId", 0);
|
|
|
+ data.put("scorePoint", 0);
|
|
|
+ data.put("individualPerformance", 0.0);
|
|
|
+ data.put("teamPerformance", 0.0);
|
|
|
+ data.put("scoreRank", 0);
|
|
|
+ data.put("updateTime", "");
|
|
|
+ log.info("未找到成绩信息,使用默认值");
|
|
|
+ }
|
|
|
+
|
|
|
+ resultList.add(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("个人项目数据处理完成,返回数据量: {}", resultList.size());
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取团体项目数据
|
|
|
+ */
|
|
|
+ private List<Map<String, Object>> getTeamProjectData(Long eventId, Long projectId, String searchValue, PageQuery pageQuery) {
|
|
|
+ List<Map<String, Object>> resultList = new ArrayList<>();
|
|
|
+ Set<Long> processedTeamIds = new HashSet<>();
|
|
|
+
|
|
|
+ // 查询参与该项目的运动员
|
|
|
+ List<GameAthleteVo> athletes = gameAthleteService.queryListByEventIdAndProjectId(eventId, projectId, searchValue);
|
|
|
+
|
|
|
+ for (GameAthleteVo athlete : athletes) {
|
|
|
+ if (athlete.getTeamId() == null || processedTeamIds.contains(athlete.getTeamId())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ processedTeamIds.add(athlete.getTeamId());
|
|
|
+
|
|
|
+ // 查询队伍信息
|
|
|
+ GameTeamVo team = gameTeamService.queryById(athlete.getTeamId());
|
|
|
+ if (team == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
+ data.put("id", team.getTeamId());
|
|
|
+ data.put("teamId", team.getTeamId());
|
|
|
+ data.put("teamName", team.getTeamName());
|
|
|
+ data.put("teamCode", team.getTeamCode());
|
|
|
+ data.put("eventId", eventId);
|
|
|
+ data.put("projectId", projectId);
|
|
|
+
|
|
|
+ // 查询成绩信息(使用第一个运动员的成绩作为队伍成绩)
|
|
|
+ GameScoreVo score = getScoreByAthleteIdAndProjectId(athlete.getAthleteId(), projectId);
|
|
|
+ if (score != null) {
|
|
|
+ data.put("scoreId", score.getScoreId());
|
|
|
+ data.put("scorePoint", score.getScorePoint());
|
|
|
+ data.put("individualPerformance", score.getIndividualPerformance());
|
|
|
+ data.put("teamPerformance", score.getTeamPerformance());
|
|
|
+ data.put("scoreRank", score.getScoreRank());
|
|
|
+ data.put("updateTime", score.getUpdateTime());
|
|
|
+ } else {
|
|
|
+ data.put("scoreId", 0);
|
|
|
+ data.put("scorePoint", 0);
|
|
|
+ data.put("individualPerformance", 0.0);
|
|
|
+ data.put("teamPerformance", 0.0);
|
|
|
+ data.put("scoreRank", 0);
|
|
|
+ data.put("updateTime", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ resultList.add(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新成绩并重新计算排名积分
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean updateScoreAndRecalculate(GameScoreBo bo) {
|
|
|
+ log.info("开始处理成绩更新,scoreId: {}, eventId: {}, projectId: {}, teamId: {}",
|
|
|
+ bo.getScoreId(), bo.getEventId(), bo.getProjectId(), bo.getTeamId());
|
|
|
+
|
|
|
+ // 判断是否是手动排名计算(没有具体成绩数据,只有基本信息)
|
|
|
+ boolean isManualRankingCalculation = (bo.getScoreId() == null &&
|
|
|
+ bo.getAthleteId() == null &&
|
|
|
+ bo.getTeamId() == null &&
|
|
|
+ bo.getIndividualPerformance() == null &&
|
|
|
+ bo.getTeamPerformance() == null);
|
|
|
+
|
|
|
+ log.info("手动排名计算判断: scoreId={}, athleteId={}, teamId={}, individualPerformance={}, teamPerformance={}, isManualRanking={}",
|
|
|
+ bo.getScoreId(), bo.getAthleteId(), bo.getTeamId(), bo.getIndividualPerformance(), bo.getTeamPerformance(), isManualRankingCalculation);
|
|
|
+
|
|
|
+ if (isManualRankingCalculation) {
|
|
|
+ // 手动排名计算:直接重新计算排名和积分
|
|
|
+ log.info("检测到手动排名计算请求,跳过成绩更新,直接计算排名");
|
|
|
+ Boolean result = recalculateRankingsAndPoints(bo.getEventId(), bo.getProjectId());
|
|
|
+ log.info("手动排名计算完成,结果: {}", result);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取项目信息,判断是个人项目还是团体项目
|
|
|
+ GameEventProjectVo project = gameEventProjectService.queryById(bo.getProjectId());
|
|
|
+ log.info("项目信息: projectId: {}, classification: {}", bo.getProjectId(),
|
|
|
+ project != null ? project.getClassification() : "null");
|
|
|
+
|
|
|
+ Boolean result = false;
|
|
|
+
|
|
|
+ if (project != null && "1".equals(project.getClassification())) {
|
|
|
+ // 团体项目:为队伍中的所有运动员创建或更新成绩记录
|
|
|
+ log.info("处理团体项目成绩更新");
|
|
|
+ result = handleTeamScoreUpdate(bo);
|
|
|
+ } else {
|
|
|
+ // 个人项目:直接更新或插入
|
|
|
+ log.info("处理个人项目成绩更新,scoreId: {}", bo.getScoreId());
|
|
|
+ if (bo.getScoreId() != null && bo.getScoreId() > 0) {
|
|
|
+ result = updateByBo(bo);
|
|
|
+ log.info("更新现有成绩记录,结果: {}", result);
|
|
|
+ } else {
|
|
|
+ result = insertByBo(bo);
|
|
|
+ log.info("插入新成绩记录,结果: {}", result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (result) {
|
|
|
+ // 重新计算排名和积分
|
|
|
+ log.info("开始重新计算排名和积分");
|
|
|
+ recalculateRankingsAndPoints(bo.getEventId(), bo.getProjectId());
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("成绩更新处理完成,结果: {}", result);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理团体项目成绩更新
|
|
|
+ */
|
|
|
+ private Boolean handleTeamScoreUpdate(GameScoreBo bo) {
|
|
|
+ try {
|
|
|
+ log.info("开始处理团体项目成绩更新,teamId: {}", bo.getTeamId());
|
|
|
+
|
|
|
+ // 获取队伍中的所有运动员
|
|
|
+ List<GameAthleteVo> teamAthletes = gameAthleteService.queryListByEventIdAndProjectId(
|
|
|
+ bo.getEventId(), bo.getProjectId(), null);
|
|
|
+
|
|
|
+ log.info("找到参与项目的运动员数量: {}", teamAthletes.size());
|
|
|
+
|
|
|
+ // 过滤出属于指定队伍的运动员
|
|
|
+ List<GameAthleteVo> relevantAthletes = teamAthletes.stream()
|
|
|
+ .filter(athlete -> athlete.getTeamId() != null && athlete.getTeamId().equals(bo.getTeamId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ log.info("队伍 {} 的运动员数量: {}", bo.getTeamId(), relevantAthletes.size());
|
|
|
+
|
|
|
+ if (relevantAthletes.isEmpty()) {
|
|
|
+ log.warn("未找到队伍 {} 的运动员", bo.getTeamId());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 为每个运动员创建或更新成绩记录
|
|
|
+ for (GameAthleteVo athlete : relevantAthletes) {
|
|
|
+ log.info("处理运动员 {} 的成绩记录", athlete.getAthleteId());
|
|
|
+
|
|
|
+ GameScoreBo athleteScoreBo = new GameScoreBo();
|
|
|
+ athleteScoreBo.setEventId(bo.getEventId());
|
|
|
+ athleteScoreBo.setProjectId(bo.getProjectId());
|
|
|
+ athleteScoreBo.setAthleteId(athlete.getAthleteId());
|
|
|
+ athleteScoreBo.setTeamId(bo.getTeamId());
|
|
|
+ athleteScoreBo.setIndividualPerformance(BigDecimal.ZERO); // 团体项目个人成绩为0
|
|
|
+ athleteScoreBo.setTeamPerformance(bo.getTeamPerformance());
|
|
|
+ athleteScoreBo.setScoreType("team");
|
|
|
+ athleteScoreBo.setStatusFlag("0");
|
|
|
+ athleteScoreBo.setStatus("0");
|
|
|
+ athleteScoreBo.setRemark("团体项目成绩");
|
|
|
+
|
|
|
+ // 查找是否已有该运动员的成绩记录
|
|
|
+ GameScoreVo existingScore = getScoreByAthleteIdAndProjectId(athlete.getAthleteId(), bo.getProjectId());
|
|
|
+ if (existingScore != null) {
|
|
|
+ // 更新现有记录
|
|
|
+ log.info("更新运动员 {} 的现有成绩记录", athlete.getAthleteId());
|
|
|
+ athleteScoreBo.setScoreId(existingScore.getScoreId());
|
|
|
+ Boolean updateResult = updateByBo(athleteScoreBo);
|
|
|
+ log.info("更新结果: {}", updateResult);
|
|
|
+ } else {
|
|
|
+ // 插入新记录
|
|
|
+ log.info("为运动员 {} 插入新成绩记录", athlete.getAthleteId());
|
|
|
+ Boolean insertResult = insertByBo(athleteScoreBo);
|
|
|
+ log.info("插入结果: {}", insertResult);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("团体项目成绩更新处理完成");
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理团体项目成绩更新失败", e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重新计算项目排名和积分
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean recalculateRankingsAndPoints(Long eventId, Long projectId) {
|
|
|
+ try {
|
|
|
+ // 获取项目配置信息
|
|
|
+ GameEventProjectVo project = gameEventProjectService.queryById(projectId);
|
|
|
+ if (project == null) {
|
|
|
+ log.error("项目不存在,projectId: {}", projectId);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ String classification = project.getClassification();
|
|
|
+ String scoreValue = project.getScoreValue();
|
|
|
+
|
|
|
+ // 获取所有相关成绩记录
|
|
|
+ GameScoreBo queryBo = new GameScoreBo();
|
|
|
+ queryBo.setEventId(eventId);
|
|
|
+ queryBo.setProjectId(projectId);
|
|
|
+ List<GameScoreVo> allScores = queryList(queryBo);
|
|
|
+
|
|
|
+ if ("0".equals(classification)) {
|
|
|
+ // 个人项目:按个人成绩排序
|
|
|
+ return handleIndividualProjectRanking(allScores, scoreValue, eventId, projectId);
|
|
|
+ } else {
|
|
|
+ // 团体项目:按队伍汇总积分后排序
|
|
|
+ return handleTeamProjectRanking(allScores, scoreValue, eventId, projectId);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("重新计算排名和积分失败", e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理个人项目排名和积分计算
|
|
|
+ */
|
|
|
+ private Boolean handleIndividualProjectRanking(List<GameScoreVo> allScores, String scoreValue, Long eventId, Long projectId) {
|
|
|
+ // 获取项目信息,确定排序方式
|
|
|
+ GameEventProjectVo project = gameEventProjectService.queryById(projectId);
|
|
|
+ if (project == null) {
|
|
|
+ log.error("项目不存在,projectId: {}", projectId);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ String orderType = project.getOrderType();
|
|
|
+ log.info("个人项目排名计算,projectId: {}, orderType: {}", projectId, orderType);
|
|
|
+
|
|
|
+ // 根据orderType决定排序方式
|
|
|
+ // orderType: 0-升序(成绩越小越好),1-降序(成绩越大越好)
|
|
|
+ List<GameScoreVo> sortedScores = allScores.stream()
|
|
|
+ .sorted((a, b) -> {
|
|
|
+ BigDecimal aIndividualPerformance = a.getIndividualPerformance() != null ? a.getIndividualPerformance() : BigDecimal.ZERO;
|
|
|
+ BigDecimal bIndividualPerformance = b.getIndividualPerformance() != null ? b.getIndividualPerformance() : BigDecimal.ZERO;
|
|
|
+
|
|
|
+ if ("0".equals(orderType)) {
|
|
|
+ // 升序:成绩越小越好
|
|
|
+ return aIndividualPerformance.compareTo(bIndividualPerformance);
|
|
|
+ } else {
|
|
|
+ // 降序:成绩越大越好(默认)
|
|
|
+ return bIndividualPerformance.compareTo(aIndividualPerformance);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .toList();
|
|
|
+
|
|
|
+ // 解析积分分值
|
|
|
+ List<Integer> pointValues = Arrays.stream(scoreValue.split(","))
|
|
|
+ .map(String::trim)
|
|
|
+ .map(Integer::parseInt)
|
|
|
+ .toList();
|
|
|
+
|
|
|
+ // 根据orderType决定积分分配方式
|
|
|
+ if ("0".equals(orderType)) {
|
|
|
+ // 升序项目:成绩越小,积分分配越多
|
|
|
+ for (int i = 0; i < sortedScores.size(); i++) {
|
|
|
+ GameScoreVo score = sortedScores.get(i);
|
|
|
+ int points = i < pointValues.size() ? pointValues.get(i) : 0;
|
|
|
+
|
|
|
+ // 更新成绩记录
|
|
|
+ GameScoreBo updateBo = new GameScoreBo();
|
|
|
+ updateBo.setScoreId(score.getScoreId());
|
|
|
+ updateBo.setScorePoint(points);
|
|
|
+ updateBo.setEventId(eventId);
|
|
|
+ updateBo.setProjectId(projectId);
|
|
|
+
|
|
|
+ updateByBo(updateBo);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 降序项目:成绩越大,积分分配越多
|
|
|
+ for (int i = 0; i < sortedScores.size(); i++) {
|
|
|
+ GameScoreVo score = sortedScores.get(i);
|
|
|
+ int points = i < pointValues.size() ? pointValues.get(i) : 0;
|
|
|
+
|
|
|
+ // 更新成绩记录
|
|
|
+ GameScoreBo updateBo = new GameScoreBo();
|
|
|
+ updateBo.setScoreId(score.getScoreId());
|
|
|
+ updateBo.setScorePoint(points);
|
|
|
+ updateBo.setEventId(eventId);
|
|
|
+ updateBo.setProjectId(projectId);
|
|
|
+
|
|
|
+ updateByBo(updateBo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 然后按积分重新排序确定排名
|
|
|
+ List<GameScoreVo> scoresWithPoints = queryList(new GameScoreBo() {{
|
|
|
+ setEventId(eventId);
|
|
|
+ setProjectId(projectId);
|
|
|
+ }});
|
|
|
+
|
|
|
+ // 按积分排序(降序,积分越高排名越靠前)
|
|
|
+ List<GameScoreVo> sortedByPoints = scoresWithPoints.stream()
|
|
|
+ .sorted((a, b) -> {
|
|
|
+ Integer aPoints = a.getScorePoint() != null ? a.getScorePoint() : 0;
|
|
|
+ Integer bPoints = b.getScorePoint() != null ? b.getScorePoint() : 0;
|
|
|
+ return Integer.compare(bPoints, aPoints);
|
|
|
+ })
|
|
|
+ .toList();
|
|
|
+
|
|
|
+ // 更新排名
|
|
|
+ for (int i = 0; i < sortedByPoints.size(); i++) {
|
|
|
+ GameScoreVo score = sortedByPoints.get(i);
|
|
|
+ int rank = i + 1;
|
|
|
+
|
|
|
+ // 更新排名
|
|
|
+ GameScoreBo updateBo = new GameScoreBo();
|
|
|
+ updateBo.setScoreId(score.getScoreId());
|
|
|
+ updateBo.setScoreRank(rank);
|
|
|
+ updateBo.setEventId(eventId);
|
|
|
+ updateBo.setProjectId(projectId);
|
|
|
+
|
|
|
+ updateByBo(updateBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理团体项目排名和积分计算
|
|
|
+ */
|
|
|
+ private Boolean handleTeamProjectRanking(List<GameScoreVo> allScores, String scoreValue, Long eventId, Long projectId) {
|
|
|
+ // 获取项目信息,确定排序方式
|
|
|
+ GameEventProjectVo project = gameEventProjectService.queryById(projectId);
|
|
|
+ if (project == null) {
|
|
|
+ log.error("项目不存在,projectId: {}", projectId);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ String orderType = project.getOrderType();
|
|
|
+ log.info("团体项目排名计算,projectId: {}, orderType: {}", projectId, orderType);
|
|
|
+
|
|
|
+ // 按队伍ID分组,汇总每个队伍的积分
|
|
|
+ Map<Long, Integer> teamTotalPoints = new HashMap<>();
|
|
|
+ Map<Long, BigDecimal> teamBestPerformance = new HashMap<>();
|
|
|
+ Map<Long, String> teamNames = new HashMap<>();
|
|
|
+// Map<Long, String> teamCodes = new HashMap<>();
|
|
|
+
|
|
|
+ for (GameScoreVo score : allScores) {
|
|
|
+ Long teamId = score.getTeamId();
|
|
|
+ if (teamId != null) {
|
|
|
+ // 累计队伍积分,处理null值
|
|
|
+ Integer currentPoints = score.getScorePoint() != null ? score.getScorePoint() : 0;
|
|
|
+ teamTotalPoints.merge(teamId, currentPoints, Integer::sum);
|
|
|
+
|
|
|
+ // 记录队伍最佳成绩
|
|
|
+ if (score.getTeamPerformance() != null && score.getTeamPerformance().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ BigDecimal currentBest = teamBestPerformance.get(teamId);
|
|
|
+ if (currentBest == null || score.getTeamPerformance().compareTo(currentBest) > 0) {
|
|
|
+ teamBestPerformance.put(teamId, score.getTeamPerformance());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 记录队伍信息
|
|
|
+ if (score.getTeamName() != null) {
|
|
|
+ teamNames.put(teamId, score.getTeamName());
|
|
|
+ }
|
|
|
+// if (score.getTeamCode() != null) {
|
|
|
+// teamCodes.put(teamId, score.getTeamCode());
|
|
|
+// }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据orderType决定队伍总积分排序方式
|
|
|
+ // orderType: 0-升序(积分越高排名越靠前),1-降序(积分越高排名越靠前)
|
|
|
+ List<Map.Entry<Long, Integer>> sortedTeams;
|
|
|
+ if ("0".equals(orderType)) {
|
|
|
+ // 升序:积分越高排名越靠前
|
|
|
+ sortedTeams = teamTotalPoints.entrySet().stream()
|
|
|
+ .sorted(Map.Entry.comparingByValue())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ } else {
|
|
|
+ // 降序:积分越高排名越靠前(默认)
|
|
|
+ sortedTeams = teamTotalPoints.entrySet().stream()
|
|
|
+ .sorted(Map.Entry.<Long, Integer>comparingByValue().reversed())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析积分分值
|
|
|
+ List<Integer> pointValues = Arrays.stream(scoreValue.split(","))
|
|
|
+ .map(String::trim)
|
|
|
+ .map(Integer::parseInt)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 根据orderType决定积分分配方式
|
|
|
+ if ("0".equals(orderType)) {
|
|
|
+ // 升序项目:成绩越小,积分分配越多
|
|
|
+ for (int i = 0; i < sortedTeams.size(); i++) {
|
|
|
+ Map.Entry<Long, Integer> teamEntry = sortedTeams.get(i);
|
|
|
+ Long teamId = teamEntry.getKey();
|
|
|
+ int rank = i + 1;
|
|
|
+ int points = i < pointValues.size() ? pointValues.get(i) : 0;
|
|
|
+
|
|
|
+ // 更新该队伍所有运动员的成绩记录
|
|
|
+ for (GameScoreVo score : allScores) {
|
|
|
+ if (teamId.equals(score.getTeamId())) {
|
|
|
+ GameScoreBo updateBo = new GameScoreBo();
|
|
|
+ updateBo.setScoreId(score.getScoreId());
|
|
|
+ updateBo.setScoreRank(rank);
|
|
|
+ updateBo.setScorePoint(points); // 使用队伍排名对应的积分
|
|
|
+ updateBo.setEventId(eventId);
|
|
|
+ updateBo.setProjectId(projectId);
|
|
|
+
|
|
|
+ updateByBo(updateBo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 降序项目:成绩越大,积分分配越多
|
|
|
+ for (int i = 0; i < sortedTeams.size(); i++) {
|
|
|
+ Map.Entry<Long, Integer> teamEntry = sortedTeams.get(i);
|
|
|
+ Long teamId = teamEntry.getKey();
|
|
|
+ int rank = i + 1;
|
|
|
+ int points = i < pointValues.size() ? pointValues.get(i) : 0;
|
|
|
+
|
|
|
+ // 更新该队伍所有运动员的成绩记录
|
|
|
+ for (GameScoreVo score : allScores) {
|
|
|
+ if (teamId.equals(score.getTeamId())) {
|
|
|
+ GameScoreBo updateBo = new GameScoreBo();
|
|
|
+ updateBo.setScoreId(score.getScoreId());
|
|
|
+ updateBo.setScoreRank(rank);
|
|
|
+ updateBo.setScorePoint(points); // 使用队伍排名对应的积分
|
|
|
+ updateBo.setEventId(eventId);
|
|
|
+ updateBo.setProjectId(projectId);
|
|
|
+
|
|
|
+ updateByBo(updateBo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|