Browse Source

feat(game): 新增无权限查询参赛队员列表方法

- 在 GameAthleteServiceImpl 中实现 queryListNoPermission 方法
- 支持从 Redis 缓存获取默认赛事 ID
- 自动解析运动员项目数据并设置项目列表
- 补充赛事名称和队伍名称的自动填充逻辑
- 在 IGameAthleteService 接口中声明新方法
- 更新 GameEventServiceImpl 使用新的无权限查询方法
- 添加 SaTokenContextException 异常处理机制
zhou 1 week ago
parent
commit
ec30cf3ea2

+ 11 - 0
ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/handler/SaTokenExceptionHandler.java

@@ -3,6 +3,7 @@ package org.dromara.common.satoken.handler;
 import cn.dev33.satoken.exception.NotLoginException;
 import cn.dev33.satoken.exception.NotPermissionException;
 import cn.dev33.satoken.exception.NotRoleException;
+import cn.dev33.satoken.exception.SaTokenContextException;
 import cn.hutool.http.HttpStatus;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
@@ -49,4 +50,14 @@ public class SaTokenExceptionHandler {
         return R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源");
     }
 
+    /**
+     * SaToken上下文异常
+     */
+    @ExceptionHandler(SaTokenContextException.class)
+    public R<Void> handleSaTokenContextException(SaTokenContextException e, HttpServletRequest request) {
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',SaToken上下文异常'{}'", requestURI, e.getMessage());
+        return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "系统内部错误,请稍后重试");
+    }
+
 }

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

@@ -52,6 +52,13 @@ public interface IGameAthleteService {
      * @return 参赛队员列表
      */
     List<GameAthleteVo> queryList(GameAthleteBo bo);
+    /**
+     * 没有使用数据权限的查询参赛队员列表方法
+     *
+     * @param bo 查询条件
+     * @return 参赛队员列表
+     */
+    List<GameAthleteVo> queryListNoPermission(GameAthleteBo bo);
 
     List<GameAthleteVo> exportData(GameAthleteBo bo);
 

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

@@ -303,6 +303,60 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
         return athleteList;
     }
 
+    @Override
+    public List<GameAthleteVo> queryListNoPermission(GameAthleteBo bo) {
+        if (bo.getEventId() == null) {
+            Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
+            if (cacheObject instanceof Integer) {
+                bo.setEventId(((Integer) cacheObject).longValue());  // 显式转换为 Long 类型
+            } else if (cacheObject instanceof Long) {
+                bo.setEventId((Long) cacheObject);
+            }
+        }
+        LambdaQueryWrapper<GameAthlete> lqw = buildQueryWrapper(bo);
+        List<GameAthleteVo> athleteList = baseMapper.selectVoList(lqw);
+//        List<GameAthleteVo> athleteList = baseMapper.selectAthleteList(lqw);
+        athleteList.forEach(vo -> {
+            Optional.ofNullable(vo.getProjectValue())
+                .filter(StringUtils::isNotBlank)
+                .ifPresent(projectValue -> {
+                    log.debug("解析运动员 {} 的项目数据 - projectValue: {}", vo.getName(), projectValue);
+                    try {
+                        List<Long> projects = JSONUtil.toList(projectValue, Long.class);
+                        vo.setProjectList(projects);
+                        log.debug("解析成功 - 运动员: {}, 项目列表: {}", vo.getName(), projects);
+                    } catch (Exception e) {
+                        log.error("解析项目数据失败 - 运动员: {}, projectValue: {}, 错误: {}", vo.getName(), projectValue, e.getMessage());
+                        vo.setProjectList(new ArrayList<>());
+                    }
+                });
+            Optional.ofNullable(vo.getEventId())
+                .filter(ObjectUtil::isNotEmpty)
+                .ifPresent(eventId -> {
+                    GameEventVo gameEventVo = gameEventService.queryById(vo.getEventId());
+                    if (gameEventVo != null) {
+                        vo.setEventName(gameEventVo.getEventName());
+                    } else {
+                        log.warn("赛事ID {} 对应的赛事信息不存在", eventId);
+                        vo.setEventName("未知赛事");
+                    }
+                });
+            Optional.ofNullable(vo.getTeamId())
+                .filter(ObjectUtil::isNotEmpty)
+                .ifPresent(teamId -> {
+                    GameTeamVo gameTeamVo = gameTeamService.queryById(vo.getTeamId());
+                    if (gameTeamVo != null) {
+                        vo.setTeamName(gameTeamVo.getTeamName());
+                    } else {
+                        log.warn("队伍ID {} 对应的队伍信息不存在", teamId);
+                        vo.setTeamName("未知队伍");
+                    }
+                });
+        });
+
+        return athleteList;
+    }
+
     /**
      * 导出数据
      */

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

@@ -35,12 +35,14 @@ import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.system.domain.GameAthlete;
 import org.dromara.system.domain.GameEvent;
 import org.dromara.system.domain.GameEventGroup;
 import org.dromara.system.domain.PdfEntry;
 import org.dromara.system.domain.bo.*;
 import org.dromara.system.domain.constant.GameEventConstant;
 import org.dromara.system.domain.vo.*;
+import org.dromara.system.mapper.GameAthleteMapper;
 import org.dromara.system.mapper.GameEventMapper;
 import org.dromara.system.config.FileUploadConfig;
 import org.dromara.system.service.*;
@@ -1831,7 +1833,7 @@ public class GameEventServiceImpl implements IGameEventService {
             // 查询运动员数据
             GameAthleteBo gameAthleteBo = new GameAthleteBo();
             gameAthleteBo.setEventId(eventId);
-            List<GameAthleteVo> athleteVoList = gameAthleteService.queryList(gameAthleteBo);
+            List<GameAthleteVo> athleteVoList = gameAthleteService.queryListNoPermission(gameAthleteBo);
 
             if (CollectionUtil.isEmpty(athleteVoList)) {
                 gameBibTaskService.updateTaskStatus(taskId, "3", "当前赛事没有队员数据");
@@ -2074,7 +2076,7 @@ public class GameEventServiceImpl implements IGameEventService {
 
             // 获取赛事ID(从athlete对象中获取)
             Long shId = athlete.getEventId();
-            
+
             // 获取赛事名称和队伍名称
             String shName = athlete.getEventName();
             String dwName = athlete.getTeamName() != null ? athlete.getTeamName() : "未知队伍";