Selaa lähdekoodia

feat(game-event): 增加赛事项目库功能并优化相关接口

- 新增查询所有赛事项目列表接口和批量新增赛事项目接口
- 修改查询默认赛事项目列表接口名称
- 优化赛事项目相关属性命名,如轮次改为录取名次等
- 实现项目库查询条件,排除默认赛事ID
- 添加项目库数据按更新时间降序排序功能
zhou 1 kuukausi sitten
vanhempi
sitoutus
c08bf3e4c6

+ 23 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/GameEventProjectController.java

@@ -1,11 +1,13 @@
 package org.dromara.system.controller;
 
+import java.util.Collection;
 import java.util.List;
 
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.system.domain.GameEventProject;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -37,7 +39,7 @@ public class GameEventProjectController extends BaseController {
     private final IGameEventProjectService gameEventProjectService;
 
     /**
-     * 查询赛事项目列表
+     * 查询默认赛事项目列表
      */
     @SaCheckPermission("system:gameEventProject:list")
     @GetMapping("/list")
@@ -45,6 +47,15 @@ public class GameEventProjectController extends BaseController {
         return gameEventProjectService.queryPageList(bo, pageQuery);
     }
 
+    /**
+     * 查询所有赛事项目列表
+     */
+    @SaCheckPermission("system:gameEventProject:list")
+    @GetMapping("/listAll")
+    public TableDataInfo<GameEventProjectVo> listAll(GameEventProjectBo bo, PageQuery pageQuery) {
+        return gameEventProjectService.queryAllProjectList(bo, pageQuery);
+    }
+
     /**
      * 导出赛事项目列表
      */
@@ -79,6 +90,17 @@ public class GameEventProjectController extends BaseController {
         return toAjax(gameEventProjectService.insertByBo(bo));
     }
 
+    /**
+     * 批量新增赛事项目
+     */
+    @SaCheckPermission("system:gameEventProject:BatchAdd")
+    @Log(title = "赛事项目", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/BatchAdd")
+    public R<Void> BatchAdd(@Validated(AddGroup.class) @RequestBody Collection<GameEventProject> projectList) {
+        return toAjax(gameEventProjectService.BatchInsertByProjectList(projectList));
+    }
+
     /**
      * 修改赛事项目
      */

+ 5 - 5
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/GameEventProject.java

@@ -80,7 +80,7 @@ public class GameEventProject extends TenantEntity {
     private Long participateNum;
 
     /**
-     * 
+     * 录取名
      */
     private String roundType;
 
@@ -105,14 +105,14 @@ public class GameEventProject extends TenantEntity {
     private String award;
 
     /**
-     * 计时点名称
+     * 比赛轮次
      */
-    private String timePoint;
+    private String gameRound;
 
     /**
-     * 控制盒编号
+     * 比赛阶段
      */
-    private String boxCode;
+    private String gameStage;
 
     /**
      * 状态(0正常 1停用)

+ 5 - 5
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/GameEventProjectBo.java

@@ -102,7 +102,7 @@ public class GameEventProjectBo extends BaseEntity {
     private Long participateNum;
 
     /**
-     * 
+     * 录取名
      */
     private String roundType;
 
@@ -128,14 +128,14 @@ public class GameEventProjectBo extends BaseEntity {
     private String award;
 
     /**
-     * 计时点名称
+     * 比赛轮次
      */
-    private String timePoint;
+    private String gameRound;
 
     /**
-     * 控制盒编号
+     * 比赛阶段
      */
-    private String boxCode;
+    private String gameStage;
 
     /**
      * 状态(0正常 1停用)

+ 9 - 9
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/GameEventProjectVo.java

@@ -116,9 +116,9 @@ public class GameEventProjectVo implements Serializable {
     private Long participateNum;
 
     /**
-     * 
+     * 录取名
      */
-    @ExcelProperty(value = "次")
+    @ExcelProperty(value = "录取名次")
     private String roundType;
 
     /**
@@ -147,16 +147,16 @@ public class GameEventProjectVo implements Serializable {
     private String award;
 
     /**
-     * 计时点名称
+     * 比赛轮次
      */
-    @ExcelProperty(value = "计时点名称")
-    private String timePoint;
+    @ExcelProperty(value = "比赛轮次")
+    private String gameRound;
 
     /**
-     * 控制盒编号
+     * 比赛阶段
      */
-    @ExcelProperty(value = "控制盒编号")
-    private String boxCode;
+    @ExcelProperty(value = "比赛阶段")
+    private String gameStage;
 
     /**
      * 状态(0正常 1停用)
@@ -172,4 +172,4 @@ public class GameEventProjectVo implements Serializable {
     private String remark;
 
 
-}
+}

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

@@ -29,7 +29,7 @@ public interface IGameEventProjectService {
     GameEventProjectVo queryById(Long projectId);
 
     /**
-     * 分页查询赛事项目列表
+     * 分页查询默认赛事项目列表
      *
      * @param bo        查询条件
      * @param pageQuery 分页参数
@@ -37,6 +37,15 @@ public interface IGameEventProjectService {
      */
     TableDataInfo<GameEventProjectVo> queryPageList(GameEventProjectBo bo, PageQuery pageQuery);
 
+    /**
+     * 分页查询所有赛事项目列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 赛事项目分页列表
+     */
+    TableDataInfo<GameEventProjectVo> queryAllProjectList(GameEventProjectBo bo, PageQuery pageQuery);
+
     /**
      * 查询符合条件的赛事项目列表
      *
@@ -53,6 +62,14 @@ public interface IGameEventProjectService {
      */
     Boolean insertByBo(GameEventProjectBo bo);
 
+    /**
+     * 批量新增赛事项目
+     *
+     * @param projectList 赛事项目
+     * @return 是否新增成功
+     */
+    Boolean BatchInsertByProjectList(Collection<GameEventProject> projectList);
+
     /**
      * 修改赛事项目
      *

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

@@ -29,9 +29,11 @@ import org.dromara.system.domain.vo.GameEventProjectVo;
 import org.dromara.system.domain.GameEventProject;
 import org.dromara.system.mapper.GameEventProjectMapper;
 import org.dromara.system.service.IGameEventProjectService;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 赛事项目Service业务层处理
@@ -95,8 +97,8 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
 
                 Optional.ofNullable(vo.getRefereeGroup())
                     .filter(ObjectUtil::isNotEmpty)
-                    .ifPresent(refereeId -> {
-                        List<Long> refereeList = JSONUtil.toList(refereeId, Long.class);
+                    .ifPresent(refereeGroup -> {
+                        List<Long> refereeList = JSONUtil.toList(refereeGroup, Long.class);
                         vo.setRefereeGroups(refereeList);
                     });
             });
@@ -104,6 +106,48 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         return TableDataInfo.build(result);
     }
 
+    @Override
+    public TableDataInfo<GameEventProjectVo> queryAllProjectList(GameEventProjectBo bo, PageQuery pageQuery) {
+        // 获取默认赛事ID
+        Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
+        final Long defaultEventID;
+        if (cacheObject instanceof Integer) {
+            defaultEventID = ((Integer) cacheObject).longValue();
+        } else if (cacheObject instanceof Long) {
+            defaultEventID = (Long) cacheObject;
+        } else {
+            defaultEventID = null;
+        }
+
+        // 构建查询条件,排除默认赛事ID
+        LambdaQueryWrapper<GameEventProject> lqw = buildQueryWrapperForProjectLibrary(bo, defaultEventID);
+        Page<GameEventProjectVo> result = baseMapper.selectVoPage(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());
+                    }
+                });
+            //不获取关联性数据
+            record.setRefereeGroup("[]");
+            //移除原始的projectId,确保添加为新项目
+            record.setProjectId(null);
+        });
+
+        // 按更新时间降序排序(最新的在前)
+        List<GameEventProjectVo> sortedRecords = result.getRecords().stream()
+            .sorted(Comparator.comparing(GameEventProjectVo::getUpdateTime, Comparator.nullsLast(Comparator.reverseOrder())))
+            .collect(Collectors.toList());
+        result.setRecords(sortedRecords);
+
+        return TableDataInfo.build(result);
+    }
+
     /**
      * 查询符合条件的赛事项目列表
      *
@@ -173,6 +217,48 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         return lqw;
     }
 
+    /**
+     * 构建项目库查询条件,排除默认赛事ID
+     */
+    private LambdaQueryWrapper<GameEventProject> buildQueryWrapperForProjectLibrary(GameEventProjectBo bo, Long defaultEventID) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<GameEventProject> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(GameEventProject::getProjectId);
+
+        // 排除默认赛事ID
+        if (defaultEventID != null) {
+            lqw.ne(GameEventProject::getEventId, defaultEventID);
+        }
+
+        // 如果指定了eventId,则按指定条件查询
+        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");
+                }
+            });
+        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(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());
+        return lqw;
+    }
+
     /**
      * 新增赛事项目
      *
@@ -201,6 +287,25 @@ public class GameEventProjectServiceImpl implements IGameEventProjectService {
         return flag;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean BatchInsertByProjectList(Collection<GameEventProject> projectList) {
+        Object cacheObject = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_ID);
+        final Long defaultEventID;
+        if (cacheObject instanceof Integer) {
+            defaultEventID = ((Integer) cacheObject).longValue();
+        } else if (cacheObject instanceof Long) {
+            defaultEventID = (Long) cacheObject;
+        } else {
+            defaultEventID = null;
+        }
+        projectList.forEach(projectBo -> projectBo.setEventId(defaultEventID));
+        if (CollectionUtils.isNotEmpty(projectList)){
+            return baseMapper.insertBatch(projectList);
+        }
+        return false;
+    }
+
     /**
      * 修改赛事项目
      *