Эх сурвалжийг харах

feat(tournaments): 添加赛事模板生成功能

- 在 ITournamentsTemplateService 中添加 generateTournamentByTemplate 方法
- 修复 ScheduleEventGroupConfigMapper.xml 中的 SQL 语法错误
- 在 ScheduleTask 中添加空值检查避免 NPE 异常
- 创建 TournamentsTemplateController 的 generateTournamentByTemplate 接口
- 实现 TournamentsTemplateServiceImpl 中的模板生成逻辑
- 添加时间格式解析和参数校验功能
fugui001 1 сар өмнө
parent
commit
e645c16bd7

+ 11 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/TournamentsTemplateController.java

@@ -166,4 +166,15 @@ public class TournamentsTemplateController extends BaseController {
         return R.ok(list);
     }
 
+
+    @PostMapping("/generateTournamentByTemplate")
+    public R<Void> generateTournamentByTemplate(
+        @NotNull(message = "模板ID不能为空")
+        @RequestParam("templateId") Long templateId,
+        @NotNull(message = "开始时间不能为空")
+        @RequestParam("beginTime") String beginTime) {
+        return toAjax(tournamentsService.generateTournamentByTemplate(templateId, beginTime));
+    }
+
+
 }

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/ITournamentsTemplateService.java

@@ -96,4 +96,7 @@ public interface ITournamentsTemplateService {
 
 
     List<TournamentsVo> selectTournamentsVoListTemplateList();
+
+    Boolean  generateTournamentByTemplate(Long templateId,String beginTime);
+
 }

+ 45 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsTemplateServiceImpl.java

@@ -21,6 +21,7 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.job.business.ScheduleTask;
 import org.dromara.system.domain.vo.SysOssVo;
 import org.dromara.system.service.ISysOssService;
 import org.springframework.beans.BeanUtils;
@@ -30,6 +31,7 @@ import java.text.ParseException;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.*;
 import java.util.stream.Collectors;
 /**
@@ -68,6 +70,8 @@ public class TournamentsTemplateServiceImpl implements ITournamentsTemplateServi
 
     private final TournamentCategoryTagTemplateMapper tournamentCategoryTagTemplateMapper;
 
+    private final ScheduleTask scheduleTask;
+
     /**
      * 查询【请填写功能名称】
      *
@@ -571,7 +575,48 @@ public class TournamentsTemplateServiceImpl implements ITournamentsTemplateServi
         return baseMapper.selectTournamentsVoListTemplateList();
     }
 
+    @Override
+    public Boolean generateTournamentByTemplate(Long templateId, String beginTime) {
+        // 参数校验
+        if (templateId == null) {
+            log.error("模板ID不能为空");
+            throw new IllegalArgumentException("模板ID不能为空");
+        }
+        if (beginTime == null || beginTime.trim().isEmpty()) {
+            log.error("开始时间不能为空");
+            throw new IllegalArgumentException("开始时间不能为空");
+        }
+
+        // 查询模板信息
+        TournamentsVo tournamentsVo = baseMapper.selectVoByIdInfoTemplate(templateId);
+        if (tournamentsVo == null) {
+            log.error("未找到模板ID为 {} 的赛事模板", templateId);
+            throw new IllegalArgumentException("未找到指定的赛事模板");
+        }
+
+        LocalDateTime localBeginTime;
+        try {
+            localBeginTime = LocalDateTime.parse(beginTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        } catch (DateTimeParseException e) {
+            log.error("时间格式错误: {}, 格式应为 yyyy-MM-dd HH:mm:ss", beginTime, e);
+            throw new IllegalArgumentException("开始时间格式错误,应为 yyyy-MM-dd HH:mm:ss");
+        }
+
+        // 调用任务调度服务创建赛事
+        boolean success = scheduleTask.autowiredTournamentData(null, tournamentsVo.getId(), localBeginTime, null);
+        if (!success) {
+            log.warn("赛事生成失败,模板ID: {}, 开始时间: {}", templateId, beginTime);
+            return false;
+        }
+
+        log.info("赛事生成成功,模板ID: {}, 开始时间: {}", templateId, beginTime);
+        return true;
+    }
+
 
+    public static LocalDateTime parseToLocalDateTime(String timeStr) {
+        return LocalDateTime.parse(timeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+    }
     private List<ItemsPrizeDto> parsePrizeList(String itemsPrizeListJson, ObjectMapper mapper) throws Exception {
         if (itemsPrizeListJson == null || itemsPrizeListJson.isBlank()) {
             throw new IllegalArgumentException("itemsPrizeList 不能为空");

+ 29 - 15
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/business/ScheduleTask.java

@@ -401,27 +401,41 @@ public class ScheduleTask {
             // 调用已有的插入方法
             if (!iTournamentsService.insertByBo(bo)) {
                 log.error("赛事插入失败");
-                scheduleExecutionMapper.updateSelective(execId, "FAILED");
+                if (execId != null) {
+                    scheduleExecutionMapper.updateSelective(execId, "FAILED");
+                } else {
+                    log.warn("execId 为空,跳过更新状态");
+                }
                 return false;
             }
 
-            ScheduleTournamentsReletion scheduleTournamentsReletion=new ScheduleTournamentsReletion();
-            scheduleTournamentsReletion.setTournamentsId(bo.getId());
-            scheduleTournamentsReletion.setTournamentsTemplateId(templateId);
-            scheduleTournamentsReletion.setScBeginTime(startTime);
-            scheduleTournamentsReletion.setConfigId(configId);
-            scheduleTournamentsReletionMapper.insertScheduleRelation(scheduleTournamentsReletion);
-
-            //todo 生成完成之后  自动化模版状态变成 使用中
-            ScheduleConfig scheduleConfig = new ScheduleConfig();
-            scheduleConfig.setId(configId);
-            scheduleConfig.setEnabled(true);
-            baseMapper.updateScheduleConfig(scheduleConfig);
-            scheduleExecutionMapper.updateSelective(execId, "SUCCESS");
+            if (configId != null) {
+                ScheduleTournamentsReletion scheduleTournamentsReletion=new ScheduleTournamentsReletion();
+                scheduleTournamentsReletion.setTournamentsId(bo.getId());
+                scheduleTournamentsReletion.setTournamentsTemplateId(templateId);
+                scheduleTournamentsReletion.setScBeginTime(startTime);
+                scheduleTournamentsReletion.setConfigId(configId);
+                scheduleTournamentsReletionMapper.insertScheduleRelation(scheduleTournamentsReletion);
+
+                //todo 生成完成之后  自动化模版状态变成 使用中
+                ScheduleConfig scheduleConfig = new ScheduleConfig();
+                scheduleConfig.setId(configId);
+                scheduleConfig.setEnabled(true);
+                baseMapper.updateScheduleConfig(scheduleConfig);
+            }
+            if (execId != null) {
+                scheduleExecutionMapper.updateSelective(execId, "SUCCESS");
+            } else {
+                log.warn("execId 为空,跳过更新状态");
+            }
             return true;
         } catch (Exception e) {
             log.error("批量插入赛事过程中发生异常", e);
-            scheduleExecutionMapper.updateSelective(execId, "FAILED");
+            if (execId != null) {
+                scheduleExecutionMapper.updateSelective(execId, "FAILED");
+            } else {
+                log.error("Exception execId 为空,跳过更新状态");
+            }
             return false;
         }
     }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleEventGroupConfigMapper.xml

@@ -55,7 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{name},
             <if test="regularTemplateId != null">#{regularTemplateId},</if>
             <if test="finalTemplateId != null">#{finalTemplateId},</if>
-            #{finalStartDate}
+            #{finalStartDate},
             #{startDate}
         </trim>
         )