Browse Source

feat(business): 新增比赛模板相关功能

- 添加比赛模板相关实体类和 Mapper 接口- 实现比赛模板的增删查改功能
- 添加比赛模板相关 API 接口和控制器- 实现比赛模板的分配和上传功能
fugui001 5 tháng trước cách đây
mục cha
commit
71cd884ef3
18 tập tin đã thay đổi với 1629 bổ sung0 xóa
  1. 150 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/TournamentsTemplateController.java
  2. 44 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/PrizeDistributionItemsTemplate.java
  3. 39 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/PrizeDistributionsTemplate.java
  4. 36 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/TournamentBlindStructureTemplate.java
  5. 55 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/TournamentEntryConditionsTemplate.java
  6. 105 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/TournamentsTemplate.java
  7. 39 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PrizeDistributionItemsTemplateMapper.java
  8. 37 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PrizeDistributionsTemplateMapper.java
  9. 28 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentBlindStructuresTemplateMapper.java
  10. 39 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentEntryConditionsTemplateMapper.java
  11. 58 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentsTemplateMapper.java
  12. 97 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/ITournamentsTemplateService.java
  13. 550 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsTemplateServiceImpl.java
  14. 71 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PrizeDistributionItemsTemplateMapper.xml
  15. 60 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PrizeDistributionsTemplateMapper.xml
  16. 26 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentBlindStructuresTemplateMapper.xml
  17. 66 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentEntryConditionsTemplateMapper.xml
  18. 129 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentsTemplateMapper.xml

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

@@ -0,0 +1,150 @@
+package org.dromara.business.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+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.TournamentBlindStructuresListVo;
+import org.dromara.business.domain.vo.TournamentsVo;
+import org.dromara.business.service.ITournamentsTemplateService;
+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.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 【赛事管理】
+ *
+ * @author Lion Li
+ * @date 2025-06-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/tournamentsTemplate")
+public class TournamentsTemplateController extends BaseController {
+
+    private final ITournamentsTemplateService tournamentsService;
+
+    /**
+     * 查询【赛事管理】列表
+     */
+    @SaCheckPermission("business:tournamentsTemplate:list")
+    @GetMapping("/list")
+    public TableDataInfo<TournamentsVo> list(TournamentsBo bo, PageQuery pageQuery) {
+        return tournamentsService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出【赛事管理】列表
+     */
+    @SaCheckPermission("business:tournamentsTemplate:export")
+    @Log(title = "【赛事管理-导出】", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(TournamentsBo bo, HttpServletResponse response) {
+        List<TournamentsVo> list = tournamentsService.queryList(bo);
+        ExcelUtil.exportExcel(list, "【赛事管理-导出】", TournamentsVo.class, response);
+    }
+
+    /**
+     * 获取【赛事管理】详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("business:tournamentsTemplate:query")
+    @GetMapping("/{id}")
+    public R<TournamentsVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(tournamentsService.queryById(id));
+    }
+
+
+
+    /**
+     * 新增【赛事管理】
+     */
+    @SaCheckPermission("business:tournamentsTemplate:add")
+    @Log(title = "【赛事管理-新增】", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody  TournamentsDto dto) {
+        return toAjax(tournamentsService.insertByBo(dto));
+    }
+
+    /**
+     * 修改【赛事管理】
+     */
+    @SaCheckPermission("business:tournamentsTemplate:edit")
+    @Log(title = "【赛事管理-修改】", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody  TournamentsDto bo) {
+        return toAjax(tournamentsService.updateByBo(bo));
+    }
+
+    /**
+     * 删除【赛事管理】
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("business:tournamentsTemplate:remove")
+    @Log(title = "【赛事管理-删除】", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(tournamentsService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 查询赛事分配情况列表
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    @SaCheckPermission("business:tournamentsTemplate:selectTournamentBlindStructuresList")
+    @GetMapping("/selectTournamentBlindStructuresList")
+    public TableDataInfo<TournamentBlindStructuresListVo> selectTournamentBlindStructuresList(TournamentBlindStructuresBo bo, PageQuery pageQuery) {
+        return tournamentsService.selectTournamentBlindStructuresList(bo, pageQuery);
+    }
+
+    /**
+     * 分配盲注
+     * @param dto
+     * @return
+     */
+    @PostMapping("/assignTournamentBlindStructures")
+    public R<Void> assignTournamentBlindStructures(@RequestBody TournamentBlindStructuresBo dto) {
+        tournamentsService.saveOrUpdateTournamentBlindStructure(dto.getTournamentId(), dto.getBlindStructureIds());
+        return R.ok("分配成功");
+    }
+
+
+    /**
+     * 上传比赛图标
+     * @param file
+     * @return
+     */
+    @PostMapping(value = "/uploadTournament", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<SysOssVo> uploadTournament(@RequestPart("file") MultipartFile file) throws Exception {
+        return R.ok(tournamentsService.uploadTournament(file));
+    }
+
+
+}

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

@@ -0,0 +1,44 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * 【请填写功能名称】对象 prize_distribution_items_template
+ *
+ * @author Lion Li
+ * @date 2025-07-02
+ */
+@Data
+@TableName("prize_distribution_items_template")
+public class PrizeDistributionItemsTemplate {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 对应prize_distribution表的ID
+     */
+    private Long prizeDistributionId;
+
+    /**
+     * 道具ID
+     */
+    private Long itemId;
+
+    /**
+     * 数量
+     */
+    private Long quantity;
+
+
+}

+ 39 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/PrizeDistributionsTemplate.java

@@ -0,0 +1,39 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * 【请填写功能名称】对象 prize_distributions_template
+ *
+ * @author Lion Li
+ * @date 2025-07-02
+ */
+@Data
+@TableName("prize_distributions_template")
+public class PrizeDistributionsTemplate {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     *
+     */
+    private Long tournamentId;
+
+    /**
+     * 排名
+     */
+    private Long paiming;
+
+
+}

+ 36 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/TournamentBlindStructureTemplate.java

@@ -0,0 +1,36 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * 【绑定情况】对象 tournament_blind_structures_template
+ *
+ * @author Lion Li
+ * @date 2025-06-11
+ */
+@Data
+@TableName("tournament_blind_structures_template")
+public class TournamentBlindStructureTemplate {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 赛事ID
+     */
+    @TableId(value = "id")
+    private Long tournamentId;
+
+    /**
+     * 盲注ID
+     */
+    private Long blindStructureId;
+
+
+
+
+}

+ 55 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/TournamentEntryConditionsTemplate.java

@@ -0,0 +1,55 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 比赛报名条件对象 tournament_entry_conditions_template
+ *
+ * @author Lion Li
+ * @date 2025-07-02
+ */
+@Data
+@TableName("tournament_entry_conditions_template")
+public class TournamentEntryConditionsTemplate {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联的比赛ID
+     */
+    private Long tournamentId;
+
+    /**
+     * 所需道具ID
+     */
+    private Long itemId;
+
+    /**
+     * 所需道具数量
+     */
+    private Long requiredQuantity;
+
+    /**
+     *
+     */
+    private Date createdAt;
+
+    /**
+     *
+     */
+    private Date updatedAt;
+
+
+}

+ 105 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/TournamentsTemplate.java

@@ -0,0 +1,105 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 【请填写功能名称】对象 tournaments_template
+ *
+ * @author Lion Li
+ * @date 2025-06-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("tournaments_template")
+public class TournamentsTemplate extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 赛事名称
+     */
+    private String name;
+
+    /**
+     * 比赛开始时间
+     */
+    private Date startTime;
+
+
+    /**
+     * 比赛结束时间
+     */
+    private Date endTime;
+
+
+    /**
+     * 游戏类型
+     */
+    private Long gameType;
+
+    /**
+     * 起始记分牌数量
+     */
+    private Long startingChips;
+
+    /**
+     * 级别持续时间(分钟)
+     */
+    private Long levelDuration;
+
+    /**
+     * 截止报名级别
+     */
+    private Long lateRegistrationLevel;
+
+    /**
+     * 最大参赛人数
+     */
+    private Long maxPlayers;
+
+    /**
+     *  赛事状态 0 未开始 1 进行中 2 同步发牌 3 普通暂停 4 完成
+     */
+    private Long status;
+
+    /**
+     *
+     */
+    private Date createdAt;
+
+    /**
+     *
+     */
+    private Date updatedAt;
+
+    /**
+     * 报名时间
+     */
+    private Long signTime;
+
+    /**
+     * 比赛图标
+     */
+    private String competitionIcon;
+
+    private Long updateUserId;
+
+    private Long createUserId;
+
+    private String tournamentsBiId;
+
+}

+ 39 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PrizeDistributionItemsTemplateMapper.java

@@ -0,0 +1,39 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.dromara.business.domain.PrizeDistributionItems;
+import org.dromara.business.domain.PrizeDistributionItemsTemplate;
+import org.dromara.business.domain.vo.PrizeDistributionItemsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-02
+ */
+@DS("mysql2")
+public interface PrizeDistributionItemsTemplateMapper extends BaseMapperPlus<PrizeDistributionItemsTemplate, PrizeDistributionItemsVo> {
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insert(PrizeDistributionItemsTemplate item);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateById(PrizeDistributionItemsTemplate item);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteById(Integer id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    PrizeDistributionItemsVo selectById(Integer id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    PrizeDistributionItemsVo selectByPrizeDistributionIdTemplate(Long prizeDistributionId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<PrizeDistributionItemsVo> selectByPrizeDistributionIdListTemplate(List<Long> prizeDistributionId);
+
+}

+ 37 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PrizeDistributionsTemplateMapper.java

@@ -0,0 +1,37 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.dromara.business.domain.PrizeDistributions;
+import org.dromara.business.domain.PrizeDistributionsTemplate;
+import org.dromara.business.domain.vo.PrizeDistributionsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-02
+ */
+@DS("mysql2")
+public interface PrizeDistributionsTemplateMapper extends BaseMapperPlus<PrizeDistributionsTemplate, PrizeDistributionsVo> {
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertTemplate(PrizeDistributionsTemplate prizeDistribution);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateByIdTemplate(PrizeDistributionsTemplate prizeDistribution);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteByIdsTemplate(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    PrizeDistributionsVo selectByIdTemplate(Integer id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<PrizeDistributionsVo> selectByTournamentIdTemplate(Long tournamentId);
+
+
+}

+ 28 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentBlindStructuresTemplateMapper.java

@@ -0,0 +1,28 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.dromara.business.domain.TournamentBlindStructure;
+import org.dromara.business.domain.TournamentBlindStructureTemplate;
+import org.dromara.business.domain.vo.TournamentBlindStructuresVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-03
+ */
+@DS("mysql2")
+public interface TournamentBlindStructuresTemplateMapper extends BaseMapperPlus<TournamentBlindStructureTemplate, TournamentBlindStructuresVo> {
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertTournamentBlindStructureTemplate(TournamentBlindStructureTemplate tournamentBlindStructure);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteTournamentBlindStructureByTournamentIdTemplate(Long tournamentId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    TournamentBlindStructuresVo selectTournamentBlindStructureByTournamentIdTemplate(Long tournamentId);
+
+}

+ 39 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentEntryConditionsTemplateMapper.java

@@ -0,0 +1,39 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.dromara.business.domain.TournamentEntryConditionsTemplate;
+import org.dromara.business.domain.vo.TournamentEntryConditionsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 比赛报名条件Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-02
+ */
+@DS("mysql2")
+public interface TournamentEntryConditionsTemplateMapper extends BaseMapperPlus<TournamentEntryConditionsTemplate, TournamentEntryConditionsVo> {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insert(TournamentEntryConditionsTemplate condition);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateByTournamentIdTemplate(TournamentEntryConditionsTemplate condition);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    TournamentEntryConditionsVo selectByIdTemplate(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<TournamentEntryConditionsVo> selectByTournamentIdTemplate(Long tournamentId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    TournamentEntryConditionsVo selectByTournamentInfoTemplate(Long tournamentId);
+
+}

+ 58 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentsTemplateMapper.java

@@ -0,0 +1,58 @@
+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.BlindStructures;
+import org.dromara.business.domain.Tournaments;
+import org.dromara.business.domain.TournamentsTemplate;
+import org.dromara.business.domain.bo.TournamentBlindStructuresBo;
+import org.dromara.business.domain.vo.TournamentBlindStructuresListVo;
+import org.dromara.business.domain.vo.TournamentsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-06-05
+ */
+@DS("mysql2")
+public interface TournamentsTemplateMapper extends BaseMapperPlus<TournamentsTemplate, TournamentsVo> {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<TournamentsVo> selectVoPageTemplate(@Param("page") Page<TournamentsTemplate> page, @Param("ew") Wrapper<TournamentsTemplate> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    TournamentsVo selectVoByIdInfoTemplate(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateTournamentsByIdTemplate(TournamentsTemplate update);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertTournamentTemplate(TournamentsTemplate insert);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deleteTournamentByIdsTemplate(@Param("ids") Collection<Long> ids);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<TournamentsVo> selectTournamentsVoListTemplate(@Param("ew") Wrapper<TournamentsTemplate> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<TournamentBlindStructuresListVo> selectTournamentBlindStructuresListTemplate(@Param("page") Page<BlindStructures> page, @Param("query") TournamentBlindStructuresBo query);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void deleteByBlindTournamentIdTemplate(@Param("tournamentId") Long tournamentId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void batchInsertTournamentBlindStructuresTemplate(@Param("tournamentId") Long tournamentId,
+                                              @Param("blindStructureIds") List<Long> blindStructureIds);
+
+}
+

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

@@ -0,0 +1,97 @@
+package org.dromara.business.service;
+
+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.TournamentBlindStructuresListVo;
+import org.dromara.business.domain.vo.TournamentsVo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author Lion Li
+ * @date 2025-06-11
+ */
+public interface ITournamentsTemplateService {
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param id 主键
+     * @return 【请填写功能名称】
+     */
+    TournamentsVo queryById(Long id);
+
+    /**
+     * 分页查询【请填写功能名称】列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 【请填写功能名称】分页列表
+     */
+    TableDataInfo<TournamentsVo> queryPageList(TournamentsBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的【请填写功能名称】列表
+     *
+     * @param bo 查询条件
+     * @return 【请填写功能名称】列表
+     */
+    List<TournamentsVo> queryList(TournamentsBo bo);
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(TournamentsDto bo);
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(TournamentsDto bo);
+
+    /**
+     * 校验并批量删除【请填写功能名称】信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+    /**
+     * 查询赛事分配情况
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    TableDataInfo<TournamentBlindStructuresListVo> selectTournamentBlindStructuresList(TournamentBlindStructuresBo bo, PageQuery pageQuery);
+
+    /**
+     * 保存和修改赛事分配
+     * @param tournamentId
+     * @param blindStructureIds
+     */
+    void saveOrUpdateTournamentBlindStructure(Long tournamentId, List<Long> blindStructureIds);
+
+    /**
+     * 上传比赛图标
+     * @param file
+     * @return
+     */
+    SysOssVo uploadTournament(MultipartFile file);
+
+}

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

@@ -0,0 +1,550 @@
+package org.dromara.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.vo.*;
+import org.dromara.business.mapper.*;
+import org.dromara.business.service.ITournamentsTemplateService;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.dromara.system.service.ISysOssService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import java.text.ParseException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-06-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TournamentsTemplateServiceImpl implements ITournamentsTemplateService {
+
+    private final TournamentsTemplateMapper baseMapper;
+
+
+    private final TournamentEntryConditionsTemplateMapper tournamentEntryConditionsMapper;
+
+
+    private final TournamentBlindStructuresTemplateMapper tournamentBlindStructuresMapper;
+
+
+    private final PrizeDistributionsTemplateMapper prizeDistributionsMapper;
+
+
+    private final PrizeDistributionItemsTemplateMapper prizeDistributionItemsMapper;
+
+
+    private final ISysOssService ossService;
+
+    private final ParticipantsMapper participantsMapper;
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param id 主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public TournamentsVo queryById(Long id){
+        TournamentsVo tournamentsVo = baseMapper.selectVoByIdInfoTemplate(id);
+        Long tournamentId = tournamentsVo.getId();
+        //赛事报名条件
+        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());
+                itemsPrizeList.add(itemsPrizeBo);
+
+            }
+            tournamentsVo.setItemsPrizeList(itemsPrizeList);
+
+            String statusText= GameStatus.getDescriptionFromCode(tournamentsVo.getStatus());
+            tournamentsVo.setStatusText(statusText);
+        }
+        int totalSignNum = participantsMapper.selectParticipantsTotal(tournamentId);
+        tournamentsVo.setSignNum(totalSignNum);
+        return tournamentsVo;
+    }
+
+    /**
+     * 分页查询【请填写功能名称】列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 【请填写功能名称】分页列表
+     */
+    @Override
+    public TableDataInfo<TournamentsVo> queryPageList(TournamentsBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<TournamentsTemplate> lqw = buildQueryWrapper(bo);
+        Page<TournamentsVo> result = baseMapper.selectVoPageTemplate(pageQuery.build(), lqw);
+        List<TournamentsVo> records = result.getRecords();
+        for (TournamentsVo record : records) {
+            Long tournamentId = record.getId();
+            String statusText= GameStatus.getDescriptionFromCode(record.getStatus());
+            record.setStatusText(statusText);
+            //赛事报名条件
+            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);
+            }
+
+           /* int totalSignNum = participantsMapper.selectParticipantsTotal(tournamentId);
+            record.setSignNum(totalSignNum);*/
+        }
+
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的【请填写功能名称】列表
+     *
+     * @param bo 查询条件
+     * @return 【请填写功能名称】列表
+     */
+    @Override
+    public List<TournamentsVo> queryList(TournamentsBo bo) {
+        LambdaQueryWrapper<TournamentsTemplate> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectTournamentsVoListTemplate(lqw);
+    }
+
+
+
+    private static final Map<String, SFunction<TournamentsTemplate, ?>> ORDER_FIELD_MAP = new HashMap<>();
+
+    static {
+        ORDER_FIELD_MAP.put("startTime", TournamentsTemplate::getStartTime);
+        // 可以继续添加其他支持排序的字段
+    }
+
+
+    private LambdaQueryWrapper<TournamentsTemplate> buildQueryWrapper(TournamentsBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<TournamentsTemplate> lqw = Wrappers.lambdaQuery();
+
+        // 获取排序字段和方式
+        String sortBy = bo.getSortBy();
+        Boolean isAsc = bo.getIsAsc();
+
+        // 如果有排序字段,并且该字段支持排序
+        if (sortBy != null && ORDER_FIELD_MAP.containsKey(sortBy)) {
+            SFunction<TournamentsTemplate, ?> columnFunc = ORDER_FIELD_MAP.get(sortBy);
+            if (Boolean.TRUE.equals(isAsc)) {
+                lqw.orderBy(true, true, columnFunc); // 升序
+            } else {
+                lqw.orderBy(true, false, columnFunc); // 降序
+            }
+        } else {
+            // 默认排序(比如按开始时间降序)
+            lqw.orderByDesc(TournamentsTemplate::getStartTime);
+        }
+
+
+        lqw.like(StringUtils.isNotBlank(bo.getName()), TournamentsTemplate::getName, bo.getName());
+        lqw.like(bo.getId() != null, TournamentsTemplate::getId, bo.getId());
+        lqw.like(bo.getStartTime() != null, TournamentsTemplate::getStartTime, bo.getStartTime());
+        lqw.eq(bo.getGameType() != null, TournamentsTemplate::getGameType, bo.getGameType());
+        lqw.eq(bo.getStartingChips() != null, TournamentsTemplate::getStartingChips, bo.getStartingChips());
+        lqw.eq(bo.getLevelDuration() != null, TournamentsTemplate::getLevelDuration, bo.getLevelDuration());
+        lqw.eq(bo.getLateRegistrationLevel() != null, TournamentsTemplate::getLateRegistrationLevel, bo.getLateRegistrationLevel());
+        lqw.eq(bo.getMaxPlayers() != null, TournamentsTemplate::getMaxPlayers, bo.getMaxPlayers());
+        lqw.eq(bo.getStatus() != null, TournamentsTemplate::getStatus, bo.getStatus());
+        lqw.eq(bo.getCreatedAt() != null, TournamentsTemplate::getCreatedAt, bo.getCreatedAt());
+        lqw.eq(bo.getUpdatedAt() != null, TournamentsTemplate::getUpdatedAt, bo.getUpdatedAt());
+        return lqw;
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(TournamentsDto bo) {
+        try {
+
+
+            // 转换 BO -> Entity
+            TournamentsTemplate add = new TournamentsTemplate();
+            BeanUtils.copyProperties(bo, add);
+
+            validEntityBeforeSave(add);
+
+            // 解析 itemsPrizeList JSON 字符串
+            List<ItemsPrizeDto> prizeList = bo.getItemsPrizeList();
+
+            if (CollectionUtils.isEmpty(prizeList)) {
+                log.error("奖励列表为空");
+                return false;
+            }
+            Long userId = LoginHelper.getUserId();
+            add.setCreateUserId(userId);
+            // 处理开始时间
+            add.setStartTime(parseDateTime(bo.getStartTime()));
+
+            //比赛ID
+            add.setTournamentsBiId(getCurrentDateTime()+bo.getGameType()+getRandomFourDigitNumber());
+
+            // 插入赛事主表
+            boolean flag = baseMapper.insertTournamentTemplate(add) > 0;
+            if (!flag) {
+                throw new RuntimeException("赛事插入失败");
+            }
+
+            Long tournamentId = add.getId();
+
+            // 绑定盲注结构
+            bindBlindStructure(tournamentId, bo.getBlindStructureId());
+
+            // 添加报名条件
+            addEntryCondition(tournamentId, bo.getItemsId(), bo.getItemsNum());
+
+            // 处理奖励分布
+            processPrizeDistributions(tournamentId, prizeList);
+
+            return true;
+
+        } catch (Exception e) {
+            log.error("赛事插入过程中发生异常", e);
+            return false;
+        }
+    }
+
+
+    /**
+     * 批量插入 1000 条赛事记录
+     *
+     * @return 是否批量插入成功
+     */
+
+    public Boolean batchInsertTournaments() {
+        try {
+            for (int i = 0; i < 1000; i++) {
+                // 模拟构造 TournamentsDto 数据
+                TournamentsDto bo = new TournamentsDto();
+
+                // 设置基础字段
+                bo.setName("赛事名称_" + i);
+                bo.setGameType((long) (1)); // 假设有5种类型
+                bo.setStartingChips(10000L);
+                bo.setLevelDuration(15L);
+                bo.setLateRegistrationLevel(3L);
+                bo.setMaxPlayers(100L);
+                bo.setStatus(1L); // 默认状态为进行中等
+                bo.setStartTime(LocalDateTime.now().plusMinutes(60L * i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+/*
+                bo.setCompetitionIcon("http://public-photos-fugui.oss-cn-beijing.aliyuncs.com/2025/07/05/987480c995204231aa21c3e8ec9af12b.png");
+*/
+                bo.setRewardPlayers(3);
+                bo.setSignTime(10L);
+
+                // 设置盲注结构 ID(假设存在)
+                bo.setBlindStructureId(9L);
+
+                // 设置报名条件
+                bo.setItemsId(1L);
+                bo.setItemsNum(10L);
+
+                // 设置奖励列表
+                List<ItemsPrizeDto> prizeList = new ArrayList<>();
+                ItemsPrizeDto prize = new ItemsPrizeDto();
+                prize.setRanking(1L);
+                prize.setItemId(1L);
+                prize.setQuantity(10L);
+                prize.setItemsName("三湘杯参赛卡");
+                prizeList.add(prize);
+                bo.setItemsPrizeList(prizeList);
+
+                // 调用已有的插入方法
+                if (!insertByBo(bo)) {
+                    log.error("第 {} 条赛事插入失败", i + 1);
+                    return false;
+                }
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("批量插入赛事过程中发生异常", e);
+            return false;
+        }
+    }
+
+
+
+
+    private void bindBlindStructure(Long tournamentId, Long blindStructureId) {
+        TournamentBlindStructureTemplate structure = new TournamentBlindStructureTemplate();
+        structure.setTournamentId(tournamentId);
+        structure.setBlindStructureId(blindStructureId);
+        tournamentBlindStructuresMapper.insertTournamentBlindStructureTemplate(structure);
+    }
+
+    private void addEntryCondition(Long tournamentId, Long itemId, Long requiredQuantity) {
+        TournamentEntryConditionsTemplate condition = new TournamentEntryConditionsTemplate();
+        condition.setTournamentId(tournamentId);
+        condition.setItemId(itemId);
+        condition.setRequiredQuantity(requiredQuantity);
+        tournamentEntryConditionsMapper.insert(condition);
+    }
+
+    private void processPrizeDistributions(Long tournamentId, List<ItemsPrizeDto> itemsPrizeList) {
+        // 排序(按排名正序)
+        Collections.sort(itemsPrizeList, Comparator.comparing(ItemsPrizeDto::getRanking));
+
+        for (ItemsPrizeDto prizeBo : itemsPrizeList) {
+            PrizeDistributionsTemplate prizeDistribution = new PrizeDistributionsTemplate();
+            prizeDistribution.setTournamentId(tournamentId);
+            prizeDistribution.setPaiming(Long.valueOf(prizeBo.getRanking()));
+            prizeDistributionsMapper.insertTemplate(prizeDistribution);
+
+            PrizeDistributionItemsTemplate distributionItems = new PrizeDistributionItemsTemplate();
+            distributionItems.setPrizeDistributionId(prizeDistribution.getId());
+            distributionItems.setItemId(Long.valueOf(prizeBo.getItemId()));
+            distributionItems.setQuantity(Long.valueOf(prizeBo.getQuantity()));
+            prizeDistributionItemsMapper.insert(distributionItems);
+        }
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(TournamentsDto bo) {
+        try {
+
+            // 转换 BO -> Entity
+            TournamentsTemplate update = new TournamentsTemplate();
+            BeanUtils.copyProperties(bo, update);
+
+            validEntityBeforeSave(update);
+            // 解析 itemsPrizeList JSON 字符串
+            List<ItemsPrizeDto> prizeList = bo.getItemsPrizeList();
+
+            if (CollectionUtils.isEmpty(prizeList)) {
+                log.error("奖励列表为空");
+                return false;
+            }
+            Long userId = LoginHelper.getUserId();
+            update.setUpdateUserId(userId);
+            // 处理开始时间
+            update.setStartTime(parseDateTime(bo.getStartTime()));
+
+            // 插入赛事主表
+            boolean flag = baseMapper.updateTournamentsByIdTemplate(update) > 0;
+            if (!flag) {
+                throw new RuntimeException("赛事修改失败");
+            }
+            Long tournamentId= update.getId();
+            //删除 旧盲注绑定信息
+            tournamentBlindStructuresMapper.deleteTournamentBlindStructureByTournamentIdTemplate(tournamentId);
+
+            // 绑定盲注结构
+            bindBlindStructure(tournamentId, bo.getBlindStructureId());
+
+            // 修改报名条件
+            TournamentEntryConditionsTemplate tournamentEntryConditions=new TournamentEntryConditionsTemplate();
+            tournamentEntryConditions.setItemId(bo.getItemsId());
+            tournamentEntryConditions.setRequiredQuantity(bo.getItemsNum());
+            tournamentEntryConditionsMapper.updateByTournamentIdTemplate(tournamentEntryConditions);
+
+            //删除奖励排名 同时删除奖励对应信息
+            List<PrizeDistributionsVo> prizeDistributionsVos = prizeDistributionsMapper.selectByTournamentIdTemplate(tournamentId);
+            if(prizeDistributionsVos.size()>0){
+                for (PrizeDistributionsVo prizeDistributionsVo : prizeDistributionsVos) {
+                    prizeDistributionsMapper.deleteByIdsTemplate(prizeDistributionsVo.getId());
+                }
+            }
+            //重新处理奖励分布
+            processPrizeDistributions(tournamentId, prizeList);
+             return true;
+        }catch (Exception e){
+            log.error("赛事修改过程中发生异常", e);
+            return false;
+        }
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(TournamentsTemplate entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除【请填写功能名称】信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteTournamentByIdsTemplate(ids) > 0;
+    }
+
+    @Override
+    public TableDataInfo<TournamentBlindStructuresListVo> selectTournamentBlindStructuresList(TournamentBlindStructuresBo bo, PageQuery pageQuery) {
+        Page<TournamentBlindStructuresListVo> result = baseMapper.selectTournamentBlindStructuresListTemplate(pageQuery.build(), bo);
+        return TableDataInfo.build(result);
+    }
+
+
+
+    public void saveOrUpdateTournamentBlindStructure(Long tournamentId, List<Long> blindStructureIds) {
+        // 先删除原有数据
+        baseMapper.deleteByBlindTournamentIdTemplate(tournamentId);
+        // 插入新数据
+        if (CollectionUtils.isNotEmpty(blindStructureIds)) {
+            baseMapper.batchInsertTournamentBlindStructuresTemplate(tournamentId,blindStructureIds);
+        }
+    }
+
+    @Override
+    public SysOssVo uploadTournament(MultipartFile file) {
+        // 1. 上传文件到 OSS
+        SysOssVo sysOssVo = ossService.upload(file);
+        return sysOssVo;
+    }
+
+
+    private List<ItemsPrizeDto> parsePrizeList(String itemsPrizeListJson, ObjectMapper mapper) throws Exception {
+        if (itemsPrizeListJson == null || itemsPrizeListJson.isBlank()) {
+            throw new IllegalArgumentException("itemsPrizeList 不能为空");
+        }
+
+        String cleanedJson = itemsPrizeListJson.trim();
+        if (cleanedJson.startsWith(",")) {
+            cleanedJson = cleanedJson.substring(1);
+        }
+
+        return mapper.readValue(
+            cleanedJson,
+            mapper.getTypeFactory().constructCollectionType(List.class, ItemsPrizeDto.class)
+        );
+    }
+
+    private Date parseDateTime(String dateTimeStr) throws ParseException {
+        if (dateTimeStr == null || dateTimeStr.isBlank()) {
+            throw new IllegalArgumentException("startTime 不能为空");
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr, formatter);
+        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * 获取当前年月日时分秒(格式:yyyy-MM-dd HH:mm:ss)
+     *
+     * @return 格式化后的时间字符串
+     */
+    public static String getCurrentDateTime() {
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        return now.format(formatter);
+    }
+
+    /**
+     * 随机获取一个四位数(1000 ~ 9999)
+     *
+     * @return 四位数整数
+     */
+    public static int getRandomFourDigitNumber() {
+        Random random = new Random();
+        // 生成 [1000, 9999] 范围内的随机数
+        return 1000 + random.nextInt(9000);
+    }
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PrizeDistributionItemsTemplateMapper.xml

@@ -0,0 +1,71 @@
+<?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.PrizeDistributionItemsTemplateMapper">
+
+    <!-- 插入数据,字段为空则不插入 -->
+    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO prize_distribution_items_template
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="prizeDistributionId != null and prizeDistributionId.toString() != ''">prize_distribution_id,</if>
+            <if test="itemId != null and itemId.toString() != ''">item_id,</if>
+            <if test="quantity != null and quantity.toString() != ''">quantity,</if>
+        </trim>
+        VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="prizeDistributionId != null and prizeDistributionId.toString() != ''">#{prizeDistributionId},</if>
+            <if test="itemId != null and itemId.toString() != ''">#{itemId},</if>
+            <if test="quantity != null and quantity.toString() != ''">#{quantity},</if>
+        </trim>
+    </insert>
+
+
+    <!-- 动态更新记录 -->
+    <update id="updateById">
+        UPDATE prize_distribution_items_template
+        <set>
+            <if test="prizeDistributionId != null and prizeDistributionId.toString() != ''">
+                prize_distribution_id = #{prizeDistributionId},
+            </if>
+            <if test="itemId != null and itemId.toString() != ''">
+                item_id = #{itemId},
+            </if>
+            <if test="quantity != null and quantity.toString() != ''">
+                quantity = #{quantity},
+            </if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 删除记录,只在id有效时删除 -->
+    <delete id="deleteById">
+        DELETE FROM prize_distribution_items_template
+        WHERE id = #{id}
+          AND #{id} IS NOT NULL
+    </delete>
+
+    <!-- 查询单条记录 -->
+    <select id="selectById" resultType="org.dromara.business.domain.vo.PrizeDistributionItemsVo">
+        SELECT *
+        FROM prize_distribution_items_template
+        WHERE id = #{id}
+    </select>
+
+    <!-- 根据 prize_distribution_id 查询奖励道具列表 -->
+    <select id="selectByPrizeDistributionIdTemplate" resultType="org.dromara.business.domain.vo.PrizeDistributionItemsVo">
+        SELECT a.id,a.prize_distribution_id,a.item_id,a.quantity,b.name itemsName
+        FROM prize_distribution_items_template a  left join items b on a.item_id=b.id
+        WHERE a.prize_distribution_id = #{prizeDistributionId}
+    </select>
+
+    <select id="selectByPrizeDistributionIdListTemplate" resultType="org.dromara.business.domain.vo.PrizeDistributionItemsVo">
+        SELECT a.id,a.prize_distribution_id,a.item_id,a.quantity,b.name itemsName
+        FROM prize_distribution_items_template a  left join items b on a.item_id=b.id
+        WHERE  a.prize_distribution_id IN
+        <foreach collection="prizeDistributionId" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
+</mapper>

+ 60 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PrizeDistributionsTemplateMapper.xml

@@ -0,0 +1,60 @@
+<?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.PrizeDistributionsTemplateMapper">
+
+
+    <!-- 插入数据,字段为空则不插入 -->
+    <insert id="insertTemplate" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO prize_distributions_template
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="tournamentId != null and tournamentId.toString() != ''">tournament_id,</if>
+            <if test="paiming != null and paiming.toString() != ''">paiming,</if>
+        </trim>
+        VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="tournamentId != null and tournamentId.toString() != ''">#{tournamentId},</if>
+            <if test="paiming != null and paiming.toString() != ''">#{paiming},</if>
+        </trim>
+    </insert>
+
+    <!-- 动态更新记录 -->
+    <update id="updateByIdTemplate">
+        UPDATE prize_distributions_template
+        <set>
+            <if test="tournamentId != null and tournamentId.toString() != ''">
+                tournament_id = #{tournamentId},
+            </if>
+            <if test="paiming != null and paiming.toString() != ''">
+                paiming = #{paiming},
+            </if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 删除记录,只在id有效时删除 -->
+    <delete id="deleteByIdsTemplate">
+        DELETE FROM prize_distributions_template
+        WHERE id = #{id}
+          AND #{id} IS NOT NULL
+    </delete>
+
+    <!-- 查询单条记录 -->
+    <select id="selectByIdTemplate" resultType="org.dromara.business.domain.vo.PrizeDistributionsVo">
+        SELECT *
+        FROM prize_distributions_template
+        WHERE id = #{id}
+    </select>
+
+    <!-- 根据比赛ID查询排名分布 -->
+    <select id="selectByTournamentIdTemplate" resultType="org.dromara.business.domain.vo.PrizeDistributionsVo">
+        SELECT *
+        FROM prize_distributions_template
+        WHERE tournament_id = #{tournamentId}
+    </select>
+
+
+
+
+</mapper>

+ 26 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentBlindStructuresTemplateMapper.xml

@@ -0,0 +1,26 @@
+<?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.TournamentBlindStructuresTemplateMapper">
+
+
+    <insert id="insertTournamentBlindStructureTemplate" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO tournament_blind_structures_template (tournament_id, blind_structure_id)
+        VALUES (#{tournamentId}, #{blindStructureId})
+    </insert>
+
+    <delete id="deleteTournamentBlindStructureByTournamentIdTemplate">
+        DELETE FROM tournament_blind_structures_template
+        WHERE tournament_id = #{tournamentId}
+    </delete>
+
+
+
+    <select id="selectTournamentBlindStructureByTournamentIdTemplate" resultType="org.dromara.business.domain.vo.TournamentBlindStructuresVo">
+        SELECT  a.tournament_id,a.blind_structure_id,b.name as blindStructuresName
+        FROM tournament_blind_structures_template a left join blind_structures b on a.blind_structure_id=b.id
+        WHERE a.tournament_id = #{tournamentId}
+    </select>
+
+</mapper>

+ 66 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentEntryConditionsTemplateMapper.xml

@@ -0,0 +1,66 @@
+<?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.TournamentEntryConditionsTemplateMapper">
+
+
+    <!-- 插入数据,字段为空则插入默认值或不插入 -->
+    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO tournament_entry_conditions_template
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="tournamentId != null and tournamentId.toString() != ''">tournament_id,</if>
+            <if test="itemId != null and itemId.toString() != ''">item_id,</if>
+            <if test="requiredQuantity != null and requiredQuantity.toString() != ''">required_quantity,</if>
+        </trim>
+        VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="tournamentId != null and tournamentId.toString() != ''">#{tournamentId},</if>
+            <if test="itemId != null and itemId.toString() != ''">#{itemId},</if>
+            <if test="requiredQuantity != null and requiredQuantity.toString() != ''">#{requiredQuantity},</if>
+        </trim>
+    </insert>
+
+    <!-- 动态更新记录 -->
+    <update id="updateByTournamentIdTemplate">
+        UPDATE tournament_entry_conditions_template
+        <set>
+            <if test="itemId != null and itemId.toString() != ''">
+                item_id = #{itemId},
+            </if>
+            <if test="requiredQuantity != null and requiredQuantity.toString() != ''">
+                required_quantity = #{requiredQuantity},
+            </if>
+            updated_at = CURRENT_TIMESTAMP
+        </set>
+        WHERE tournament_id = #{tournamentId}
+    </update>
+
+    <!-- 删除记录,只在id有效时删除 -->
+    <delete id="deleteById">
+        DELETE FROM tournament_entry_conditions_template
+        WHERE id = #{id}
+          AND #{id} IS NOT NULL
+    </delete>
+
+    <!-- 查询单条记录 -->
+    <select id="selectById" resultType="org.dromara.business.domain.vo.TournamentEntryConditionsVo">
+        SELECT *
+        FROM tournament_entry_conditions_template
+        WHERE id = #{id}
+    </select>
+
+    <!-- 根据比赛ID查询报名条件 -->
+    <select id="selectByTournamentIdTemplate" resultType="org.dromara.business.domain.vo.TournamentEntryConditionsVo">
+        SELECT *
+        FROM tournament_entry_conditions_template
+        WHERE tournament_id = #{tournamentId}
+    </select>
+
+    <select id="selectByTournamentInfoTemplate" resultType="org.dromara.business.domain.vo.TournamentEntryConditionsVo">
+       SELECT  a.tournament_id,a.item_id,a.required_quantity,b.name itemsName
+        FROM tournament_entry_conditions_template a left join items b on a.item_id=b.id
+        WHERE a.tournament_id = #{tournamentId}
+    </select>
+
+</mapper>

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

@@ -0,0 +1,129 @@
+<?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.TournamentsTemplateMapper">
+
+    <select id="selectVoPageTemplate" resultType="org.dromara.business.domain.vo.TournamentsVo">
+        SELECT * FROM tournaments_template ${ew.customSqlSegment}
+    </select>
+
+
+    <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>
+
+    <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>
+
+
+    <update id="updateTournamentsByIdTemplate">
+        UPDATE tournaments_template
+        <set>
+            <if test="name != null">name = #{name},</if>
+            <if test="startTime != null">start_time = #{startTime},</if>
+            <if test="endTime != null">end_time = #{endTime},</if>
+            <if test="gameType != null">game_type = #{gameType},</if>
+            <if test="startingChips != null">starting_chips = #{startingChips},</if>
+            <if test="levelDuration != null">level_duration = #{levelDuration},</if>
+            <if test="lateRegistrationLevel != null">late_registration_level = #{lateRegistrationLevel},</if>
+            <if test="maxPlayers != null">max_players = #{maxPlayers},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createdAt != null">created_at = #{createdAt},</if>
+            <if test="updatedAt != null">updated_at = #{updatedAt},</if>
+            <if test="signTime != null">sign_time = #{signTime},</if>
+            <if test="competitionIcon != null">competition_icon = #{competitionIcon},</if>
+            <if test="updateUserId != null">update_user_id = #{updateUserId}</if>
+            <if test="tournamentsBiId != null">tournaments_bi_id = #{tournamentsBiId}</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+
+    <insert id="insertTournamentTemplate" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO tournaments_template
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null">name,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="gameType != null">game_type,</if>
+            <if test="startingChips != null">starting_chips,</if>
+            <if test="levelDuration != null">level_duration,</if>
+            <if test="lateRegistrationLevel != null">late_registration_level,</if>
+            <if test="maxPlayers != null">max_players,</if>
+            <if test="status != null">status,</if>
+            <if test="signTime != null">sign_time,</if>
+            <if test="competitionIcon != null">competition_icon,</if>
+            <if test="createUserId != null">create_user_id,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="tournamentsBiId != null">tournaments_bi_id,</if>
+        </trim>
+        VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null">#{name},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="gameType != null">#{gameType},</if>
+            <if test="startingChips != null">#{startingChips},</if>
+            <if test="levelDuration != null">#{levelDuration},</if>
+            <if test="lateRegistrationLevel != null">#{lateRegistrationLevel},</if>
+            <if test="maxPlayers != null">#{maxPlayers},</if>
+            <if test="status != null">#{status},</if>
+            <if test="signTime != null">#{signTime},</if>
+            <if test="competitionIcon != null">#{competitionIcon},</if>
+            <if test="createUserId != null">#{createUserId},</if>
+            <if test="endTime != null">#{endTime},</if>
+            <if test="tournamentsBiId != null">#{tournamentsBiId},</if>
+        </trim>
+    </insert>
+
+
+    <delete id="deleteTournamentByIdsTemplate">
+        DELETE FROM tournaments_template
+        <where>
+            id IN
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                <if test="id > 0">
+                    #{id}
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
+
+    <select id="selectTournamentBlindStructuresListTemplate" resultType="org.dromara.business.domain.vo.TournamentBlindStructuresListVo">
+        SELECT
+        a.id AS blindStructuresId,
+        a.name AS blindStructuresName,
+        a.description AS blindDescription,
+        c.name AS tournamentsName,
+        CASE
+        WHEN b.tournament_id IS NOT NULL OR b.tournament_id > 0 THEN 1
+        ELSE 0
+        END AS allocationStatus
+        FROM
+        blind_structures a
+        LEFT JOIN tournament_blind_structures_template b ON a.id = b.blind_structure_id
+        <if test="query.tournamentId != null and query.tournamentId != 0">
+            AND b.tournament_id = #{query.tournamentId}
+        </if>
+        LEFT JOIN tournaments c ON b.tournament_id = c.id
+    </select>
+
+
+
+    <delete id="deleteByBlindTournamentIdTemplate">
+        DELETE FROM tournament_blind_structures_template WHERE tournament_id = #{tournamentId}
+    </delete>
+
+
+    <insert id="batchInsertTournamentBlindStructuresTemplate">
+        INSERT INTO tournament_blind_structures_template (tournament_id, blind_structure_id)
+        VALUES
+        <foreach collection="blindStructureIds" item="id" separator=",">
+            (#{tournamentId}, #{id})
+        </foreach>
+        ON DUPLICATE KEY UPDATE
+        tournament_id = tournament_id
+    </insert>
+
+</mapper>