Przeglądaj źródła

refactor(game): 重构游戏赛事模块的数据结构和接口

- 重命名ClientProjectSaveBo类中的字段名称为更简洁的形式,如eventName改为name、eventCode改为bianhao
- 新增GameAppEvent和GameAppProject实体类用于应用端数据传输
- 更新IToClientService接口返回类型为新的应用实体类
- 修改MarkdownController中删除方法的参数验证消息
- 重命名ScoreSheetDetailVo、ScoreSheetItemVo、ScoreSheetVo中的字段名称
- 更新ScoreSubmitBo、ScoreSubmitDetailBo、ScoreSubmitItemBo中的字段映射关系
- 在ToClientController中更新接口返回类型并添加防重复提交注解
- 重构ToClientServiceImpl中的数据转换逻辑,使用BeanUtil进行属性复制
- 更新服务实现类中的字段映射和数据处理逻辑,统一使用新的字段名称
zhou 1 dzień temu
rodzic
commit
97b666f03a

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

@@ -79,7 +79,7 @@ public class MarkdownController extends BaseController {
     @DeleteMapping("/{eventId}/{type}")
     public R<Void> remove(@NotNull(message = "赛事id不能为空")
                           @PathVariable Long eventId,
-                          @NotNull(message = "赛事id不能为空")
+                          @NotNull(message = "文本类型不能为空")
                           @PathVariable Integer type) {
         return toAjax(appEventMdService.deleteByEventIdAndType(eventId, type));
     }

+ 5 - 2
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app_client/ToClientController.java

@@ -5,6 +5,8 @@ import org.dromara.common.core.domain.R;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
+import org.dromara.system.domain.GameAppEvent;
+import org.dromara.system.domain.GameAppProject;
 import org.dromara.system.domain.GameEvent;
 import org.dromara.system.domain.GameEventProject;
 import org.dromara.system.domain.bo.ClientLoginBo;
@@ -45,13 +47,14 @@ public class ToClientController {
      * 赛事列表接口 (接口2)
      */
     @GetMapping("/eventList")
-    public R<List<GameEvent>> eventList() {
+    public R<List<GameAppEvent>> eventList() {
         return R.ok(toClientService.getEventList());
     }
 
     /**
      * 赛事列表项删除接口 (接口3)
      */
+    @RepeatSubmit()
     @Log(title = "app客户端删除赛事项", businessType = BusinessType.DELETE)
     @DeleteMapping("/eventRemove/{eventId}")
     public R<Void> eventRemove(@PathVariable Long eventId) {
@@ -74,7 +77,7 @@ public class ToClientController {
      * 项目列表接口 (接口5)
      */
     @GetMapping("/projectList")
-    public R<List<GameEventProject>> projectList(@RequestParam Long eventId) {
+    public R<List<GameAppProject>> projectList(@RequestParam Long eventId) {
         return R.ok(toClientService.getProjectList(eventId));
     }
 

+ 114 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/GameAppEvent.java

@@ -0,0 +1,114 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 赛事基本信息对象 game_event
+ *
+ * @author zlt
+ * @date 2025-07-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class GameAppEvent extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 赛事编号
+     */
+    private String bianhao;
+
+    /**
+     * 赛事名称
+     */
+    private String name;
+
+    /**
+     * 赛事类型
+     */
+    private String eventType;
+
+    /**
+     * 举办地点
+     */
+    private String location;
+
+    /**
+     * 用途
+     */
+    private String purpose;
+
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 每人限报项目数
+     */
+    private Integer limitApplication;
+
+    /**
+     * 赛事链接
+     */
+    private String eventUrl;
+
+    /**
+     * 裁判码
+     */
+    private String refereeUrl;
+
+    /**
+     * 签到码
+     */
+    private String registerUrl;
+
+    /**
+     * 举办单位
+     */
+    private String unit;
+
+    /**
+     * 是否默认赛事
+     */
+    private String isDefault;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 174 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/GameAppProject.java

@@ -0,0 +1,174 @@
+package org.dromara.system.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 赛事项目对象 game_event_project
+ *
+ * @author zlt
+ * @date 2025-07-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class GameAppProject extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long projectId;
+
+    /**
+     * 赛事ID
+     */
+    private Long id;
+
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 项目类型--参考字典game_project_type,一般不修改
+     * (如1-径赛,2-田赛,3-趣味个人,4-趣味集体,5-体侧。6;领导男子,7-领导女子,8-赛前拔河,9-径赛集体)
+     * 如新增的项目类型,值顺延,如10-xxx1,11-xxx2,...
+     */
+    private String type;
+
+    /**
+     * 归类(0个人项目/1团体项目)
+     */
+    private String classification;
+
+    /**
+     * 裁判组
+     */
+    private String refereeGroup;
+
+    /**
+     * 比赛场地
+     */
+    private String location;
+
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 参赛组数
+     */
+    private Long groupNum;
+
+    /**
+     * 参赛人数
+     */
+    private Long participateNum;
+
+    /**
+     * 项目限报人数
+     */
+    private Integer limitPerson;
+
+    /**
+     * 录取名次
+     */
+    private String pmnum;
+
+    /**
+     * 排序方式
+     */
+    private String paiMing;
+
+    /**
+     * 计算规则
+     */
+    private String chengjiType;
+
+    /**
+     * 计时格式
+     */
+    private String guize;
+
+    /**
+     * 距离模式
+     */
+    private String distanceMode;
+
+    /**
+     * 计数单位
+     */
+    private String countUnit;
+
+    /**
+     * 成绩数量
+     */
+    private Integer ChengJiNum;
+
+    /**
+     * 积分分值
+     */
+    private String jifen;
+
+    /**
+     * 比赛轮次
+     */
+    private String lunci;
+
+    /**
+     * 比赛阶段
+     */
+    private String jieduan;
+
+    /**
+     * 状态(0正常 1已结束)
+     */
+    private String state;
+    /**
+     * 参赛性别
+     */
+    private String sex;
+
+    /**
+     * 参赛组别
+     */
+    private String zu;
+
+    /**
+     * 排名分组ID
+     */
+    private Long rgId;
+
+    /**
+     * 限报男生人数 (个人项目为总人数 / 团体项目为每队人数)
+     */
+    private Integer limitMale;
+
+    /**
+     * 限报女生人数 (个人项目为总人数 / 团体项目为每队人数)
+     */
+    private Integer limitFemale;
+
+    /**
+     * 团体项目限报队伍数
+     */
+    private Integer limitTeam;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 23 - 15
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/ClientProjectSaveBo.java

@@ -15,22 +15,26 @@ import java.util.List;
 @Data
 public class ClientProjectSaveBo {
 
+    /**
+     * 赛事ID
+     */
+    private Long id;
     /**
      * 赛事名称
      */
     @NotBlank(message = "赛事名称不能为空")
-    private String eventName;
+    private String name;
 
     /**
      * 赛事编号
      */
     @NotBlank(message = "赛事编号不能为空")
-    private String eventCode;
+    private String bianhao;
 
     /**
      * 机器编号
      */
-    private String machineCode;
+    private String jiqi;
 
     /**
      * 项目类型--参考字典game_project_type,一般不修改
@@ -55,12 +59,12 @@ public class ClientProjectSaveBo {
      * 成绩类型--字典game_score_type
      * 1-计时类;2-距离类;3-单次计数类;4-多次计数类;5-排名类;6-远度距离类;7-高度距离类
      */
-    private String scoreRule;
+    private String chengjiType;
     /**
      * 计时格式 0---00:00:00.000, 1---00:00.00
      */
     // @ExcelProperty(value = "计时格式")
-    private String timingFormat;
+    private String guize;
 
     /**
      * 距离模式(0:单轮最高, 1:双轮最高)
@@ -78,19 +82,19 @@ public class ClientProjectSaveBo {
      * 成绩数量
      */
     // @ExcelProperty(value = "成绩数量")
-    private Integer scoreCount;
+    private Integer ChengJiNum;
 
     /**
      * 性别---字典sys_group_sex
      * 1-男;2-女;3-混合;4-其他
      */
-    private String gender;
+    private String sex;
 
     /**
      * 参赛组别(队伍排名分组)
      * 没有就新增
      */
-    private String rgName;
+    private String zu;
 
     /**
      * 组别ID
@@ -101,34 +105,38 @@ public class ClientProjectSaveBo {
      * 比赛阶段--字典game_stage
      * 1-预赛;2-决赛;3-复赛
      */
-    private String gameStage;
+    private String jieduan;
 
     /**
      * 轮次--字典game_round
      * 1-一轮;2-二轮
      */
-    private String gameRound;
+    private String lunci;
 
     /**
      * 排名方式---字典game_order_type
      * 0-升序(1...9);1-降序(9...1);2-失误次数A(1...9);3-失误次数B(9...1);4-求和 ;5-最大值;6-最小值;7-平均值
      * 多个用英文逗号分隔
      */
-    private String orderType;
+    private String paiMing;
 
     /**
-     * 录取名次(以英文逗号分隔)
+     * 录取名次
+     */
+    private String pmnum;
+    /**
+     * 积分分值(以英文逗号分隔)
      */
-    private String roundType;
+    private String jifen;
 
     /**
      * 赛事提示
      */
-    private String eventTip;
+    private String info;
 
     /**
      * 上传成绩路径
      */
-    private String uploadPath;
+    private String ServerUrl;
 
 }

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

@@ -18,12 +18,12 @@ public class ScoreSubmitBo implements Serializable {
 
     /** 赛事ID */
     @NotNull(message = "赛事ID不能为空")
-    private Long eventId;
+    private Long id;
 
     /** 项目ID */
     @NotNull(message = "项目ID不能为空")
     private Long projectId;
 
     /** 提交项列表 */
-    private List<ScoreSubmitItemBo> items;
+    private List<ScoreSubmitItemBo> user;
 }

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

@@ -19,5 +19,5 @@ public class ScoreSubmitDetailBo implements Serializable {
     /** 尝试序号 */
     private Integer attemptIndex;
     /** 成绩值 */
-    private BigDecimal performanceValue;
+    private BigDecimal num;
 }

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

@@ -15,17 +15,17 @@ public class ScoreSubmitItemBo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /** 运动员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 Long trackIndex;
+    private Long xuhao;
     /** 成绩ID (APP传回已有ID以避免重复创建) */
     private Long scoreId;
     /** 成绩 (支持复杂格式字符串) */
@@ -36,5 +36,5 @@ public class ScoreSubmitItemBo implements Serializable {
     private Integer faultB;
 
     /** 成绩明细列表 (APP传回已有明细ID以避免冗余) */
-    private List<ScoreSubmitDetailBo> details;
+    private List<ScoreSubmitDetailBo> chengji;
 }

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

@@ -21,13 +21,13 @@ public class ScoreSheetDetailVo implements Serializable {
     /** 第attemptIndex轮的成绩 */
     private Integer attemptIndex;
     /** 成绩值 */
-    private String performanceValue;
+    private String num;
     /** 失误A */
     private Integer faultA;
     /** 失误B */
     private Integer faultB;
     /** 运动员ID (逻辑关联使用) */
-    private Long athleteId;
+    private Long Id;
     /** 队伍ID (逻辑关联使用) */
     private Long teamId;
 }

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

@@ -15,17 +15,17 @@ public class ScoreSheetItemVo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /** 运动员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 Long trackIndex;
+    private Long xuhao;
     /** 成绩ID */
     private Long scoreId;
     /** 成绩 */
@@ -36,5 +36,5 @@ public class ScoreSheetItemVo implements Serializable {
     private Integer faultB;
 
     /** 成绩明细列表 */
-    private List<ScoreSheetDetailVo> details;
+    private List<ScoreSheetDetailVo> chengji;
 }

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

@@ -1,6 +1,8 @@
 package org.dromara.system.domain.vo;
 
 import lombok.Data;
+
+import java.io.Serial;
 import java.io.Serializable;
 import java.util.List;
 
@@ -9,10 +11,11 @@ import java.util.List;
  */
 @Data
 public class ScoreSheetVo implements Serializable {
+    @Serial
     private static final long serialVersionUID = 1L;
 
     /** 赛事名称 */
-    private String eventName;
+    private String name;
     /** 计算规则 */
     private String scoreRule;
     /** 项目名称 */
@@ -22,26 +25,26 @@ public class ScoreSheetVo implements Serializable {
     /** 项目分类 (0个人 1团体) */
     private String classification;
     /** 参赛性别 */
-    private String gender;
+    private String sex;
     /** 参赛组别 */
-    private String rgName;
+    private String zu;
     /** 比赛阶段 */
-    private String gameStage;
+    private String jieduan;
     /** 比赛轮次 */
-    private String gameRound;
+    private String lunci;
     /** 完赛人数/对数 */
     private Integer finishedParticipants;
     /** 报名人数/对数 */
-    private Integer totalParticipants;
+    private Integer popnum;
     /** 比赛时间 */
     private String startTime;
     /** 裁判员 */
-    private String refereeName;
+    private String caipan;
     /** 计时格式 */
-    private String timingFormat;
+    private String guize;
     /** 赛事提示 */
-    private String eventTip;
+    private String info;
 
     /** 队员列表 */
-    private List<ScoreSheetItemVo> list;
+    private List<ScoreSheetItemVo> user;
 }

+ 4 - 2
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/app/IToClientService.java

@@ -1,5 +1,7 @@
 package org.dromara.system.service.app;
 
+import org.dromara.system.domain.GameAppEvent;
+import org.dromara.system.domain.GameAppProject;
 import org.dromara.system.domain.GameEvent;
 import org.dromara.system.domain.GameEventProject;
 import org.dromara.system.domain.bo.ClientLoginBo;
@@ -30,7 +32,7 @@ public interface IToClientService {
     /**
      * 获取赛事列表 (接口2)
      */
-    List<GameEvent> getEventList();
+    List<GameAppEvent> getEventList();
 
     /**
      * 删除赛事 (接口3)
@@ -40,7 +42,7 @@ public interface IToClientService {
     /**
      * 获取项目列表 (接口5)
      */
-    List<GameEventProject> getProjectList(Long eventId);
+    List<GameAppProject> getProjectList(Long eventId);
 
     /**
      * 获取成绩记录单 (接口6 展示)

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

@@ -1,5 +1,6 @@
 package org.dromara.system.service.impl.app;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.toolkit.Db;
@@ -17,7 +18,6 @@ import org.dromara.system.mapper.GameScoreMapper;
 import org.dromara.system.mapper.app.ToClientMapper;
 import org.dromara.system.service.IGameScoreService;
 import org.dromara.system.service.IGameRankGroupService;
-import org.dromara.system.service.ISysDictDataService;
 import org.dromara.system.service.ISysDictTypeService;
 import org.dromara.system.service.app.IToClientService;
 import org.springframework.scheduling.annotation.Async;
@@ -75,15 +75,17 @@ public class ToClientServiceImpl implements IToClientService {
     public void saveOrUpdateEventFromClient(ClientProjectSaveBo bo) {
         // 1. 获取或创建赛事
         GameEvent event = gameEventMapper.selectOne(Wrappers.lambdaQuery(GameEvent.class)
-                .eq(GameEvent::getEventCode, bo.getEventCode()));
+                .eq(bo.getId() != null, GameEvent::getEventId, bo.getId())
+                .eq(GameEvent::getEventCode, bo.getBianhao())
+        );
         if (event == null) {
             event = new GameEvent();
-            event.setEventCode(bo.getEventCode());
-            event.setEventName(bo.getEventName());
+            event.setEventCode(bo.getBianhao());
+            event.setEventName(bo.getName());
             event.setStatus("0");
             gameEventMapper.insert(event);
-        } else if (!event.getEventName().equals(bo.getEventName())) {
-            throw new RuntimeException("赛事编号" + bo.getEventCode() + "已被赛事【" + event.getEventName() + "】占用");
+        } else if (!event.getEventName().equals(bo.getName())) {
+            throw new RuntimeException("赛事编号" + bo.getBianhao() + "已被赛事【" + event.getEventName() + "】占用");
         }
         Long eventId = event.getEventId();
 
@@ -92,7 +94,7 @@ public class ToClientServiceImpl implements IToClientService {
 
         // 3. 维护组别信息 (参赛组别)
         Long rgId = bo.getRgId();
-        String rgName = bo.getRgName();
+        String rgName = bo.getZu();
         if (rgId == null && StringUtils.isNotBlank(rgName)) {
             GameRankGroup group = Db.getOne(Wrappers.lambdaQuery(GameRankGroup.class)
                     .select(GameRankGroup::getRgId)
@@ -138,18 +140,19 @@ public class ToClientServiceImpl implements IToClientService {
                 }
                 project.setProjectType(bo.getProjectType());
                 project.setClassification(bo.getClassification());
-                project.setScoreRule(bo.getScoreRule());
-                project.setTimingFormat(bo.getTimingFormat());
+                project.setScoreRule(bo.getChengjiType());
+                project.setTimingFormat(bo.getGuize());
                 project.setDistanceMode(bo.getDistanceMode());
                 project.setCountUnit(bo.getCountUnit());
-                project.setScoreCount(bo.getScoreCount());
-                project.setGender(bo.getGender());
+                project.setScoreCount(bo.getChengJiNum());
+                project.setGender(bo.getSex());
                 project.setRgName(rgName);
                 project.setRgId(rgId);
-                project.setGameStage(bo.getGameStage());
-                project.setGameRound(bo.getGameRound());
-                project.setOrderType(bo.getOrderType());
-                project.setRoundType(bo.getRoundType());
+                project.setGameStage(bo.getJieduan());
+                project.setGameRound(bo.getLunci());
+                project.setOrderType(bo.getPaiMing());
+                project.setRoundType(bo.getPmnum());
+                project.setScoreValue(bo.getJifen());
                 projectsToSave.add(project);
             }
             // 批量保存或更新
@@ -202,19 +205,44 @@ public class ToClientServiceImpl implements IToClientService {
     }
 
     @Override
-    public List<GameEvent> getEventList() {
-        return gameEventMapper.selectList(Wrappers.lambdaQuery(GameEvent.class)
-                .orderByDesc(GameEvent::getCreateTime)
-                .select(GameEvent::getEventId, GameEvent::getEventCode, GameEvent::getEventName,
-                        GameEvent::getCreateTime));
+    public List<GameAppEvent> getEventList() {
+        List<GameEvent> res = gameEventMapper.selectList(Wrappers.lambdaQuery(GameEvent.class)
+            .orderByDesc(GameEvent::getCreateTime)
+            .select(GameEvent::getEventId, GameEvent::getEventCode, GameEvent::getEventName,
+                GameEvent::getCreateTime));
+        return res.isEmpty() ? new ArrayList<>() : res.stream().map(e -> {
+            GameAppEvent appEvent = BeanUtil.copyProperties(e, GameAppEvent.class);
+            appEvent.setId(e.getEventId());
+            appEvent.setBianhao(e.getEventCode());
+            appEvent.setName(e.getEventName());
+            return appEvent;
+        }).toList();
     }
 
     @Override
-    public List<GameEventProject> getProjectList(Long eventId) {
-        return projectMapper.selectList(Wrappers.lambdaQuery(GameEventProject.class)
-                .eq(GameEventProject::getEventId, eventId)
-                .select(GameEventProject::getProjectId, GameEventProject::getProjectType,
-                        GameEventProject::getClassification, GameEventProject::getProjectName, GameEventProject::getStatus));
+    public List<GameAppProject> getProjectList(Long eventId) {
+        List<GameEventProject> res = projectMapper.selectList(Wrappers.lambdaQuery(GameEventProject.class)
+            .eq(GameEventProject::getEventId, eventId)
+            .select(GameEventProject::getProjectId, GameEventProject::getProjectType,
+                GameEventProject::getClassification, GameEventProject::getProjectName,
+                GameEventProject::getStatus)
+        );
+        return res.isEmpty() ? new ArrayList<>() : res.stream().map(p -> {
+            GameAppProject appProject = BeanUtil.copyProperties(p, GameAppProject.class);
+            appProject.setId(p.getEventId());
+            appProject.setState(p.getStatus());
+            appProject.setSex(p.getGender());
+            appProject.setType(p.getProjectType());
+            appProject.setPmnum(p.getRoundType());
+            appProject.setPaiMing(p.getOrderType());
+            appProject.setChengJiNum(p.getScoreCount());
+            appProject.setJifen(p.getScoreValue());
+            appProject.setGuize(p.getTimingFormat());
+            appProject.setLunci(p.getGameRound());
+            appProject.setJieduan(p.getGameStage());
+            appProject.setZu(p.getRgName());
+            return appProject;
+        }).toList();
     }
 
     @Override
@@ -241,48 +269,48 @@ public class ToClientServiceImpl implements IToClientService {
                         .map(this::convertToDetailVo)
                         .collect(Collectors.groupingBy(ScoreSheetDetailVo::getTeamId));
 
-                items.forEach(item -> item.setDetails(detailMap.get(item.getTeamId())));
+                items.forEach(item -> item.setChengji(detailMap.get(item.getTeamId())));
             } else {
                 // 个人项目:优先按 athleteId 分组 (如果存储时没存 athleteId 则按 scoreId)
                 detailMap = allDetails.stream()
                         .filter(d -> d.getAthleteId() != null)
                         .map(this::convertToDetailVo)
-                        .collect(Collectors.groupingBy(ScoreSheetDetailVo::getAthleteId));
+                        .collect(Collectors.groupingBy(ScoreSheetDetailVo::getId));
 
-                items.forEach(item -> item.setDetails(detailMap.get(item.getAthleteId())));
+                items.forEach(item -> item.setChengji(detailMap.get(item.getId())));
 
                 // 兜底:处理部分仅关联 scoreId 的旧数据
-                items.stream().filter(i -> i.getDetails() == null && i.getScoreId() != null).forEach(item -> {
+                items.stream().filter(i -> i.getChengji() == null && i.getScoreId() != null).forEach(item -> {
                     List<ScoreSheetDetailVo> scoreDetails = allDetails.stream()
                             .filter(d -> Objects.equals(d.getScoreId(), item.getScoreId()))
                             .map(this::convertToDetailVo)
                             .toList();
-                    item.setDetails(scoreDetails);
+                    item.setChengji(scoreDetails);
                 });
             }
         }
 
         // 4. 处理计时格式转换
-        if (vo.getTimingFormat() != null && StringUtils.isNotBlank(vo.getTimingFormat())) {
+        if (vo.getGuize() != null && StringUtils.isNotBlank(vo.getGuize())) {
             items.forEach(item -> {
                 // 格式化主成绩
                 if (StringUtils.isNotBlank(item.getScore())) {
-                    item.setScore(convertDecimalToTimeScore(new BigDecimal(item.getScore()), vo.getTimingFormat()));
+                    item.setScore(convertDecimalToTimeScore(new BigDecimal(item.getScore()), vo.getGuize()));
                 }
                 // 格式化明细成绩
-                if (item.getDetails() != null) {
-                    item.getDetails().forEach(detail -> {
-                        if (StringUtils.isNotBlank(detail.getPerformanceValue())) {
-                            detail.setPerformanceValue(convertDecimalToTimeScore(
-                                    new BigDecimal(detail.getPerformanceValue()),
-                                    vo.getTimingFormat()));
+                if (item.getChengji() != null) {
+                    item.getChengji().forEach(detail -> {
+                        if (StringUtils.isNotBlank(detail.getNum())) {
+                            detail.setNum(convertDecimalToTimeScore(
+                                    new BigDecimal(detail.getNum()),
+                                    vo.getGuize()));
                         }
                     });
                 }
             });
         }
 
-        vo.setList(items);
+        vo.setUser(items);
         return vo;
     }
 
@@ -291,11 +319,11 @@ public class ToClientServiceImpl implements IToClientService {
         dvo.setDetailId(d.getDetailId());
         dvo.setScoreId(d.getScoreId());
         dvo.setAttemptIndex(d.getAttemptIndex());
-        dvo.setPerformanceValue(d.getPerformanceValue() != null ? d.getPerformanceValue().toString() : null);
+        dvo.setNum(d.getPerformanceValue() != null ? d.getPerformanceValue().toString() : null);
         dvo.setFaultA(d.getFaultA());
         dvo.setFaultB(d.getFaultB());
         // 传递关联 ID 供分组使用
-        dvo.setAthleteId(d.getAthleteId());
+        dvo.setId(d.getAthleteId());
         dvo.setTeamId(d.getTeamId());
         return dvo;
     }
@@ -337,7 +365,7 @@ public class ToClientServiceImpl implements IToClientService {
     @Transactional(rollbackFor = Exception.class)
     public void submitScoreSheet(ScoreSubmitBo bo) {
         Long projectId = bo.getProjectId();
-        Long eventId = bo.getEventId();
+        Long eventId = bo.getId();
         GameEventProject project = projectMapper.selectOne(Wrappers.lambdaQuery(GameEventProject.class)
                 .eq(GameEventProject::getEventId, eventId)
                 .eq(GameEventProject::getProjectId, projectId));
@@ -345,7 +373,7 @@ public class ToClientServiceImpl implements IToClientService {
             throw new RuntimeException("该赛事下不存在此项目");
         }
 
-        List<ScoreSubmitItemBo> items = bo.getItems();
+        List<ScoreSubmitItemBo> items = bo.getUser();
         if (CollectionUtils.isEmpty(items)) {
             return;
         }
@@ -353,8 +381,8 @@ public class ToClientServiceImpl implements IToClientService {
         // 1. 批量处理队伍 (缺失则新增)
         Map<String, Long> teamIdMap = new HashMap<>();
         Set<String> missingTeamNames = items.stream()
-                .filter(item -> item.getTeamId() == null && StringUtils.isNotBlank(item.getTeamName()))
-                .map(ScoreSubmitItemBo::getTeamName)
+                .filter(item -> item.getTeamId() == null && StringUtils.isNotBlank(item.getDuiwu()))
+                .map(ScoreSubmitItemBo::getDuiwu)
                 .collect(Collectors.toSet());
 
         if (!missingTeamNames.isEmpty()) {
@@ -381,12 +409,12 @@ public class ToClientServiceImpl implements IToClientService {
         // 2. 批量处理运动员 (缺失则新增,其余准备批量更新)
         Map<String, Long> athleteIdMap = new HashMap<>();
         List<ScoreSubmitItemBo> missingAthleteItems = items.stream()
-                .filter(item -> item.getAthleteId() == null && StringUtils.isNotBlank(item.getAthleteCode()))
+                .filter(item -> item.getId() == null && StringUtils.isNotBlank(item.getNum()))
                 .toList();
 
         if (!missingAthleteItems.isEmpty()) {
             // 预查是否存在,防止重复
-            Set<String> codes = missingAthleteItems.stream().map(ScoreSubmitItemBo::getAthleteCode)
+            Set<String> codes = missingAthleteItems.stream().map(ScoreSubmitItemBo::getNum)
                     .collect(Collectors.toSet());
             List<GameAthlete> existAthletes = gameAthleteMapper.selectList(Wrappers.lambdaQuery(GameAthlete.class)
                     .eq(GameAthlete::getEventId, eventId)
@@ -395,15 +423,15 @@ public class ToClientServiceImpl implements IToClientService {
             existAthletes.forEach(a -> athleteIdMap.put(a.getAthleteCode(), a.getAthleteId()));
 
             List<GameAthlete> newAthletes = missingAthleteItems.stream()
-                    .filter(item -> !athleteIdMap.containsKey(item.getAthleteCode()))
+                    .filter(item -> !athleteIdMap.containsKey(item.getNum()))
                     .map(item -> {
                         GameAthlete a = new GameAthlete();
                         a.setEventId(eventId);
-                        a.setAthleteCode(item.getAthleteCode());
+                        a.setAthleteCode(item.getNum());
                         a.setName(item.getName());
-                        a.setTeamId(item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getTeamName()));
+                        a.setTeamId(item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getDuiwu()));
                         a.setProjectValue("[\"" + projectId + "\"]");
-                        a.setTrackIndex(item.getTrackIndex());
+                        a.setTrackIndex(item.getXuhao());
                         return a;
                     }).collect(Collectors.toMap(GameAthlete::getAthleteCode, a -> a, (a1, a2) -> a1))
                     .values().stream().toList();
@@ -417,13 +445,13 @@ public class ToClientServiceImpl implements IToClientService {
         // 3. 直接批量更新所有上传项的运动员信息 (不再预查对比,直接全量同步)
         List<GameAthlete> updateBatch = items.stream()
                 .map(item -> {
-                    Long aid = item.getAthleteId() != null ? item.getAthleteId()
-                            : athleteIdMap.get(item.getAthleteCode());
+                    Long aid = item.getId() != null ? item.getId()
+                            : athleteIdMap.get(item.getNum());
                     if (aid == null)
                         return null;
                     GameAthlete a = new GameAthlete();
                     a.setAthleteId(aid);
-                    a.setTrackIndex(item.getTrackIndex());
+                    a.setTrackIndex(item.getXuhao());
                     // 如果有姓名或其它字段变更也可以在此同步
                     return a;
                 }).filter(Objects::nonNull).toList();
@@ -434,12 +462,12 @@ public class ToClientServiceImpl implements IToClientService {
 
         // 4. 循环处理成绩录入 (统一使用 details 明细列表)
         for (ScoreSubmitItemBo item : items) {
-            Long athleteId = item.getAthleteId() != null ? item.getAthleteId()
-                    : athleteIdMap.get(item.getAthleteCode());
+            Long athleteId = item.getId() != null ? item.getId()
+                    : athleteIdMap.get(item.getNum());
             if (athleteId == null)
                 continue;
 
-            Long teamId = item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getTeamName());
+            Long teamId = item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getDuiwu());
 
             GameScoreBo scoreBo = new GameScoreBo();
             scoreBo.setScoreId(item.getScoreId());
@@ -451,12 +479,12 @@ public class ToClientServiceImpl implements IToClientService {
             scoreBo.setFaultB(item.getFaultB());
 
             // 统一模式:优先处理明细列表
-            if (CollectionUtils.isNotEmpty(item.getDetails())) {
-                List<GameScoreDetailBo> details = item.getDetails().stream().map(d -> {
+            if (CollectionUtils.isNotEmpty(item.getChengji())) {
+                List<GameScoreDetailBo> details = item.getChengji().stream().map(d -> {
                     GameScoreDetailBo dbo = new GameScoreDetailBo();
                     dbo.setDetailId(d.getDetailId());
                     dbo.setAttemptIndex(d.getAttemptIndex());
-                    dbo.setPerformanceValue(d.getPerformanceValue());
+                    dbo.setPerformanceValue(d.getNum());
                     return dbo;
                 }).toList();
                 scoreBo.setDetails(details);
@@ -517,7 +545,7 @@ public class ToClientServiceImpl implements IToClientService {
                 detailMap = allDetails.stream()
                         .filter(d -> d.getAthleteId() != null)
                         .map(this::convertToDetailVo)
-                        .collect(Collectors.groupingBy(ScoreSheetDetailVo::getAthleteId));
+                        .collect(Collectors.groupingBy(ScoreSheetDetailVo::getId));
 
                 list.forEach(item -> {
                     List<ScoreSheetDetailVo> details = detailMap.get(item.getAthleteId());
@@ -542,9 +570,9 @@ public class ToClientServiceImpl implements IToClientService {
                 }
                 if (item.getDetails() != null) {
                     item.getDetails().forEach(detail -> {
-                        if (StringUtils.isNotBlank(detail.getPerformanceValue())) {
-                            detail.setPerformanceValue(convertDecimalToTimeScore(
-                                    new BigDecimal(detail.getPerformanceValue()),
+                        if (StringUtils.isNotBlank(detail.getNum())) {
+                            detail.setNum(convertDecimalToTimeScore(
+                                    new BigDecimal(detail.getNum()),
                                     project.getTimingFormat()));
                         }
                     });
@@ -615,12 +643,12 @@ public class ToClientServiceImpl implements IToClientService {
      */
     private void batchSaveConfigs(Long eventId, ClientProjectSaveBo bo) {
         Map<String, String> configValues = new HashMap<>();
-        if (StringUtils.isNotBlank(bo.getMachineCode()))
-            configValues.put("machine_code", bo.getMachineCode());
-        if (StringUtils.isNotBlank(bo.getEventTip()))
-            configValues.put("event_tip", bo.getEventTip());
-        if (StringUtils.isNotBlank(bo.getUploadPath()))
-            configValues.put("upload_path", bo.getUploadPath());
+        if (StringUtils.isNotBlank(bo.getJiqi()))
+            configValues.put("machine_code", bo.getJiqi());
+        if (StringUtils.isNotBlank(bo.getInfo()))
+            configValues.put("event_tip", bo.getInfo());
+        if (StringUtils.isNotBlank(bo.getServerUrl()))
+            configValues.put("upload_path", bo.getServerUrl());
 
         if (configValues.isEmpty())
             return;