Browse Source

feat(game-event): 小程序端增加成绩查询功能

- 新增 AppScoreVo 类用于小程序端成绩展示
- 在 GameScoreMapper 中添加相关查询方法
- 实现 GameScoreServiceImpl 中的 listAppScore 方法
- 在 IGameScoreService 中添加 listAppScore 接口
- 在 ScoreController 中添加成绩查询的 REST 接口
zhou 2 days ago
parent
commit
94e865d380

+ 13 - 4
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/ScoreController.java

@@ -2,14 +2,13 @@ package org.dromara.system.controller.app;
 
 import cn.dev33.satoken.annotation.SaIgnore;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.vo.AppScoreVo;
 import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.system.domain.vo.GameTeamVo;
 import org.dromara.system.service.IGameScoreService;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
@@ -36,4 +35,14 @@ public class ScoreController {
         return gameScoreService.getAppScore(eventId);
     }
 
+    /**
+     * 查询成绩
+     */
+    @GetMapping("/list")
+    public R<List<AppScoreVo>> listScore(
+        @RequestParam("eventId") Long eventId,
+        @RequestParam("projectId") Long projectId){
+        List<AppScoreVo> result = gameScoreService.listAppScore(eventId, projectId);
+        return R.ok(result);
+    }
 }

+ 33 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/AppScoreVo.java

@@ -0,0 +1,33 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 小程序端查询成绩信息结果Vo
+ */
+@Data
+public class AppScoreVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long projectId;
+    private String projectName;
+    private String classification;
+
+    private Long teamId;
+    private String teamName;
+
+    private Long athleteId;
+    private String athleteName;
+
+    private BigDecimal individualPerformance;
+    private BigDecimal teamPerformance;
+    private Integer scorePoint;
+    private Integer scoreRank;
+
+}

+ 3 - 3
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/GameTeamVo.java

@@ -34,13 +34,13 @@ public class GameTeamVo implements Serializable {
     /**
      * 赛事ID
      */
-    @ExcelProperty(value = "赛事ID")
+//    @ExcelProperty(value = "赛事ID")
     private Long eventId;
 
     /**
      * 赛事ID
      */
-    @ExcelProperty(value = "赛事名称")
+//    @ExcelProperty(value = "赛事名称")
     private String eventName;
 
     /**
@@ -83,7 +83,7 @@ public class GameTeamVo implements Serializable {
     /**
      * 号码段
      */
-    @ExcelProperty(value = "号码段")
+//    @ExcelProperty(value = "号码段")
     private String numberRange;
 
     /**

+ 3 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/GameScoreMapper.java

@@ -1,5 +1,6 @@
 package org.dromara.system.mapper;
 
+import org.apache.ibatis.annotations.Select;
 import org.dromara.system.domain.GameScore;
 import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@@ -30,4 +31,6 @@ public interface GameScoreMapper extends BaseMapperPlus<GameScore, GameScoreVo>
      * @return
      */
     GameScoreVo selectVoByAthleteIdAndProjectId(Long athleteId, Long projectId);
+
+
 }

+ 9 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameScoreService.java

@@ -1,5 +1,6 @@
 package org.dromara.system.service;
 
+import org.dromara.system.domain.vo.AppScoreVo;
 import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.system.domain.bo.GameScoreBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -116,4 +117,12 @@ public interface IGameScoreService {
      * @param response HTTP响应对象
      */
     void exportScoresSummary(Long eventId, HttpServletResponse response);
+
+    /**
+     * 用户端查询项目成绩信息
+     * @param eventId
+     * @param projectId
+     * @return
+     */
+    List<AppScoreVo> listAppScore(Long eventId, Long projectId);
 }

+ 100 - 5
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameScoreServiceImpl.java

@@ -13,19 +13,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.system.domain.GameAthlete;
 import org.dromara.system.domain.GameEventProject;
 import org.dromara.system.domain.constant.GameEventConstant;
 import org.dromara.system.domain.constant.ProjectClassification;
 import org.dromara.system.domain.constant.SortType;
-import org.dromara.system.domain.vo.GameAthleteVo;
-import org.dromara.system.domain.vo.GameEventProjectVo;
-import org.dromara.system.domain.vo.GameTeamVo;
+import org.dromara.system.domain.vo.*;
+import org.dromara.system.mapper.GameEventProjectMapper;
 import org.dromara.system.service.IGameAthleteService;
 import org.dromara.system.service.IGameEventProjectService;
 import org.dromara.system.service.IGameTeamService;
 import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.GameScoreBo;
-import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.system.domain.GameScore;
 import org.dromara.system.mapper.GameScoreMapper;
 import org.dromara.system.service.IGameScoreService;
@@ -36,7 +35,6 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import jakarta.servlet.http.HttpServletResponse;
 import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.system.domain.vo.GameScoreSummaryExportVo;
 import org.dromara.system.domain.bo.GameEventProjectBo;
 import org.dromara.system.domain.bo.GameTeamBo;
 
@@ -60,6 +58,8 @@ public class GameScoreServiceImpl implements IGameScoreService {
     private final GameScoreMapper baseMapper;
     private final IGameTeamService gameTeamService;
     private final IGameAthleteService gameAthleteService;
+
+    private final GameEventProjectMapper projectMapper;
     private final IGameEventProjectService gameEventProjectService;
 
     /**
@@ -885,6 +885,101 @@ public class GameScoreServiceImpl implements IGameScoreService {
         }
     }
 
+    /**
+     * 用户端查询项目成绩信息
+     */
+    @Override
+    public List<AppScoreVo> listAppScore(Long eventId, Long projectId) {
+        // 获取项目详细信息
+        GameEventProjectVo project = gameEventProjectService.queryById(projectId);
+
+        // 查询参与了该项目的运动员
+        List<GameAthleteVo> athletes = gameAthleteService.queryListByEventIdAndProjectId(eventId, projectId, null);
+
+        // 获取所有相关成绩
+        GameScoreBo scoreBo = new GameScoreBo();
+        scoreBo.setEventId(eventId);
+        scoreBo.setProjectId(projectId);
+        List<GameScoreVo> scores = queryList(scoreBo);
+
+        // 创建成绩映射 athleteId -> GameScoreVo
+        Map<Long, GameScoreVo> scoreMap = scores.stream()
+            .collect(Collectors.toMap(GameScoreVo::getAthleteId, Function.identity(), (existing, replacement) -> existing));
+
+        // 队伍id与名称的映射
+        Set<Long> teamIds = athletes.stream().map(GameAthleteVo::getTeamId).collect(Collectors.toSet());
+        Map<Long, String>  teamMap = gameTeamService.queryTeamIdAndName(teamIds);
+
+        List<AppScoreVo> result = result = athletes.stream().map(athlete -> {
+            AppScoreVo vo = new AppScoreVo();
+            vo.setProjectId(projectId);
+            vo.setProjectName(project != null ? project.getProjectName() : "");
+            vo.setClassification(project != null ? project.getClassification() : "");
+            vo.setAthleteId(athlete.getAthleteId());
+            vo.setAthleteName(athlete.getName());
+            vo.setTeamId(athlete.getTeamId());
+
+            // 获取队伍信息
+            if (athlete.getTeamId() != null) {
+                String teamName = teamMap.get(athlete.getTeamId());
+                vo.setTeamName(teamName != null ? teamName : "");
+            }
+
+            // 获取成绩信息
+            GameScoreVo score = scoreMap.get(athlete.getAthleteId());
+            if (score != null) {
+                vo.setIndividualPerformance(convertToBigDecimal(score.getIndividualPerformance()));
+                vo.setTeamPerformance(convertToBigDecimal(score.getTeamPerformance()));
+                vo.setScorePoint(score.getScorePoint());
+                vo.setScoreRank(score.getScoreRank());
+            } else {
+                vo.setIndividualPerformance(BigDecimal.ZERO);
+                vo.setTeamPerformance(BigDecimal.ZERO);
+                vo.setScorePoint(0);
+                vo.setScoreRank(0);
+            }
+
+            return vo;
+        }).toList();
+
+        // 按排名排序
+        return result.stream()
+            .sorted(Comparator.comparing(AppScoreVo::getScoreRank))
+            .collect(Collectors.toList());
+    }
+
+    /**
+     * 安全地将对象转换为BigDecimal
+     * @param value 待转换的值
+     * @return BigDecimal值
+     */
+    private BigDecimal convertToBigDecimal(Object value) {
+        if (value == null) {
+            return BigDecimal.ZERO;
+        }
+
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
+        } else if (value instanceof Double) {
+            return BigDecimal.valueOf((Double) value);
+        } else if (value instanceof Float) {
+            return BigDecimal.valueOf((Float) value);
+        } else if (value instanceof String) {
+            try {
+                return new BigDecimal((String) value);
+            } catch (NumberFormatException e) {
+                return BigDecimal.ZERO;
+            }
+        } else if (value instanceof Integer) {
+            return BigDecimal.valueOf((Integer) value);
+        } else if (value instanceof Long) {
+            return BigDecimal.valueOf((Long) value);
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+
     /**
      * 动态列导出Excel
      */

+ 1 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameTeamServiceImpl.java

@@ -363,7 +363,7 @@ public class GameTeamServiceImpl implements IGameTeamService {
     public Map<Long, String> queryTeamIdAndName(Set<Long> teamIds) {
         List<GameTeamVo> list = baseMapper.selectVoList(
             Wrappers.lambdaQuery(GameTeam.class)
-                .in(GameTeam::getEventId, teamIds)
+                .in(GameTeam::getTeamId, teamIds)
         );
         Map<Long, String> map = list.stream()
             .collect(Collectors.toMap(GameTeamVo::getTeamId, GameTeamVo::getTeamName));