Przeglądaj źródła

feat(game-team): 添加队伍列表导出功能并优化查询逻辑

- 在 GameTeamMapper 中新增 selectTeamListWithProjects 方法用于导出
- 添加数据权限注解支持部门和用户字段的数据权限控制
- 在 GameTeamMapper.xml 中实现带项目名称汇总的查询 SQL
- 重构 GameTeamServiceImpl 中的 queryList 方法使用新的查询逻辑
- 修复 JSON 字符串处理中的参数绑定格式问题
- 保持原有的事件 ID 缓存获取逻辑和运动员列表转换功能
zhou 1 tydzień temu
rodzic
commit
a1895031de

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

@@ -54,6 +54,15 @@ public interface GameTeamMapper extends BaseMapperPlus<GameTeam, GameTeamVo> {
         return this.selectVoList(queryWrapper);
     }
 
+    /**
+     * 查询队伍列表,包含汇总的项目名称(用于导出)
+     */
+    @DataPermission({
+        @DataColumn(key = "deptName", value = "gt.create_dept"),
+        @DataColumn(key = "userName", value = "gt.create_by")
+    })
+    List<GameTeamVo> selectTeamListWithProjects(@Param("ew") Wrapper<GameTeam> queryWrapper);
+
     @Select("""
                 SELECT * FROM game_team
         WHERE del_flag='0' AND event_id = #{eventId} AND number_range IS NOT NULL

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

@@ -103,32 +103,6 @@ public class GameTeamServiceImpl implements IGameTeamService {
         return TableDataInfo.build(result);
     }
 
-    /**
-     * 查询符合条件的参赛队伍列表
-     *
-     * @param bo 查询条件
-     * @return 参赛队伍列表
-     */
-    @Override
-    public List<GameTeamVo> queryList(GameTeamBo 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);
-            }
-        }
-        // 使用包含分组名的查询方法
-        List<GameTeamVo> list = baseMapper.selectVoListWithGroupName(bo);
-        list.forEach(vo -> {
-            if (vo.getAthleteValue() != null) {
-                vo.setAthleteList(JSONUtil.toList(vo.getAthleteValue(), Long.class));
-            }
-        });
-        return list;
-    }
-
     private LambdaQueryWrapper<GameTeam> buildQueryWrapper(GameTeamBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<GameTeam> lqw = Wrappers.lambdaQuery();
@@ -157,7 +131,9 @@ public class GameTeamServiceImpl implements IGameTeamService {
         lqw.eq(StringUtils.isNotBlank(bo.getLeader()), GameTeam::getLeader, bo.getLeader());
         lqw.eq(StringUtils.isNotBlank(bo.getAthleteValue()), GameTeam::getAthleteValue, bo.getAthleteValue());
         lqw.eq(StringUtils.isNotBlank(bo.getProjectValue()), GameTeam::getProjectValue, bo.getProjectValue());
-        lqw.apply(bo.getProjectId() != null, "EXISTS (SELECT 1 FROM game_athlete ga WHERE ga.team_id = gt.team_id AND ga.del_flag = '0' AND (JSON_CONTAINS(ga.project_value, CAST({0} AS CHAR)) OR JSON_CONTAINS(ga.project_value, CONCAT('\"', {0}, '\"'))))", bo.getProjectId());
+        lqw.apply(bo.getProjectId() != null,
+                "EXISTS (SELECT 1 FROM game_athlete ga WHERE ga.team_id = gt.team_id AND ga.del_flag = '0' AND (JSON_CONTAINS(ga.project_value, CAST({0} AS CHAR)) OR JSON_CONTAINS(ga.project_value, CONCAT('\"', {0}, '\"'))))",
+                bo.getProjectId());
         lqw.eq(bo.getAthleteNum() != null, GameTeam::getAthleteNum, bo.getAthleteNum());
         lqw.eq(StringUtils.isNotBlank(bo.getNumberRange()), GameTeam::getNumberRange, bo.getNumberRange());
         lqw.eq(StringUtils.isNotBlank(bo.getTeamDescribe()), GameTeam::getTeamDescribe, bo.getTeamDescribe());
@@ -165,6 +141,34 @@ public class GameTeamServiceImpl implements IGameTeamService {
         return lqw;
     }
 
+    /**
+     * 查询参赛队伍列表
+     *
+     * @param bo 查询条件
+     * @return 参赛队伍列表
+     */
+    @Override
+    public List<GameTeamVo> queryList(GameTeamBo bo) {
+        if (bo.getEventId() == null) {
+            Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
+            if (cacheObject instanceof Integer) {
+                bo.setEventId(((Integer) cacheObject).longValue());
+            } else if (cacheObject instanceof Long) {
+                bo.setEventId((Long) cacheObject);
+            }
+        }
+        LambdaQueryWrapper<GameTeam> lqw = buildQueryWrapper(bo);
+        List<GameTeamVo> list = baseMapper.selectTeamListWithProjects(lqw);
+        // 处理队员列表 JSON 转换
+        list.forEach(vo -> {
+            if (StringUtils.isNotBlank(vo.getAthleteValue())) {
+                List<Long> athleteIds = JSONUtil.toList(vo.getAthleteValue(), Long.class);
+                vo.setAthleteList(athleteIds);
+            }
+        });
+        return list;
+    }
+
     /**
      * 新增参赛队伍
      *

+ 28 - 0
ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/GameTeamMapper.xml

@@ -76,4 +76,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         FROM game_team gt
         ${ew.customSqlSegment}
     </select>
+
+    <select id="selectTeamListWithProjects" resultType="org.dromara.system.domain.vo.GameTeamVo">
+        SELECT
+            gt.team_id,
+            gt.event_id,
+            gt.rg_id,
+            (SELECT rg_name FROM game_rank_group WHERE rg_id = gt.rg_id) as rgName,
+            gt.team_name,
+            gt.team_code,
+            (SELECT event_name FROM game_event WHERE event_id = gt.event_id) as eventName,
+            (SELECT name FROM game_athlete WHERE athlete_id = gt.leader) as leader,
+            gt.athlete_value as athleteValue,
+            gt.project_value as projectValue,
+            gt.athlete_num as athleteNum,
+            gt.number_range as numberRange,
+            gt.team_describe as teamDescribe,
+            gt.status,
+            gt.remark,
+            gt.create_time as createTime,
+            gt.update_time as updateTime,
+            (SELECT GROUP_CONCAT(DISTINCT gp.project_name SEPARATOR ', ')
+             FROM game_athlete ga
+             JOIN game_event_project gp ON (JSON_CONTAINS(ga.project_value, CAST(gp.project_id AS CHAR)) OR JSON_CONTAINS(ga.project_value, CONCAT('"', gp.project_id, '"')))
+             WHERE ga.team_id = gt.team_id AND ga.del_flag = '0' AND gp.del_flag = '0' AND gp.classification != '0'
+            ) as projectNames
+        FROM game_team gt
+        ${ew.customSqlSegment}
+    </select>
 </mapper>