Переглянути джерело

feat(business): 添加创建方案和排期配置相关功能

- 新增 CreationScheme 和 ScheduleConfig 相关的实体类、BO、VO、Mapper、Service 和 Controller
- 实现了创建方案和排期配置的增删改查功能- 添加了相关的页面和接口
fugui001 5 місяців тому
батько
коміт
f95866a1cb
48 змінених файлів з 3643 додано та 11 видалено
  1. 2 1
      ruoyi-admin/src/main/resources/application-dev.yml
  2. 12 4
      ruoyi-admin/src/main/resources/application-prod.yml
  3. 2 0
      ruoyi-admin/src/main/resources/application.yml
  4. 121 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/CreationSchemeController.java
  5. 133 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/ScheduleConfigController.java
  6. 12 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/TournamentsTemplateController.java
  7. 61 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/CreationScheme.java
  8. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleConfig.java
  9. 65 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleExecution.java
  10. 41 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleRepeat.java
  11. 44 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleTime.java
  12. 44 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleTournamentsReletion.java
  13. 64 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/CreationSchemeBo.java
  14. 71 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleConfigBo.java
  15. 49 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleConfigRequestBo.java
  16. 66 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleExecutionBo.java
  17. 42 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleRepeatBo.java
  18. 46 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleTimeBo.java
  19. 45 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleTournamentsReletionBo.java
  20. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/dto/TournamentsDto.java
  21. 49 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/Weekday.java
  22. 71 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/CreationSchemeVo.java
  23. 81 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleConfigVo.java
  24. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleExecutionVo.java
  25. 49 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleRepeatVo.java
  26. 49 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleTimeVo.java
  27. 53 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleTournamentsReletionVo.java
  28. 60 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/TournamentsVo.java
  29. 52 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/CreationSchemeMapper.java
  30. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleConfigMapper.java
  31. 36 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleExecutionMapper.java
  32. 49 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleRepeatMapper.java
  33. 52 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleTimeMapper.java
  34. 33 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleTournamentsReletionMapper.java
  35. 71 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/ICreationSchemeService.java
  36. 125 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IScheduleConfigService.java
  37. 143 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/CreationSchemeServiceImpl.java
  38. 588 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/ScheduleConfigServiceImpl.java
  39. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsServiceImpl.java
  40. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsTemplateServiceImpl.java
  41. 351 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/business/ScheduleTask.java
  42. 84 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/CreationSchemeMapper.xml
  43. 149 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleConfigMapper.xml
  44. 63 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleExecutionMapper.xml
  45. 82 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleRepeatMapper.xml
  46. 91 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleTimeMapper.xml
  47. 110 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleTournamentsReletionMapper.xml
  48. 2 2
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentsTemplateMapper.xml

+ 2 - 1
ruoyi-admin/src/main/resources/application-dev.yml

@@ -60,6 +60,7 @@ spring:
           url: jdbc:mysql://192.168.0.193:3306/hello?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: guest
           password: 123456
+
 #        # 从库数据源
 #        slave:
 #          lazy: true
@@ -112,7 +113,7 @@ spring.data:
     # 数据库索引
     database: 0
     # redis 密码必须配置
-    password: 123456
+    auth: 123456
     # 连接超时时间
     timeout: 10s
     # 是否开启ssl

+ 12 - 4
ruoyi-admin/src/main/resources/application-prod.yml

@@ -52,9 +52,17 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://39.96.219.239:3306/db_ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
-          password: root
+          password: StrongP@ssw0rd!
+        mysql2:
+          type: ${spring.datasource.type}
+          driverClassName: com.mysql.cj.jdbc.Driver
+          # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
+          # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
+          url: jdbc:mysql://39.96.219.239:3306/game?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          username: root
+          password: StrongP@ssw0rd!
 #        # 从库数据源
 #        slave:
 #          lazy: true
@@ -101,13 +109,13 @@ spring:
 spring.data:
   redis:
     # 地址
-    host: localhost
+    host: 39.96.219.239
     # 端口,默认为6379
     port: 6379
     # 数据库索引
     database: 0
     # redis 密码必须配置
-    password: ruoyi123
+    password: 123456
     # 连接超时时间
     timeout: 10s
     # 是否开启ssl

+ 2 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -63,6 +63,8 @@ spring:
     basename: i18n/messages
   profiles:
     active: @profiles.active@
+#    profiles:
+#      active: prod
   # 文件上传
   servlet:
     multipart:

+ 121 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/CreationSchemeController.java

@@ -0,0 +1,121 @@
+package org.dromara.business.controller;
+
+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.business.domain.bo.CreationSchemeBo;
+import org.dromara.business.domain.bo.TournamentsBo;
+import org.dromara.business.domain.vo.CreationSchemeVo;
+import org.dromara.business.domain.vo.TournamentsVo;
+import org.dromara.business.service.ICreationSchemeService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 创建方案:用于定义排期生成规则模板
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/scheme")
+public class CreationSchemeController extends BaseController {
+
+    private final ICreationSchemeService creationSchemeService;
+
+    /**
+     * 查询创建方案:用于定义排期生成规则模板列表
+     */
+    @SaCheckPermission("business:scheme:list")
+    @GetMapping("/list")
+    public TableDataInfo<CreationSchemeVo> list(CreationSchemeBo bo, PageQuery pageQuery) {
+        return creationSchemeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出创建方案:用于定义排期生成规则模板列表
+     */
+    @SaCheckPermission("business:scheme:export")
+    @Log(title = "创建方案:用于定义排期生成规则模板", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(CreationSchemeBo bo, HttpServletResponse response) {
+        List<CreationSchemeVo> list = creationSchemeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "创建方案:用于定义排期生成规则模板", CreationSchemeVo.class, response);
+    }
+
+    /**
+     * 获取创建方案:用于定义排期生成规则模板详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("business:scheme:query")
+    @GetMapping("/{id}")
+    public R<CreationSchemeVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(creationSchemeService.queryById(id));
+    }
+
+    /**
+     * 新增创建方案:用于定义排期生成规则模板
+     */
+    @SaCheckPermission("business:scheme:add")
+    @Log(title = "创建方案:用于定义排期生成规则模板", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody CreationSchemeBo bo) {
+        return toAjax(creationSchemeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改创建方案:用于定义排期生成规则模板
+     */
+    @SaCheckPermission("business:scheme:edit")
+    @Log(title = "创建方案:用于定义排期生成规则模板", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody CreationSchemeBo bo) {
+        return toAjax(creationSchemeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除创建方案:用于定义排期生成规则模板
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("business:scheme:remove")
+    @Log(title = "创建方案:用于定义排期生成规则模板", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(creationSchemeService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+
+    /**
+     * 查询所有模版
+     * @param bo
+     * @return
+     */
+    @GetMapping("/selectAllCreationSchemesAllList")
+    public R<List<CreationSchemeVo>> selectAllCreationSchemesAllList(TournamentsBo bo) {
+        List<CreationSchemeVo> list = creationSchemeService.selectAllCreationSchemesAllList();
+        return R.ok(list);
+    }
+
+
+}

+ 133 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/ScheduleConfigController.java

@@ -0,0 +1,133 @@
+package org.dromara.business.controller;
+
+import java.util.List;
+
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.business.domain.bo.ScheduleConfigBo;
+import org.dromara.business.domain.bo.ScheduleConfigRequestBo;
+import org.dromara.business.domain.vo.ScheduleConfigVo;
+import org.dromara.business.domain.vo.TournamentsVo;
+import org.dromara.business.service.IScheduleConfigService;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 排期配置:用于保存具体的排期实例配置
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/config")
+public class ScheduleConfigController extends BaseController {
+
+    private final IScheduleConfigService scheduleConfigService;
+
+    /**
+     * 查询排期配置:用于保存具体的排期实例配置列表
+     */
+    @SaCheckPermission("business:config:list")
+    @GetMapping("/list")
+    public TableDataInfo<TournamentsVo> list(ScheduleConfigBo bo, PageQuery pageQuery) {
+        return scheduleConfigService.queryPageListSai(bo, pageQuery);
+    }
+
+
+    /**
+     * 导出排期配置:用于保存具体的排期实例配置列表
+     */
+    @SaCheckPermission("business:config:export")
+    @Log(title = "排期配置:用于保存具体的排期实例配置", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ScheduleConfigBo bo, HttpServletResponse response) {
+        List<ScheduleConfigVo> list = scheduleConfigService.queryList(bo);
+        ExcelUtil.exportExcel(list, "排期配置:用于保存具体的排期实例配置", ScheduleConfigVo.class, response);
+    }
+
+    /**
+     * 获取排期配置:用于保存具体的排期实例配置详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("business:config:query")
+    @GetMapping("/{id}")
+    public R<TournamentsVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(scheduleConfigService.selectScheduleConfigInfoById(id));
+    }
+
+    /**
+     * 新增排期配置:用于保存具体的排期实例配置
+     */
+    @SaCheckPermission("business:config:add")
+    @Log(title = "排期配置:用于保存具体的排期实例配置", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ScheduleConfigBo bo) {
+        return toAjax(scheduleConfigService.insertByBo(bo));
+    }
+
+    /**
+     * 修改排期配置:用于保存具体的排期实例配置
+     */
+    @SaCheckPermission("business:config:edit")
+    @Log(title = "排期配置:用于保存具体的排期实例配置", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ScheduleConfigBo bo) {
+        return toAjax(scheduleConfigService.updateByBo(bo));
+    }
+
+    /**
+     * 删除排期配置:用于保存具体的排期实例配置
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("business:config:remove")
+    @Log(title = "排期配置:用于保存具体的排期实例配置", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(scheduleConfigService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+
+    @PostMapping("/createSchedule")
+    public R<String> createSchedule(@Valid @RequestBody ScheduleConfigRequestBo request) {
+        return scheduleConfigService.saveScheduleConfig(request);
+     }
+
+    @PostMapping("/updateScheduleConfig")
+    public R<String> updateScheduleConfig(@Valid @RequestBody ScheduleConfigRequestBo request) {
+        return scheduleConfigService.updateScheduleConfig(request.getConfigId(), request);
+    }
+
+    @DeleteMapping("/deleteScheduleConfig/{id}")
+    public R<String> deleteScheduleConfig(@NotNull(message = "主键不能为空")
+                                    @PathVariable Long id) {
+        return scheduleConfigService.deleteScheduleConfig(id);
+    }
+
+    @PostMapping("/stopScheduleConfig/{id}")
+    public R<Void> stopScheduleConfig(@PathVariable Long id) {
+        return toAjax(scheduleConfigService.stopScheduleConfig(id));
+    }
+
+}

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

@@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor;
 import org.dromara.business.domain.bo.TournamentBlindStructuresBo;
 import org.dromara.business.domain.bo.TournamentsBo;
 import org.dromara.business.domain.dto.TournamentsDto;
+import org.dromara.business.domain.vo.BlindStructuresVo;
 import org.dromara.business.domain.vo.TournamentBlindStructuresListVo;
 import org.dromara.business.domain.vo.TournamentsVo;
 import org.dromara.business.service.ITournamentsTemplateService;
@@ -147,4 +148,15 @@ public class TournamentsTemplateController extends BaseController {
     }
 
 
+    /**
+     * 查询模版赛事列表
+     * @param bo
+     * @return
+     */
+    @GetMapping("/selectTemplateTourList")
+    public R<List<TournamentsVo>> selectTourList(TournamentsBo bo) {
+        List<TournamentsVo> list = tournamentsService.queryList(bo);
+        return R.ok(list);
+    }
+
 }

+ 61 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/CreationScheme.java

@@ -0,0 +1,61 @@
+package org.dromara.business.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 创建方案:用于定义排期生成规则模板对象 creation_scheme
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("creation_scheme")
+public class CreationScheme extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 唯一标识符
+     */
+    private String code;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 默认开始偏移天数
+     */
+    private Long defaultStartOffset;
+
+    /**
+     * 默认持续天数
+     */
+    private Long defaultDurationDays;
+
+    /**
+     * 是否激活
+     */
+    private Boolean isActive;
+
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleConfig.java

@@ -0,0 +1,70 @@
+package org.dromara.business.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+import java.util.Date;
+
+
+import java.io.Serial;
+
+/**
+ * 排期配置:用于保存具体的排期实例配置对象 schedule_config
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("schedule_config")
+public class ScheduleConfig extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 模板ID
+     */
+    private Long templateId;
+
+    /**
+     * 创建方案ID
+     */
+    private Long creationSchemeId;
+
+    /**
+     * 开始日期
+     */
+    private LocalDate startDate;
+
+    /**
+     * 结束日期
+     */
+    private LocalDate endDate;
+
+    /**
+     * 是否启用
+     */
+    private Boolean enabled;
+
+    /**
+     * 创建时间
+     */
+    private Date createdAt;
+
+    /**
+     * 更新时间
+     */
+    private Date updatedAt;
+
+
+}

+ 65 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleExecution.java

@@ -0,0 +1,65 @@
+package org.dromara.business.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 【请填写功能名称】对象 schedule_execution
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@Data
+@TableName("schedule_execution")
+public class ScheduleExecution{
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     *
+     */
+    private Long configId;
+
+    /**
+     *
+     */
+    private LocalDate executionDate;
+
+    /**
+     *
+     */
+    private LocalTime executionTime;
+
+    /**
+     *
+     */
+    private String status;
+
+    /**
+     *
+     */
+    private Date createdAt;
+
+    /**
+     *
+     */
+    private Date updatedAt;
+
+
+}

+ 41 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleRepeat.java

@@ -0,0 +1,41 @@
+package org.dromara.business.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 排期重复规则:定义排期配置的重复逻辑(如每天、每周一)对象 schedule_repeat
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("schedule_repeat")
+public class ScheduleRepeat extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联的schedule_config ID
+     */
+    private Long configId;
+
+    /**
+     * 重复类型: DAILY, WEEKLY_MONDAY 等  "WEEKLY_MONDAY", "WEEKLY_TUESDAY", "WEEKLY_WEDNESDAY", "WEEKLY_THURSDAY", "WEEKLY_FRIDAY", "WEEKLY_SATURDAY", "WEEKLY_SUNDAY"
+     */
+    private String repeatType;
+
+
+}

+ 44 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleTime.java

@@ -0,0 +1,44 @@
+package org.dromara.business.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+import java.io.Serial;
+
+/**
+ * 排期执行时间:定义每天执行任务的具体时间点对象 schedule_time
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("schedule_time")
+public class ScheduleTime extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联的schedule_config ID
+     */
+    private Long configId;
+
+    /**
+     * 执行时间点
+     */
+    private LocalTime execTime;
+
+
+}

+ 44 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/ScheduleTournamentsReletion.java

@@ -0,0 +1,44 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.io.Serial;
+import java.time.LocalDateTime;
+
+/**
+ * 赛事分配的模版关系对象 schedule_tournaments_reletion
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@Data
+@TableName("schedule_tournaments_reletion")
+public class ScheduleTournamentsReletion {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 赛事ID
+     */
+    private Long tournamentsId;
+
+    /**
+     * 模版ID
+     */
+    private Long tournamentsTemplateId;
+
+    /**
+     * 赛事开始时间
+     */
+    private String scBeginTime;
+
+
+}

+ 64 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/CreationSchemeBo.java

@@ -0,0 +1,64 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.CreationScheme;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 创建方案:用于定义排期生成规则模板业务对象 creation_scheme
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = CreationScheme.class, reverseConvertGenerate = false)
+public class CreationSchemeBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 唯一标识符
+     */
+    @NotBlank(message = "唯一标识符不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String code;
+
+    /**
+     * 名称
+     */
+    @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 默认开始偏移天数
+     */
+    @NotNull(message = "默认开始偏移天数不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long defaultStartOffset;
+
+    /**
+     * 默认持续天数
+     */
+    @NotNull(message = "默认持续天数不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long defaultDurationDays;
+
+    /**
+     * 是否激活
+     */
+    private Boolean isActive;
+
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleConfigBo.java

@@ -0,0 +1,71 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.ScheduleConfig;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.time.LocalDate;
+import java.util.Date;
+
+/**
+ * 排期配置:用于保存具体的排期实例配置业务对象 schedule_config
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ScheduleConfig.class, reverseConvertGenerate = false)
+public class ScheduleConfigBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 模板ID
+     */
+    @NotNull(message = "模板ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long templateId;
+
+    /**
+     * 创建方案ID
+     */
+    private Long creationSchemeId;
+
+    /**
+     * 开始日期
+     */
+    @NotNull(message = "开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private LocalDate startDate;
+
+    /**
+     * 结束日期
+     */
+    @NotNull(message = "结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private LocalDate endDate;
+
+    /**
+     * 是否启用
+     */
+    private Boolean enabled;
+
+    /**
+     * 创建时间
+     */
+    private Date createdAt;
+
+    /**
+     * 更新时间
+     */
+    private Date updatedAt;
+
+
+}

+ 49 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleConfigRequestBo.java

@@ -0,0 +1,49 @@
+package org.dromara.business.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.business.domain.ScheduleConfig;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 排期配置:用于保存具体的排期实例配置业务对象 schedule_config
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ScheduleConfig.class, reverseConvertGenerate = false)
+public class ScheduleConfigRequestBo extends BaseEntity {
+
+    @NotNull(message = "模板ID不能为空")
+    private Long templateId;
+
+    @NotBlank(message = "创建方案Code不能为空")
+    private String creationSchemeCode;
+
+    @NotNull(message = "请选择是否启用")
+    private Boolean enabled = false;
+
+    // 重复规则,例如 ["DAILY", "WEEKLY_MONDAY"]
+    private List<String> repeatTypes;
+
+    // 执行时间点,例如 ["20:00", "21:00"]
+    private List<LocalTime> execTimes;
+
+    /**
+     * 排期配置ID
+     */
+    private Long configId;
+
+    private Long id;
+}

+ 66 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleExecutionBo.java

@@ -0,0 +1,66 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.ScheduleExecution;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Date;
+
+
+/**
+ * 【请填写功能名称】业务对象 schedule_execution
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ScheduleExecution.class, reverseConvertGenerate = false)
+public class ScheduleExecutionBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long configId;
+
+    /**
+     *
+     */
+    private LocalDate executionDate;
+
+    /**
+     *
+     */
+    private LocalTime executionTime;
+
+    /**
+     *
+     */
+    private String status;
+
+    /**
+     *
+     */
+    private Date createdAt;
+
+    /**
+     *
+     */
+    private Date updatedAt;
+
+
+}

+ 42 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleRepeatBo.java

@@ -0,0 +1,42 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.ScheduleRepeat;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 排期重复规则:定义排期配置的重复逻辑(如每天、每周一)业务对象 schedule_repeat
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ScheduleRepeat.class, reverseConvertGenerate = false)
+public class ScheduleRepeatBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 关联的schedule_config ID
+     */
+    @NotNull(message = "关联的schedule_config ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long configId;
+
+    /**
+     * 重复类型: DAILY, WEEKLY_MONDAY 等
+     */
+    @NotBlank(message = "重复类型: DAILY, WEEKLY_MONDAY 等不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String repeatType;
+
+
+}

+ 46 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleTimeBo.java

@@ -0,0 +1,46 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.ScheduleTime;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+
+/**
+ * 排期执行时间:定义每天执行任务的具体时间点业务对象 schedule_time
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ScheduleTime.class, reverseConvertGenerate = false)
+public class ScheduleTimeBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 关联的schedule_config ID
+     */
+    @NotNull(message = "关联的schedule_config ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long configId;
+
+    /**
+     * 执行时间点
+     */
+    @NotNull(message = "执行时间点不能为空", groups = { AddGroup.class, EditGroup.class })
+    private LocalTime execTime;
+
+
+}

+ 45 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/ScheduleTournamentsReletionBo.java

@@ -0,0 +1,45 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.ScheduleTournamentsReletion;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+
+/**
+ * 赛事分配的模版关系业务对象 schedule_tournaments_reletion
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ScheduleTournamentsReletion.class, reverseConvertGenerate = false)
+public class ScheduleTournamentsReletionBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 赛事ID
+     */
+    private Long tournamentsId;
+
+    /**
+     * 模版ID
+     */
+    private Long tournamentsTemplateId;
+
+    /**
+     * 赛事开始时间
+     */
+    private Date scBeginTime;
+
+
+}

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/dto/TournamentsDto.java

@@ -48,8 +48,14 @@ public class TournamentsDto {
     @NotNull(message = "奖励内容不能为空")
     private List<ItemsPrizeDto> itemsPrizeList;
 
+    /**
+     * 比赛logo
+     */
     private String competitionIcon;
 
+    /**
+     * 奖励人数
+     */
     private int rewardPlayers;
 
 }

+ 49 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/Weekday.java

@@ -0,0 +1,49 @@
+package org.dromara.business.domain.enums;
+
+/**
+ * 星期枚举
+ *
+ * @author ruoyi
+ */
+public enum Weekday {
+
+    // 按周一至周日顺序定义枚举常量
+    MONDAY("周一", "WEEKLY_MONDAY"),
+    TUESDAY("周二", "WEEKLY_TUESDAY"),
+    WEDNESDAY("周三", "WEEKLY_WEDNESDAY"),
+    THURSDAY("周四", "WEEKLY_THURSDAY"),
+    FRIDAY("周五", "WEEKLY_FRIDAY"),
+    SATURDAY("周六", "WEEKLY_SATURDAY"),
+    SUNDAY("周日", "WEEKLY_SUNDAY");
+
+    private final String description;
+    private final String code;
+
+    Weekday(String description, String code) {
+        this.description = description;
+        this.code = code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    /**
+     * 根据 code 获取对应的 Weekday 枚举
+     * @param code code 值
+     * @return 对应的 Weekday 枚举(周一至周日)
+     */
+    public static Weekday getByCode(String code) {
+        for (Weekday weekday : Weekday.values()) {
+            if (weekday.getCode().equals(code)) {
+                return weekday;
+            }
+        }
+        return null; // 若未找到匹配项,返回 null
+    }
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/CreationSchemeVo.java

@@ -0,0 +1,71 @@
+package org.dromara.business.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.business.domain.CreationScheme;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 创建方案:用于定义排期生成规则模板视图对象 creation_scheme
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = CreationScheme.class)
+public class CreationSchemeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 唯一标识符
+     */
+    @ExcelProperty(value = "唯一标识符")
+    private String code;
+
+    /**
+     * 名称
+     */
+    @ExcelProperty(value = "名称")
+    private String name;
+
+    /**
+     * 描述
+     */
+    @ExcelProperty(value = "描述")
+    private String description;
+
+    /**
+     * 默认开始偏移天数
+     */
+    @ExcelProperty(value = "默认开始偏移天数")
+    private Long defaultStartOffset;
+
+    /**
+     * 默认持续天数
+     */
+    @ExcelProperty(value = "默认持续天数")
+    private Long defaultDurationDays;
+
+    /**
+     * 是否激活
+     */
+    @ExcelProperty(value = "是否激活")
+    private Boolean isActive;
+
+
+}

+ 81 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleConfigVo.java

@@ -0,0 +1,81 @@
+package org.dromara.business.domain.vo;
+
+import java.time.LocalDate;
+import java.util.Date;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.business.domain.ScheduleConfig;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+
+/**
+ * 排期配置:用于保存具体的排期实例配置视图对象 schedule_config
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ScheduleConfig.class)
+public class ScheduleConfigVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 模板ID
+     */
+    @ExcelProperty(value = "模板ID")
+    private Long templateId;
+
+    /**
+     * 创建方案ID
+     */
+    @ExcelProperty(value = "创建方案ID")
+    private Long creationSchemeId;
+
+    /**
+     * 开始日期
+     */
+    @ExcelProperty(value = "开始日期")
+    private LocalDate startDate;
+
+    /**
+     * 结束日期
+     */
+    @ExcelProperty(value = "结束日期")
+    private LocalDate endDate;
+
+    /**
+     * 是否启用
+     */
+    @ExcelProperty(value = "是否启用")
+    private Boolean enabled;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createdAt;
+
+    /**
+     * 更新时间
+     */
+    @ExcelProperty(value = "更新时间")
+    private Date updatedAt;
+
+
+}

+ 76 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleExecutionVo.java

@@ -0,0 +1,76 @@
+package org.dromara.business.domain.vo;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Date;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.business.domain.ScheduleExecution;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 【请填写功能名称】视图对象 schedule_execution
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ScheduleExecution.class)
+public class ScheduleExecutionVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long configId;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private LocalDate executionDate;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private LocalTime executionTime;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private String status;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Date createdAt;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Date updatedAt;
+
+
+}

+ 49 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleRepeatVo.java

@@ -0,0 +1,49 @@
+package org.dromara.business.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.business.domain.ScheduleRepeat;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+
+/**
+ * 排期重复规则:定义排期配置的重复逻辑(如每天、每周一)视图对象 schedule_repeat
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ScheduleRepeat.class)
+public class ScheduleRepeatVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 关联的schedule_config ID
+     */
+    @ExcelProperty(value = "关联的schedule_config ID")
+    private Long configId;
+
+    /**
+     * 重复类型: DAILY, WEEKLY_MONDAY 等
+     */
+    @ExcelProperty(value = "重复类型: DAILY, WEEKLY_MONDAY 等")
+    private String repeatType;
+
+
+}

+ 49 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleTimeVo.java

@@ -0,0 +1,49 @@
+package org.dromara.business.domain.vo;
+
+import java.time.LocalTime;
+import java.util.Date;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.business.domain.ScheduleTime;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 排期执行时间:定义每天执行任务的具体时间点视图对象 schedule_time
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ScheduleTime.class)
+public class ScheduleTimeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 关联的schedule_config ID
+     */
+    @ExcelProperty(value = "关联的schedule_config ID")
+    private Long configId;
+
+    /**
+     * 执行时间点
+     */
+    @ExcelProperty(value = "执行时间点")
+    private LocalTime execTime;
+
+
+}

+ 53 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/ScheduleTournamentsReletionVo.java

@@ -0,0 +1,53 @@
+package org.dromara.business.domain.vo;
+
+import java.util.Date;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.business.domain.ScheduleTournamentsReletion;
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 赛事分配的模版关系视图对象 schedule_tournaments_reletion
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ScheduleTournamentsReletion.class)
+public class ScheduleTournamentsReletionVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 赛事ID
+     */
+    @ExcelProperty(value = "赛事ID")
+    private Long tournamentsId;
+
+    /**
+     * 模版ID
+     */
+    @ExcelProperty(value = "模版ID")
+    private Long tournamentsTemplateId;
+
+    /**
+     * 赛事开始时间
+     */
+    @ExcelProperty(value = "赛事开始时间")
+    private Date scBeginTime;
+
+
+}

+ 60 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/TournamentsVo.java

@@ -1,5 +1,6 @@
 package org.dromara.business.domain.vo;
 
+import java.time.LocalTime;
 import java.util.Date;
 import jakarta.validation.constraints.NotNull;
 import org.dromara.business.domain.Tournaments;
@@ -45,12 +46,12 @@ public class TournamentsVo implements Serializable {
      * 比赛开始时间
      */
     @ExcelProperty(value = "比赛开始时间")
-    private Date startTime;
+    private String startTime;
 
     /**
      * 比赛结束时间
      */
-    private Date endTime;
+    private String endTime;
 
     /**
      * 游戏类型
@@ -131,4 +132,61 @@ public class TournamentsVo implements Serializable {
      */
     private int signNum;
 
+    /**
+     * 奖励人数
+     */
+    private int rewardPlayers;
+
+    /**
+     * 总手数,包括rebuy
+     */
+    private int totalSignup;
+
+
+
+    /**
+     * 排期配置id
+     */
+    private Long configId;
+
+    /**
+     * 重复类型
+     */
+    private List<String> repeatTypes;
+
+    /**
+     * 执行时间
+     */
+    private List<LocalTime> execTimes;
+
+    /**
+     * 是否启用
+     */
+    private Boolean enabled;
+
+    /**
+     * 排期模板id
+     */
+    private Long templateId;
+
+    /**
+     * 创建方案id
+     */
+    private Long creationSchemeId;
+
+    /**
+     * 创建方案编码
+     */
+    private String creationSchemeCode;
+
+    /**
+     * 对应创建的选择周几信息
+     */
+    private List<String> weekDayList;
+
+    /**
+     * 频率数量
+     */
+    private int weekDaySize;
+
 }

+ 52 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/CreationSchemeMapper.java

@@ -0,0 +1,52 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.CreationScheme;
+import org.dromara.business.domain.vo.CreationSchemeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 创建方案:用于定义排期生成规则模板Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@DS("mysql2")
+public interface CreationSchemeMapper extends BaseMapperPlus<CreationScheme, CreationSchemeVo> {
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<CreationSchemeVo> selectAllCreationSchemes(@Param("page") Page<CreationScheme> page, @Param("ew") Wrapper<CreationScheme> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertCreationScheme(CreationScheme creationScheme);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateCreationScheme(CreationScheme creationScheme);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteCreationSchemeById(@Param("ids") Collection<Long> ids);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CreationSchemeVo selectCreationSchemeById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<CreationSchemeVo> selectAllCreationSchemesList(@Param("ew") Wrapper<CreationScheme> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    CreationSchemeVo selectAllCreationSchemesInfo(@Param("code") String code);
+
+    /**
+     * 查询所有创建方案
+     *
+     * @return 创建方案列表
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    List<CreationSchemeVo> selectAllCreationSchemesAllList();
+}

+ 76 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleConfigMapper.java

@@ -0,0 +1,76 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.ScheduleConfig;
+import org.dromara.business.domain.vo.ScheduleConfigVo;
+import org.dromara.business.domain.vo.TournamentsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 排期配置:用于保存具体的排期实例配置Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@DS("mysql2")
+public interface ScheduleConfigMapper extends BaseMapperPlus<ScheduleConfig, ScheduleConfigVo> {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<ScheduleConfigVo> selectAllScheduleConfigs(@Param("page") Page<ScheduleConfig> page, @Param("ew") Wrapper<ScheduleConfig> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertScheduleConfig(ScheduleConfig scheduleConfig);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateScheduleConfig(ScheduleConfig scheduleConfig);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteScheduleConfig(@Param("ids") Collection<Long> ids);
+
+    @InterceptorIgnore(tenantLine = "true")
+    ScheduleConfigVo selectScheduleConfigById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScheduleConfigVo> selectAllScheduleConfigsList(@Param("ew") Wrapper<ScheduleConfig> wrapper);
+
+
+
+    // 查询是否存在重复配置
+    @InterceptorIgnore(tenantLine = "true")
+    boolean existsDuplicateSchedule(@Param("templateId") Long templateId,
+                                    @Param("startDate") LocalDate startDate,
+                                    @Param("endDate") LocalDate endDate,
+                                    @Param("execTime") LocalTime execTime);
+
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<TournamentsVo> selectAllScheduleConfigsInfoList(@Param("page") Page<ScheduleConfig> page, @Param("ew") Wrapper<ScheduleConfig> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    TournamentsVo selectScheduleConfigInfoById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScheduleConfigVo> findActiveConfigsForDate(@Param("date") LocalDate date);
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    int countConflictingSchedules(@Param("templateId") Long templateId,
+                                    @Param("startDate") LocalDate startDate,
+                                    @Param("endDate") LocalDate endDate,
+                                    @Param("execTime") LocalTime execTime,
+                                      @Param("currentConfigId") Long currentConfigId);
+
+
+
+}

+ 36 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleExecutionMapper.java

@@ -0,0 +1,36 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.ScheduleExecution;
+import org.dromara.business.domain.vo.ScheduleExecutionVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@DS("mysql2")
+public interface ScheduleExecutionMapper extends BaseMapperPlus<ScheduleExecution, ScheduleExecutionVo> {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertScheduleExecution(ScheduleExecution execution);
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScheduleExecutionVo> findTodayPendingExecutions(@Param("dates") LocalDate dates);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateSelective(@Param("id") Long id,@Param("status") String status);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteScheduleExecutionByConfigId(@Param("configId") Long configId);
+
+}

+ 49 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleRepeatMapper.java

@@ -0,0 +1,49 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.ScheduleRepeat;
+import org.dromara.business.domain.vo.ScheduleRepeatVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 排期重复规则:定义排期配置的重复逻辑(如每天、每周一)Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@DS("mysql2")
+public interface ScheduleRepeatMapper extends BaseMapperPlus<ScheduleRepeat, ScheduleRepeatVo> {
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<ScheduleRepeatVo> selectAllScheduleRepeats(@Param("page") Page<ScheduleRepeat> page, @Param("ew") Wrapper<ScheduleRepeat> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertScheduleRepeat(ScheduleRepeat scheduleRepeat);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateScheduleConfig(ScheduleRepeat scheduleRepeat);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteScheduleConfig(@Param("ids") Collection<Long> ids);
+
+    @InterceptorIgnore(tenantLine = "true")
+    ScheduleRepeatVo selectScheduleConfigById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScheduleRepeatVo> selectAllScheduleRepeats(@Param("ew") Wrapper<ScheduleRepeat> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScheduleRepeatVo> selectScheduleRepeatByConfigId(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteRepeatByConfigId(@Param("configId") Long configId);
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleTimeMapper.java

@@ -0,0 +1,52 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.ScheduleTime;
+import org.dromara.business.domain.vo.ScheduleTimeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 排期执行时间:定义每天执行任务的具体时间点Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@DS("mysql2")
+public interface ScheduleTimeMapper extends BaseMapperPlus<ScheduleTime, ScheduleTimeVo> {
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<ScheduleTimeVo> selectAllScheduleTimes(@Param("page") Page<ScheduleTime> page, @Param("ew") Wrapper<ScheduleTime> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertScheduleTime(ScheduleTime scheduleTime);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateScheduleTime(ScheduleTime scheduleTime);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteScheduleTime(@Param("ids") Collection<Long> ids);
+
+    @InterceptorIgnore(tenantLine = "true")
+    ScheduleTimeVo selectScheduleTimeById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScheduleTimeVo> selectAllScheduleTimes(@Param("ew") Wrapper<ScheduleTime> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScheduleTimeVo> selectScheduleTimeInfoById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteTimeByConfigId(@Param("configId") Long configId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Boolean existsByConfigIdAndTime(@Param("configId") Long configId,@Param("execTime") LocalDateTime execTime);
+
+}

+ 33 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/ScheduleTournamentsReletionMapper.java

@@ -0,0 +1,33 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.ScheduleTournamentsReletion;
+import org.dromara.business.domain.vo.ScheduleTournamentsReletionVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.time.LocalDateTime;
+
+/**
+ * 赛事分配的模版关系Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-31
+ */
+@DS("mysql2")
+public interface ScheduleTournamentsReletionMapper extends BaseMapperPlus<ScheduleTournamentsReletion, ScheduleTournamentsReletionVo> {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertScheduleRelation(ScheduleTournamentsReletion scheduleTournamentsReletion);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int selectByScheduleRelation(@Param("templateId") Long templateId, @Param("beginTime") LocalDateTime beginTime);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int selectByScheduleRelationExit(@Param("templateId") Long templateId);
+
+
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/ICreationSchemeService.java

@@ -0,0 +1,71 @@
+package org.dromara.business.service;
+
+import org.dromara.business.domain.bo.CreationSchemeBo;
+import org.dromara.business.domain.vo.CreationSchemeVo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 创建方案:用于定义排期生成规则模板Service接口
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+public interface ICreationSchemeService {
+
+    /**
+     * 查询创建方案:用于定义排期生成规则模板
+     *
+     * @param id 主键
+     * @return 创建方案:用于定义排期生成规则模板
+     */
+    CreationSchemeVo queryById(Long id);
+
+    /**
+     * 分页查询创建方案:用于定义排期生成规则模板列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 创建方案:用于定义排期生成规则模板分页列表
+     */
+    TableDataInfo<CreationSchemeVo> queryPageList(CreationSchemeBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的创建方案:用于定义排期生成规则模板列表
+     *
+     * @param bo 查询条件
+     * @return 创建方案:用于定义排期生成规则模板列表
+     */
+    List<CreationSchemeVo> queryList(CreationSchemeBo bo);
+
+    /**
+     * 新增创建方案:用于定义排期生成规则模板
+     *
+     * @param bo 创建方案:用于定义排期生成规则模板
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(CreationSchemeBo bo);
+
+    /**
+     * 修改创建方案:用于定义排期生成规则模板
+     *
+     * @param bo 创建方案:用于定义排期生成规则模板
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(CreationSchemeBo bo);
+
+    /**
+     * 校验并批量删除创建方案:用于定义排期生成规则模板信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    List<CreationSchemeVo> selectAllCreationSchemesAllList();
+
+}

+ 125 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IScheduleConfigService.java

@@ -0,0 +1,125 @@
+package org.dromara.business.service;
+
+import org.dromara.business.domain.bo.ScheduleConfigBo;
+import org.dromara.business.domain.bo.ScheduleConfigRequestBo;
+import org.dromara.business.domain.vo.ScheduleConfigVo;
+import org.dromara.business.domain.vo.TournamentsVo;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.time.LocalTime;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 排期配置:用于保存具体的排期实例配置Service接口
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+public interface IScheduleConfigService {
+
+    /**
+     * 查询排期配置:用于保存具体的排期实例配置
+     *
+     * @param id 主键
+     * @return 排期配置:用于保存具体的排期实例配置
+     */
+    ScheduleConfigVo queryById(Long id);
+
+    /**
+     * 分页查询排期配置:用于保存具体的排期实例配置列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 排期配置:用于保存具体的排期实例配置分页列表
+     */
+    TableDataInfo<ScheduleConfigVo> queryPageList(ScheduleConfigBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的排期配置:用于保存具体的排期实例配置列表
+     *
+     * @param bo 查询条件
+     * @return 排期配置:用于保存具体的排期实例配置列表
+     */
+    List<ScheduleConfigVo> queryList(ScheduleConfigBo bo);
+
+    /**
+     * 新增排期配置:用于保存具体的排期实例配置
+     *
+     * @param bo 排期配置:用于保存具体的排期实例配置
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ScheduleConfigBo bo);
+
+    /**
+     * 修改排期配置:用于保存具体的排期实例配置
+     *
+     * @param bo 排期配置:用于保存具体的排期实例配置
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ScheduleConfigBo bo);
+
+    /**
+     * 校验并批量删除排期配置:用于保存具体的排期实例配置信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+    /**
+     * 保存排期配置
+     *
+     * @param templateId 排期模板ID
+     * @param schemeCode 排期方案编码
+     * @param repeatTypes 重复类型
+     * @param execTimes 执行时间点
+     */
+    R<String> saveScheduleConfig(ScheduleConfigRequestBo request);
+
+
+
+    /**
+     * 分页查询排期配置:用于保存具体的排期实例配置列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 排期配置:用于保存具体的排期实例配置分页列表
+     */
+    TableDataInfo<TournamentsVo> queryPageListSai(ScheduleConfigBo bo, PageQuery pageQuery);
+
+
+
+    TournamentsVo selectScheduleConfigInfoById(Long id);
+
+
+
+    /**
+     * 修改排期配置
+     *
+     */
+    R<String> updateScheduleConfig(Long configId, ScheduleConfigRequestBo dto);
+
+
+    /**
+     * 删除排期配置
+     * @param configId
+     * @return
+     */
+    R<String> deleteScheduleConfig(Long configId);
+
+
+    /**
+     * 停止排期配置
+     * @param configId
+     * @return
+     */
+    Boolean stopScheduleConfig(Long configId);
+
+
+
+}

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

@@ -0,0 +1,143 @@
+package org.dromara.business.service.impl;
+
+import org.dromara.business.domain.CreationScheme;
+import org.dromara.business.domain.bo.CreationSchemeBo;
+import org.dromara.business.domain.vo.CreationSchemeVo;
+import org.dromara.business.mapper.CreationSchemeMapper;
+import org.dromara.business.service.ICreationSchemeService;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.springframework.stereotype.Service;
+
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 创建方案:用于定义排期生成规则模板Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class CreationSchemeServiceImpl implements ICreationSchemeService {
+
+    private final CreationSchemeMapper baseMapper;
+
+    /**
+     * 查询创建方案:用于定义排期生成规则模板
+     *
+     * @param id 主键
+     * @return 创建方案:用于定义排期生成规则模板
+     */
+    @Override
+    public CreationSchemeVo queryById(Long id){
+        return baseMapper.selectCreationSchemeById(id);
+    }
+
+    /**
+     * 分页查询创建方案:用于定义排期生成规则模板列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 创建方案:用于定义排期生成规则模板分页列表
+     */
+    @Override
+    public TableDataInfo<CreationSchemeVo> queryPageList(CreationSchemeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<CreationScheme> lqw = buildQueryWrapper(bo);
+        Page<CreationSchemeVo> result = baseMapper.selectAllCreationSchemes(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的创建方案:用于定义排期生成规则模板列表
+     *
+     * @param bo 查询条件
+     * @return 创建方案:用于定义排期生成规则模板列表
+     */
+    @Override
+    public List<CreationSchemeVo> queryList(CreationSchemeBo bo) {
+        LambdaQueryWrapper<CreationScheme> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectAllCreationSchemesList(lqw);
+    }
+
+    private LambdaQueryWrapper<CreationScheme> buildQueryWrapper(CreationSchemeBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<CreationScheme> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(CreationScheme::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getCode()), CreationScheme::getCode, bo.getCode());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), CreationScheme::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), CreationScheme::getDescription, bo.getDescription());
+        lqw.eq(bo.getDefaultStartOffset() != null, CreationScheme::getDefaultStartOffset, bo.getDefaultStartOffset());
+        lqw.eq(bo.getDefaultDurationDays() != null, CreationScheme::getDefaultDurationDays, bo.getDefaultDurationDays());
+        lqw.eq(bo.getIsActive() != null, CreationScheme::getIsActive, bo.getIsActive());
+        return lqw;
+    }
+
+    /**
+     * 新增创建方案:用于定义排期生成规则模板
+     *
+     * @param bo 创建方案:用于定义排期生成规则模板
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(CreationSchemeBo bo) {
+        CreationScheme add = MapstructUtils.convert(bo, CreationScheme.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insertCreationScheme(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改创建方案:用于定义排期生成规则模板
+     *
+     * @param bo 创建方案:用于定义排期生成规则模板
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(CreationSchemeBo bo) {
+        CreationScheme update = MapstructUtils.convert(bo, CreationScheme.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateCreationScheme(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(CreationScheme entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除创建方案:用于定义排期生成规则模板信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteCreationSchemeById(ids) > 0;
+    }
+
+    @Override
+    public List<CreationSchemeVo> selectAllCreationSchemesAllList() {
+        return baseMapper.selectAllCreationSchemesAllList();
+    }
+}

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

@@ -0,0 +1,588 @@
+package org.dromara.business.service.impl;
+
+import org.dromara.business.domain.*;
+import org.dromara.business.domain.bo.ScheduleConfigBo;
+import org.dromara.business.domain.bo.ScheduleConfigRequestBo;
+import org.dromara.business.domain.dto.ItemsPrizeDto;
+import org.dromara.business.domain.enums.Weekday;
+import org.dromara.business.domain.vo.*;
+import org.dromara.business.mapper.*;
+import org.dromara.business.service.IScheduleConfigService;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.MapstructUtils;
+
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.springframework.stereotype.Service;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 排期配置:用于保存具体的排期实例配置Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-28
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ScheduleConfigServiceImpl implements IScheduleConfigService {
+
+    private final ScheduleConfigMapper baseMapper;
+
+    private final CreationSchemeMapper schemeRepo;
+
+    private final ScheduleRepeatMapper scheduleRepeatMapper;
+
+    private final ScheduleTimeMapper scheduleTimeMapper;
+
+    private final TournamentEntryConditionsTemplateMapper tournamentEntryConditionsMapper;
+
+
+    private final TournamentBlindStructuresTemplateMapper tournamentBlindStructuresMapper;
+
+
+    private final PrizeDistributionsTemplateMapper prizeDistributionsMapper;
+
+
+    private final PrizeDistributionItemsTemplateMapper prizeDistributionItemsMapper;
+
+    private final ScheduleExecutionMapper scheduleExecutionMapper;
+
+    private final ScheduleTournamentsReletionMapper scheduleTournamentsReletionMapper;
+
+    /**
+     * 查询排期配置:用于保存具体的排期实例配置
+     *
+     * @param id 主键
+     * @return 排期配置:用于保存具体的排期实例配置
+     */
+    @Override
+    public ScheduleConfigVo queryById(Long id){
+        return baseMapper.selectScheduleConfigById(id);
+    }
+
+    /**
+     * 分页查询排期配置:用于保存具体的排期实例配置列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 排期配置:用于保存具体的排期实例配置分页列表
+     */
+    @Override
+    public TableDataInfo<ScheduleConfigVo> queryPageList(ScheduleConfigBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ScheduleConfig> lqw = buildQueryWrapper(bo);
+        Page<ScheduleConfigVo> result = baseMapper.selectAllScheduleConfigs(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的排期配置:用于保存具体的排期实例配置列表
+     *
+     * @param bo 查询条件
+     * @return 排期配置:用于保存具体的排期实例配置列表
+     */
+    @Override
+    public List<ScheduleConfigVo> queryList(ScheduleConfigBo bo) {
+        LambdaQueryWrapper<ScheduleConfig> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectAllScheduleConfigsList(lqw);
+    }
+
+    private LambdaQueryWrapper<ScheduleConfig> buildQueryWrapper(ScheduleConfigBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ScheduleConfig> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ScheduleConfig::getId);
+        lqw.eq(bo.getTemplateId() != null, ScheduleConfig::getTemplateId, bo.getTemplateId());
+        lqw.eq(bo.getCreationSchemeId() != null, ScheduleConfig::getCreationSchemeId, bo.getCreationSchemeId());
+        lqw.eq(bo.getStartDate() != null, ScheduleConfig::getStartDate, bo.getStartDate());
+        lqw.eq(bo.getEndDate() != null, ScheduleConfig::getEndDate, bo.getEndDate());
+        lqw.eq(bo.getEnabled() != null, ScheduleConfig::getEnabled, bo.getEnabled());
+        lqw.eq(bo.getCreatedAt() != null, ScheduleConfig::getCreatedAt, bo.getCreatedAt());
+        lqw.eq(bo.getUpdatedAt() != null, ScheduleConfig::getUpdatedAt, bo.getUpdatedAt());
+        return lqw;
+    }
+
+    /**
+     * 新增排期配置:用于保存具体的排期实例配置
+     *
+     * @param bo 排期配置:用于保存具体的排期实例配置
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ScheduleConfigBo bo) {
+        ScheduleConfig add = MapstructUtils.convert(bo, ScheduleConfig.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insertScheduleConfig(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改排期配置:用于保存具体的排期实例配置
+     *
+     * @param bo 排期配置:用于保存具体的排期实例配置
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ScheduleConfigBo bo) {
+        ScheduleConfig update = MapstructUtils.convert(bo, ScheduleConfig.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateScheduleConfig(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ScheduleConfig entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除排期配置:用于保存具体的排期实例配置信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteScheduleConfig(ids) > 0;
+    }
+
+    public R<String> saveScheduleConfig(ScheduleConfigRequestBo dto) {
+        //todo 选择未来三天   同时周机对不上
+
+        if(dto.getExecTimes().size()<=0){
+            return R.fail("时间设置为空");
+        }
+        if(dto.getRepeatTypes().size()<=0){
+            return R.fail("重复设置为空");
+        }
+
+        // 1. 查询创建方案
+        CreationSchemeVo scheme = schemeRepo.selectAllCreationSchemesInfo(dto.getCreationSchemeCode());
+        if (scheme == null) throw new IllegalArgumentException("Invalid scheme code: " + dto.getCreationSchemeCode());
+
+        // 2. 计算开始和结束日期
+        LocalDate startDate = calculateStartDate(dto.getCreationSchemeCode());
+        LocalDate endDate = calculateEndDate(dto.getCreationSchemeCode(), startDate);
+
+        // 3. 保存主配置
+        ScheduleConfig config = new ScheduleConfig();
+        config.setTemplateId(dto.getTemplateId());
+        config.setCreationSchemeId(scheme.getId());
+        config.setStartDate(startDate);
+        config.setEndDate(endDate);
+        config.setEnabled(true);
+        baseMapper.insertScheduleConfig(config);
+
+        Long configId = config.getId();
+
+        // 5. 保存重复规则(如 DAILY, WEEKLY_MONDAY 等)
+        for (String repeatType : dto.getRepeatTypes()) {
+            ScheduleRepeat repeat = new ScheduleRepeat();
+            repeat.setConfigId(config.getId());
+            repeat.setRepeatType(repeatType);
+            scheduleRepeatMapper.insertScheduleRepeat(repeat);
+        }
+
+        // 6. 保存执行时间(如 09:00, 14:30)
+        for (LocalTime time : dto.getExecTimes()) {
+            ScheduleTime st = new ScheduleTime();
+            st.setConfigId(config.getId());
+            st.setExecTime(time);
+            scheduleTimeMapper.insertScheduleTime(st);
+        }
+
+
+        // 6. ✅ 预生成执行计划
+        generateExecutionPlan(configId, dto.getCreationSchemeCode(), startDate, endDate, dto.getRepeatTypes(), dto.getExecTimes());
+
+         return R.ok();
+    }
+
+    private LocalDate calculateStartDate(String schemeCode) {
+        return LocalDate.now();
+    }
+
+    private LocalDate calculateEndDate(String schemeCode, LocalDate startDate) {
+        switch (schemeCode.toUpperCase()) {
+            case "DAILY":
+            case "WEEKLY":
+                return LocalDate.of(2027, 12, 31);
+            case "NEXT_THREE_DAYS":
+                return startDate.plusDays(2);
+            default:
+                throw new IllegalArgumentException("Unknown scheme: " + schemeCode);
+        }
+    }
+
+    private void generateExecutionPlan(
+        Long configId,
+        String schemeCode,
+        LocalDate startDate,
+        LocalDate endDate,
+        List<String> repeatTypes,
+        List<LocalTime> execTimes) {
+
+        switch (schemeCode.toUpperCase()) {
+            case "DAILY":
+                // 初始化为特定日期
+                endDate = LocalDate.of(2025, 8, 30);
+                generateDailyPlan(configId, startDate, endDate, repeatTypes, execTimes);
+                break;
+            case "WEEKLY":
+                generateWeeklyPlan(configId, startDate, endDate, repeatTypes, execTimes);
+                break;
+            case "NEXT_THREE_DAYS":
+                generateNextThreeDaysPlan(configId, startDate, endDate, repeatTypes, execTimes);
+                break;
+        }
+    }
+
+    // 辅助方法:判断某天是否应该执行
+    private boolean shouldExecuteOnDate(List<String> repeatTypes, LocalDate date) {
+        if (repeatTypes == null || repeatTypes.isEmpty()) return false;
+        String dayType = "WEEKLY_" + date.getDayOfWeek().name();
+        return repeatTypes.contains(dayType) || repeatTypes.contains("DAILY");
+    }
+
+    private void generateDailyPlan(Long configId, LocalDate start, LocalDate end, List<String> repeatTypes, List<LocalTime> execTimes) {
+        LocalDate d = start;
+        while (!d.isAfter(end)) {
+            if (shouldExecuteOnDate(repeatTypes, d)) {
+                for (LocalTime t : execTimes) {
+                    ScheduleExecution e = new ScheduleExecution();
+                    e.setConfigId(configId);
+                    e.setExecutionDate(d);
+                    e.setExecutionTime(t);
+                    scheduleExecutionMapper.insertScheduleExecution(e);
+                }
+            }
+            d = d.plusDays(1);
+        }
+    }
+
+    private void generateWeeklyPlan(Long configId, LocalDate start, LocalDate end, List<String> repeatTypes, List<LocalTime> execTimes) {
+        LocalDate d = start;
+        while (!d.isAfter(end)) {
+            if (shouldExecuteOnDate(repeatTypes, d)) {
+                for (LocalTime t : execTimes) {
+                    ScheduleExecution e = new ScheduleExecution();
+                    e.setConfigId(configId);
+                    e.setExecutionDate(d);
+                    e.setExecutionTime(t);
+                    scheduleExecutionMapper.insertScheduleExecution(e);
+                }
+            }
+            d = d.plusDays(1);
+        }
+    }
+
+    private void generateNextThreeDaysPlan(Long configId, LocalDate start, LocalDate end, List<String> repeatTypes, List<LocalTime> execTimes) {
+        LocalDate d = start;
+        int count = 0;
+        while (!d.isAfter(end)) {
+            if (shouldExecuteOnDate(repeatTypes, d)) {
+                for (LocalTime t : execTimes) {
+                    ScheduleExecution e = new ScheduleExecution();
+                    e.setConfigId(configId);
+                    e.setExecutionDate(d);
+                    e.setExecutionTime(t);
+                    scheduleExecutionMapper.insertScheduleExecution(e);
+                }
+                count++; // ✅ 仅在生成计划时递增 count
+            }
+            d = d.plusDays(1);
+            if (count >= 3) {
+                break; // ✅ 已生成 3 个计划,提前退出循环
+            }
+        }
+    }
+
+
+    @Override
+    public TableDataInfo<TournamentsVo> queryPageListSai(ScheduleConfigBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ScheduleConfig> lqw = buildQueryWrapper(bo);
+        Page<TournamentsVo> result = baseMapper.selectAllScheduleConfigsInfoList(pageQuery.build(), lqw);
+        List<TournamentsVo> records = result.getRecords();
+        for (TournamentsVo record : records) {
+            Long tournamentId = record.getTemplateId();
+            if(record.getEnabled()){
+                 record.setStatusText("使用中");
+            }else{
+                record.setStatusText("未使用");
+            }
+            //赛事报名条件
+            TournamentEntryConditionsVo tournamentEntryConditionsVo = tournamentEntryConditionsMapper.selectByTournamentInfoTemplate(tournamentId);
+            if(tournamentEntryConditionsVo!=null){
+                record.setItemsId(tournamentEntryConditionsVo.getItemId());
+                record.setItemsNum(tournamentEntryConditionsVo.getRequiredQuantity());
+                record.setItemsName(tournamentEntryConditionsVo.getItemsName());
+            }
+
+            //绑定的盲注信息
+            TournamentBlindStructuresVo tournamentBlindStructuresVo = tournamentBlindStructuresMapper.selectTournamentBlindStructureByTournamentIdTemplate(tournamentId);
+            if(tournamentBlindStructuresVo!=null){
+                record.setBlindStructureId(tournamentBlindStructuresVo.getBlindStructureId());
+                record.setBlindStructuresName(tournamentBlindStructuresVo.getBlindStructuresName());
+            }
+
+            //排名
+            List<PrizeDistributionsVo> prizeDistributionsVos = prizeDistributionsMapper.selectByTournamentIdTemplate(tournamentId);
+            if(prizeDistributionsVos!=null){
+                List<ItemsPrizeDto> itemsPrizeList=new ArrayList<>();
+
+                // 提取并按排名正序排序后,取出 id 列表
+                List<Long> ids = prizeDistributionsVos.stream()
+                    .sorted(Comparator.comparing(PrizeDistributionsVo::getPaiming))
+                    .map(PrizeDistributionsVo::getId)
+                    .collect(Collectors.toList());
+                int i=0;
+                for (Long id2 : ids) {
+                    i++;
+                    //奖品
+                    PrizeDistributionItemsVo prizeDistributionItemsVos = prizeDistributionItemsMapper.selectByPrizeDistributionIdTemplate(id2);
+                    ItemsPrizeDto itemsPrizeBo = new ItemsPrizeDto();
+                    itemsPrizeBo.setRanking(Long.valueOf(i));
+                    itemsPrizeBo.setItemId(prizeDistributionItemsVos.getItemId());
+                    itemsPrizeBo.setQuantity(prizeDistributionItemsVos.getQuantity());
+                    itemsPrizeBo.setItemsName(prizeDistributionItemsVos.getItemsName());
+                    itemsPrizeList.add(itemsPrizeBo);
+                }
+                record.setItemsPrizeList(itemsPrizeList);
+
+                List<ScheduleTimeVo> scheduleTimeVos = scheduleTimeMapper.selectScheduleTimeInfoById(record.getConfigId());
+                //对应的频率
+                record.setWeekDaySize(scheduleTimeVos.size());
+                //对应的周期
+                List<String> weekDays=new ArrayList<>();
+                List<ScheduleRepeatVo> scheduleRepeatVo = scheduleRepeatMapper.selectScheduleRepeatByConfigId(record.getConfigId());
+                for (ScheduleRepeatVo repeatVo : scheduleRepeatVo) {
+                    Weekday codeWeek = Weekday.getByCode(repeatVo.getRepeatType());
+                    weekDays.add(codeWeek.getDescription());
+                }
+                record.setWeekDayList(weekDays);
+            }
+        }
+
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public TournamentsVo selectScheduleConfigInfoById(Long id) {
+        TournamentsVo tournamentsVo = baseMapper.selectScheduleConfigInfoById(id);
+        if(tournamentsVo!=null){
+            Long tournamentId = tournamentsVo.getTemplateId();
+            if(tournamentsVo.getEnabled()){
+                tournamentsVo.setStatusText("使用中");
+            }else{
+                tournamentsVo.setStatusText("未使用");
+            }
+            //赛事报名条件
+            TournamentEntryConditionsVo tournamentEntryConditionsVo = tournamentEntryConditionsMapper.selectByTournamentInfoTemplate(tournamentId);
+            if(tournamentEntryConditionsVo!=null){
+                tournamentsVo.setItemsId(tournamentEntryConditionsVo.getItemId());
+                tournamentsVo.setItemsNum(tournamentEntryConditionsVo.getRequiredQuantity());
+                tournamentsVo.setItemsName(tournamentEntryConditionsVo.getItemsName());
+            }
+
+            //绑定的盲注信息
+            TournamentBlindStructuresVo tournamentBlindStructuresVo = tournamentBlindStructuresMapper.selectTournamentBlindStructureByTournamentIdTemplate(tournamentId);
+            if(tournamentBlindStructuresVo!=null){
+                tournamentsVo.setBlindStructureId(tournamentBlindStructuresVo.getBlindStructureId());
+                tournamentsVo.setBlindStructuresName(tournamentBlindStructuresVo.getBlindStructuresName());
+            }
+
+            //排名
+            List<PrizeDistributionsVo> prizeDistributionsVos = prizeDistributionsMapper.selectByTournamentIdTemplate(tournamentId);
+            if(prizeDistributionsVos!=null){
+                List<ItemsPrizeDto> itemsPrizeList=new ArrayList<>();
+
+                // 提取并按排名正序排序后,取出 id 列表
+                List<Long> ids = prizeDistributionsVos.stream()
+                    .sorted(Comparator.comparing(PrizeDistributionsVo::getPaiming))
+                    .map(PrizeDistributionsVo::getId)
+                    .collect(Collectors.toList());
+                int i=0;
+                for (Long id2 : ids) {
+                    i++;
+                    //奖品
+                    PrizeDistributionItemsVo prizeDistributionItemsVos = prizeDistributionItemsMapper.selectByPrizeDistributionIdTemplate(id2);
+                    ItemsPrizeDto itemsPrizeBo = new ItemsPrizeDto();
+                    itemsPrizeBo.setRanking(Long.valueOf(i));
+                    itemsPrizeBo.setItemId(prizeDistributionItemsVos.getItemId());
+                    itemsPrizeBo.setQuantity(prizeDistributionItemsVos.getQuantity());
+                    itemsPrizeBo.setItemsName(prizeDistributionItemsVos.getItemsName());
+                    itemsPrizeList.add(itemsPrizeBo);
+                }
+                tournamentsVo.setItemsPrizeList(itemsPrizeList);
+            }
+
+            List<ScheduleRepeatVo> scheduleRepeatVo = scheduleRepeatMapper.selectScheduleRepeatByConfigId(tournamentsVo.getConfigId());
+            if(scheduleRepeatVo!=null && scheduleRepeatVo.size()>0){
+                List<String> repeatTypes = new ArrayList<>();
+                for (ScheduleRepeatVo repeatVo : scheduleRepeatVo) {
+                    repeatTypes.add(repeatVo.getRepeatType());
+                }
+                tournamentsVo.setRepeatTypes(repeatTypes);
+            }
+
+            List<ScheduleTimeVo> scheduleTimeVos = scheduleTimeMapper.selectScheduleTimeInfoById(tournamentsVo.getConfigId());
+            if(scheduleTimeVos!=null && scheduleTimeVos.size()>0){
+                List<LocalTime> timeIds = new ArrayList<>();
+                for (ScheduleTimeVo repeatVo : scheduleTimeVos) {
+                    timeIds.add(repeatVo.getExecTime());
+                }
+                tournamentsVo.setExecTimes(timeIds);
+            }
+            CreationSchemeVo schemeVo = schemeRepo.selectCreationSchemeById(tournamentsVo.getCreationSchemeId());
+            if(schemeVo!=null){
+                tournamentsVo.setCreationSchemeCode(schemeVo.getCode());
+            }
+
+        }
+         return tournamentsVo;
+    }
+
+
+    public R<String> updateScheduleConfig(Long configId, ScheduleConfigRequestBo dto) {
+
+        if(dto.getExecTimes().size()<=0){
+            return R.fail("时间设置为空");
+        }
+        if(dto.getRepeatTypes().size()<=0){
+            return R.fail("重复设置为空");
+        }
+
+        int selectByScheduleRelationExit = scheduleTournamentsReletionMapper.selectByScheduleRelationExit(dto.getTemplateId());
+        if(selectByScheduleRelationExit>0){
+            //已经生成过赛事数据
+            return R.fail("该配置已经分配过赛事!");
+        }
+
+        // 1. 检查配置是否存在
+        ScheduleConfigVo existingConfig = baseMapper.selectScheduleConfigById(configId);
+        if (existingConfig == null) {
+            throw new IllegalArgumentException("Schedule config not found for id: " + configId);
+        }
+        CreationSchemeVo scheme = schemeRepo.selectAllCreationSchemesInfo(dto.getCreationSchemeCode());
+
+        // 2. 更新主配置的可变字段 (这里只更新 enabled)
+        ScheduleConfig updateConfig = new ScheduleConfig();
+        updateConfig.setId(configId);
+        updateConfig.setEnabled(dto.getEnabled()); // 假设 DTO 有 enabled 字段
+        updateConfig.setCreationSchemeId(scheme.getId());
+        // 注意:不更新 startDate, endDate, creationSchemeId, templateId
+
+        baseMapper.updateScheduleConfig(updateConfig); // 使用之前定义的 updateSelective
+
+        // 3. 🔴 删除旧的关联规则和时间
+        // 3.1 删除旧的执行时间 (ScheduleTime)
+        scheduleTimeMapper.deleteTimeByConfigId(configId);
+
+        // 3.2 删除旧的重复规则 (ScheduleRepeat)
+        scheduleRepeatMapper.deleteRepeatByConfigId(configId);
+
+        // 3.3 删除已生成的执行计划 (schedule_execution)
+        scheduleExecutionMapper.deleteScheduleExecutionByConfigId(configId); // 假设你有这个方法
+
+        // 4. ✅ 插入新的关联规则和时间
+        // 4.1 插入新的重复规则
+        for (String repeatType : dto.getRepeatTypes()) {
+            ScheduleRepeat repeat = new ScheduleRepeat();
+            repeat.setConfigId(configId);
+            repeat.setRepeatType(repeatType);
+            scheduleRepeatMapper.insertScheduleRepeat(repeat);
+        }
+        // 4.2 插入新的执行时间
+        for (LocalTime time : dto.getExecTimes()) {
+            ScheduleTime st = new ScheduleTime();
+            st.setConfigId(configId);
+            st.setExecTime(time);
+            scheduleTimeMapper.insertScheduleTime(st);
+        }
+
+
+        LocalDate startDate = calculateStartDate(dto.getCreationSchemeCode());
+        LocalDate endDate = calculateEndDate(dto.getCreationSchemeCode(), startDate);
+
+
+        // 5. ✅ 重新生成执行计划
+        // 需要 startDate, endDate, repeatTypes, execTimes
+        generateExecutionPlan(
+            configId,
+            scheme.getCode(), // 从现有配置获取 scheme code
+            startDate,
+            endDate,
+            dto.getRepeatTypes(),          // 使用新的重复类型
+            dto.getExecTimes()             // 使用新的执行时间
+        );
+        return R.ok();
+    }
+
+    @Override
+    public R<String> deleteScheduleConfig(Long configId) {
+
+        // 1. 检查配置是否存在
+        ScheduleConfigVo existingConfig = baseMapper.selectScheduleConfigById(configId);
+
+        int selectByScheduleRelationExit = scheduleTournamentsReletionMapper.selectByScheduleRelationExit(existingConfig.getTemplateId());
+        if(selectByScheduleRelationExit>0){
+            //已经生成过赛事数据
+            return R.fail("该配置已经分配过赛事!禁止删除!");
+        }
+
+        if (existingConfig == null) {
+            throw new IllegalArgumentException("Schedule config not found for id: " + configId);
+        }
+        try {
+            // 2. 🔴 按依赖顺序删除关联数据
+            // 2.1 删除已生成的执行计划
+            int deletedExecutions = scheduleExecutionMapper.deleteScheduleExecutionByConfigId(configId); // 假设返回删除行数
+            log.info("Deleted {} execution plans for configId: {}", deletedExecutions, configId);
+
+            // 2.2 删除执行时间
+            int deletedTimes = scheduleTimeMapper.deleteTimeByConfigId(configId);
+            log.info("Deleted {} schedule times for configId: {}", deletedTimes, configId);
+
+            // 2.3 删除重复规则
+            int deletedRepeats = scheduleRepeatMapper.deleteRepeatByConfigId(configId);
+            log.info("Deleted {} repeat rules for configId: {}", deletedRepeats, configId);
+
+            // 3. ✅ 删除主配置
+            Collection<Long> ids=new ArrayList<>();
+            ids.add(configId);
+            baseMapper.deleteScheduleConfig(ids);
+            log.info("Deleted schedule config with id: {}", configId);
+
+        } catch (Exception e) {
+            log.error("Error deleting schedule config and its associations, configId: {}", configId, e);
+            throw e; // 事务会回滚
+        }
+
+        return R.ok();
+    }
+
+    @Override
+    public Boolean stopScheduleConfig(Long configId) {
+        ScheduleConfig scheduleConfig = new ScheduleConfig();
+        scheduleConfig.setId(configId);
+        scheduleConfig.setEnabled(false);
+        int scheduleConfig1 = baseMapper.updateScheduleConfig(scheduleConfig);
+        return scheduleConfig1>0?true:false;
+    }
+
+}

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsServiceImpl.java

@@ -253,7 +253,6 @@ public class TournamentsServiceImpl implements ITournamentsService {
     public Boolean insertByBo(TournamentsDto bo) {
         try {
 
-
             // 转换 BO -> Entity
             Tournaments add = new Tournaments();
             BeanUtils.copyProperties(bo, add);
@@ -292,6 +291,7 @@ public class TournamentsServiceImpl implements ITournamentsService {
             // 处理奖励分布
             processPrizeDistributions(tournamentId, prizeList);
 
+            bo.setId(tournamentId);
             return true;
 
         } catch (Exception e) {

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

@@ -9,11 +9,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.business.domain.*;
+
 import org.dromara.business.domain.bo.TournamentBlindStructuresBo;
 import org.dromara.business.domain.bo.TournamentsBo;
 import org.dromara.business.domain.dto.ItemsPrizeDto;
 import org.dromara.business.domain.dto.TournamentsDto;
-import org.dromara.business.domain.enums.GameStatus;
 import org.dromara.business.domain.enums.GameTemplateStatus;
 import org.dromara.business.domain.vo.*;
 import org.dromara.business.mapper.*;

+ 351 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/business/ScheduleTask.java

@@ -0,0 +1,351 @@
+package org.dromara.job.business;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.business.domain.*;
+import org.dromara.business.domain.dto.ItemsPrizeDto;
+import org.dromara.business.domain.dto.TournamentsDto;
+import org.dromara.business.domain.vo.*;
+import org.dromara.business.mapper.*;
+import org.dromara.business.service.ITournamentsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+@Component
+@EnableScheduling
+@Slf4j
+public class ScheduleTask {
+
+    @Autowired
+    ScheduleConfigMapper baseMapper;
+
+    @Autowired
+    CreationSchemeMapper schemeRepo;
+
+    @Autowired
+    ScheduleRepeatMapper scheduleRepeatMapper;
+
+    @Autowired
+    ScheduleTimeMapper scheduleTimeMapper;
+
+    @Autowired
+    ITournamentsService iTournamentsService;
+
+    @Autowired
+    TournamentsTemplateMapper tournamentsTemplateMapper;
+
+    @Autowired
+    TournamentEntryConditionsTemplateMapper tournamentEntryConditionsMapper;
+
+    @Autowired
+    TournamentBlindStructuresTemplateMapper tournamentBlindStructuresMapper;
+
+    @Autowired
+    PrizeDistributionsTemplateMapper prizeDistributionsMapper;
+
+    @Autowired
+    PrizeDistributionItemsTemplateMapper prizeDistributionItemsMapper;
+
+    @Autowired
+    ScheduleExecutionMapper scheduleExecutionMapper;
+
+    @Autowired
+    ScheduleTournamentsReletionMapper scheduleTournamentsReletionMapper;
+
+    /**
+     * 每天上午 11:15 执行
+     */
+    @Scheduled(cron = "0 35 15 * * ?")
+    public void generateMatchesForToday() {
+        LocalDate today = LocalDate.now();
+        log.info("开始生成今日比赛: {}", today);
+
+        List<ScheduleExecutionVo> executions = scheduleExecutionMapper.findTodayPendingExecutions(today);
+
+        for (ScheduleExecutionVo exec : executions) {
+            try {
+                ScheduleConfigVo config = baseMapper.selectScheduleConfigById(exec.getConfigId());
+                if (config == null) {
+                    log.warn("配置不存在: execId={}", exec.getId());
+                    scheduleExecutionMapper.updateSelective(exec.getId(), "FAILED");
+                    continue;
+                }
+
+                LocalDateTime triggerTime = LocalDateTime.of(exec.getExecutionDate(), exec.getExecutionTime());
+
+                // 再次防重(可选)
+                if (scheduleTournamentsReletionMapper.selectByScheduleRelation(config.getTemplateId(), triggerTime)>0) {
+                    log.debug("比赛已存在,跳过: {}", triggerTime);
+                    scheduleExecutionMapper.updateSelective(exec.getId(), "SKIPPED");
+                    continue;
+                }
+
+                // ✅ 创建比赛
+                autowiredTournamentData(config.getTemplateId(), triggerTime);
+
+
+                scheduleExecutionMapper.updateSelective(exec.getId(), "SUCCESS");
+
+            } catch (Exception e) {
+                log.error("创建比赛失败: execId={}", exec.getId(), e);
+                scheduleExecutionMapper.updateSelective(exec.getId(), "FAILED");
+            }
+        }
+
+        log.info("今日比赛生成完成,共处理 {} 条", executions.size());
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+/*    *//**
+     * 每天凌晨1点执行:生成当天的比赛/任务
+     *//*
+    @Scheduled(cron = "0 15 11 * * ?") // 每天1:00 AM
+    public void generateMatchesForToday() {
+        LocalDate today = LocalDate.now();
+        log.info("Starting schedule task for date: {}", today);
+
+        DayOfWeek dayOfWeek = today.getDayOfWeek();
+        log.info("Starting schedule task for date: {}, day: {}", today, dayOfWeek);
+
+
+
+        // 查询所有今天有效的配置
+        List<ScheduleConfigVo> activeConfigs = baseMapper.findActiveConfigsForDate(
+                today);
+
+        for (ScheduleConfigVo config : activeConfigs) {
+            try {
+                CreationSchemeVo scheme = schemeRepo.selectCreationSchemeById(config.getCreationSchemeId());
+                if (scheme == null) {
+                    log.warn("No scheme found for config: {}", config.getId());
+                    continue;
+                }
+
+                // 👇 核心:根据方案类型决定是否生成、生成哪些日期
+                List<LocalDate> datesToGenerate = determineDatesToGenerate(scheme, config, today);
+                if (datesToGenerate.isEmpty()) {
+                    continue; // 无需生成
+                }
+
+                // 获取执行时间点(如 09:00, 14:30)
+                List<LocalTime> execTimes = getExecTimes(config.getId());
+                if (execTimes.isEmpty()) continue;
+
+                // TODO 生成比赛
+                generateMatches(config, datesToGenerate, execTimes);
+
+            } catch (Exception e) {
+                log.error("Error generating matches for config: {}", config.getId(), e);
+            }
+        }
+
+        log.info("Schedule task completed for date: {}", today);
+    }
+
+
+    *//**
+     * 这些日期批量生成
+     * @param config
+     * @param targetDates
+     * @param execTimes
+     *//*
+    private void generateMatches(
+        ScheduleConfigVo config,
+        List<LocalDate> targetDates,
+        List<LocalTime> execTimes) {
+
+        for (LocalDate date : targetDates) {
+            // ✅ 判断该天是否满足重复规则
+            if (!shouldGenerateOnDate(config.getId(), date)) {
+                continue;
+            }
+
+            for (LocalTime time : execTimes) {
+                LocalDateTime triggerTime = LocalDateTime.of(date, time);
+
+                // ✅ 防重:检查是否已存在该场比赛
+                if (scheduleTimeMapper.existsByConfigIdAndTime(config.getId(), triggerTime)) {
+                    log.debug("Match already exists: config={}, time={}", config.getId(), triggerTime);
+                    continue;
+                }
+
+                // ✅ 创建比赛
+                autowiredTournamentData(config.getTemplateId(), triggerTime);
+            }
+        }
+    }*/
+
+    /**
+     * 自动组装赛事数据
+     * @param templateId
+     * @return
+     */
+    public Boolean autowiredTournamentData(Long templateId,LocalDateTime triggerTime) {
+        try {
+
+                TournamentsVo tournamentsVo = tournamentsTemplateMapper.selectVoByIdInfoTemplate(templateId);
+
+                // 模拟构造 TournamentsDto 数据
+                TournamentsDto bo = new TournamentsDto();
+                // 定义你想要的日期时间格式
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+                // 使用指定的格式器格式化 LocalDateTime 对象
+                String startTime = triggerTime.format(formatter);
+                bo.setStartTime(startTime);
+
+                // 设置基础字段
+                bo.setName(tournamentsVo.getName());
+                bo.setGameType(tournamentsVo.getGameType()); // 假设有5种类型
+                bo.setStartingChips(tournamentsVo.getStartingChips());
+                bo.setLevelDuration(tournamentsVo.getLevelDuration());
+                bo.setLateRegistrationLevel(tournamentsVo.getLateRegistrationLevel());
+                bo.setMaxPlayers(tournamentsVo.getMaxPlayers());
+                bo.setStatus(Long.valueOf(tournamentsVo.getStatus())); // 默认状态为进行中等
+                bo.setCompetitionIcon(tournamentsVo.getCompetitionIcon());
+                bo.setRewardPlayers(tournamentsVo.getRewardPlayers());
+                bo.setSignTime(tournamentsVo.getSignTime());
+
+                //查询模版 赛事对应盲注
+                TournamentBlindStructuresVo tournamentBlindStructuresVo = tournamentBlindStructuresMapper.selectTournamentBlindStructureByTournamentIdTemplate(tournamentsVo.getId());
+
+                // 设置盲注结构 ID
+                bo.setBlindStructureId(tournamentBlindStructuresVo.getBlindStructureId());
+
+
+                //查询模版  设置报名条件
+                TournamentEntryConditionsVo tournamentEntryConditionsVo = tournamentEntryConditionsMapper.selectByTournamentInfoTemplate(tournamentsVo.getId());
+                bo.setItemsId(tournamentEntryConditionsVo.getItemId());
+                bo.setItemsNum(tournamentEntryConditionsVo.getRequiredQuantity());
+
+                //查询模版对应的排名
+                List<PrizeDistributionsVo> prizeDistributionsVos = prizeDistributionsMapper.selectByTournamentIdTemplate(tournamentsVo.getId());
+
+                List<PrizeDistributionsVo> sortedList = prizeDistributionsVos.stream()
+                    .sorted(Comparator.comparing(
+                        PrizeDistributionsVo::getPaiming,
+                        Comparator.nullsLast(Long::compareTo) // null 值排在最后
+                    ))
+                    .collect(Collectors.toList());
+
+
+                // 设置奖励列表
+                List<ItemsPrizeDto> prizeList = new ArrayList<>();
+
+                for (PrizeDistributionsVo prizeDistributionsVo : sortedList) {
+
+                    PrizeDistributionItemsVo prizeDistributionItemsVo = prizeDistributionItemsMapper.selectByPrizeDistributionIdTemplate(prizeDistributionsVo.getId());
+
+                    ItemsPrizeDto prize = new ItemsPrizeDto();
+                    prize.setRanking(prizeDistributionsVo.getPaiming());
+                    prize.setItemId(prizeDistributionItemsVo.getItemId());
+                    prize.setQuantity(prizeDistributionItemsVo.getQuantity());
+                    prize.setItemsName(prizeDistributionItemsVo.getItemsName());
+                    prizeList.add(prize);
+
+                }
+
+                bo.setItemsPrizeList(prizeList);
+
+                // 调用已有的插入方法
+                if (!iTournamentsService.insertByBo(bo)) {
+                    log.error("赛事插入失败");
+                    return false;
+                }
+
+            ScheduleTournamentsReletion scheduleTournamentsReletion=new ScheduleTournamentsReletion();
+            scheduleTournamentsReletion.setTournamentsId(bo.getId());
+            scheduleTournamentsReletion.setTournamentsTemplateId(templateId);
+            scheduleTournamentsReletion.setScBeginTime(startTime);
+            scheduleTournamentsReletionMapper.insertScheduleRelation(scheduleTournamentsReletion);
+
+            return true;
+        } catch (Exception e) {
+            log.error("批量插入赛事过程中发生异常", e);
+            return false;
+        }
+    }
+
+
+
+    private List<LocalTime> getExecTimes(Long configId) {
+        return scheduleTimeMapper.selectScheduleTimeInfoById(configId)
+                .stream()
+                .map(ScheduleTimeVo::getExecTime)
+                .collect(Collectors.toList());
+    }
+
+    private List<LocalDate> determineDatesToGenerate(
+            CreationSchemeVo scheme, ScheduleConfigVo config, LocalDate today) {
+
+        String code = scheme.getCode().toUpperCase();
+
+        switch (code) {
+            case "DAILY":
+                return Collections.singletonList(today);
+
+            case "WEEKLY":
+                if (today.getDayOfWeek() == DayOfWeek.SUNDAY) {
+                    // 下周一
+                    LocalDate nextMonday = today.plusDays(1); // 周日 +1 = 周一
+                    return getDateRange(nextMonday, 0, 6); // 下周一 ~ 下周日
+                }
+                return Collections.emptyList();
+
+            case "NEXT_3_DAYS":
+                return getDateRange(today, 0, 2); // 今天、明天、后天
+
+            default:
+                log.warn("Unknown scheme code: {}", code);
+                return Collections.emptyList();
+        }
+    }
+
+    // 辅助方法:生成从 today 起的连续 n 天
+    private List<LocalDate> getDateRange(LocalDate start, int fromInclusive, int toInclusive) {
+        return IntStream.rangeClosed(fromInclusive, toInclusive)
+                .mapToObj(start::plusDays)
+                .collect(Collectors.toList());
+    }
+
+
+    private boolean shouldGenerateOnDate(Long configId, LocalDate date) {
+        List<ScheduleRepeatVo> repeats = scheduleRepeatMapper.selectScheduleRepeatByConfigId(configId);
+        if (repeats.isEmpty()) return false;
+
+        return repeats.stream().anyMatch(repeat -> {
+            String type = repeat.getRepeatType();
+            return "DAILY".equals(type) ||
+                    ("WEEKLY_MONDAY".equals(type) && date.getDayOfWeek() == DayOfWeek.MONDAY) ||
+                    ("WEEKLY_WEDNESDAY".equals(type) && date.getDayOfWeek() == DayOfWeek.WEDNESDAY);
+            // 可扩展...
+        });
+    }
+
+
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/CreationSchemeMapper.xml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.CreationSchemeMapper">
+
+    <!-- 查询所有记录 -->
+    <select id="selectAllCreationSchemes" resultType="org.dromara.business.domain.vo.CreationSchemeVo">
+        SELECT id, code, name, description, default_start_offset, default_duration_days, is_active
+        FROM creation_scheme
+    </select>
+
+    <!-- 根据 id 查询单条记录 -->
+    <select id="selectCreationSchemeById" parameterType="long" resultType="org.dromara.business.domain.vo.CreationSchemeVo">
+        SELECT id, code, name, description, default_start_offset, default_duration_days, is_active
+        FROM creation_scheme
+        WHERE id = #{id}
+    </select>
+
+    <!-- 查询所有记录 -->
+    <select id="selectAllCreationSchemesList" resultType="org.dromara.business.domain.vo.CreationSchemeVo">
+        SELECT id, code, name, description, default_start_offset, default_duration_days, is_active
+        FROM creation_scheme
+    </select>
+
+    <!-- 查询所有记录 -->
+    <select id="selectAllCreationSchemesAllList" resultType="org.dromara.business.domain.vo.CreationSchemeVo">
+        SELECT id, code, name, description, default_start_offset, default_duration_days, is_active
+        FROM creation_scheme
+    </select>
+
+
+    <!-- 查询所有记录 -->
+    <select id="selectAllCreationSchemesList" resultType="org.dromara.business.domain.vo.CreationSchemeVo">
+        SELECT id, code, name, description, default_start_offset, default_duration_days, is_active
+        FROM creation_scheme
+    </select>
+
+
+    <!-- 插入一条记录 -->
+    <insert id="insertCreationScheme" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO creation_scheme
+        (code, name, description, default_start_offset, default_duration_days, is_active)
+        VALUES
+            (#{code}, #{name}, #{description}, #{defaultStartOffset}, #{defaultDurationDays}, #{isActive})
+    </insert>
+
+    <!-- 更新记录,只更新传值的字段 -->
+    <update id="updateCreationScheme">
+        UPDATE creation_scheme
+        <set>
+            <if test="code != null">code = #{code},</if>
+            <if test="name != null">name = #{name},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="defaultStartOffset != null">default_start_offset = #{defaultStartOffset},</if>
+            <if test="defaultDurationDays != null">default_duration_days = #{defaultDurationDays},</if>
+            <if test="isActive != null">is_active = #{isActive}</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 删除记录 -->
+    <delete id="deleteCreationSchemeById">
+        DELETE FROM creation_scheme
+        <where>
+            id IN
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                <if test="id > 0">
+                    #{id}
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
+
+    <select id="selectAllCreationSchemesInfo" resultType="org.dromara.business.domain.vo.CreationSchemeVo">
+        SELECT id, code, name, description, default_start_offset, default_duration_days, is_active
+        FROM creation_scheme
+        where 1=1
+        <if test="code != null">and code = #{code}</if>
+    </select>
+
+
+</mapper>

+ 149 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleConfigMapper.xml

@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.ScheduleConfigMapper">
+
+    <!-- 查询所有字段 -->
+    <select id="selectAllScheduleConfigs" resultType="org.dromara.business.domain.vo.ScheduleConfigVo">
+        SELECT id, template_id, creation_scheme_id, start_date, end_date, enabled, created_at, updated_at
+        FROM schedule_config
+    </select>
+
+    <!-- 根据 id 查询单条记录 -->
+    <select id="selectScheduleConfigById" parameterType="long" resultType="org.dromara.business.domain.vo.ScheduleConfigVo">
+        SELECT id, template_id, creation_scheme_id, start_date, end_date, enabled, created_at, updated_at
+        FROM schedule_config
+        WHERE id = #{id}
+    </select>
+
+
+    <!-- 查询所有字段 -->
+    <select id="selectAllScheduleConfigsList" resultType="org.dromara.business.domain.vo.ScheduleConfigVo">
+        SELECT id, template_id, creation_scheme_id, start_date, end_date, enabled, created_at, updated_at
+        FROM schedule_config
+    </select>
+
+
+
+    <!-- 插入一条记录,非空字段必须传值 -->
+    <insert id="insertScheduleConfig" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO schedule_config (
+            template_id,
+            creation_scheme_id,
+            start_date,
+            end_date,
+            enabled,
+            created_at,
+            updated_at
+        ) VALUES (
+                     #{templateId},
+                     #{creationSchemeId},
+                     #{startDate},
+                     #{endDate},
+                     #{enabled},
+                     #{createdAt},
+                     #{updatedAt}
+                 )
+    </insert>
+
+    <!-- 更新记录,只更新传值字段 -->
+    <update id="updateScheduleConfig">
+        UPDATE schedule_config
+        <set>
+            <if test="templateId != null">template_id = #{templateId},</if>
+            <if test="creationSchemeId != null">creation_scheme_id = #{creationSchemeId},</if>
+            <if test="startDate != null">start_date = #{startDate},</if>
+            <if test="endDate != null">end_date = #{endDate},</if>
+            <if test="enabled != null">enabled = #{enabled},</if>
+            <if test="createdAt != null">created_at = #{createdAt},</if>
+            <if test="updatedAt != null">updated_at = #{updatedAt}</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 删除记录 -->
+    <delete id="deleteScheduleConfig">
+        DELETE FROM schedule_config
+        <where>
+            id IN
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                <if test="id > 0">
+                    #{id}
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
+
+    <!-- 校验是否存在重复配置 -->
+    <select id="existsDuplicateSchedule" resultType="boolean">
+        SELECT EXISTS (
+        SELECT 1
+        FROM schedule_config sc
+        JOIN schedule_time st ON sc.id = st.config_id
+        WHERE sc.template_id = #{templateId}
+        AND sc.start_date &lt;= #{endDate}
+        AND sc.end_date >= #{startDate}
+        AND st.exec_time = #{execTime}
+        )
+    </select>
+
+
+
+    <!-- 查询所有字段 -->
+    <select id="selectAllScheduleConfigsInfoList" resultType="org.dromara.business.domain.vo.TournamentsVo">
+        select
+            a.creation_scheme_id as creationSchemeId,
+            a.enabled,
+            a.id config_id,
+            a.template_id,
+            a.id, b.name, b.start_time, b.end_time,b.game_type, b.starting_chips, b.level_duration, b.late_registration_level, b.max_players, b.status, b.created_at, b.updated_at,b.sign_time,b.competition_icon,b.tournaments_bi_id
+        from schedule_config a  inner join  tournaments_template  b   on a.template_id=b.id
+    </select>
+
+    <!-- 根据 id 查询单条记录 -->
+    <select id="selectScheduleConfigInfoById" parameterType="long" resultType="org.dromara.business.domain.vo.TournamentsVo">
+        select
+            a.creation_scheme_id as creationSchemeId,
+            a.enabled,
+            a.id config_id,
+            a.template_id,
+            a.id, b.name, b.start_time, b.end_time,b.game_type, b.starting_chips, b.level_duration, b.late_registration_level, b.max_players, b.status, b.created_at, b.updated_at,b.sign_time,b.competition_icon,b.tournaments_bi_id
+        from schedule_config a  inner join  tournaments_template  b   on a.template_id=b.id
+        where a.id=#{id}
+    </select>
+
+
+
+    <select id="findActiveConfigsForDate" resultType="org.dromara.business.domain.vo.ScheduleConfigVo">
+        SELECT
+            id,
+            template_id,
+            creation_scheme_id,
+            start_date,
+            end_date,
+            enabled,
+            created_at,
+            updated_at
+        FROM schedule_config
+        WHERE start_date &lt;= #{date}
+          AND end_date &gt;= #{date}
+          AND enabled = 1
+    </select>
+
+
+    <select id="countConflictingSchedules" resultType="int">
+        SELECT COUNT(*)
+        FROM schedule_config sc
+        INNER JOIN schedule_time st ON sc.id = st.config_id
+        WHERE sc.template_id = #{templateId}
+        AND sc.id != #{currentConfigId}  <!-- 排除自己 -->
+        AND sc.enabled = true
+        AND st.exec_time = #{execTime}
+        AND (
+        (sc.start_date &gt;= #{endDate} AND sc.end_date >= #{startDate})
+        )
+    </select>
+
+</mapper>

+ 63 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleExecutionMapper.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.ScheduleExecutionMapper">
+
+    <!-- 插入语句:只插入非空字段 -->
+    <insert id="insertScheduleExecution" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO schedule_execution
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="configId != null">config_id,</if>
+            <if test="executionDate != null">execution_date,</if>
+            <if test="executionTime != null">execution_time,</if>
+            <if test="status != null and status != ''">status,</if>
+            <!-- created_at 通常由数据库默认值处理,除非需要精确控制插入时间才考虑插入 -->
+            <!-- <if test="createdAt != null">created_at,</if> -->
+            <!-- updated_at 插入时不设置 -->
+        </trim>
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
+            <if test="configId != null">#{configId},</if>
+            <if test="executionDate != null">#{executionDate},</if>
+            <if test="executionTime != null">#{executionTime},</if>
+            <if test="status != null and status != ''">#{status},</if>
+            <!-- <if test="createdAt != null">#{createdAt},</if> -->
+        </trim>
+    </insert>
+
+
+    <select id="findTodayPendingExecutions"   resultType="org.dromara.business.domain.vo.ScheduleExecutionVo">
+        SELECT
+            id,
+            config_id,
+            execution_date,
+            execution_time,
+            status,
+            created_at,
+            updated_at
+        FROM
+            schedule_execution
+        WHERE
+            execution_date = #{dates} -- 或者使用具体的日期如 '2025-07-31'
+          AND status = 'PENDING'
+    </select>
+
+    <!-- 通用更新:只更新非空字段 -->
+    <update id="updateSelective">
+        UPDATE schedule_execution
+        <set>
+            <!-- status 更新,检查非空且非空字符串 -->
+            <if test="status != null and status != ''">
+                status = #{status},
+            </if>
+
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <delete id="deleteScheduleExecutionByConfigId">
+        DELETE FROM schedule_execution  where  config_id =#{configId}
+    </delete>
+
+
+</mapper>

+ 82 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleRepeatMapper.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.ScheduleRepeatMapper">
+
+    <!-- 查询所有记录 -->
+    <select id="selectAllScheduleRepeats" resultType="org.dromara.business.domain.vo.ScheduleRepeatVo">
+        SELECT id, config_id, repeat_type
+        FROM schedule_repeat
+    </select>
+
+    <!-- 根据 id 查询单条记录 -->
+    <select id="selectScheduleRepeatById" parameterType="long" resultType="org.dromara.business.domain.vo.ScheduleRepeatVo">
+        SELECT id, config_id, repeat_type
+        FROM schedule_repeat
+        WHERE id = #{id}
+    </select>
+
+    <!-- 插入一条记录,非空字段必须传值 -->
+    <insert id="insertScheduleRepeat" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO schedule_repeat
+        (
+        config_id,
+        repeat_type
+        )
+        VALUES
+        (
+        <!-- config_id 必须传值 -->
+        <if test="configId == null">
+            #{configId, javaType=long, typeHandler=org.apache.ibatis.type.UnknownTypeHandler@throwError}
+        </if>
+        <if test="configId != null">
+            #{configId}
+        </if>,
+
+        <!-- repeat_type 必须传值 -->
+        <if test="repeatType == null">
+            #{repeatType, javaType=string, typeHandler=org.apache.ibatis.type.UnknownTypeHandler@throwError}
+        </if>
+        <if test="repeatType != null">
+            #{repeatType}
+        </if>
+        )
+    </insert>
+
+    <!-- 更新记录,只更新传值字段 -->
+    <update id="updateScheduleRepeat">
+        UPDATE schedule_repeat
+        <set>
+            <if test="configId != null">config_id = #{configId},</if>
+            <if test="repeatType != null">repeat_type = #{repeatType}</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 删除记录 -->
+    <delete id="deleteScheduleRepeat">
+        DELETE FROM schedule_repeat
+        <where>
+            id IN
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                <if test="id > 0">
+                    #{id}
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
+    <select id="selectScheduleRepeatByConfigId" parameterType="long" resultType="org.dromara.business.domain.vo.ScheduleRepeatVo">
+        SELECT id, config_id, repeat_type
+        FROM schedule_repeat
+        WHERE config_id = #{configId}
+    </select>
+
+    <delete id="deleteRepeatByConfigId">
+        DELETE FROM schedule_repeat  where  config_id =#{configId}
+    </delete>
+
+
+
+</mapper>

+ 91 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleTimeMapper.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.ScheduleTimeMapper">
+
+    <!-- 查询所有记录 -->
+    <select id="selectAllScheduleTimes" resultType="org.dromara.business.domain.vo.ScheduleTimeVo">
+        SELECT id, config_id, exec_time
+        FROM schedule_time
+    </select>
+
+    <!-- 根据 id 查询单条记录 -->
+    <select id="selectScheduleTimeById" parameterType="long" resultType="org.dromara.business.domain.vo.ScheduleTimeVo">
+        SELECT id, config_id, exec_time
+        FROM schedule_time
+        WHERE id = #{id}
+    </select>
+
+    <!-- 插入一条记录,非空字段必须传值 -->
+    <insert id="insertScheduleTime"  useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO schedule_time
+        (
+        config_id,
+        exec_time
+        )
+        VALUES
+        (
+        <!-- config_id 必须传值 -->
+        <if test="configId == null">
+            #{configId, javaType=long, typeHandler=org.apache.ibatis.type.UnknownTypeHandler@throwError}
+        </if>
+        <if test="configId != null">
+            #{configId}
+        </if>,
+
+        <!-- exec_time 必须传值 -->
+        <if test="execTime == null">
+            #{execTime, javaType=java.time.LocalTime, typeHandler=org.apache.ibatis.type.UnknownTypeHandler@throwError}
+        </if>
+        <if test="execTime != null">
+            #{execTime}
+        </if>
+        )
+    </insert>
+
+    <!-- 更新记录,只更新传值字段 -->
+    <update id="updateScheduleTime" >
+        UPDATE schedule_time
+        <set>
+            <if test="configId != null">config_id = #{configId},</if>
+            <if test="execTime != null">exec_time = #{execTime}</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 删除记录 -->
+    <delete id="deleteScheduleTime">
+        DELETE FROM schedule_time
+        <where>
+            id IN
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                <if test="id > 0">
+                    #{id}
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
+    <select id="selectScheduleTimeInfoById" parameterType="long" resultType="org.dromara.business.domain.vo.ScheduleTimeVo">
+        SELECT id, config_id, exec_time
+        FROM schedule_time
+        WHERE config_id = #{configId}
+    </select>
+
+    <delete id="deleteTimeByConfigId">
+        DELETE FROM schedule_time  where  config_id =#{configId}
+    </delete>
+
+    <select id="existsByConfigIdAndTime" resultType="boolean">
+        SELECT EXISTS (
+        SELECT 1 FROM schedule_time
+        WHERE config_id = #{configId}
+        AND exec_time = #{execTime}
+        <!-- 如果使用逻辑删除,则加上此条件 -->
+        )
+    </select>
+
+
+
+</mapper>

+ 110 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/ScheduleTournamentsReletionMapper.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.ScheduleTournamentsReletionMapper">
+
+
+    <!-- 新增:选择性插入 -->
+    <insert id="insertScheduleRelation"  useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO schedule_tournaments_reletion
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="tournamentsId != null">tournaments_id,</if>
+            <if test="tournamentsTemplateId != null">tournaments_template_id,</if>
+            <if test="scBeginTime != null">sc_begin_time,</if>
+            create_time
+        </trim>
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
+            <if test="tournamentsId != null">#{tournamentsId},</if>
+            <if test="tournamentsTemplateId != null">#{tournamentsTemplateId},</if>
+            <if test="scBeginTime != null">#{scBeginTime},</if>
+            now()
+        </trim>
+    </insert>
+
+    <!-- 删除:根据ID -->
+    <delete id="deleteById" parameterType="long">
+        DELETE FROM schedule_tournaments_reletion
+        WHERE id = #{id}
+    </delete>
+
+
+
+
+
+    <!-- 查询:根据模版ID -->
+    <select id="selectByScheduleRelation" resultType="int">
+        SELECT
+           count(1)
+        FROM schedule_tournaments_reletion
+        WHERE tournaments_template_id = #{templateId} and sc_begin_time=#{beginTime}
+    </select>
+
+
+
+    <!-- 更新:选择性更新 -->
+    <update id="updateSelective" parameterType="org.dromara.business.domain.vo.ScheduleTournamentsReletionVo">
+        UPDATE schedule_tournaments_reletion
+        <set>
+            <if test="tournamentsId != null">tournaments_id = #{tournamentsId},</if>
+            <if test="tournamentsTemplateId != null">tournaments_template_id = #{tournamentsTemplateId},</if>
+            <!-- create_time 一般不更新 -->
+            <if test="scBeginTime != null">sc_begin_time = #{scBeginTime},</if>
+            update_time=now()
+            <!-- update_time 由数据库 ON UPDATE CURRENT_TIMESTAMP 自动更新,无需手动设置 -->
+        </set>
+        WHERE id = #{id}
+    </update>
+
+
+    <!-- 查询:根据模版ID  查看是否已经分配赛事 -->
+    <select id="selectByScheduleRelationExit" resultType="int">
+        SELECT
+          count(1)
+        FROM schedule_tournaments_reletion
+        WHERE tournaments_template_id = #{templateId}
+    </select>
+
+
+
+
+    <!-- 查询:根据ID -->
+    <select id="selectById" parameterType="long" resultType="org.dromara.business.domain.vo.ScheduleTournamentsReletionVo">
+        SELECT
+            id,
+            tournaments_id,
+            tournaments_template_id,
+            create_time,
+            sc_begin_time,
+            update_time
+        FROM schedule_tournaments_reletion
+        WHERE id = #{id}
+    </select>
+
+    <!-- 查询:所有记录 -->
+    <select id="selectAll" resultType="org.dromara.business.domain.vo.ScheduleTournamentsReletionVo">
+        SELECT
+            id,
+            tournaments_id,
+            tournaments_template_id,
+            create_time,
+            sc_begin_time,
+            update_time
+        FROM schedule_tournaments_reletion
+    </select>
+
+    <!-- 查询:根据赛事ID -->
+    <select id="selectByTournamentsId" resultType="org.dromara.business.domain.vo.ScheduleTournamentsReletionVo">
+        SELECT
+            id,
+            tournaments_id,
+            tournaments_template_id,
+            create_time,
+            sc_begin_time,
+            update_time
+        FROM schedule_tournaments_reletion
+        WHERE tournaments_id = #{tournamentsId}
+    </select>
+
+
+</mapper>

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentsTemplateMapper.xml

@@ -10,11 +10,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 
     <select id="selectTournamentsVoListTemplate" resultType="org.dromara.business.domain.vo.TournamentsVo">
-        SELECT id, name, start_time, end_time,game_type, starting_chips, level_duration, late_registration_level, max_players, status, created_at, updated_at,sign_time,competition_icon,tournaments_bi_id FROM tournaments_template  ${ew.customSqlSegment}
+        SELECT id, name, start_time, end_time,game_type, starting_chips, level_duration, late_registration_level, max_players, status, created_at, updated_at,sign_time,competition_icon,tournaments_bi_id,reward_players,total_signup,robot_count FROM tournaments_template  ${ew.customSqlSegment}
     </select>
 
     <select id="selectVoByIdInfoTemplate" resultType="org.dromara.business.domain.vo.TournamentsVo">
-       SELECT id, name, start_time, end_time,game_type, starting_chips, level_duration, late_registration_level, max_players, status, created_at, updated_at,sign_time,competition_icon,tournaments_bi_id FROM tournaments_template WHERE id =  #{id}
+       SELECT id, name, start_time, end_time,game_type, starting_chips, level_duration, late_registration_level, max_players, status, created_at, updated_at,sign_time,competition_icon,tournaments_bi_id,reward_players,total_signup,robot_count FROM tournaments_template WHERE id =  #{id}
     </select>