Explorar el Código

feat(game): 添加成绩明细功能并重构相关数据结构

- 新增 GameAppScoreDetailBo 业务对象用于成绩明细管理
- 将 ScorePreviewUpdateBo 中的 details 字段重命名为 chengji
- 将 ScorePreviewUpdateBo 中的 athleteCode 字段重命名为 num
- 将 ScorePreviewUpdateBo 中的 teamName 字段重命名为 duiwu
- 将 ScorePreviewUpdateBo 中的 score 字段描述改为最终成绩
- 在 ScorePreviewVo 中将 athleteId 重命名为 id
- 在 ScorePreviewVo 中将 athleteCode 重命名为 num
- 在 ScorePreviewVo 中将 teamName 重命名为 duiwu
- 在 ScorePreviewVo 中将 details 重命名为 chengji
- 在 ScoreSheetDetailVo 中将 faultA 和 faultB 重命名为 shiwuA 和 shiwuB
- 在 ScoreSheetVo 中将 scoreRule 重命名为 paiMing
- 在 ScoreSheetVo 中将 projectType 重命名为 type
- 在 ScoreSubmitDetailBo 中新增 shiwuA 和 shiwuB 字段
- 更新 ToClientMapper.xml 中的字段映射关系
- 修改 ToClientServiceImpl 中的成绩明细转换逻辑
- 更新服务层中的字段引用和分组逻辑
zhou hace 1 día
padre
commit
a7ce6aa688

+ 77 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/GameAppScoreDetailBo.java

@@ -0,0 +1,77 @@
+package org.dromara.system.domain.bo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 成绩明细业务对象 game_score_detail
+ *
+ * @author z
+ * @date 2026-05-08
+ */
+@Data
+public class GameAppScoreDetailBo {
+
+    /**
+     * 明细主键
+     */
+    private Long detailId;
+    /**
+     * 关联主表score_id
+     */
+    private Long scoreId;
+    /**
+     * 项目ID
+     */
+    private Long projectId;
+    /**
+     * 队伍ID
+     */
+    private Long teamId;
+    /**
+     * 运动员ID
+     */
+    private Long id;
+
+    /**
+     * 轮次/尝试序号(如1,2,3表示第1,2,3次)
+     */
+    private Integer attemptIndex;
+
+    /**
+     * 单次原始成绩
+     */
+    @NotNull(message = "单次原始成绩不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal num;
+
+    /**
+     * 单次失误次数A
+     */
+    private Integer shiwuA;
+
+    /**
+     * 单次失误次数B
+     */
+    private Integer shiwuB;
+
+    /**
+     * 是否有效(0有效 1犯规/无效)
+     */
+    private String isValid;
+
+    /**
+     * 单次备注(如:踩线)
+     */
+    private String remark;
+
+
+
+}

+ 5 - 5
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/ScorePreviewUpdateBo.java

@@ -17,18 +17,18 @@ public class ScorePreviewUpdateBo {
     private Long scoreId;
 
     /** 队员号码 */
-    private String athleteCode;
+    private String num;
 
     /** 队员姓名 */
     private String name;
 
     /** 队伍名称 */
-    private String teamName;
+    private String duiwu;
 
-    /** 成绩 */
-    @NotBlank(message = "成绩不能为空")
+    /** 最终成绩 */
+    @NotBlank(message = "最终成绩不能为空")
     private String score;
 
     /** 成绩明细列表 */
-    private List<GameScoreDetailBo> details;
+    private List<GameAppScoreDetailBo> chengji;
 }

+ 4 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/ScoreSubmitDetailBo.java

@@ -20,4 +20,8 @@ public class ScoreSubmitDetailBo implements Serializable {
     private Integer attemptIndex;
     /** 成绩值 */
     private BigDecimal num;
+    /** 失误次数A */
+    private Integer shiwuA;
+    /** 失误次数B */
+    private Integer shiwuB;
 }

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

@@ -18,15 +18,15 @@ public class ScorePreviewVo implements Serializable {
     /** 成绩ID */
     private Long scoreId;
     /** 运动员ID */
-    private Long athleteId;
+    private Long id;
     /** 队伍ID */
     private Long teamId;
     /** 队员号码 */
-    private String athleteCode;
+    private String num;
     /** 队员姓名 */
     private String name;
     /** 队伍名称 */
-    private String teamName;
+    private String duiwu;
     /** 成绩 */
     private String score;
     /** 积分 */
@@ -35,5 +35,5 @@ public class ScorePreviewVo implements Serializable {
     private Integer scoreRank;
 
     /** 成绩明细列表 */
-    private List<ScoreSheetDetailVo> details;
+    private List<ScoreSheetDetailVo> chengji;
 }

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

@@ -4,7 +4,6 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
-import java.math.BigDecimal;
 
 /**
  * 成绩记录明细视图对象
@@ -23,9 +22,9 @@ public class ScoreSheetDetailVo implements Serializable {
     /** 成绩值 */
     private String num;
     /** 失误A */
-    private Integer faultA;
+    private Integer shiwuA;
     /** 失误B */
-    private Integer faultB;
+    private Integer shiwuB;
     /** 运动员ID (逻辑关联使用) */
     private Long Id;
     /** 队伍ID (逻辑关联使用) */

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

@@ -17,11 +17,11 @@ public class ScoreSheetVo implements Serializable {
     /** 赛事名称 */
     private String name;
     /** 计算规则 */
-    private String scoreRule;
+    private String paiMing;
     /** 项目名称 */
     private String projectName;
     /** 项目类型 */
-    private String projectType;
+    private String type;
     /** 项目分类 (0个人 1团体) */
     private String classification;
     /** 参赛性别 */

+ 14 - 12
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/app/ToClientServiceImpl.java

@@ -320,8 +320,8 @@ public class ToClientServiceImpl implements IToClientService {
         dvo.setScoreId(d.getScoreId());
         dvo.setAttemptIndex(d.getAttemptIndex());
         dvo.setNum(d.getPerformanceValue() != null ? d.getPerformanceValue().toString() : null);
-        dvo.setFaultA(d.getFaultA());
-        dvo.setFaultB(d.getFaultB());
+        dvo.setShiwuA(d.getFaultA());
+        dvo.setShiwuB(d.getFaultB());
         // 传递关联 ID 供分组使用
         dvo.setId(d.getAthleteId());
         dvo.setTeamId(d.getTeamId());
@@ -485,6 +485,8 @@ public class ToClientServiceImpl implements IToClientService {
                     dbo.setDetailId(d.getDetailId());
                     dbo.setAttemptIndex(d.getAttemptIndex());
                     dbo.setPerformanceValue(d.getNum());
+                    dbo.setFaultA(d.getShiwuA());
+                    dbo.setFaultB(d.getShiwuB());
                     return dbo;
                 }).toList();
                 scoreBo.setDetails(details);
@@ -539,7 +541,7 @@ public class ToClientServiceImpl implements IToClientService {
                         .map(this::convertToDetailVo)
                         .collect(Collectors.groupingBy(ScoreSheetDetailVo::getTeamId));
 
-                list.forEach(item -> item.setDetails(detailMap.get(item.getTeamId())));
+                list.forEach(item -> item.setChengji(detailMap.get(item.getTeamId())));
             } else {
                 // 个人项目:按 athleteId 分组
                 detailMap = allDetails.stream()
@@ -548,7 +550,7 @@ public class ToClientServiceImpl implements IToClientService {
                         .collect(Collectors.groupingBy(ScoreSheetDetailVo::getId));
 
                 list.forEach(item -> {
-                    List<ScoreSheetDetailVo> details = detailMap.get(item.getAthleteId());
+                    List<ScoreSheetDetailVo> details = detailMap.get(item.getId());
                     if (details == null && item.getScoreId() != null) {
                         // 兜底:按 scoreId 匹配
                         details = allDetails.stream()
@@ -556,7 +558,7 @@ public class ToClientServiceImpl implements IToClientService {
                                 .map(this::convertToDetailVo)
                                 .toList();
                     }
-                    item.setDetails(details);
+                    item.setChengji(details);
                 });
             }
         }
@@ -568,8 +570,8 @@ public class ToClientServiceImpl implements IToClientService {
                     item.setScore(
                             convertDecimalToTimeScore(new BigDecimal(item.getScore()), project.getTimingFormat()));
                 }
-                if (item.getDetails() != null) {
-                    item.getDetails().forEach(detail -> {
+                if (item.getChengji() != null) {
+                    item.getChengji().forEach(detail -> {
                         if (StringUtils.isNotBlank(detail.getNum())) {
                             detail.setNum(convertDecimalToTimeScore(
                                     new BigDecimal(detail.getNum()),
@@ -599,15 +601,15 @@ public class ToClientServiceImpl implements IToClientService {
         scoreBo.setAthleteId(score.getAthleteId());
         scoreBo.setTeamId(score.getTeamId());
 
-        if (CollectionUtils.isNotEmpty(bo.getDetails())) {
+        if (CollectionUtils.isNotEmpty(bo.getChengji())) {
             // 如果提交了明细列表,则优先更新明细
-            List<GameScoreDetailBo> details = bo.getDetails().stream().map(d -> {
+            List<GameScoreDetailBo> details = bo.getChengji().stream().map(d -> {
                 GameScoreDetailBo dbo = new GameScoreDetailBo();
                 dbo.setDetailId(d.getDetailId());
                 dbo.setAttemptIndex(d.getAttemptIndex());
-                dbo.setPerformanceValue(d.getPerformanceValue());
-                dbo.setFaultA(d.getFaultA());
-                dbo.setFaultB(d.getFaultB());
+                dbo.setPerformanceValue(d.getNum());
+                dbo.setFaultA(d.getShiwuA());
+                dbo.setFaultB(d.getShiwuB());
                 return dbo;
             }).toList();
             scoreBo.setDetails(details);

+ 17 - 17
ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/app/ToClientMapper.xml

@@ -5,28 +5,28 @@
 <mapper namespace="org.dromara.system.mapper.app.ToClientMapper">
     <select id="selectScoreSheetMetadata" resultType="org.dromara.system.domain.vo.ScoreSheetVo">
         SELECT
-            e.event_name as eventName,
-            p.score_rule as scoreRule,
+            e.event_name as name,
+            p.score_rule as paiMing,
             p.project_name as projectName,
-            p.project_type as projectType,
+            p.project_type as type,
             p.classification as classification,
-            p.gender as gender,
-            p.rg_name as rgName,
-            p.game_stage as gameStage,
-            p.game_round as gameRound,
+            p.gender as sex,
+            p.rg_name as zu,
+            p.game_stage as jieduan,
+            p.game_round as lunci,
             DATE_FORMAT(p.start_time, '%Y-%m-%d %H:%i:%s') as startTime,
             (SELECT GROUP_CONCAT(name SEPARATOR ',') FROM game_referee WHERE del_flag = '0'
                     AND event_id = p.event_id
                     AND (JSON_CONTAINS(p.referee_group, JSON_ARRAY(referee_id))
                              OR JSON_CONTAINS(p.referee_group, JSON_ARRAY(CAST(referee_id AS CHAR))))
-            ) as refereeName,
-            p.timing_format as timingFormat,
+            ) as caipan,
+            p.timing_format as guize,
             (SELECT config_value FROM game_event_config WHERE event_id = p.event_id
                                                           AND config_key = 'event_tip' AND del_flag = '0' LIMIT 1) as eventTip,
             IFNULL((SELECT COUNT(*) FROM game_athlete a WHERE a.event_id = p.event_id AND a.del_flag = '0'
                 AND (JSON_CONTAINS(a.project_value, JSON_ARRAY(p.project_id))
                 OR JSON_CONTAINS(a.project_value, JSON_ARRAY(CAST(p.project_id AS CHAR)))))
-                , 0) as totalParticipants,
+                , 0) as popnum,
             IFNULL((SELECT COUNT(*)
                     FROM game_score s
                     JOIN game_athlete a ON s.athlete_id = a.athlete_id AND a.del_flag = '0'
@@ -41,12 +41,12 @@
 
     <select id="selectScoreSheetItems" resultType="org.dromara.system.domain.vo.ScoreSheetItemVo">
         SELECT
-            a.athlete_id as athleteId,
+            a.athlete_id as id,
             a.team_id as teamId,
-            a.athlete_code as athleteCode,
+            a.athlete_code as num,
             a.name as name,
-            t.team_name as teamName,
-            a.track_index as trackIndex,
+            t.team_name as duiwu,
+            a.track_index as xuhao,
             s.score_id as scoreId,
             CASE
                 WHEN p.classification = '0' THEN s.individual_performance
@@ -68,11 +68,11 @@
     <select id="selectScorePreviewList" resultType="org.dromara.system.domain.vo.ScorePreviewVo">
         SELECT
             s.score_id as scoreId,
-            s.athlete_id as athleteId,
+            s.athlete_id as id,
             s.team_id as teamId,
-            a.athlete_code as athleteCode,
+            a.athlete_code as num,
             a.name as name,
-            t.team_name as teamName,
+            t.team_name as duiwu,
             CASE
                 WHEN p.classification = '0' THEN CAST(s.individual_performance AS CHAR)
                 ELSE CAST(s.team_performance AS CHAR)