Procházet zdrojové kódy

feat(game-score): 新增看板排名数据接口

- 在GameScoreController中添加getRankingBoardData方法提供极简排名接口
- 新增RankingBoardVO视图对象用于封装看板排名数据
- 在GameScoreMapper中添加selectRankingBoardData查询方法
- 实现GameScoreService中的getRankingBoardData业务逻辑
- 配置GameScoreMapper.xml中的selectRankingBoardData查询语句
- 支持个人项目和团体项目的排名数据查询
- 集成计时类成绩的数据格式转换功能
zhou před 1 týdnem
rodič
revize
9a9c2dd831

+ 14 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/GameScoreController.java

@@ -19,6 +19,7 @@ import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.system.domain.vo.GameScoreVo;
+import org.dromara.system.domain.vo.RankingBoardVO;
 import org.dromara.system.domain.bo.GameScoreBo;
 import org.dromara.system.domain.bo.GameScoreBo;
 import org.dromara.system.service.IGameScoreService;
 import org.dromara.system.service.IGameScoreService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -135,6 +136,19 @@ public class GameScoreController extends BaseController {
         return R.ok(result);
         return R.ok(result);
     }
     }
 
 
+    /**
+     * 获取看板排名数据(极简接口)
+     */
+    @SaCheckPermission("system:gameScore:list")
+    @GetMapping("/rankingBoard")
+    public R<List<RankingBoardVO>> getRankingBoardData(
+            @RequestParam("eventId") Long eventId,
+            @RequestParam("projectId") Long projectId,
+            @RequestParam("classification") String classification,
+            @RequestParam(value = "rgId", required = false) Long rgId) {
+        return R.ok(gameScoreService.getRankingBoardData(eventId, projectId, classification, rgId));
+    }
+
     /**
     /**
      * 更新成绩并重新计算排名积分
      * 更新成绩并重新计算排名积分
      */
      */

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

@@ -0,0 +1,51 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 看板排名数据视图对象
+ */
+@Data
+public class RankingBoardVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 排名
+     */
+    private Integer rank;
+
+    /**
+     * 姓名/队伍名称
+     */
+    private String name;
+
+    /**
+     * 代表队名称
+     */
+    private String teamName;
+
+    /**
+     * 成绩显示文本
+     */
+    private String score;
+
+    /**
+     * 分组名称
+     */
+    private String rgName;
+
+    /**
+     * ID (运动员ID或队伍ID)
+     */
+    private Long id;
+
+    /**
+     * 分组ID
+     */
+    private Long rgId;
+
+}

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

@@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Select;
 import org.dromara.system.domain.vo.GameProjectStatsVo;
 import org.dromara.system.domain.vo.GameProjectStatsVo;
 import org.dromara.system.domain.GameScore;
 import org.dromara.system.domain.GameScore;
 import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.system.domain.vo.GameScoreVo;
+import org.dromara.system.domain.vo.RankingBoardVO;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 
 import java.util.Collection;
 import java.util.Collection;
@@ -20,6 +21,14 @@ import java.util.List;
 @Mapper
 @Mapper
 public interface GameScoreMapper extends BaseMapperPlus<GameScore, GameScoreVo> {
 public interface GameScoreMapper extends BaseMapperPlus<GameScore, GameScoreVo> {
 
 
+    /**
+     * 获取看板排名数据
+     */
+    List<RankingBoardVO> selectRankingBoardData(@Param("eventId") Long eventId,
+                                               @Param("projectId") Long projectId,
+                                               @Param("classification") String classification,
+                                               @Param("rgId") Long rgId);
+
     /**
     /**
      * 批量统计项目的参赛和完赛情况
      * 批量统计项目的参赛和完赛情况
      */
      */

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

@@ -2,6 +2,7 @@ package org.dromara.system.service;
 
 
 import org.dromara.system.domain.vo.AppScoreVo;
 import org.dromara.system.domain.vo.AppScoreVo;
 import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.system.domain.vo.GameScoreVo;
+import org.dromara.system.domain.vo.RankingBoardVO;
 import org.dromara.system.domain.bo.GameScoreBo;
 import org.dromara.system.domain.bo.GameScoreBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -53,6 +54,11 @@ public interface IGameScoreService {
      */
      */
     Boolean insertByBo(GameScoreBo bo);
     Boolean insertByBo(GameScoreBo bo);
 
 
+    /**
+     * 获取看板排名数据
+     */
+    List<RankingBoardVO> getRankingBoardData(Long eventId, Long projectId, String classification, Long rgId);
+
     /**
     /**
      * 修改成绩
      * 修改成绩
      *
      *

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

@@ -190,6 +190,34 @@ public class GameScoreServiceImpl implements IGameScoreService {
 
 
     }
     }
 
 
+    @Override
+    public List<RankingBoardVO> getRankingBoardData(Long eventId, Long projectId, String classification, Long rgId) {
+        // 1. 获取项目信息,判断是否为计时类
+        GameEventProjectVo project = gameEventProjectService.queryById(projectId);
+        boolean isTiming = isTimingProject(project);
+
+        // 2. 调用 Mapper 获取极简排名数据
+        List<RankingBoardVO> list = baseMapper.selectRankingBoardData(eventId, projectId, classification, rgId);
+
+        // 3. 处理成绩显示格式(针对计时类进行转换)
+        if (isTiming && list != null) {
+            for (RankingBoardVO item : list) {
+                if (StringUtils.isNotBlank(item.getScore())) {
+                    try {
+                        BigDecimal decimalScore = new BigDecimal(item.getScore());
+                        String timeFormat = convertDecimalToTimeScore(decimalScore);
+                        if (timeFormat != null) {
+                            item.setScore(timeFormat);
+                        }
+                    } catch (Exception e) {
+                        log.warn("看板排名数据成绩转换失败: {}, score: {}", item.getName(), item.getScore());
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
     /**
     /**
      * 校验并批量删除成绩信息
      * 校验并批量删除成绩信息
      *
      *

+ 51 - 1
ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/GameScoreMapper.xml

@@ -73,10 +73,60 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         AND del_flag = '0'
         AND del_flag = '0'
     </select>
     </select>
 
 
-    <select id="deleteByAthleteIds" resultType="int">
+    <delete id="deleteByAthleteIds">
         DELETE FROM game_score WHERE athlete_id IN
         DELETE FROM game_score WHERE athlete_id IN
         <foreach item="athleteId" collection="athleteIds" separator="," open="(" close=")">
         <foreach item="athleteId" collection="athleteIds" separator="," open="(" close=")">
             #{athleteId}
             #{athleteId}
         </foreach>
         </foreach>
+    </delete>
+
+    <select id="selectRankingBoardData" resultType="org.dromara.system.domain.vo.RankingBoardVO">
+        <choose>
+            <when test='classification == "0"'>
+                <!-- 个人项目 -->
+                SELECT
+                    s.score_rank as `rank`,
+                    a.name as `name`,
+                    t.team_name as teamName,
+                    CAST(s.individual_performance AS CHAR) as score,
+                    rg.rg_name as rgName,
+                    a.athlete_id as id,
+                    rg.rg_id as rgId
+                FROM game_score s
+                LEFT JOIN game_athlete a ON s.athlete_id = a.athlete_id
+                LEFT JOIN game_team t ON a.team_id = t.team_id
+                LEFT JOIN game_rank_group rg ON t.rg_id = rg.rg_id
+                WHERE s.event_id = #{eventId}
+                  AND s.project_id = #{projectId}
+                  AND s.del_flag = '0'
+                  <if test="rgId != null">
+                    AND (rg.rg_id = #{rgId} OR FIND_IN_SET(#{rgId}, rg.ancestors))
+                  </if>
+                ORDER BY s.score_rank ASC
+            </when>
+            <otherwise>
+                <!-- 团体项目 -->
+                SELECT
+                    s.score_rank as `rank`,
+                    t.team_name as `name`,
+                    t.team_name as teamName,
+                    CAST(s.team_performance AS CHAR) as score,
+                    rg.rg_name as rgName,
+                    t.team_id as id,
+                    rg.rg_id as rgId
+                FROM (
+                    SELECT DISTINCT team_id, score_rank, team_performance, event_id, project_id
+                    FROM game_score
+                    WHERE event_id = #{eventId} AND project_id = #{projectId} AND del_flag = '0'
+                ) s
+                LEFT JOIN game_team t ON s.team_id = t.team_id
+                LEFT JOIN game_rank_group rg ON t.rg_id = rg.rg_id
+                WHERE 1=1
+                  <if test="rgId != null">
+                    AND (rg.rg_id = #{rgId} OR FIND_IN_SET(#{rgId}, rg.ancestors))
+                  </if>
+                ORDER BY s.score_rank ASC
+            </otherwise>
+        </choose>
     </select>
     </select>
 </mapper>
 </mapper>