Forráskód Böngészése

feat(game-event): 新增默认赛事功能并优化赛事相关逻辑

- 新增默认赛事相关字段和方法
- 实现默认赛事的缓存逻辑
- 添加修改赛事默认状态的功能
- 优化赛事列表和删除逻辑
- 新增系统初始化时加载默认赛事配置
zhou 2 hete
szülő
commit
ceba5982bc

+ 45 - 0
ruoyi-admin/src/main/java/org/dromara/config/SystemInitializationRunner.java

@@ -0,0 +1,45 @@
+package org.dromara.config;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.system.service.IGameEventService;
+import org.dromara.system.service.ISysOssConfigService;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+/**
+ * 系统启动初始化配置类
+ *
+ * @author zlt
+ */
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SystemInitializationRunner implements ApplicationRunner {
+    private final IGameEventService gameEventService;
+    private final ISysOssConfigService ossConfigService;
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        log.info("开始初始化系统配置...");
+        try {
+            // 初始化OSS配置
+            ossConfigService.init();
+            log.info("OSS配置初始化完成");
+        } catch (Exception e) {
+            log.error("OSS配置初始化失败", e);
+        }
+
+        try {
+            // 初始化默认赛事配置
+            gameEventService.init();
+            log.info("赛事配置初始化完成");
+        } catch (Exception e) {
+            log.error("赛事配置初始化失败", e);
+        }
+
+        log.info("系统配置初始化完成");
+    }
+}

+ 21 - 2
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/GameEventController.java

@@ -76,8 +76,9 @@ public class GameEventController extends BaseController {
     @Log(title = "赛事基本信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody GameEventBo bo) {
-        return toAjax(gameEventService.insertByBo(bo));
+    public R<Long> add(@Validated(AddGroup.class) @RequestBody GameEventBo bo) {
+        Long eventId = gameEventService.insertByBo(bo);
+        return eventId != null && eventId > 0 ? R.ok(eventId) : R.fail("新增赛事失败");
     }
 
     /**
@@ -111,4 +112,22 @@ public class GameEventController extends BaseController {
     public R<Map<String, Long>> getEventIdNameMap() {
         return R.ok(gameEventService.getEventIdNameMap());
     }
+
+    /**
+     * 获取默认赛事信息
+     */
+    @GetMapping("/default")
+    public R<GameEventVo> getDefaultEvent() {
+        return R.ok(gameEventService.getDefaultEvent());
+    }
+
+    /**
+     * 修改赛事默认状态
+     */
+    @SaCheckPermission("system:gameEvent:edit")
+    @Log(title = "赛事默认状态修改", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeEventDefault")
+    public R<Void> changeEventDefault(@RequestBody GameEventBo bo) {
+        return toAjax(gameEventService.updateEventDefault(bo));
+    }
 }

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

@@ -27,6 +27,11 @@ public class GameEventConfigType extends TenantEntity {
     @TableId(value = "type_id",type = IdType.AUTO)
     private Long typeId;
 
+    /**
+     * 赛事ID
+     */
+    private Long eventId;
+
     /**
      * 类型编码
      */

+ 2 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/GameEventConfigBo.java

@@ -33,7 +33,7 @@ public class GameEventConfigBo extends BaseEntity {
     /**
      * 配置类型
      */
-    @NotBlank(message = "配置类型不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "配置类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private String configType;
 
     /**
@@ -50,6 +50,7 @@ public class GameEventConfigBo extends BaseEntity {
     /**
      * 配置描述
      */
+    @NotBlank(message = "配置描述不能为空", groups = { AddGroup.class, EditGroup.class })
     private String configDesc;
 
     /**

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

@@ -25,6 +25,11 @@ public class GameEventConfigTypeBo extends BaseEntity {
      */
     private Long typeId;
 
+    /**
+     * 赛事ID
+     */
+    private Long eventId;
+
     /**
      * 类型编码
      */

+ 8 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/constant/GameEventConstant.java

@@ -0,0 +1,8 @@
+package org.dromara.system.domain.constant;
+
+public class GameEventConstant {
+    /**
+     * 默认赛事缓存键
+     */
+    public static final String DEFAULT_EVENT_KEY = "default_game_event";
+}

+ 10 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/GameEventConfigTypeVo.java

@@ -28,6 +28,16 @@ public class GameEventConfigTypeVo implements Serializable {
     @Serial
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 类型ID
+     */
+    private Long typeId;
+
+    /**
+     * 赛事ID
+     */
+    private String eventId;
+
     /**
      * 类型编码
      */

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

@@ -118,7 +118,7 @@ public class GameEventVo implements Serializable {
     private String unit;
 
     /**
-     * 是否默认赛事
+     * 是否默认赛事(0=是,1=否)
      */
     @ExcelProperty(value = "是否默认赛事", converter = ExcelDictConvert.class)
     @ExcelDictFormat(dictType = "sys_yes_no")

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

@@ -49,7 +49,7 @@ public interface IGameEventService {
      * @param bo 赛事基本信息
      * @return 是否新增成功
      */
-    Boolean insertByBo(GameEventBo bo);
+    Long insertByBo(GameEventBo bo);
 
     /**
      * 修改赛事基本信息
@@ -74,4 +74,24 @@ public interface IGameEventService {
      * @return 赛事ID与名称的映射关系
      */
     Map<String, Long> getEventIdNameMap();
+
+    /**
+     * 初始化赛事信息
+     */
+    void init();
+
+    /**
+     * 获取默认赛事信息
+     *
+     * @return 默认赛事信息
+     */
+    GameEventVo getDefaultEvent();
+
+    /**
+     * 更新赛事默认赛事状态
+     *
+     * @param bo 赛事基本信息
+     * @return 更新记录数
+     */
+    int updateEventDefault(GameEventBo bo);
 }

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

@@ -74,6 +74,7 @@ public class GameEventMenuServiceImpl implements IGameEventMenuService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<GameEventMenu> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(GameEventMenu::getMenuId);
+        lqw.eq(bo.getEventId() != null, GameEventMenu::getEventId, bo.getEventId());
         lqw.eq(bo.getOrderNum() != null, GameEventMenu::getOrderNum, bo.getOrderNum());
         return lqw;
     }

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

@@ -1,8 +1,10 @@
 package org.dromara.system.service.impl;
 
-import org.dromara.common.core.domain.R;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import jakarta.annotation.PostConstruct;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,12 +12,15 @@ 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.constant.GameEventConstant;
 import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.GameEventBo;
 import org.dromara.system.domain.vo.GameEventVo;
 import org.dromara.system.domain.GameEvent;
 import org.dromara.system.mapper.GameEventMapper;
 import org.dromara.system.service.IGameEventService;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
@@ -93,14 +98,14 @@ public class GameEventServiceImpl implements IGameEventService {
      * @return 是否新增成功
      */
     @Override
-    public Boolean insertByBo(GameEventBo bo) {
+    public Long insertByBo(GameEventBo bo) {
         GameEvent add = MapstructUtils.convert(bo, GameEvent.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
-            bo.setEventId(add.getEventId());
+            return add.getEventId();
         }
-        return flag;
+        return null;
     }
 
     /**
@@ -113,7 +118,12 @@ public class GameEventServiceImpl implements IGameEventService {
     public Boolean updateByBo(GameEventBo bo) {
         GameEvent update = MapstructUtils.convert(bo, GameEvent.class);
         validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+        boolean result = baseMapper.updateById(update) > 0;
+        // 如果修改的是默认赛事,更新缓存
+        if ("0".equals(bo.getIsDefault())) {
+            RedisUtils.setCacheObject(GameEventConstant.DEFAULT_EVENT_KEY, JsonUtils.toJsonString(update));
+        }
+        return result;
     }
 
     /**
@@ -135,6 +145,18 @@ public class GameEventServiceImpl implements IGameEventService {
         if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
+        // 检查删除的赛事中是否包含默认赛事
+        LambdaQueryWrapper<GameEvent> lqw = Wrappers.lambdaQuery();
+        lqw.in(GameEvent::getEventId, ids);
+        lqw.eq(GameEvent::getIsDefault, "0");
+        GameEvent defaultEvent = baseMapper.selectOne(lqw);
+
+        boolean result = baseMapper.deleteByIds(ids) > 0;
+
+        // 如果删除了默认赛事,清除缓存
+        if (defaultEvent != null) {
+            RedisUtils.deleteObject(GameEventConstant.DEFAULT_EVENT_KEY);
+        }
         return baseMapper.deleteByIds(ids) > 0;
     }
 
@@ -153,4 +175,72 @@ public class GameEventServiceImpl implements IGameEventService {
             .collect(Collectors.toMap(GameEvent::getEventName, GameEvent::getEventId));
         return idNameMap;
     }
+
+    /**
+     * 初始化默认赛事缓存
+     */
+    @Override
+    public void init() {
+        LambdaQueryWrapper<GameEvent> lqw = Wrappers.lambdaQuery();
+        lqw.eq(GameEvent::getIsDefault, "0");
+        GameEvent defaultEvent = baseMapper.selectOne(lqw);
+        if (defaultEvent != null) {
+            RedisUtils.setCacheObject(GameEventConstant.DEFAULT_EVENT_KEY, JsonUtils.toJsonString(defaultEvent));
+        }
+    }
+
+    @PostConstruct
+    public void initCache(){
+        init();
+    }
+
+    /**
+     * 获取默认赛事信息
+     *
+     * @return 默认赛事信息
+     */
+    @Override
+    public GameEventVo getDefaultEvent() {
+        String defaultEventJson = RedisUtils.getCacheObject(GameEventConstant.DEFAULT_EVENT_KEY);
+        if (StringUtils.isNotEmpty(defaultEventJson)) {
+            return JsonUtils.parseObject(defaultEventJson, GameEventVo.class);
+        }
+
+        // 缓存未命中,从数据库查询
+        LambdaQueryWrapper<GameEvent> lqw = Wrappers.lambdaQuery();
+        lqw.eq(GameEvent::getIsDefault, "0");
+        GameEvent defaultEvent = baseMapper.selectOne(lqw);
+
+        if (defaultEvent != null) {
+            // 放入缓存
+            RedisUtils.setCacheObject(GameEventConstant.DEFAULT_EVENT_KEY, JsonUtils.toJsonString(defaultEvent));
+            return baseMapper.selectVoById(defaultEvent.getEventId());
+        }
+
+        return null;
+    }
+
+
+    /**
+     * 设置默认赛事
+     *
+     * @param bo 赛事信息
+     * @return 更新记录数
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int updateEventDefault(GameEventBo bo) {
+        GameEvent event = MapstructUtils.convert(bo, GameEvent.class);
+        // 先将所有赛事设置为非默认
+        int row = baseMapper.update(null, new LambdaUpdateWrapper<GameEvent>()
+            .set(GameEvent::getIsDefault, "1"));
+        // 再将指定赛事设置为默认
+        row += baseMapper.updateById(event);
+        if (row > 0) {
+            // 更新缓存中的默认赛事信息
+            GameEvent updatedEvent = baseMapper.selectById(event.getEventId());
+            RedisUtils.setCacheObject(GameEventConstant.DEFAULT_EVENT_KEY, JsonUtils.toJsonString(updatedEvent));
+        }
+        return row;
+    }
 }