فهرست منبع

feat(game): 添加项目ID查询队伍功能并优化运动员查询逻辑

- 移除未使用的导入包(Collectors、JSONUtil、GameTeam、GameEventProject等)
- 将Stream.collect(Collectors.toList())替换为Stream.toList()
- 在GameAthleteController中添加getTeamListByProjectId接口方法
- 优化SQL查询逻辑,支持JSON数组和单值的项目ID匹配
- 在mapper层添加selectTeamPageByProjectId查询方法
- 实现selectTeamPageByProjectId服务层方法
- 更新数据权限注解格式化代码风格
- 优化LambdaQueryWrapper中的JSON匹配条件表达式
zhou 5 روز پیش
والد
کامیت
8f838089d4

+ 10 - 4
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/GameAthleteController.java

@@ -2,9 +2,7 @@ package org.dromara.system.controller;
 
 import java.io.IOException;
 import java.util.*;
-import java.util.stream.Collectors;
 
-import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
@@ -14,7 +12,6 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.excel.core.ExcelResult;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.system.domain.GameAthlete;
-import org.dromara.system.domain.GameTeam;
 import org.dromara.system.domain.bo.ProjectSelectionValidationBo;
 import org.dromara.system.domain.constant.GameEventConstant;
 import org.dromara.system.domain.vo.AthleteScoreVo;
@@ -90,7 +87,7 @@ public class GameAthleteController extends BaseController {
                     gameAthlete.setEventId(finalDefaultEventId);
                     return gameAthlete;
                 })
-                .collect(Collectors.toList());
+                .toList();
             gameAthleteService.saveOrEditBatch(list);
         } catch (IOException e) {
             e.printStackTrace();
@@ -180,4 +177,13 @@ public class GameAthleteController extends BaseController {
     public R<Long> getAthleteCountByProjectId(@PathVariable Long projectId, @RequestParam(required = false) Long eventId) {
         return R.ok(gameAthleteService.selectAthleteCountByProjectId(eventId, projectId));
     }
+
+    /**
+     * 根据项目ID分页查询队伍详细信息
+     * @param projectId 项目ID
+     */
+    @GetMapping("/teamListByProject/{projectId}")
+    public TableDataInfo<GameTeamVo> getTeamListByProjectId(@PathVariable Long projectId, PageQuery pageQuery) {
+        return gameAthleteService.selectTeamPageByProjectId(projectId, pageQuery);
+    }
 }

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

@@ -8,15 +8,13 @@ import org.apache.ibatis.annotations.Select;
 import org.dromara.common.mybatis.annotation.DataColumn;
 import org.dromara.common.mybatis.annotation.DataPermission;
 import org.dromara.system.domain.GameAthlete;
-import org.dromara.system.domain.GameEventProject;
 import org.dromara.system.domain.bo.GameAthleteBo;
 import org.dromara.system.domain.vo.GameAthleteVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
-import org.dromara.system.domain.vo.GameEventProjectVo;
+import org.dromara.system.domain.vo.GameTeamVo;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 参赛队员Mapper接口
@@ -30,16 +28,16 @@ public interface GameAthleteMapper extends BaseMapperPlus<GameAthlete, GameAthle
      * 分页查询运动员列表
      */
     @DataPermission({
-        @DataColumn(key = "deptName", value = "create_dept"),
-        @DataColumn(key = "userName", value = "create_by")
+            @DataColumn(key = "deptName", value = "create_dept"),
+            @DataColumn(key = "userName", value = "create_by")
     })
     default Page<GameAthleteVo> selectPageAthleteList(Page<GameAthlete> page, Wrapper<GameAthlete> queryWrapper) {
         return this.selectVoPage(page, queryWrapper);
     }
 
     @DataPermission({
-        @DataColumn(key = "deptName", value = "create_dept"),
-        @DataColumn(key = "userName", value = "create_by")
+            @DataColumn(key = "deptName", value = "create_dept"),
+            @DataColumn(key = "userName", value = "create_by")
     })
     default List<GameAthleteVo> selectAthleteList(Wrapper<GameAthlete> queryWrapper) {
         return this.selectVoList(queryWrapper);
@@ -56,15 +54,25 @@ public interface GameAthleteMapper extends BaseMapperPlus<GameAthlete, GameAthle
 
     /**
      * 根据项目id列表查询运动员(批量查询)
+     *
      * @param projectIds 项目id列表
      * @return 运动员列表
      */
     @Select("<script>" +
-        "SELECT * FROM game_athlete " +
-        "WHERE del_flag = '0' and(" +
-        "<foreach collection='projectIds' item='projectId' separator=' OR '>" +
-        "JSON_CONTAINS(project_value, CAST(#{projectId} AS JSON))" +
-        "</foreach>" +")"+
-        "</script>")
+            "SELECT * FROM game_athlete " +
+            "WHERE del_flag = '0' AND (" +
+            "<foreach collection='projectIds' item='projectId' separator=' OR '>" +
+            "(JSON_CONTAINS(project_value, CAST(#{projectId} AS JSON)) OR JSON_CONTAINS(project_value, JSON_ARRAY(CAST(#{projectId} AS CHAR))))" +
+            "</foreach>" + ")" +
+            "</script>")
     List<GameAthleteBo> findByProjectIds(@Param("projectIds") Collection<Long> projectIds);
+
+    /**
+     * 根据项目ID分页查询队伍详细信息
+     */
+    @Select("SELECT DISTINCT gt.* FROM game_team gt " +
+            "JOIN game_athlete ga ON ga.team_id = gt.team_id " +
+            "WHERE ga.del_flag = '0' AND gt.del_flag = '0' " +
+            "AND (JSON_CONTAINS(ga.project_value, CAST(#{projectId} AS JSON)) OR JSON_CONTAINS(ga.project_value, JSON_ARRAY(CAST(#{projectId} AS CHAR))))")
+    Page<GameTeamVo> selectTeamPageByProjectId(Page<GameTeamVo> page, @Param("projectId") Long projectId);
 }

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

@@ -7,6 +7,7 @@ import org.dromara.system.domain.bo.GameAthleteBo;
 import org.dromara.system.domain.bo.ProjectSelectionValidationBo;
 import org.dromara.system.domain.vo.AthleteScoreVo;
 import org.dromara.system.domain.vo.GameAthleteVo;
+import org.dromara.system.domain.vo.GameTeamVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -140,4 +141,12 @@ public interface IGameAthleteService {
      * @return 人数
      */
     Long countEligibleAthletes(Long eventId, Long projectId, String gender, String mixGenderValue);
+
+    /**
+     * 根据项目ID分页查询队伍详细信息
+     * @param projectId 项目ID
+     * @param pageQuery 分页参数
+     * @return 队伍分页列表
+     */
+    TableDataInfo<GameTeamVo> selectTeamPageByProjectId(Long projectId, PageQuery pageQuery);
 }

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

@@ -495,7 +495,7 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), GameAthlete::getStatus, bo.getStatus());
         lqw.like(StringUtils.isNotBlank(bo.getPhone()), GameAthlete::getPhone, bo.getPhone());
         lqw.like(StringUtils.isNotBlank(bo.getLocation()), GameAthlete::getLocation, bo.getLocation());
-        lqw.apply(bo.getProjectId() != null, "JSON_CONTAINS(project_value, JSON_ARRAY({0}))", bo.getProjectId());
+        lqw.apply(bo.getProjectId() != null, "(JSON_CONTAINS(project_value, CAST({0} AS JSON)) OR JSON_CONTAINS(project_value, JSON_ARRAY(CAST({0} AS CHAR))))", bo.getProjectId());
         return lqw;
     }
 
@@ -845,14 +845,14 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
     public Long selectAthleteCountByProjectId(Long eventId, Long projectId) {
         return baseMapper.selectCount(new LambdaQueryWrapper<GameAthlete>()
             .eq(eventId != null, GameAthlete::getEventId, eventId)
-            .apply("JSON_CONTAINS(project_value, JSON_ARRAY({0}))", projectId));
+            .apply("(JSON_CONTAINS(project_value, CAST({0} AS JSON)) OR JSON_CONTAINS(project_value, JSON_ARRAY(CAST({0} AS CHAR))))", projectId));
     }
 
     @Override
     public Long countEligibleAthletes(Long eventId, Long projectId, String gender, String mixGenderValue) {
         LambdaQueryWrapper<GameAthlete> lqw = new LambdaQueryWrapper<>();
         lqw.eq(eventId != null, GameAthlete::getEventId, eventId);
-        lqw.apply(projectId != null, "JSON_CONTAINS(project_value, JSON_ARRAY({0}))", projectId);
+        lqw.apply(projectId != null, "(JSON_CONTAINS(project_value, CAST({0} AS JSON)) OR JSON_CONTAINS(project_value, JSON_ARRAY(CAST({0} AS CHAR))))", projectId);
 
         // 性别过滤:如果不为空且不是“混合”模式,则增加性别过滤
         if (StringUtils.isNotBlank(gender) && !gender.equals(mixGenderValue)) {
@@ -861,4 +861,10 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
 
         return baseMapper.selectCount(lqw);
     }
+
+    @Override
+    public TableDataInfo<GameTeamVo> selectTeamPageByProjectId(Long projectId, PageQuery pageQuery) {
+        Page<GameTeamVo> page = baseMapper.selectTeamPageByProjectId(pageQuery.build(), projectId);
+        return TableDataInfo.build(page);
+    }
 }