5 Commits 0d8b920494 ... 7574ca0f1f

Author SHA1 Message Date
  wenkai 7574ca0f1f Merge branch 'wk-dev-8-13' into dev 3 weeks ago
  wenkai 65cdeb9ef9 fix:修复poi导入报名表,如果有该队伍则加人,没有该队伍就分配 3 weeks ago
  wenkai 5d6692208a Merge branch 'wk-dev-8-13' into dev 3 weeks ago
  zhou 9fd9ecce95 feat(game-event): 增加手机号查询用户及运动员信息功能 3 weeks ago
  zhou 056569d6ea feat(game-athlete): 修改我的赛事-登录接口返回结果 3 weeks ago

+ 1 - 1
ruoyi-admin/src/main/resources/application-dev.yml

@@ -50,7 +50,7 @@ spring:
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
 #          url: jdbc:mysql://192.168.1.146:3306/game_event?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
-          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://localhost:3306/game-event?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
 #          password: P@ssw0rd
           password: 123456

+ 4 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -288,5 +288,7 @@ warm-flow:
 # 微信小程序配置
 wechat:
   miniapp:
-    appid: wx017241c84de43b7a
-    secret: 91ee2725605ba0ae73829cf4538395ac
+    appid: wx2189666171bf043e
+    secret: f97e65576ceb1516e49074a87b608f7b
+#    appid: wx017241c84de43b7a
+#    secret: 91ee2725605ba0ae73829cf4538395ac

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

@@ -41,10 +41,11 @@ public class UserEventController {
         }
     }
 
-    @GetMapping("/eventInfo/{userId}")
-    public R<UserEventInfoVo> getUserEventInfo(@PathVariable Long userId) {
+    @Log(title = "我的赛事-用户获取信息", businessType = BusinessType.OTHER)
+    @GetMapping("/eventInfo/{userId}/{phone}")
+    public R<UserEventInfoVo> getUserEventInfo(@PathVariable Long userId, @PathVariable String phone) {
         try {
-            UserEventInfoVo result = userEventService.getUserEventInfo(userId);
+            UserEventInfoVo result = userEventService.getUserEventInfo(userId, phone);
             return R.ok(result);
         } catch (Exception e) {
             return R.fail("获取用户赛事信息失败:" + e.getMessage());

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

@@ -22,6 +22,9 @@ public class UserEventInfoVo implements Serializable {
     // 用户基本信息
     private Long userId;
     private String username;
+    private String nickName;
+    private String avatar;
+    private String phone;
 
     // 运动员信息
     private GameAthleteVo athleteInfo;

+ 6 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/app/UserLoginVo.java

@@ -31,10 +31,15 @@ public class UserLoginVo implements Serializable {
     private String avatarUrl;
 
     /**
-     * 性别 0-未知 1-男 2-女
+     * 性别 1-男 2-女 3-混合
      */
     private Integer gender;
 
+    /**
+     * 手机号
+     */
+    private String phone;
+
     /**
      * 国家
      */

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

@@ -19,6 +19,9 @@ public interface GameAthleteMapper extends BaseMapperPlus<GameAthlete, GameAthle
     @Select("select * from game_athlete where user_id = #{userId} AND del_flag = '0'")
     GameAthlete selectByUserId(Long userId);
 
+    @Select("select * from game_athlete where phone = #{phone} AND del_flag = '0'")
+    GameAthlete selectByPhone(String phone);
+
     @Select("select athlete_id,name,team_id from game_athlete where event_id = #{eventId} and del_flag = '0'")
     List<GameAthleteVo> queryAthleteIdAndName(Long eventId);
 }

+ 12 - 2
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/app/GameUserMapper.java

@@ -18,7 +18,7 @@ public interface GameUserMapper extends BaseMapperPlus<GameUser, GameUserVo> {
      * @param username 用户名
      * @return 用户
      */
-    @Select("select * from game_user where username = #{username}")
+    @Select("select * from game_user where username = #{username} AND del_flag = '0'")
     GameUser selectUserByUserName(String username);
 
     /**
@@ -27,9 +27,19 @@ public interface GameUserMapper extends BaseMapperPlus<GameUser, GameUserVo> {
      * @param userId 用户ID
      * @return 用户
      */
-    @Select("select * from game_user where user_id = #{userId}")
+    @Select("select * from game_user where user_id = #{userId} AND del_flag = '0'")
     GameUser selectUserById(Long userId);
 
+    /**
+     * 根据用户ID和手机号查询用户
+     *
+     * @param userId 用户ID
+     * @param phone  手机号
+     * @return 用户
+     */
+    @Select("select * from game_user where user_id = #{userId} AND phone = #{phone} AND del_flag = '0'")
+    GameUser selectUserByIdAndPhone(Long userId, String phone);
+
     /**
      * 根据微信openid查询用户
      *

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

@@ -135,4 +135,6 @@ public interface IGameTeamService {
      * @return 结果
      */
     Boolean moveGroup(List<Long> teamIds, Long rgId);
+
+    List<GameTeam> queryTeamByEventId(Long eventId);
 }

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

@@ -8,5 +8,5 @@ public interface IUserEventService {
     UserEventInfoVo login(UserLoginVo loginVo);
 
     // 获取用户赛事信息
-    UserEventInfoVo getUserEventInfo(Long userId);
+    UserEventInfoVo getUserEventInfo(Long userId, String phone);
 }

+ 3 - 2
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameAthleteServiceImpl.java

@@ -485,12 +485,13 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
 
     @Override
     public String queryMaxNumber(Long teamId) {
-        return baseMapper.selectOne(
+        GameAthlete gameAthlete = baseMapper.selectOne(
             Wrappers.lambdaQuery(GameAthlete.class)
                 .eq(GameAthlete::getTeamId, teamId)
                 .orderByDesc(GameAthlete::getAthleteCode)
                 .select(GameAthlete::getAthleteCode)
                 .last("limit 1")
-        ).getAthleteCode();
+        );
+        return gameAthlete != null ? gameAthlete.getAthleteCode() : "0";
     }
 }

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

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -19,7 +18,6 @@ import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.system.domain.GameAthlete;
 import org.dromara.system.domain.GameEvent;
 import org.dromara.system.domain.GameTeam;
-import org.dromara.system.domain.bo.GameRankGroupBo;
 import org.dromara.system.domain.bo.GameTeamBo;
 import org.dromara.system.domain.constant.GameEventConstant;
 import org.dromara.system.domain.vo.GameRankGroupVo;
@@ -458,4 +456,12 @@ public class GameTeamServiceImpl implements IGameTeamService {
 
         return baseMapper.batchUpdateRg(rgId, teamIds);
     }
+
+    @Override
+    public List<GameTeam> queryTeamByEventId(Long eventId) {
+        return baseMapper.selectList(
+            Wrappers.lambdaQuery(GameTeam.class)
+                .eq(GameTeam::getEventId, eventId)
+        );
+    }
 }

+ 264 - 77
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/IEnrollServiceImpl.java

@@ -13,14 +13,17 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.ObjectUtils;
 import org.dromara.system.domain.GameTeam;
 import org.dromara.system.domain.bo.EnrollBo;
 import org.dromara.system.domain.bo.GameAthleteBo;
 import org.dromara.system.domain.bo.GameTeamBo;
 import org.dromara.system.domain.vo.EnrollProjectVo;
-import org.dromara.system.service.*;
+import org.dromara.system.domain.vo.GameTeamVo;
+import org.dromara.system.service.IEnrollService;
+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.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -30,6 +33,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -175,14 +179,14 @@ public class IEnrollServiceImpl implements IEnrollService {
     @Override
     public Boolean importDataForPoi(MultipartFile file, Long eventId) {
         //查询赛事下是否已经有报名信息,如果有就禁止导入
-        Long count = gameAthleteService.countByEventId(eventId);
-        if (count > 0) {
-            throw new ServiceException("该赛事下已经有报名信息,禁止导入");
-        }
-        count = gameTeamService.countByEventId(eventId);
-        if (count > 0) {
-            throw new ServiceException("该赛事下已经有报名信息,禁止导入");
-        }
+        // Long count = gameAthleteService.countByEventId(eventId);
+        // if (count > 0) {
+        //     throw new ServiceException("该赛事下已经有报名信息,禁止导入");
+        // }
+        // count = gameTeamService.countByEventId(eventId);
+        // if (count > 0) {
+        //     throw new ServiceException("该赛事下已经有报名信息,禁止导入");
+        // }
         //1.解析报名信息
         List<EnrollProjectVo> enrollList = parseData(file);
         //2.保存报名信息
@@ -456,99 +460,208 @@ public class IEnrollServiceImpl implements IEnrollService {
      * @param eventId
      * @return
      */
+    // @Transactional(rollbackFor = Exception.class)
+    // public boolean saveEnrollData(List<EnrollProjectVo> dataList, Long eventId) {
+    //     // 1. 根据队伍分类成Map
+    //     Map<String, List<EnrollProjectVo>> groupedByTeam = dataList.stream()
+    //         .collect(Collectors.groupingBy(EnrollProjectVo::getTeamName));
+    //     // 查询当前赛事下的项目 名称和id映射关系
+    //     Map<String, Long> projectList = gameEventProjectService.mapProjectAndProjectId(eventId);
+    //     // 1.2 根据队伍生成号码段
+    //     Map<String, String> numberRanges = new HashMap<>();
+    //     Map<String, AtomicInteger> currentNumbers = new HashMap<>(); // 记录每个队伍当前分配到的号码
+    //     AtomicInteger teamIndex = new AtomicInteger(1);
+    //     Snowflake snowflake = IdUtil.createSnowflake(1, 1);
+    //
+    //     for (Map.Entry<String, List<EnrollProjectVo>> entry : groupedByTeam.entrySet()) {
+    //         String teamName = entry.getKey();
+    //         String range = generateNumberRange(dataList.size(), teamIndex.getAndIncrement());
+    //         numberRanges.put(teamName, range);
+    //
+    //         // 解析起始号码作为初始值
+    //         int startNum = Integer.parseInt(range.split("-")[0]);
+    //         currentNumbers.put(teamName, new AtomicInteger(startNum));
+    //     }
+    //
+    //     // 2. 保存参赛队伍 & 队员
+    //     for (Map.Entry<String, List<EnrollProjectVo>> entry : groupedByTeam.entrySet()) {
+    //         String teamName = entry.getKey();
+    //         List<EnrollProjectVo> athletes = entry.getValue();
+    //         GameTeamBo gameTeamBo = new GameTeamBo();
+    //         gameTeamBo.setTeamId(snowflake.nextId());
+    //         Long teamId = gameTeamBo.getTeamId();
+    //         // 获取该队伍的当前编号计数器
+    //         AtomicInteger currentNumber = currentNumbers.get(teamName);
+    //         int width = (dataList.size() > 100) ? 5 : 4; // 决定格式化宽度
+    //         List<Long> athletesId = new ArrayList<>();
+    //         // 3. 保存参赛队员
+    //         for (EnrollProjectVo enrollInfo : athletes) {
+    //             GameAthleteBo gameAthleteBo = new GameAthleteBo();
+    //             gameAthleteBo.setEventId(eventId);
+    //             gameAthleteBo.setTeamId(teamId);
+    //             gameAthleteBo.setTeamName(teamName);
+    //             // 分配编号:从当前计数器获取并递增
+    //             int assignedNumber = currentNumber.getAndIncrement();
+    //             String formattedCode = String.format("%0" + width + "d", assignedNumber);
+    //             gameAthleteBo.setAthleteCode(formattedCode);
+    //
+    //             gameAthleteBo.setName(enrollInfo.getName());
+    //             gameAthleteBo.setGender(enrollInfo.getSex());
+    //             gameAthleteBo.setAge(Long.valueOf(enrollInfo.getAge()));
+    //             gameAthleteBo.setPhone(enrollInfo.getPhone());
+    //             gameAthleteBo.setUnit(teamName);
+    //             Map<String, Boolean> selectProjects = enrollInfo.getProjectSelections();
+    //             //查询出对应的赛事id
+    //             List<Long> selectionProjectIds = new ArrayList<>();
+    //             for (Map.Entry<String, Boolean> selectProject : selectProjects.entrySet()) {
+    //                 Long projectId = projectList.get(selectProject.getKey());
+    //                 if (ObjectUtils.isNotEmpty(projectId)) {
+    //                     selectionProjectIds.add(projectId);
+    //                 }
+    //             }
+    //             gameAthleteBo.setProjectValue(JSONUtil.toJsonStr(selectionProjectIds));
+    //
+    //             gameAthleteBo.setStatus("0");
+    //
+    //             gameAthleteService.insertByBo(gameAthleteBo);
+    //             athletesId.add(gameAthleteBo.getAthleteId());
+    //         }
+    //
+    //         gameTeamBo.setEventId(eventId);
+    //         gameTeamBo.setTeamName(teamName);
+    //         // gameTeamBo.setTeamCode("");
+    //         gameTeamBo.setLeader(athletes.get(0).getLeader());
+    //         gameTeamBo.setAthleteValue(JSONUtil.toJsonStr(athletesId));
+    //         gameTeamBo.setAthleteNum(Long.valueOf(athletes.size()));
+    //         gameTeamBo.setNumberRange(numberRanges.get(teamName));
+    //         gameTeamBo.setStatus("0");
+    //         gameTeamService.insertByBo(gameTeamBo);
+    //
+    //
+    //     }
+    //     return true;
+    // }
     @Transactional(rollbackFor = Exception.class)
     public boolean saveEnrollData(List<EnrollProjectVo> dataList, Long eventId) {
         // 1. 根据队伍分类成Map
         Map<String, List<EnrollProjectVo>> groupedByTeam = dataList.stream()
             .collect(Collectors.groupingBy(EnrollProjectVo::getTeamName));
-        // 查询当前赛事下的项目 名称和id映射关系
-        Map<String, Long> projectList = gameEventProjectService.mapProjectAndProjectId(eventId);
-        // 1.2 根据队伍生成号码段
-        Map<String, String> numberRanges = new HashMap<>();
-        Map<String, AtomicInteger> currentNumbers = new HashMap<>(); // 记录每个队伍当前分配到的号码
-        AtomicInteger teamIndex = new AtomicInteger(1);
-        Snowflake snowflake = IdUtil.createSnowflake(1, 1);
 
-        for (Map.Entry<String, List<EnrollProjectVo>> entry : groupedByTeam.entrySet()) {
-            String teamName = entry.getKey();
-            String range = generateNumberRange(dataList.size(), teamIndex.getAndIncrement());
-            numberRanges.put(teamName, range);
+        // 查询当前赛事下的项目名称和id映射关系
+        Map<String, Long> projectList = gameEventProjectService.mapProjectAndProjectId(eventId);
 
-            // 解析起始号码作为初始值
-            int startNum = Integer.parseInt(range.split("-")[0]);
-            currentNumbers.put(teamName, new AtomicInteger(startNum));
+        // 查询当前赛事下已存在的队伍
+        List<GameTeam> existingTeams = gameTeamService.queryTeamByEventId(eventId);
+        Map<String, GameTeam> existingTeamMap = existingTeams.stream()
+            .collect(Collectors.toMap(GameTeam::getTeamName, Function.identity()));
+
+        // 查询当前赛事最大的号码段结束值,用于确定新队伍的起始号码
+        Integer maxEventNumber;
+        GameTeam maxNumberTeam = gameTeamService.queryMaxNumber(eventId);
+        if (maxNumberTeam != null && maxNumberTeam.getNumberRange() != null) {
+            String[] rangeParts = maxNumberTeam.getNumberRange().split("-");
+            maxEventNumber = Integer.valueOf(rangeParts[1]);
+        } else {
+            maxEventNumber = 0;
         }
-        // 2. 保存参赛队伍 & 队员
+
+        // 计算新队伍的起始队伍编号(从当前最大号码段的下一个300倍数开始)
+        int nextTeamIndex = (maxEventNumber / 300) + 1;
+        AtomicInteger teamIndexCounter = new AtomicInteger(nextTeamIndex);
+
+        Snowflake snowflake = IdUtil.createSnowflake(1, 1);
+        int width = (dataList.size() > 100) ? 5 : 4; // 决定格式化宽度
+
+        // 2. 处理每个队伍
         for (Map.Entry<String, List<EnrollProjectVo>> entry : groupedByTeam.entrySet()) {
             String teamName = entry.getKey();
             List<EnrollProjectVo> athletes = entry.getValue();
-            GameTeamBo gameTeamBo = new GameTeamBo();
-            gameTeamBo.setTeamId(snowflake.nextId());
-            Long teamId = gameTeamBo.getTeamId();
-            // 获取该队伍的当前编号计数器
-            AtomicInteger currentNumber = currentNumbers.get(teamName);
-            int width = (dataList.size() > 100) ? 5 : 4; // 决定格式化宽度
-            List<Long> athletesId = new ArrayList<>();
-            // 3. 保存参赛队员
-            for (EnrollProjectVo enrollInfo : athletes) {
-                GameAthleteBo gameAthleteBo = new GameAthleteBo();
-                gameAthleteBo.setEventId(eventId);
-                gameAthleteBo.setTeamId(teamId);
-                gameAthleteBo.setTeamName(teamName);
-                // 分配编号:从当前计数器获取并递增
-                int assignedNumber = currentNumber.getAndIncrement();
-                String formattedCode = String.format("%0" + width + "d", assignedNumber);
-                gameAthleteBo.setAthleteCode(formattedCode);
-
-                gameAthleteBo.setName(enrollInfo.getName());
-                gameAthleteBo.setGender(enrollInfo.getSex());
-                gameAthleteBo.setAge(Long.valueOf(enrollInfo.getAge()));
-                gameAthleteBo.setPhone(enrollInfo.getPhone());
-                gameAthleteBo.setUnit(teamName);
-                Map<String, Boolean> selectProjects = enrollInfo.getProjectSelections();
-                //查询出对应的赛事id
-                List<Long> selectionProjectIds = new ArrayList<>();
-                for (Map.Entry<String, Boolean> selectProject : selectProjects.entrySet()) {
-                    Long projectId = projectList.get(selectProject.getKey());
-                    if (ObjectUtils.isNotEmpty(projectId)) {
-                        selectionProjectIds.add(projectId);
+
+            Long teamId;
+            AtomicInteger currentNumber;
+            boolean isNewTeam = false;
+            String numberRange = "";
+
+            // 判断队伍是否已存在
+            if (existingTeamMap.containsKey(teamName)) {
+                // 队伍已存在,使用现有队伍的号码段
+                GameTeam existingTeam = existingTeamMap.get(teamName);
+                teamId = existingTeam.getTeamId();
+                numberRange = existingTeam.getNumberRange();
+
+                try {
+                    // 尝试查询该队伍的最大队员编号
+                    String maxNumberStr = gameAthleteService.queryMaxNumber(teamId);
+                    Integer maxNumber = Integer.valueOf(maxNumberStr);
+
+                    // 如果最大编号为0,说明队伍实际上没有队员,从号码段起始开始
+                    if (maxNumber == 0) {
+                        String[] rangeParts = numberRange.split("-");
+                        int startNumber = Integer.valueOf(rangeParts[0]);
+                        currentNumber = new AtomicInteger(startNumber);
+                    } else {
+                        // 成功获取到有效编号,续着分配
+                        currentNumber = new AtomicInteger(maxNumber + 1);
                     }
+                } catch (Exception e) {
+                    // 出现异常,从号码段起始开始分配
+                    String[] rangeParts = numberRange.split("-");
+                    int startNumber = Integer.valueOf(rangeParts[0]);
+                    currentNumber = new AtomicInteger(startNumber);
                 }
-                gameAthleteBo.setProjectValue(JSONUtil.toJsonStr(selectionProjectIds));
-
-                gameAthleteBo.setStatus("0");
+            } else {
+                // 队伍不存在,创建新队伍并分配新的300号码段
+                isNewTeam = true;
+                teamId = snowflake.nextId();
+
+                // 为新队伍生成300个号码段
+                int teamIndex = teamIndexCounter.getAndIncrement();
+                numberRange = generateNumberRange(dataList.size(), teamIndex);
+
+                // 解析号码段起始号码
+                String[] rangeParts = numberRange.split("-");
+                int startNumber = Integer.valueOf(rangeParts[0]);
+                currentNumber = new AtomicInteger(startNumber);
+            }
 
+            // 保存队员信息
+            List<Long> athletesId = new ArrayList<>();
+            for (EnrollProjectVo enrollInfo : athletes) {
+                GameAthleteBo gameAthleteBo = createAthleteBo(enrollInfo, eventId, teamId, teamName,
+                    currentNumber, width, projectList);
                 gameAthleteService.insertByBo(gameAthleteBo);
                 athletesId.add(gameAthleteBo.getAthleteId());
             }
 
-            gameTeamBo.setEventId(eventId);
-            gameTeamBo.setTeamName(teamName);
-            // gameTeamBo.setTeamCode("");
-            gameTeamBo.setLeader(athletes.get(0).getLeader());
-            gameTeamBo.setAthleteValue(JSONUtil.toJsonStr(athletesId));
-            gameTeamBo.setAthleteNum(Long.valueOf(athletes.size()));
-            gameTeamBo.setNumberRange(numberRanges.get(teamName));
-            gameTeamBo.setStatus("0");
-            gameTeamService.insertByBo(gameTeamBo);
-
-
+            if (isNewTeam) {
+                // 保存新队伍信息
+                GameTeamBo gameTeamBo = new GameTeamBo();
+                gameTeamBo.setTeamId(teamId);
+                gameTeamBo.setEventId(eventId);
+                gameTeamBo.setTeamName(teamName);
+                gameTeamBo.setLeader(athletes.get(0).getLeader());
+                gameTeamBo.setAthleteValue(JSONUtil.toJsonStr(athletesId));
+                gameTeamBo.setAthleteNum(Long.valueOf(athletes.size()));
+                gameTeamBo.setNumberRange(numberRange); // 设置300个号码段
+                gameTeamBo.setStatus("0");
+                gameTeamService.insertByBo(gameTeamBo);
+            } else {
+                // 更新现有队伍的队员列表和数量
+                updateExistingTeam(teamId, athletesId, athletes.size());
+            }
         }
+
         return true;
     }
 
-
     /**
      * 生成号码段
-     * 需求:
-     * 不超100人,一般4位。0101-0199;超过100人,一般5位,01001-01101;
-     * 根据队伍分配,最多不超过300个
      * 规则:
-     * 1. 按照队伍分类,每个队伍生成一个号码段
-     * 2. 直接给每个队伍分配300个号码,多余的预留起来,防止后续有新的人加入该队伍参赛,预留号码可直接分配给他
-     * 3. 号码从1开始递增,高位填充0
+     * 1. 按照队伍分类,每个队伍分配300个号码
+     * 2. 号码从1开始递增,高位填充0
+     * 3. 超过100人使用5位,否则使用4位
      *
-     * @param member 人数
+     * @param member 人数(用于决定位数)
      * @param team   当前是第几队
      * @return 号码段字符串,如 "0001-0300" 或 "00001-00300"
      */
@@ -566,5 +679,79 @@ public class IEnrollServiceImpl implements IEnrollService {
         return startStr + "-" + endStr;
     }
 
+    /**
+     * 创建运动员BO对象
+     */
+    private GameAthleteBo createAthleteBo(EnrollProjectVo enrollInfo, Long eventId, Long teamId,
+                                          String teamName, AtomicInteger currentNumber, int width,
+                                          Map<String, Long> projectList) {
+        GameAthleteBo gameAthleteBo = new GameAthleteBo();
+        gameAthleteBo.setEventId(eventId);
+        gameAthleteBo.setTeamId(teamId);
+        gameAthleteBo.setTeamName(teamName);
+
+        // 分配编号
+        int assignedNumber = currentNumber.getAndIncrement();
+        String formattedCode = String.format("%0" + width + "d", assignedNumber);
+        gameAthleteBo.setAthleteCode(formattedCode);
+
+        gameAthleteBo.setName(enrollInfo.getName());
+        gameAthleteBo.setGender(enrollInfo.getSex());
+        gameAthleteBo.setAge(Long.valueOf(enrollInfo.getAge()));
+        gameAthleteBo.setPhone(enrollInfo.getPhone());
+        gameAthleteBo.setUnit(teamName);
+
+        // 处理项目选择
+        Map<String, Boolean> selectProjects = enrollInfo.getProjectSelections();
+        List<Long> selectionProjectIds = new ArrayList<>();
+        for (Map.Entry<String, Boolean> selectProject : selectProjects.entrySet()) {
+            Long projectId = projectList.get(selectProject.getKey());
+            if (ObjectUtils.isNotEmpty(projectId)) {
+                selectionProjectIds.add(projectId);
+            }
+        }
+        gameAthleteBo.setProjectValue(JSONUtil.toJsonStr(selectionProjectIds));
+        gameAthleteBo.setStatus("0");
+
+        return gameAthleteBo;
+    }
+
+    /**
+     * 更新现有队伍信息
+     */
+    private void updateExistingTeam(Long teamId, List<Long> newAthletesId, int newAthleteCount) {
+        GameTeamVo existingTeam = gameTeamService.queryById(teamId);
+        if (existingTeam != null) {
+            // 合并现有队员ID和新队员ID
+            List<Long> existingAthletes = JSONUtil.toList(existingTeam.getAthleteValue(), Long.class);
+            List<Long> allAthletes = new ArrayList<>();
+            if (existingAthletes != null) {
+                allAthletes.addAll(existingAthletes);
+            }
+            allAthletes.addAll(newAthletesId);
+
+            // 更新队伍信息
+            GameTeamBo updateTeamBo = new GameTeamBo();
+            updateTeamBo.setTeamId(teamId);
+            updateTeamBo.setAthleteValue(JSONUtil.toJsonStr(allAthletes));
+            updateTeamBo.setAthleteNum(existingTeam.getAthleteNum() + newAthleteCount);
+            gameTeamService.updateByBo(updateTeamBo);
+        }
+    }
+
+    private String generateNumberRangeByMax(int maxNumber) {
+        // 每个队伍固定分配300个号码
+        int start = maxNumber + 1;
+        int end = maxNumber + 300;
+
+        // 判断使用5位
+        int width = 5;
+
+        String startStr = String.format("%0" + width + "d", start);
+        String endStr = String.format("%0" + width + "d", end);
+
+        return startStr + "-" + endStr;
+    }
+
     // endregion 辅助方法
 }

+ 18 - 5
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/app/UserEventServiceImpl.java

@@ -72,6 +72,9 @@ public class UserEventServiceImpl implements IUserEventService {
             UserEventInfoVo result = new UserEventInfoVo();
             result.setUserId(user.getUserId());
             result.setUsername(user.getUsername());
+            result.setNickName(user.getNickname());
+            result.setAvatar(user.getAvatar());
+            result.setPhone(user.getPhone());
 
             return result;
         } catch (Exception e) {
@@ -110,15 +113,15 @@ public class UserEventServiceImpl implements IUserEventService {
 
             // 手动解析JSON响应
             WxLoginResult result = parseWxResponse(responseBody);
-            
+
             if (result.getErrcode() != null && result.getErrcode() != 0) {
                 throw new RuntimeException("微信接口返回错误:" + result.getErrmsg() + " (错误码: " + result.getErrcode() + ")");
             }
-            
+
             if (result.getOpenid() == null || result.getOpenid().isEmpty()) {
                 throw new RuntimeException("微信接口未返回openid");
             }
-            
+
             return result;
         } catch (Exception e) {
             if (e instanceof RuntimeException) {
@@ -155,6 +158,7 @@ public class UserEventServiceImpl implements IUserEventService {
             user.setUsername("wx_" + openid.substring(0, Math.min(8, openid.length()))); // 生成用户名
             user.setNickname(loginVo.getNickName() != null ? loginVo.getNickName() : "微信用户");
             user.setAvatar(loginVo.getAvatarUrl());
+            user.setPhone(loginVo.getPhone());
             // 注意:如果数据库password字段允许为NULL,则不需要设置密码
             // 如果数据库password字段不允许为NULL,请取消注释下面这行代码
             // user.setPassword("WX_LOGIN_" + System.currentTimeMillis());
@@ -173,6 +177,9 @@ public class UserEventServiceImpl implements IUserEventService {
             if (loginVo.getAvatarUrl() != null && !loginVo.getAvatarUrl().isEmpty()) {
                 user.setAvatar(loginVo.getAvatarUrl());
             }
+            if (loginVo.getAvatarUrl() != null && !loginVo.getAvatarUrl().isEmpty()) {
+                user.setPhone(loginVo.getPhone());
+            }
             user.setUpdateTime(new Date());
 
             // 更新用户
@@ -183,7 +190,7 @@ public class UserEventServiceImpl implements IUserEventService {
     }
 
     @Override
-    public UserEventInfoVo getUserEventInfo(Long userId) {
+    public UserEventInfoVo getUserEventInfo(Long userId, String phone) {
         // 步骤1:查询用户基本信息
         GameUser user = gameUserMapper.selectUserById(userId);
         if (user == null) {
@@ -191,7 +198,7 @@ public class UserEventServiceImpl implements IUserEventService {
         }
 
         // 步骤2:查询用户关联的运动员信息
-        GameAthlete athlete = gameAthleteMapper.selectByUserId(userId);
+        GameAthlete athlete = gameAthleteMapper.selectByPhone(phone);
         if (athlete == null) {
             throw new RuntimeException("用户未关联运动员信息");
         }
@@ -220,6 +227,9 @@ public class UserEventServiceImpl implements IUserEventService {
         UserEventInfoVo result = new UserEventInfoVo();
         result.setUserId(user.getUserId());
         result.setUsername(user.getUsername());
+        result.setNickName(user.getNickname());
+        result.setAvatar(user.getAvatar());
+        result.setPhone(athlete.getPhone());
 
         // 设置运动员信息
         GameAthleteVo athleteInfo = MapstructUtils.convert(athlete, GameAthleteVo.class);
@@ -238,6 +248,9 @@ public class UserEventServiceImpl implements IUserEventService {
         UserEventInfoVo result = new UserEventInfoVo();
         result.setUserId(user.getUserId());
         result.setUsername(user.getUsername());
+        result.setNickName(user.getNickname());
+        result.setAvatar(user.getAvatar());
+        result.setPhone(athlete.getPhone());
 
         // 组装运动员信息
         GameAthleteVo athleteInfo = MapstructUtils.convert(athlete, GameAthleteVo.class);