Explorar el Código

feat(physical): 添加线下赛事预报名功能

- 在 PhysicalLeagueTournament 实体类中添加预报名开始和结束时间字段及验证注解
- 在 PhysicalLeagueTournamentBo 和 PhysicalLeagueTournamentVo 中添加对应的预报名时间字段
- 更新数据库映射文件,添加预报名时间字段到插入和更新语句中
- 在 PhysicalTournamentMenuServiceImpl 中添加预报名记录检查逻辑,避免重复激活
- 添加 PhysicalTournamentsRegistrationMapper 查询方法获取用户预报名记录
- 创建 PhysicalTournamentTask 定时任务类,根据预报名时间段自动启用菜单
- 在物理联赛表中添加预报名时间范围的非空验证规则
fugui001 hace 9 horas
padre
commit
6c63a919ab

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/business/PhysicalTournamentTask.java

@@ -0,0 +1,71 @@
+package org.dromara.job.business;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.physical.domain.bo.PhysicalTournamentMenuBo;
+import org.dromara.physical.domain.vo.PhysicalLeagueTournamentVo;
+import org.dromara.physical.domain.vo.PhysicalTournamentMenuVo;
+import org.dromara.physical.mapper.PhysicalLeagueTournamentMapper;
+import org.dromara.physical.service.IPhysicalTournamentMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+@Component
+@EnableScheduling
+@Slf4j
+public class PhysicalTournamentTask {
+
+    @Autowired
+    PhysicalLeagueTournamentMapper  physicalLeagueTournamentMapper;
+
+    @Autowired
+    IPhysicalTournamentMenuService physicalTournamentMenuService;
+
+    /**
+     * 生成 线下赛事预报名菜单
+     */
+    /**
+     * 生成 线下赛事预报名菜单
+     */
+   // @Scheduled(fixedRate = 20000)
+    public void generatePreTask() {
+        // 查询联赛列表
+        List<PhysicalLeagueTournamentVo> physicalLeagueTournamentVoList = physicalLeagueTournamentMapper.selectPhysicalLeagueTournamentSelList();
+
+        // 查询一次预报名类型的菜单列表(避免重复查询)
+        PhysicalTournamentMenuBo physicalTournamentMenuBo = new PhysicalTournamentMenuBo();
+        physicalTournamentMenuBo.setMenuKey("pre_registration_type");
+        List<PhysicalTournamentMenuVo> physicalTournamentMenuVos = physicalTournamentMenuService.queryList(physicalTournamentMenuBo);
+
+        // 遍历联赛列表
+        for (PhysicalLeagueTournamentVo physicalLeagueTournamentVo : physicalLeagueTournamentVoList) {
+            Date registrationBeginTime = physicalLeagueTournamentVo.getRegistrationBeginTime();
+            Date registrationEndTime = physicalLeagueTournamentVo.getRegistrationEndTime();
+            Date currentTime = new Date(); // 获取当前时间
+
+            // 判断当前时间是否在预报名时间段内
+            if (currentTime.after(registrationBeginTime) && currentTime.before(registrationEndTime)) {
+                // 如果在预报名时间内,则更新菜单状态
+                for (PhysicalTournamentMenuVo menuVo : physicalTournamentMenuVos) {
+                    PhysicalTournamentMenuBo updateBo = new PhysicalTournamentMenuBo();
+                    updateBo.setId(menuVo.getId());
+                    updateBo.setStatus(1L); // 设置状态为启用
+                    updateBo.setMenuKey("pre_registration_type");
+                    physicalTournamentMenuService.auditTournamentMenu(updateBo);
+                }
+            }
+        }
+    }
+
+
+
+
+
+
+
+
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/domain/PhysicalLeagueTournament.java

@@ -1,5 +1,8 @@
 package org.dromara.physical.domain;
 
+import jakarta.validation.constraints.NotNull;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
@@ -77,4 +80,16 @@ public class PhysicalLeagueTournament extends BaseEntity {
      * 游戏玩法类型:0=德州扑克, 1=奥马哈, 2=短牌
      */
     private Integer gameVariant;
+
+    /**
+     * 预报名开始时间不能为空
+     */
+    @NotNull(message = "预报名开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date registrationBeginTime;
+
+    /**
+     * 预报名结束时间不能为空
+     */
+    @NotNull(message = "预报名结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date registrationEndTime;
 }

+ 13 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/domain/bo/PhysicalLeagueTournamentBo.java

@@ -84,4 +84,17 @@ public class PhysicalLeagueTournamentBo extends BaseEntity {
      */
     private Integer gameVariant;
 
+
+    /**
+     * 预报名开始时间不能为空
+     */
+    @NotNull(message = "预报名开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date registrationBeginTime;
+
+    /**
+     * 预报名结束时间不能为空
+     */
+    @NotNull(message = "预报名结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date registrationEndTime;
+
 }

+ 17 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/domain/vo/PhysicalLeagueTournamentVo.java

@@ -4,7 +4,10 @@ import java.util.Date;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
 import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
 import org.dromara.physical.domain.PhysicalLeagueTournament;
 
 import java.io.Serial;
@@ -90,4 +93,18 @@ public class PhysicalLeagueTournamentVo implements Serializable {
      * 游戏玩法类型:0=德州扑克, 1=奥马哈, 2=短牌
      */
     private Integer gameVariant;
+
+
+    /**
+     * 预报名开始时间不能为空
+     */
+    @NotNull(message = "预报名开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date registrationBeginTime;
+
+    /**
+     * 预报名结束时间不能为空
+     */
+    @NotNull(message = "预报名结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date registrationEndTime;
+
 }

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/mapper/PhysicalTournamentsRegistrationMapper.java

@@ -39,4 +39,7 @@ public interface PhysicalTournamentsRegistrationMapper extends BaseMapperPlus<Ph
     @InterceptorIgnore(tenantLine = "true")
     List<PhysicalTournamentsRegistrationVo> selectPhysicalTournamentsRegistrationList(@Param("ew") Wrapper<PhysicalTournamentsRegistration> wrapper);
 
+    @InterceptorIgnore(tenantLine = "true")
+    PhysicalTournamentsRegistrationVo selectTournamentsRegistrationByUser(@Param("leagueTournamentId") Long leagueTournamentId,@Param("userId") Long userId);
+
 }

+ 6 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/service/impl/PhysicalTournamentMenuServiceImpl.java

@@ -22,6 +22,7 @@ import org.dromara.physical.domain.PhysicalTournamentsRegistration;
 import org.dromara.physical.domain.bo.PhysicalTournamentMenuBo;
 import org.dromara.physical.domain.vo.PhysicalLeagueTournamentVo;
 import org.dromara.physical.domain.vo.PhysicalTournamentMenuVo;
+import org.dromara.physical.domain.vo.PhysicalTournamentsRegistrationVo;
 import org.dromara.physical.mapper.PhysicalLeagueTournamentMapper;
 import org.dromara.physical.mapper.PhysicalPlayerItemActivationMapper;
 import org.dromara.physical.mapper.PhysicalTournamentMenuMapper;
@@ -197,11 +198,15 @@ public class PhysicalTournamentMenuServiceImpl implements IPhysicalTournamentMen
         if(counts>0){
             if(bo.getMenuKey().equals("pre_registration_type") && bo.getStatus()==1L){
                 //激活之后  插入预报名记录里面
-
                 //如果是预报名的   查看所有用户是不是有主赛卡,有的话默认激活一张
                 UserBo userBo=new UserBo();
                 List<UserVo> userVoList = userService.queryUserList(userBo);
                 for (UserVo userVo : userVoList) {
+                    //查看用户本次联赛是否有已经预报名的
+                    PhysicalTournamentsRegistrationVo physicalTournamentsRegistrationVo = physicalTournamentsRegistrationMapper.selectTournamentsRegistrationByUser(userVo.getId(), physicalLeagueTournamentVoList.get(0).getId());
+                    if(physicalTournamentsRegistrationVo!=null){
+                        continue;
+                     }
                     List<PhysicalCardVo> cardVoUserList = playerItemsMapper.findCardTypeByUserList(userVo.getId(),"main_tournament","");
                     if(!cardVoUserList.isEmpty()){
                         // 随机选择一张用户的主赛卡进行激活

+ 8 - 2
ruoyi-modules/ruoyi-system/src/main/resources/mapper/physical/PhysicalLeagueTournamentMapper.xml

@@ -36,7 +36,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             game_type,
             location,
             status,
-            game_variant
+            game_variant,
+            registration_begin_time,
+            registration_end_time
         ) VALUES (
                      #{title},
                      #{imageUrl},
@@ -45,7 +47,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                      #{gameType},
                      #{location},
                      #{status},
-                     #{gameVariant}
+                     #{gameVariant},
+                     #{registrationBeginTime},
+                     #{registrationEndTime}
                  )
     </insert>
 
@@ -75,6 +79,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 status = #{status},
             </if>
             <if test="gameVariant != null">game_variant = #{gameVariant},</if>
+            <if test="registrationBeginTime != null">registration_begin_time = #{registrationBeginTime},</if>
+            <if test="registrationEndTime != null">registration_end_time = #{registrationEndTime},</if>
         </set>
         WHERE id = #{id}
     </update>

+ 17 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/physical/PhysicalTournamentsRegistrationMapper.xml

@@ -111,4 +111,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </delete>
 
+
+    <select id="selectTournamentsRegistrationByUser" resultType="org.dromara.physical.domain.vo.PhysicalTournamentsRegistrationVo">
+        SELECT
+            id,
+            user_id,
+            league_tournament_id,
+            image_url,
+            status,
+            remark,
+            created_at,
+            audited_at,
+            auditor_id,
+            auditor_name,
+            auto_status
+        FROM physical_tournaments_registration  where 1=1  and league_tournament_id = #{leagueTournamentId}  and user_id = #{userId}
+    </select>
+
 </mapper>