소스 검색

feat(app): 为移动端应用增加赛事和项目管理功能

- 在GameEventProject实体类中完善项目类型的详细注释说明
- 为IToClientService接口添加获取赛事列表、删除赛事和获取项目列表的方法定义
- 在ToClientController控制器中实现赛事列表查询、赛事删除和项目列表查询的REST API端点
- 在ToClientServiceImpl服务实现类中添加异步删除赛事数据的功能,支持删除关联的组别、配置、成绩和项目数据
- 实现赛事列表查询功能,按创建时间倒序返回赛事基本信息
- 实现项目列表查询功能,根据赛事ID返回对应的项目信息
- 使用@Async注解实现异步删除操作,提高大容量数据删除的性能
- 添加事务管理和异常处理机制,确保数据删除操作的一致性和可靠性
zhou 2 주 전
부모
커밋
9b4ab35847

+ 30 - 4
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app_client/ToClientController.java

@@ -5,13 +5,14 @@ import org.dromara.common.core.domain.R;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
+import org.dromara.system.domain.GameEvent;
+import org.dromara.system.domain.GameEventProject;
 import org.dromara.system.domain.bo.ClientProjectSaveBo;
 import org.dromara.system.service.app.IToClientService;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * 面向app客户端
@@ -35,4 +36,29 @@ public class ToClientController {
         return R.ok();
     }
 
+    /**
+     * 赛事列表接口 (接口2)
+     */
+    @GetMapping("/eventList")
+    public R<List<GameEvent>> eventList() {
+        return R.ok(toClientService.getEventList());
+    }
+
+    /**
+     * 赛事列表项删除接口 (接口3)
+     */
+    @Log(title = "app客户端删除赛事项", businessType = BusinessType.DELETE)
+    @DeleteMapping("/eventRemove/{eventId}")
+    public R<Void> eventRemove(@PathVariable Long eventId) {
+        toClientService.removeEvent(eventId);
+        return R.ok("删除任务已提交,正在后台处理");
+    }
+
+    /**
+     * 项目列表接口 (接口5)
+     */
+    @GetMapping("/projectList")
+    public R<List<GameEventProject>> projectList(@RequestParam Long eventId) {
+        return R.ok(toClientService.getProjectList(eventId));
+    }
 }

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

@@ -39,7 +39,9 @@ public class GameEventProject extends TenantEntity {
     private String projectName;
 
     /**
-     * 项目类型(个人/团体)
+     * 项目类型--参考字典game_project_type,一般不修改
+     * (如1-径赛,2-田赛,3-趣味个人,4-趣味集体,5-体侧。6;领导男子,7-领导女子,8-赛前拔河,9-径赛集体)
+     * 如新增的项目类型,值顺延,如10-xxx1,11-xxx2,...
      */
     private String projectType;
 

+ 19 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/app/IToClientService.java

@@ -1,7 +1,11 @@
 package org.dromara.system.service.app;
 
+import org.dromara.system.domain.GameEvent;
+import org.dromara.system.domain.GameEventProject;
 import org.dromara.system.domain.bo.ClientProjectSaveBo;
 
+import java.util.List;
+
 public interface IToClientService {
 
     /**
@@ -10,4 +14,19 @@ public interface IToClientService {
      * @param bo 客户端保存对象
      */
     void saveOrUpdateEventFromClient(ClientProjectSaveBo bo);
+
+    /**
+     * 获取赛事列表 (接口2)
+     */
+    List<GameEvent> getEventList();
+
+    /**
+     * 删除赛事 (接口3)
+     */
+    void removeEvent(Long eventId);
+
+    /**
+     * 获取项目列表 (接口5)
+     */
+    List<GameEventProject> getProjectList(Long eventId);
 }

+ 65 - 4
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/app/ToClientServiceImpl.java

@@ -6,16 +6,14 @@ import com.baomidou.mybatisplus.extension.toolkit.Db;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.utils.StringUtils;
-import org.dromara.system.domain.GameEvent;
-import org.dromara.system.domain.GameEventConfig;
-import org.dromara.system.domain.GameEventProject;
-import org.dromara.system.domain.GameRankGroup;
+import org.dromara.system.domain.*;
 import org.dromara.system.domain.bo.ClientProjectSaveBo;
 import org.dromara.system.domain.bo.GameRankGroupBo;
 import org.dromara.system.mapper.GameEventMapper;
 import org.dromara.system.mapper.GameEventProjectMapper;
 import org.dromara.system.service.IGameRankGroupService;
 import org.dromara.system.service.app.IToClientService;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -122,6 +120,69 @@ public class ToClientServiceImpl implements IToClientService {
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void removeEvent(Long eventId) {
+        // 先验证赛事是否存在
+        GameEvent event = gameEventMapper.selectById(eventId);
+        if (event == null) {
+            throw new RuntimeException("赛事不存在");
+        }
+        // 异步执行删除操作
+        asyncRemoveEventData(eventId);
+    }
+
+    /**
+     * 异步删除赛事关联数据
+     */
+    @Async
+    @Transactional(rollbackFor = Exception.class)
+    public void asyncRemoveEventData(Long eventId) {
+        log.info("开始异步删除赛事数据,eventId: {}", eventId);
+        long startTime = System.currentTimeMillis();
+        try{
+            // 删除关联的组别
+            Db.remove(Wrappers.lambdaQuery(GameRankGroup.class)
+                .eq(GameRankGroup::getEventId, eventId)
+            );
+            // 删除关联的配置信息
+            Db.remove(Wrappers.lambdaQuery(GameEventConfig.class)
+                .eq(GameEventConfig::getEventId, eventId)
+            );
+            // 删除关联的成绩信息
+            Db.remove(Wrappers.lambdaQuery(GameScore.class)
+                .eq(GameScore::getEventId, eventId)
+            );
+            // 删除关联的项目
+            int projectCount = projectMapper.delete(Wrappers.lambdaQuery(GameEventProject.class)
+                .eq(GameEventProject::getEventId, eventId));
+            log.info("删除项目完成,eventId: {}, 删除数量: {}", eventId, projectCount);
+            // 删除赛事
+            gameEventMapper.deleteById(eventId);
+            long endTime = System.currentTimeMillis();
+            log.info("赛事数据删除完成,eventId: {}, 耗时: {}ms", eventId, (endTime - startTime));
+        }catch (Exception e){
+            log.error("异步删除赛事数据失败,eventId: {}", eventId, e);
+            throw new RuntimeException("删除赛事数据失败: " + e.getMessage());
+        }
+    }
+
+    @Override
+    public List<GameEvent> getEventList() {
+        return gameEventMapper.selectList(Wrappers.lambdaQuery(GameEvent.class)
+            .orderByDesc(GameEvent::getCreateTime)
+            .select(GameEvent::getEventId, GameEvent::getEventCode, GameEvent::getEventName, GameEvent::getCreateTime)
+        );
+    }
+
+    @Override
+    public List<GameEventProject> getProjectList(Long eventId) {
+        return projectMapper.selectList(Wrappers.lambdaQuery(GameEventProject.class)
+            .eq(GameEventProject::getEventId, eventId)
+            .select(GameEventProject::getProjectId, GameEventProject::getProjectType, GameEventProject::getClassification, GameEventProject::getProjectName)
+        );
+    }
+
     /**
      * 批量保存配置信息
      */