Browse Source

feat(game): 添加赛事分组功能

- 新增 ExGameGroupDetailVo 和 ExGameGroupVo 数据传输对象
- 在 ExperienceVersionController 中添加分组查询接口
- 扩展 GameEventGroupMapper 添加分组信息查询方法
- 扩展 GameEventProjectMapper 添加分组详情查询逻辑
- 实现成绩格式化显示功能,支持不同项目类型的单位显示
- 添加 MyBatis XML 映射文件中的分组详情查询 SQL
zhou 1 ngày trước cách đây
mục cha
commit
2f7b149ada

+ 18 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/ExperienceVersionController.java

@@ -11,9 +11,9 @@ import org.dromara.system.domain.GameEvent;
 import org.dromara.system.domain.vo.app.*;
 import org.dromara.system.domain.bo.ExperienceEnrollSubmitBo;
 import org.dromara.system.mapper.GameEventConfigMapper;
+import org.dromara.system.mapper.GameEventGroupMapper;
 import org.dromara.system.mapper.GameEventMapper;
 import org.dromara.system.mapper.GameEventProjectMapper;
-import org.dromara.system.service.ISysOssService;
 import org.dromara.system.service.app.IUserEventService;
 import org.dromara.system.mapper.app.GameUserMapper;
 import org.springframework.validation.annotation.Validated;
@@ -38,6 +38,7 @@ public class ExperienceVersionController {
     private final IUserEventService userEventService;
     private final GameUserMapper gameUserMapper;
     private final GameEventProjectMapper projectMapper;
+    private final GameEventGroupMapper groupMapper;
 
     /**
      * 1、登录接口(微信小程序授权登录)
@@ -146,4 +147,20 @@ public class ExperienceVersionController {
     public R<List<ExGameScheduleVo>> getSchedule(@RequestParam("eventId") Long eventId) {
         return R.ok(TenantHelper.ignore(() -> projectMapper.selectSchedule(eventId)));
     }
+
+    /**
+     * 11、赛事分组-----获取该赛事所有分组名
+     */
+    @GetMapping("/group")
+    public R<List<ExGameGroupVo>> getGroup(@RequestParam("eventId") Long eventId) {
+        return R.ok(TenantHelper.ignore(() -> groupMapper.selectInfoWithGroup(eventId)));
+    }
+
+    /**
+     * 12、赛事分组-----获取该分组的分组详情
+     */
+    @GetMapping("/groupDetail")
+    public R<List<ExGameGroupDetailVo>> getGroupDetail(@RequestParam("groupId") Long groupId) {
+        return R.ok(TenantHelper.ignore(() -> projectMapper.selectGroupDetail(groupId)));
+    }
 }

+ 86 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/app/ExGameGroupDetailVo.java

@@ -0,0 +1,86 @@
+package org.dromara.system.domain.vo.app;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 赛事分组详情展示VO
+ *
+ * @author system
+ */
+@Data
+public class ExGameGroupDetailVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 运动员姓名
+     */
+    private String athleteName;
+
+    /**
+     * 运动员编号
+     */
+    private String athleteCode;
+
+    /**
+     * 队伍名称
+     */
+    private String teamName;
+
+    /**
+     * 成绩(根据成绩类型格式化后的字符串)
+     */
+    private String score;
+
+    /**
+     * 排名/名次
+     */
+    private Integer scoreRank;
+
+    /**
+     * 组次序号
+     */
+    private Long groupIndex;
+
+    /**
+     * 道次序号
+     */
+    private Long trackIndex;
+
+    /**
+     * 计数单位
+     */
+    @JsonIgnore
+    private String countUnit;
+
+    // 以下为辅助接收查询结果的临时字段,序列化时忽略
+
+    /**
+     * 成绩类型(如 1-计时类等)
+     */
+    @JsonIgnore
+    private String scoreRule;
+
+    /**
+     * 个人成绩
+     */
+    @JsonIgnore
+    private BigDecimal individualPerformance;
+
+    /**
+     * 团队成绩
+     */
+    @JsonIgnore
+    private BigDecimal teamPerformance;
+
+    /**
+     * 归类(0个人项目/1团体项目)
+     */
+    @JsonIgnore
+    private String classification;
+}

+ 58 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/app/ExGameGroupVo.java

@@ -0,0 +1,58 @@
+package org.dromara.system.domain.vo.app;
+
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class ExGameGroupVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 组id
+     */
+    private Long groupId;
+    /**
+     * 项目组名称
+     */
+    private String groupName;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 比赛阶段--game_stage
+     */
+    @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, other = "game_stage")
+    private String gameStage;
+
+    /**
+     * 组别开始时间
+     */
+    private Date beginTime;
+
+    /**
+     * 组别结束时间
+     */
+    private Date endTime;
+    /**
+     * 组数
+     */
+    private Long includeGroupNum;
+
+    /**
+     * 人数/组
+     */
+    private Long personNum;
+    /**
+     * 录取名次
+     */
+    private String roundType;
+
+
+}

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

@@ -12,6 +12,7 @@ import org.dromara.system.domain.GameReferee;
 import org.dromara.system.domain.vo.GameEventGroupVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.system.domain.vo.GameRefereeVo;
+import org.dromara.system.domain.vo.app.ExGameGroupVo;
 
 import java.util.List;
 
@@ -53,4 +54,14 @@ public interface GameEventGroupMapper extends BaseMapperPlus<GameEventGroup, Gam
     default List<GameEventGroupVo> selectEventGroupList(Wrapper<GameEventGroup> queryWrapper) {
         return this.selectVoList(queryWrapper);
     }
+
+    /**
+     * 获取赛事分组信息,并关联查询分组下的项目信息
+     */
+    @Select("SELECT g.group_id, g.group_name, g.project_id, p.project_name, p.game_stage, " +
+        "p.round_type, g.begin_time, g.end_time, g.include_group_num, g.person_num " +
+        "from game_event_group g " +
+        "left join game_event_project p on g.project_id = p.project_id and p.del_flag = '0' " +
+        "where g.del_flag = '0' and g.event_id = #{eventId} ")
+    List<ExGameGroupVo> selectInfoWithGroup(@Param("eventId") Long eventId);
 }

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

@@ -11,7 +11,11 @@ import org.dromara.system.domain.bo.GameEventProjectBo;
 import org.dromara.system.domain.vo.GameEventProjectVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.system.domain.vo.app.ExGameScheduleVo;
+import org.dromara.system.domain.vo.app.ExGameGroupDetailVo;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -123,4 +127,57 @@ public interface GameEventProjectMapper extends BaseMapperPlus<GameEventProject,
             }
             return scheduleList;
         }
+
+        /**
+         * 查询分组内所有运动员的原始信息
+         */
+        List<ExGameGroupDetailVo> selectGroupDetailRaw(@Param("groupId") Long groupId);
+
+        /**
+         * 根据分组ID查询该分组详情,包括各组次下各运动员的姓名、编号、队伍、格式化后的成绩、排名和道次。
+         */
+        default List<ExGameGroupDetailVo> selectGroupDetail(@Param("groupId") Long groupId) {
+            List<ExGameGroupDetailVo> list = this.selectGroupDetailRaw(groupId);
+            if (list == null || list.isEmpty()) {
+                return new ArrayList<>();
+            }
+            for (ExGameGroupDetailVo vo : list) {
+                // 1. 根据项目归类获取原始成绩
+                BigDecimal rawScore = null;
+                if ("0".equals(vo.getClassification())) {
+                    rawScore = vo.getIndividualPerformance();
+                } else if ("1".equals(vo.getClassification())) {
+                    rawScore = vo.getTeamPerformance();
+                }
+
+                // 2. 处理成绩显示和单位
+                if (rawScore != null) {
+                    // 去除尾随零
+                    String scoreStr = rawScore.stripTrailingZeros().toPlainString();
+                    String rule = vo.getScoreRule();
+
+                    if ("1".equals(rule)) {
+                        // 计时类附加 s
+                        vo.setScore(scoreStr + "s");
+                    } else if ("2".equals(rule) || "6".equals(rule) || "7".equals(rule)) {
+                        // 距离类、远度距离类、高度距离类附加 m
+                        vo.setScore(scoreStr + "m");
+                    } else if ("3".equals(rule) || "4".equals(rule)) {
+                        // 计数类附加项目配置的计数单位
+                        String unit = vo.getCountUnit();
+                        if (unit != null && !unit.isEmpty()) {
+                            vo.setScore(scoreStr + unit);
+                        } else {
+                            vo.setScore(scoreStr);
+                        }
+                    } else {
+                        // 其他类型直接显示
+                        vo.setScore(scoreStr);
+                    }
+                } else {
+                    vo.setScore("");
+                }
+            }
+            return list;
+        }
 }

+ 20 - 0
ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/GameEventProjectMapper.xml

@@ -46,4 +46,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY p.create_time DESC
     </select>
 
+    <select id="selectGroupDetailRaw" resultType="org.dromara.system.domain.vo.app.ExGameGroupDetailVo">
+        SELECT 
+            g.athlete_name AS athleteName,
+            g.athlete_code AS athleteCode,
+            g.team_name AS teamName,
+            g.group_index AS groupIndex,
+            g.track_index AS trackIndex,
+            p.score_rule AS scoreRule,
+            s.score_rank AS scoreRank,
+            s.individual_performance AS individualPerformance,
+            s.team_performance AS teamPerformance,
+            p.classification AS classification,
+            p.count_unit AS countUnit
+        FROM game_athlete_competition_group g
+        LEFT JOIN game_event_project p ON g.project_id = p.project_id AND p.del_flag = '0'
+        LEFT JOIN game_score s ON g.athlete_id = s.athlete_id AND g.project_id = s.project_id AND s.del_flag = '0'
+        WHERE g.group_id = #{groupId} AND g.status = '0'
+        ORDER BY g.group_index ASC, g.track_index ASC
+    </select>
+
 </mapper>