ソースを参照

refactor(game-event): 重构赛事项目服务实现类优化代码结构

- 移除未使用的 Lombok RequiredArgsConstructor 注解
- 修复构造函数参数格式化问题
- 统一代码缩进和空格格式
- 优化 JSON 数组解析逻辑,支持数字和字符串类型的 ID 匹配
- 更新注释格式,统一使用标准注释风格
- 修改查询方法调用,使用新的分页查询接口
- 调整 Lambda 表达式的缩进格式
- 优化流式处理的链式调用格式
- 更新数据库查询中的 JSON 匹配逻辑,同时匹配数值和字符串格式的 ID
- 将队伍参与统计改为基于运动员表的去重统计方式
zhou 1 週間 前
コミット
e9052e7bb7

+ 166 - 171
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameEventProjectServiceImpl.java

@@ -10,7 +10,6 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.system.domain.*;
@@ -41,7 +40,7 @@ import java.util.stream.Collectors;
  * @date 2025-07-30
  */
 @Slf4j
-//@RequiredArgsConstructor
+// @RequiredArgsConstructor
 @Service
 public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
@@ -62,8 +61,8 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
     private IGameAthleteService gameAthleteService;
 
     public GameEventProjectServiceImpl(GameEventProjectMapper baseMapper, GameEventMapper gameEventMapper,
-        ISysDictTypeService sysDictTypeService, GameTeamMapper gameTeamMapper, GameAthleteMapper gameAthleteMapper,
-        GameEventGroupMapper gameEventGroupMapper, GameScoreMapper gameScoreMapper) {
+            ISysDictTypeService sysDictTypeService, GameTeamMapper gameTeamMapper, GameAthleteMapper gameAthleteMapper,
+            GameEventGroupMapper gameEventGroupMapper, GameScoreMapper gameScoreMapper) {
         this.baseMapper = baseMapper;
         this.gameEventMapper = gameEventMapper;
         this.sysDictTypeService = sysDictTypeService;
@@ -85,9 +84,9 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         if (vo == null) {
             return null;
         }
-        if (vo.getRefereeGroup() != null && !vo.getRefereeGroup().isEmpty()){
+        if (vo.getRefereeGroup() != null && !vo.getRefereeGroup().isEmpty()) {
             vo.setRefereeGroups(JSONUtil.toList(vo.getRefereeGroup(), Long.class));
-        }else{
+        } else {
             vo.setRefereeGroups(new ArrayList<>());
         }
         return vo;
@@ -105,32 +104,33 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         if (bo.getEventId() == null) {
             Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
             if (cacheObject instanceof Integer) {
-                bo.setEventId(((Integer) cacheObject).longValue());  // 显式转换为 Long 类型
+                bo.setEventId(((Integer) cacheObject).longValue()); // 显式转换为 Long 类型
             } else if (cacheObject instanceof Long) {
                 bo.setEventId((Long) cacheObject);
             }
         }
         LambdaQueryWrapper<GameEventProject> lqw = buildQueryWrapper(bo);
-//        Page<GameEventProjectVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        // Page<GameEventProjectVo> result = baseMapper.selectVoPage(pageQuery.build(),
+        // lqw);
         Page<GameEventProjectVo> result = baseMapper.selectPageEventProjectList(pageQuery.build(), lqw);
         GameEvent gameEvent = gameEventMapper.selectById(bo.getEventId());
         result.getRecords()
-            .forEach(vo -> {
-                Optional.ofNullable(vo.getEventId())
-                    .filter(ObjectUtil::isNotEmpty)
-                    .ifPresent(eventId -> {
-                        if (gameEvent != null) {
-                            vo.setEventName(gameEvent.getEventName());
-                        }
-                    });
-
-                Optional.ofNullable(vo.getRefereeGroup())
-                    .filter(ObjectUtil::isNotEmpty)
-                    .ifPresent(refereeGroup -> {
-                        List<Long> refereeList = JSONUtil.toList(refereeGroup, Long.class);
-                        vo.setRefereeGroups(refereeList);
-                    });
-            });
+                .forEach(vo -> {
+                    Optional.ofNullable(vo.getEventId())
+                            .filter(ObjectUtil::isNotEmpty)
+                            .ifPresent(eventId -> {
+                                if (gameEvent != null) {
+                                    vo.setEventName(gameEvent.getEventName());
+                                }
+                            });
+
+                    Optional.ofNullable(vo.getRefereeGroup())
+                            .filter(ObjectUtil::isNotEmpty)
+                            .ifPresent(refereeGroup -> {
+                                List<Long> refereeList = JSONUtil.toList(refereeGroup, Long.class);
+                                vo.setRefereeGroups(refereeList);
+                            });
+                });
 
         // 批量计算统计数据
         calculateProjectStats(bo.getEventId(), result.getRecords());
@@ -147,9 +147,9 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         }
 
         List<Long> projectIds = projectList.stream()
-            .map(GameEventProjectVo::getProjectId)
-            .filter(Objects::nonNull)
-            .collect(Collectors.toList());
+                .map(GameEventProjectVo::getProjectId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
 
         if (projectIds.isEmpty()) {
             return;
@@ -160,7 +160,7 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
         // 转换为 Map 方便查找
         Map<Long, GameProjectStatsVo> statsMap = statsList.stream()
-            .collect(Collectors.toMap(GameProjectStatsVo::getProjectId, s -> s));
+                .collect(Collectors.toMap(GameProjectStatsVo::getProjectId, s -> s));
 
         // 回填统计数据
         projectList.forEach(vo -> {
@@ -191,29 +191,31 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
         // 构建查询条件,排除默认赛事ID
         LambdaQueryWrapper<GameEventProject> lqw = buildQueryWrapperForProjectLibrary(bo, defaultEventID);
-//        Page<GameEventProjectVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        // Page<GameEventProjectVo> result = baseMapper.selectVoPage(pageQuery.build(),
+        // lqw);
         Page<GameEventProjectVo> result = baseMapper.selectPageEventProjectList(pageQuery.build(), lqw);
 
         // 处理记录
         result.getRecords().forEach(record -> {
             Optional.ofNullable(record.getEventId())
-                .filter(ObjectUtil::isNotEmpty)
-                .ifPresent(eventId -> {
-                    GameEvent gameEvent = gameEventMapper.selectById(eventId);
-                    if (gameEvent != null) {
-                        record.setEventName(gameEvent.getEventName());
-                    }
-                });
-            //不获取关联性数据
+                    .filter(ObjectUtil::isNotEmpty)
+                    .ifPresent(eventId -> {
+                        GameEvent gameEvent = gameEventMapper.selectById(eventId);
+                        if (gameEvent != null) {
+                            record.setEventName(gameEvent.getEventName());
+                        }
+                    });
+            // 不获取关联性数据
             record.setRefereeGroup("[]");
-            //移除原始的projectId,确保添加为新项目
+            // 移除原始的projectId,确保添加为新项目
             record.setProjectId(null);
         });
 
         // 按更新时间降序排序(最新的在前)
         List<GameEventProjectVo> sortedRecords = result.getRecords().stream()
-            .sorted(Comparator.comparing(GameEventProjectVo::getUpdateTime, Comparator.nullsLast(Comparator.reverseOrder())))
-            .collect(Collectors.toList());
+                .sorted(Comparator.comparing(GameEventProjectVo::getUpdateTime,
+                        Comparator.nullsLast(Comparator.reverseOrder())))
+                .collect(Collectors.toList());
         result.setRecords(sortedRecords);
 
         return TableDataInfo.build(result);
@@ -230,30 +232,30 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         if (bo.getEventId() == null) {
             Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
             if (cacheObject instanceof Integer) {
-                bo.setEventId(((Integer) cacheObject).longValue());  // 显式转换为 Long 类型
+                bo.setEventId(((Integer) cacheObject).longValue()); // 显式转换为 Long 类型
             } else if (cacheObject instanceof Long) {
                 bo.setEventId((Long) cacheObject);
             }
         }
         LambdaQueryWrapper<GameEventProject> lqw = buildQueryWrapper(bo);
-//        List<GameEventProjectVo> list = baseMapper.selectVoList(lqw);
+        // List<GameEventProjectVo> list = baseMapper.selectVoList(lqw);
         List<GameEventProjectVo> list = baseMapper.selectEventProjectList(lqw);
         list.forEach(vo -> {
             Optional.ofNullable(vo.getEventId())
-                .filter(ObjectUtil::isNotEmpty)
-                .ifPresent(eventId -> {
-                    GameEvent gameEvent = gameEventMapper.selectById(eventId);
-                    if (gameEvent != null) {
-                        vo.setEventName(gameEvent.getEventName());
-                    }
-                });
+                    .filter(ObjectUtil::isNotEmpty)
+                    .ifPresent(eventId -> {
+                        GameEvent gameEvent = gameEventMapper.selectById(eventId);
+                        if (gameEvent != null) {
+                            vo.setEventName(gameEvent.getEventName());
+                        }
+                    });
 
             Optional.ofNullable(vo.getRefereeGroup())
-                .filter(ObjectUtil::isNotEmpty)
-                .ifPresent(refereeIdStr -> {
-                    List<Long> refereeList = JSONUtil.toList(refereeIdStr, Long.class);
-                    vo.setRefereeGroups(refereeList);
-                });
+                    .filter(ObjectUtil::isNotEmpty)
+                    .ifPresent(refereeIdStr -> {
+                        List<Long> refereeList = JSONUtil.toList(refereeIdStr, Long.class);
+                        vo.setRefereeGroups(refereeList);
+                    });
         });
         // 批量计算统计数据
         calculateProjectStats(bo.getEventId(), list);
@@ -262,6 +264,7 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
     /**
      * 计算项目的参赛人数
+     *
      * @param projectId 项目ID
      * @return 参赛人数
      */
@@ -272,30 +275,30 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
         // 查询所有运动员,筛选出参与该项目的运动员
         List<GameAthlete> allAthletes = gameAthleteMapper.selectList(
-            Wrappers.lambdaQuery(GameAthlete.class)
-                .select(GameAthlete::getProjectValue)
-        );
+                Wrappers.lambdaQuery(GameAthlete.class)
+                        .select(GameAthlete::getProjectValue));
 
         long count = allAthletes.stream()
-            .filter(athlete -> {
-                if (StringUtils.isNotBlank(athlete.getProjectValue())) {
-                    try {
-                        List<Long> projectList = JSONUtil.toList(athlete.getProjectValue(), Long.class);
-                        return projectList.contains(projectId);
-                    } catch (Exception e) {
-                        log.warn("解析运动员项目列表失败: {}", athlete.getProjectValue(), e);
-                        return false;
+                .filter(athlete -> {
+                    if (StringUtils.isNotBlank(athlete.getProjectValue())) {
+                        try {
+                            List<Long> projectList = JSONUtil.toList(athlete.getProjectValue(), Long.class);
+                            return projectList.contains(projectId);
+                        } catch (Exception e) {
+                            log.warn("解析运动员项目列表失败: {}", athlete.getProjectValue(), e);
+                            return false;
+                        }
                     }
-                }
-                return false;
-            })
-            .count();
+                    return false;
+                })
+                .count();
 
         return count;
     }
 
     /**
      * 计算项目的参赛队伍数
+     *
      * @param projectId 项目ID
      * @return 参赛队伍数
      */
@@ -306,24 +309,23 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
         // 查询所有队伍,筛选出参与该项目的队伍
         List<GameTeam> allTeams = gameTeamMapper.selectList(
-            Wrappers.lambdaQuery(GameTeam.class)
-                .select(GameTeam::getProjectValue)
-        );
+                Wrappers.lambdaQuery(GameTeam.class)
+                        .select(GameTeam::getProjectValue));
 
         long count = allTeams.stream()
-            .filter(team -> {
-                if (StringUtils.isNotBlank(team.getProjectValue())) {
-                    try {
-                        List<Long> projectList = JSONUtil.toList(team.getProjectValue(), Long.class);
-                        return projectList.contains(projectId);
-                    } catch (Exception e) {
-                        log.warn("解析队伍项目列表失败: {}", team.getProjectValue(), e);
-                        return false;
+                .filter(team -> {
+                    if (StringUtils.isNotBlank(team.getProjectValue())) {
+                        try {
+                            List<Long> projectList = JSONUtil.toList(team.getProjectValue(), Long.class);
+                            return projectList.contains(projectId);
+                        } catch (Exception e) {
+                            log.warn("解析队伍项目列表失败: {}", team.getProjectValue(), e);
+                            return false;
+                        }
                     }
-                }
-                return false;
-            })
-            .count();
+                    return false;
+                })
+                .count();
 
         return count;
     }
@@ -335,24 +337,24 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         lqw.eq(bo.getEventId() != null, GameEventProject::getEventId, bo.getEventId());
         // 通过名称模糊查询
         Optional.ofNullable(bo.getEventName())
-            .ifPresent(eventName -> {
-                List<GameEvent> gameEvents = gameEventMapper.selectList(
-                    Wrappers.lambdaQuery(GameEvent.class)
-                        .like(GameEvent::getEventName, bo.getEventName())
-                        .select(GameEvent::getEventId)
-                );
-                if (CollectionUtils.isNotEmpty(gameEvents)) {
-                    List<Long> ids = gameEvents.stream()
-                        .map(GameEvent::getEventId)
-                        .collect(Collectors.toList());
-                    lqw.in(GameEventProject::getEventId, ids);
-                } else {
-                    lqw.apply("1=0");
-                }
-            });
+                .ifPresent(eventName -> {
+                    List<GameEvent> gameEvents = gameEventMapper.selectList(
+                            Wrappers.lambdaQuery(GameEvent.class)
+                                    .like(GameEvent::getEventName, bo.getEventName())
+                                    .select(GameEvent::getEventId));
+                    if (CollectionUtils.isNotEmpty(gameEvents)) {
+                        List<Long> ids = gameEvents.stream()
+                                .map(GameEvent::getEventId)
+                                .collect(Collectors.toList());
+                        lqw.in(GameEventProject::getEventId, ids);
+                    } else {
+                        lqw.apply("1=0");
+                    }
+                });
         lqw.like(StringUtils.isNotBlank(bo.getProjectName()), GameEventProject::getProjectName, bo.getProjectName());
         lqw.eq(StringUtils.isNotBlank(bo.getProjectType()), GameEventProject::getProjectType, bo.getProjectType());
-        lqw.eq(StringUtils.isNotBlank(bo.getClassification()), GameEventProject::getClassification, bo.getClassification());
+        lqw.eq(StringUtils.isNotBlank(bo.getClassification()), GameEventProject::getClassification,
+                bo.getClassification());
         lqw.eq(bo.getStartTime() != null, GameEventProject::getStartTime, bo.getStartTime());
         lqw.eq(StringUtils.isNotBlank(bo.getOrderType()), GameEventProject::getOrderType, bo.getOrderType());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), GameEventProject::getStatus, bo.getStatus());
@@ -362,7 +364,8 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
     /**
      * 构建项目库查询条件,排除默认赛事ID
      */
-    private LambdaQueryWrapper<GameEventProject> buildQueryWrapperForProjectLibrary(GameEventProjectBo bo, Long defaultEventID) {
+    private LambdaQueryWrapper<GameEventProject> buildQueryWrapperForProjectLibrary(GameEventProjectBo bo,
+            Long defaultEventID) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<GameEventProject> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(GameEventProject::getProjectId);
@@ -377,24 +380,24 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
         // 通过名称模糊查询
         Optional.ofNullable(bo.getEventName())
-            .ifPresent(eventName -> {
-                List<GameEvent> gameEvents = gameEventMapper.selectList(
-                    Wrappers.lambdaQuery(GameEvent.class)
-                        .like(GameEvent::getEventName, bo.getEventName())
-                        .select(GameEvent::getEventId)
-                );
-                if (CollectionUtils.isNotEmpty(gameEvents)) {
-                    List<Long> ids = gameEvents.stream()
-                        .map(GameEvent::getEventId)
-                        .collect(Collectors.toList());
-                    lqw.in(GameEventProject::getEventId, ids);
-                } else {
-                    lqw.apply("1=0");
-                }
-            });
+                .ifPresent(eventName -> {
+                    List<GameEvent> gameEvents = gameEventMapper.selectList(
+                            Wrappers.lambdaQuery(GameEvent.class)
+                                    .like(GameEvent::getEventName, bo.getEventName())
+                                    .select(GameEvent::getEventId));
+                    if (CollectionUtils.isNotEmpty(gameEvents)) {
+                        List<Long> ids = gameEvents.stream()
+                                .map(GameEvent::getEventId)
+                                .collect(Collectors.toList());
+                        lqw.in(GameEventProject::getEventId, ids);
+                    } else {
+                        lqw.apply("1=0");
+                    }
+                });
         lqw.like(StringUtils.isNotBlank(bo.getProjectName()), GameEventProject::getProjectName, bo.getProjectName());
         lqw.eq(StringUtils.isNotBlank(bo.getProjectType()), GameEventProject::getProjectType, bo.getProjectType());
-        lqw.eq(StringUtils.isNotBlank(bo.getClassification()), GameEventProject::getClassification, bo.getClassification());
+        lqw.eq(StringUtils.isNotBlank(bo.getClassification()), GameEventProject::getClassification,
+                bo.getClassification());
         lqw.eq(bo.getStartTime() != null, GameEventProject::getStartTime, bo.getStartTime());
         lqw.eq(StringUtils.isNotBlank(bo.getOrderType()), GameEventProject::getOrderType, bo.getOrderType());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), GameEventProject::getStatus, bo.getStatus());
@@ -412,7 +415,7 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         if (bo.getEventId() == null) {
             Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
             if (cacheObject instanceof Integer) {
-                bo.setEventId(((Integer) cacheObject).longValue());  // 显式转换为 Long 类型
+                bo.setEventId(((Integer) cacheObject).longValue()); // 显式转换为 Long 类型
             } else if (cacheObject instanceof Long) {
                 bo.setEventId((Long) cacheObject);
             }
@@ -442,7 +445,7 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
             defaultEventID = null;
         }
         projectList.forEach(projectBo -> projectBo.setEventId(defaultEventID));
-        if (CollectionUtils.isNotEmpty(projectList)){
+        if (CollectionUtils.isNotEmpty(projectList)) {
             return baseMapper.insertBatch(projectList);
         }
         return false;
@@ -459,7 +462,7 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         if (bo.getEventId() == null) {
             Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
             if (cacheObject instanceof Integer) {
-                bo.setEventId(((Integer) cacheObject).longValue());  // 显式转换为 Long 类型
+                bo.setEventId(((Integer) cacheObject).longValue()); // 显式转换为 Long 类型
             } else if (cacheObject instanceof Long) {
                 bo.setEventId((Long) cacheObject);
             }
@@ -476,7 +479,7 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
      * 保存前的数据校验
      */
     private void validEntityBeforeSave(GameEventProject entity) {
-        //TODO 做一些数据校验,如唯一约束
+        // TODO 做一些数据校验,如唯一约束
     }
 
     /**
@@ -489,14 +492,14 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         if (isValid) {
-            //TODO 做一些业务上的校验,判断是否需要校验
+            // TODO 做一些业务上的校验,判断是否需要校验
 
         }
-        //删除项目前批量删除裁判的关联信息
+        // 删除项目前批量删除裁判的关联信息
         removeProjectFromReferees(ids);
-        //删除项目前批量删除运动员的关联信息
+        // 删除项目前批量删除运动员的关联信息
         removeProjectFromAthletes(ids);
-        //删除项目前批量删除分组表game_event_group中的关联信息
+        // 删除项目前批量删除分组表game_event_group中的关联信息
         removeProjectFromGroups(ids);
         return baseMapper.deleteByIds(ids) > 0;
     }
@@ -518,7 +521,7 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
             log.info("找到 {} 名运动员需要更新项目关联,项目ID列表: {}", athletes.size(), projectIds);
 
             for (GameAthleteBo athlete : athletes) {
-                for (Long projectId : projectIds){
+                for (Long projectId : projectIds) {
                     if (athlete.getProjectList() != null) {
                         athlete.getProjectList().remove(projectId);
                         log.info("已从运动员 {} 的项目列表中移除项目 {}", athlete.getName(), projectId);
@@ -573,17 +576,16 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
             // 查询所有包含这些项目的分组
             List<GameEventGroup> groups = gameEventGroupMapper.selectList(
-                Wrappers.lambdaQuery(GameEventGroup.class)
-                    .in(GameEventGroup::getProjectId, projectIds)
-            );
+                    Wrappers.lambdaQuery(GameEventGroup.class)
+                            .in(GameEventGroup::getProjectId, projectIds));
 
             log.info("找到 {} 个分组需要删除,项目ID列表: {}", groups.size(), projectIds);
 
             if (CollectionUtils.isNotEmpty(groups)) {
                 // 提取分组ID列表
                 List<Long> groupIds = groups.stream()
-                    .map(GameEventGroup::getGroupId)
-                    .collect(Collectors.toList());
+                        .map(GameEventGroup::getGroupId)
+                        .collect(Collectors.toList());
 
                 // 批量删除分组
                 int deletedCount = gameEventGroupMapper.deleteBatchIds(groupIds);
@@ -602,22 +604,19 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         if (CollectionUtils.isEmpty(projectIds)) {
             return Collections.emptyList();
         }
-//        return this.baseMapper.selectVoList(
+        // return this.baseMapper.selectVoList(
         return this.baseMapper.selectEventProjectList(
-            new LambdaQueryWrapper<GameEventProject>()
-                .eq(GameEventProject::getEventId, eventId)
-                .in(GameEventProject::getProjectId, projectIds)
-        );
+                new LambdaQueryWrapper<GameEventProject>()
+                        .eq(GameEventProject::getEventId, eventId)
+                        .in(GameEventProject::getProjectId, projectIds));
     }
 
     @Override
     public Long countEventProject() {
         return this.baseMapper.selectCount(
-            Wrappers.lambdaQuery(GameEventProject.class)
-        );
+                Wrappers.lambdaQuery(GameEventProject.class));
     }
 
-
     /**
      * 获取excel动态表头
      *
@@ -625,21 +624,21 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
      */
     @Override
     public Map<String, List<String>> mapProjectTypeAndProject(Long eventId) {
-        // Object cacheId = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
+        // Object cacheId =
+        // RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
         // Long defaultEventId = Long.valueOf(cacheId.toString());
         List<GameEventProject> list = baseMapper.selectList(
-            Wrappers.lambdaQuery(GameEventProject.class)
-                .eq(GameEventProject::getEventId, eventId)
-                .select(GameEventProject::getProjectType, GameEventProject::getProjectName)
-                .orderByDesc(GameEventProject::getProjectType)
-        );
+                Wrappers.lambdaQuery(GameEventProject.class)
+                        .eq(GameEventProject::getEventId, eventId)
+                        .select(GameEventProject::getProjectType, GameEventProject::getProjectName)
+                        .orderByDesc(GameEventProject::getProjectType));
 
         // 从字典中获取项目类型映射:projectType (dictValue) -> dictLabel
         List<SysDictDataVo> projectTypeDictList = sysDictTypeService.selectDictDataByType("game_project_type");
 
         // 构建 dictValue -> dictLabel 的映射,便于快速查找
         Map<String, String> dictMap = projectTypeDictList.stream()
-            .collect(Collectors.toMap(SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel));
+                .collect(Collectors.toMap(SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel));
 
         // 遍历项目列表,将每个项目的 projectType 转换为对应的中文 label,并以 projectName 为 key 构建结果 map
         Map<String, List<String>> result = new HashMap<>();
@@ -663,9 +662,8 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
     @Override
     public List<GameEventProjectVo> queryListByEventId(Long eventId) {
         List<GameEventProjectVo> projects = baseMapper.selectVoList(
-            Wrappers.lambdaQuery(GameEventProject.class)
-                .eq(GameEventProject::getEventId, eventId)
-        );
+                Wrappers.lambdaQuery(GameEventProject.class)
+                        .eq(GameEventProject::getEventId, eventId));
         return projects;
     }
 
@@ -678,13 +676,12 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
     @Override
     public Map<String, Long> mapProjectAndProjectId(Long eventId) {
         List<GameEventProject> projects = baseMapper.selectList(
-            Wrappers.lambdaQuery(GameEventProject.class)
-                .eq(GameEventProject::getEventId, eventId)
-                .select(GameEventProject::getProjectId, GameEventProject::getProjectName)
-        );
-        return projects.isEmpty() ?
-            Map.of() :
-            projects.stream().collect(Collectors.toMap(GameEventProject::getProjectName, GameEventProject::getProjectId));
+                Wrappers.lambdaQuery(GameEventProject.class)
+                        .eq(GameEventProject::getEventId, eventId)
+                        .select(GameEventProject::getProjectId, GameEventProject::getProjectName));
+        return projects.isEmpty() ? Map.of()
+                : projects.stream()
+                        .collect(Collectors.toMap(GameEventProject::getProjectName, GameEventProject::getProjectId));
     }
 
     @Override
@@ -692,24 +689,22 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         if (projectIds == null || projectIds.isEmpty()) {
             // 如果项目ID列表为空,返回该赛事下的所有项目
             List<GameEventProject> projectVoList = baseMapper.selectList(
-                Wrappers.lambdaQuery(GameEventProject.class)
-                    .eq(GameEventProject::getEventId, eventId)
-                    .select(GameEventProject::getProjectId, GameEventProject::getProjectName)
-            );
-            return projectVoList.isEmpty() ?
-                Map.of() :
-                projectVoList.stream().collect(Collectors.toMap(GameEventProject::getProjectId, GameEventProject::getProjectName));
+                    Wrappers.lambdaQuery(GameEventProject.class)
+                            .eq(GameEventProject::getEventId, eventId)
+                            .select(GameEventProject::getProjectId, GameEventProject::getProjectName));
+            return projectVoList.isEmpty() ? Map.of()
+                    : projectVoList.stream().collect(
+                            Collectors.toMap(GameEventProject::getProjectId, GameEventProject::getProjectName));
         } else {
             // 如果项目ID列表不为空,根据指定的项目ID查询
             List<GameEventProject> projectVoList = baseMapper.selectList(
-                Wrappers.lambdaQuery(GameEventProject.class)
-                    .eq(GameEventProject::getEventId, eventId)
-                    .in(GameEventProject::getProjectId, projectIds)
-                    .select(GameEventProject::getProjectId, GameEventProject::getProjectName)
-            );
-            return projectVoList.isEmpty() ?
-                Map.of() :
-                projectVoList.stream().collect(Collectors.toMap(GameEventProject::getProjectId, GameEventProject::getProjectName));
+                    Wrappers.lambdaQuery(GameEventProject.class)
+                            .eq(GameEventProject::getEventId, eventId)
+                            .in(GameEventProject::getProjectId, projectIds)
+                            .select(GameEventProject::getProjectId, GameEventProject::getProjectName));
+            return projectVoList.isEmpty() ? Map.of()
+                    : projectVoList.stream().collect(
+                            Collectors.toMap(GameEventProject::getProjectId, GameEventProject::getProjectName));
         }
     }
 }

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

@@ -12,12 +12,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 WHEN p.classification = '0' THEN
                     (SELECT COUNT(*) FROM game_athlete a
                      WHERE a.event_id = #{eventId} AND a.del_flag = '0'
-                       AND JSON_CONTAINS(a.project_value, CAST(p.project_id AS CHAR))
+                       AND (JSON_CONTAINS(a.project_value, CAST(p.project_id AS CHAR)) OR JSON_CONTAINS(a.project_value, CONCAT('"', p.project_id, '"')))
                     )
                 ELSE
-                    (SELECT COUNT(*) FROM game_team t
-                     WHERE t.event_id = #{eventId} AND t.del_flag = '0'
-                       AND JSON_CONTAINS(t.project_value, CAST(p.project_id AS CHAR))
+                    (SELECT COUNT(DISTINCT a.team_id) FROM game_athlete a
+                     WHERE a.event_id = #{eventId} AND a.del_flag = '0'
+                       AND (JSON_CONTAINS(a.project_value, CAST(p.project_id AS CHAR)) OR JSON_CONTAINS(a.project_value, CONCAT('"', p.project_id, '"')))
                     )
             END) as totalParticipants,
             (SELECT COUNT(DISTINCT (CASE WHEN p.classification = '0' THEN s.athlete_id ELSE s.team_id END))