Browse Source

feat(physical): 更新赛事报名条件和奖励配置功能

- 修改PhysicalTournamentEntryConditionsMapper返回多个报名条件记录
- 在PhysicalParticipantsServiceImpl中实现多报名条件查询和显示逻辑
- 添加ItemsMapper依赖用于获取道具名称信息
- 新增PhysicalItemsPrizeDto类用于处理报名条件数据传输
- 在PhysicalTournamentsDto中添加itemsConditionList字段存储报名条件列表
- 更新PhysicalTournamentsServiceImpl中的报名条件处理逻辑
- 实现批量添加和修改赛事报名条件的功能
- 优化赛事列表中报名条件的展示格式,支持多条件逗号分隔显示
- 添加报名条件为空的验证逻辑确保数据完整性
fugui001 1 tuần trước cách đây
mục cha
commit
5e4e03da0d

+ 6 - 3
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/domain/dto/PhysicalTournamentsDto.java

@@ -13,9 +13,12 @@ public class PhysicalTournamentsDto {
     @NotBlank(message = "赛事名称不能为空")
     private String name;
 
-/*    @NotNull(message = "比赛开始时间不能为空")*/
+    @NotNull(message = "比赛开始时间不能为空")
     private String startTime;
 
+    @NotNull(message = "报名时间不能为空")
+    private String signTime;
+
     @NotBlank(message = "比赛类型不能为空")
     private Long gameType;
     private Long startingChips;
@@ -27,8 +30,6 @@ public class PhysicalTournamentsDto {
     private Long maxPlayers;
     private Long status;
 
-    @NotNull(message = "报名时间不能为空")
-    private Long signTime;
 
     @NotNull(message = "报名条件不能为空")
     private Long itemsId;
@@ -42,6 +43,8 @@ public class PhysicalTournamentsDto {
     @NotNull(message = "奖励内容不能为空")
     private List<PhysicalItemsPrizeDto> itemsPrizeList;
 
+    @NotNull(message = "报名条件不能为空")
+    private List<PhysicalItemsPrizeDto> itemsConditionList;
     /**
      * 比赛logo
      */

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

@@ -237,6 +237,7 @@ public class PhysicalTournamentsVo implements Serializable {
 
     private List<PhysicalItemsPrizeDto> itemsPrizeList;
 
+    private List<PhysicalItemsPrizeDto> itemsConditionList;
 
     @ExcelProperty(value = "赛事状态")
     private String statusText;

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/mapper/PhysicalTournamentEntryConditionsMapper.java

@@ -34,6 +34,6 @@ public interface PhysicalTournamentEntryConditionsMapper extends BaseMapperPlus<
     List<PhysicalTournamentEntryConditionsVo> selectPhysicalTournamentEntryConditionsByTournamentId(Long tournamentId);
 
     @InterceptorIgnore(tenantLine = "true")
-    PhysicalTournamentEntryConditionsVo selectPhysicalConditionsByTournamentId(Long tournamentId);
+    List<PhysicalTournamentEntryConditionsVo> selectPhysicalConditionsByTournamentId(Long tournamentId);
 
 }

+ 49 - 9
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/service/impl/PhysicalParticipantsServiceImpl.java

@@ -1,9 +1,11 @@
 package org.dromara.physical.service.impl;
 
 import org.dromara.business.domain.enums.GameStatus;
+import org.dromara.business.domain.vo.ItemsVo;
 import org.dromara.business.domain.vo.TournamentEntryConditionsVo;
 import org.dromara.business.domain.vo.TournamentsVo;
 import org.dromara.business.domain.vo.UserVo;
+import org.dromara.business.mapper.ItemsMapper;
 import org.dromara.business.mapper.UserMapper;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -16,6 +18,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.physical.domain.PhysicalParticipants;
 import org.dromara.physical.domain.bo.PhysicalParticipantsBo;
+import org.dromara.physical.domain.dto.PhysicalItemsPrizeDto;
 import org.dromara.physical.domain.vo.PhysicalParticipantsVo;
 import org.dromara.physical.domain.vo.PhysicalTournamentEntryConditionsVo;
 import org.dromara.physical.domain.vo.PhysicalTournamentsVo;
@@ -48,6 +51,7 @@ public class PhysicalParticipantsServiceImpl implements IPhysicalParticipantsSer
 
     private final PhysicalTournamentEntryConditionsMapper physicalTournamentEntryConditionsMapper;
 
+    private final ItemsMapper itemsMapper;
 
     /**
      * 查询线下用户报名
@@ -95,11 +99,33 @@ public class PhysicalParticipantsServiceImpl implements IPhysicalParticipantsSer
                 String statusText= GameStatus.getDescriptionFromCode(tournamentsVo.getStatus());
                 resultRecord.setStatusText(statusText);
             }
-            PhysicalTournamentEntryConditionsVo tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(resultRecord.getTournamentId());
-            String tournamentCondition="";
-            if(tournamentEntryConditionsVo!=null){
-                tournamentCondition=tournamentEntryConditionsVo.getItemsName()+"*"+tournamentEntryConditionsVo.getRequiredQuantity();
+
+            String tournamentCondition = "";
+            //赛事报名条件
+            List<PhysicalTournamentEntryConditionsVo> tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(resultRecord.getTournamentId());
+            if(tournamentEntryConditionsVo != null && !tournamentEntryConditionsVo.isEmpty()){
+                StringBuilder conditionBuilder = new StringBuilder();
+                for (int i = 0; i < tournamentEntryConditionsVo.size(); i++) {
+                    PhysicalTournamentEntryConditionsVo condition = tournamentEntryConditionsVo.get(i);
+                    if (i > 0) {
+                        conditionBuilder.append(","); // 使用逗号分隔多个条件
+                    }
+
+                    ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(condition.getItemId());
+                    if(itemsVo!=null){
+                        condition.setItemsName(itemsVo.getName());
+                        conditionBuilder.append(condition.getItemsName())
+                            .append("*")
+                            .append(condition.getRequiredQuantity());
+                    }
+
+
+
+                }
+                tournamentCondition = conditionBuilder.toString();
             }
+
+
             resultRecord.setTournamentCondition(tournamentCondition);
         }
 
@@ -137,11 +163,25 @@ public class PhysicalParticipantsServiceImpl implements IPhysicalParticipantsSer
                 String statusText= GameStatus.getDescriptionFromCode(tournamentsVo.getStatus());
                 resultRecord.setStatusText(statusText);
             }
-           //赛事报名条件
-            PhysicalTournamentEntryConditionsVo tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(resultRecord.getTournamentId());
-            String tournamentCondition="";
-            if(tournamentEntryConditionsVo!=null){
-                tournamentCondition=tournamentEntryConditionsVo.getItemsName()+"*"+tournamentEntryConditionsVo.getRequiredQuantity();
+            String tournamentCondition = "";
+            //赛事报名条件
+            List<PhysicalTournamentEntryConditionsVo> tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(resultRecord.getTournamentId());
+            if(tournamentEntryConditionsVo != null && !tournamentEntryConditionsVo.isEmpty()){
+                StringBuilder conditionBuilder = new StringBuilder();
+                for (int i = 0; i < tournamentEntryConditionsVo.size(); i++) {
+                    PhysicalTournamentEntryConditionsVo condition = tournamentEntryConditionsVo.get(i);
+                    if (i > 0) {
+                        conditionBuilder.append(","); // 使用逗号分隔多个条件
+                    }
+                    ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(condition.getItemId());
+                    if(itemsVo!=null){
+                        condition.setItemsName(itemsVo.getName());
+                        conditionBuilder.append(condition.getItemsName())
+                            .append("*")
+                            .append(condition.getRequiredQuantity());
+                    }
+                }
+                tournamentCondition = conditionBuilder.toString();
             }
             resultRecord.setTournamentCondition(tournamentCondition);
         }

+ 86 - 26
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/physical/service/impl/PhysicalTournamentsServiceImpl.java

@@ -4,7 +4,9 @@ import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import org.dromara.business.domain.enums.GameStatus;
+import org.dromara.business.domain.vo.ItemsVo;
 import org.dromara.business.domain.vo.TournamentBlindStructuresVo;
+import org.dromara.business.mapper.ItemsMapper;
 import org.dromara.business.utils.RedisKeys;
 import org.dromara.business.utils.RedisUtil;
 import org.dromara.common.core.utils.StringUtils;
@@ -65,6 +67,8 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
 
     private final PhysicalTournamentJudgeMapper physicalTournamentJudgeMapper;;
 
+    private final ItemsMapper itemsMapper;
+
     @Autowired
     RedisUtil redisUtil;
 
@@ -83,11 +87,23 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
         }
         Long tournamentId = physicalTournamentsVo.getId();
         //赛事报名条件
-        PhysicalTournamentEntryConditionsVo tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(tournamentId);
+        List<PhysicalTournamentEntryConditionsVo> tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(tournamentId);
         if(tournamentEntryConditionsVo!=null){
-            physicalTournamentsVo.setItemsId(tournamentEntryConditionsVo.getItemId());
+            /*physicalTournamentsVo.setItemsId(tournamentEntryConditionsVo.getItemId());
             physicalTournamentsVo.setItemsNum(tournamentEntryConditionsVo.getRequiredQuantity());
-            physicalTournamentsVo.setItemsName(tournamentEntryConditionsVo.getItemsName());
+            physicalTournamentsVo.setItemsName(tournamentEntryConditionsVo.getItemsName());*/
+            List<PhysicalItemsPrizeDto> itemsConditionList=new ArrayList<>();
+            for (PhysicalTournamentEntryConditionsVo physicalTournamentEntryConditionsVo : tournamentEntryConditionsVo) {
+                PhysicalItemsPrizeDto itemsPrizeBo = new PhysicalItemsPrizeDto();
+                itemsPrizeBo.setItemId(physicalTournamentEntryConditionsVo.getItemId());
+                itemsPrizeBo.setQuantity(physicalTournamentEntryConditionsVo.getRequiredQuantity());
+                ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(physicalTournamentEntryConditionsVo.getItemId());
+                if(itemsVo!=null){
+                    itemsPrizeBo.setItemsName(itemsVo.getName());
+                    itemsConditionList.add(itemsPrizeBo);
+                }
+            }
+            physicalTournamentsVo.setItemsConditionList(itemsConditionList);
         }
 
 
@@ -152,14 +168,21 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
 
             Long tournamentId = physicalTournamentsVo.getId();
             //赛事报名条件
-            PhysicalTournamentEntryConditionsVo tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(tournamentId);
+            List<PhysicalTournamentEntryConditionsVo> tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(tournamentId);
             if(tournamentEntryConditionsVo!=null){
-                physicalTournamentsVo.setItemsId(tournamentEntryConditionsVo.getItemId());
-                physicalTournamentsVo.setItemsNum(tournamentEntryConditionsVo.getRequiredQuantity());
-                physicalTournamentsVo.setItemsName(tournamentEntryConditionsVo.getItemsName());
+                List<PhysicalItemsPrizeDto> itemsConditionList=new ArrayList<>();
+                for (PhysicalTournamentEntryConditionsVo physicalTournamentEntryConditionsVo : tournamentEntryConditionsVo) {
+                    PhysicalItemsPrizeDto itemsPrizeBo = new PhysicalItemsPrizeDto();
+                    itemsPrizeBo.setItemId(physicalTournamentEntryConditionsVo.getItemId());
+                    itemsPrizeBo.setQuantity(physicalTournamentEntryConditionsVo.getRequiredQuantity());
+                    ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(physicalTournamentEntryConditionsVo.getItemId());
+                    if(itemsVo!=null){
+                        itemsPrizeBo.setItemsName(itemsVo.getName());
+                        itemsConditionList.add(itemsPrizeBo);
+                    }
+                }
+                physicalTournamentsVo.setItemsConditionList(itemsConditionList);
             }
-
-
             //绑定的盲注信息
             TournamentBlindStructuresVo tournamentBlindStructuresVo = physicalTournamentBlindStructuresMapper.selectPhysicalTournamentBlindStructureByTournamentId(tournamentId);
             if(tournamentBlindStructuresVo!=null){
@@ -221,16 +244,28 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
         LambdaQueryWrapper<PhysicalTournaments> lqw = buildQueryWrapper(bo);
         List<PhysicalTournamentsVo> resultRecords = baseMapper.selectPhysicalTournamentsVoList(lqw);
         for (PhysicalTournamentsVo physicalTournamentsVo : resultRecords) {
-            String tournamentCondition="";
+            String tournamentCondition = "";
             Long tournamentId = physicalTournamentsVo.getId();
-            //赛事报名条件
-            PhysicalTournamentEntryConditionsVo tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(tournamentId);
-            if(tournamentEntryConditionsVo!=null){
-                physicalTournamentsVo.setItemsId(tournamentEntryConditionsVo.getItemId());
-                physicalTournamentsVo.setItemsNum(tournamentEntryConditionsVo.getRequiredQuantity());
-                physicalTournamentsVo.setItemsName(tournamentEntryConditionsVo.getItemsName());
-                tournamentCondition=tournamentEntryConditionsVo.getItemsName()+"*"+tournamentEntryConditionsVo.getRequiredQuantity();
+             //赛事报名条件
+            List<PhysicalTournamentEntryConditionsVo> tournamentEntryConditionsVo = physicalTournamentEntryConditionsMapper.selectPhysicalConditionsByTournamentId(tournamentId);
+            if(tournamentEntryConditionsVo != null && !tournamentEntryConditionsVo.isEmpty()){
+                StringBuilder conditionBuilder = new StringBuilder();
+                for (int i = 0; i < tournamentEntryConditionsVo.size(); i++) {
+                    PhysicalTournamentEntryConditionsVo condition = tournamentEntryConditionsVo.get(i);
+                    if (i > 0) {
+                        conditionBuilder.append(","); // 使用逗号分隔多个条件
+                    }
+                    ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(condition.getItemId());
+                    if(itemsVo!=null){
+                        condition.setItemsName(itemsVo.getName());
+                        conditionBuilder.append(condition.getItemsName())
+                            .append("*")
+                            .append(condition.getRequiredQuantity());
+                    }
+                }
+                tournamentCondition = conditionBuilder.toString();
             }
+
             physicalTournamentsVo.setTournamentCondition(tournamentCondition);
             //绑定的盲注信息
             TournamentBlindStructuresVo tournamentBlindStructuresVo = physicalTournamentBlindStructuresMapper.selectPhysicalTournamentBlindStructureByTournamentId(tournamentId);
@@ -369,11 +404,16 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
         try {
             // 解析 itemsPrizeList JSON 字符串
             List<PhysicalItemsPrizeDto> prizeList = bo.getItemsPrizeList();
-
             if (CollectionUtils.isEmpty(prizeList)) {
                 log.error("奖励列表为空");
                 return false;
             }
+
+            List<PhysicalItemsPrizeDto> conditionList = bo.getItemsConditionList();
+            if (CollectionUtils.isEmpty(conditionList)) {
+                log.error("报名条件为空");
+                return false;
+            }
             Long userId = LoginHelper.getUserId();
             add.setCreateUserId(userId);
             // 处理开始时间
@@ -397,7 +437,7 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
             bindBlindStructure(tournamentId, bo.getBlindStructureId());
 
             // 添加报名条件
-            addEntryCondition(tournamentId, bo.getItemsId(), bo.getItemsNum());
+            addEntryCondition2(tournamentId, conditionList);
 
             // 处理奖励分布
             processPrizeDistributions(tournamentId, prizeList);
@@ -450,6 +490,13 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
                log.error("奖励列表为空");
                return false;
            }
+
+           List<PhysicalItemsPrizeDto> conditionList = bo.getItemsConditionList();
+           if (CollectionUtils.isEmpty(conditionList)) {
+               log.error("报名条件为空");
+               return false;
+           }
+
             //取出对应盲注 本级别持续时间
            List<PhysicalBlindLevelsVo> blindLevelsVosList = physicalBlindLevelsService.selectPhysicalBlindLevelsInfoObj(bo.getBlindStructureId());
            if(blindLevelsVosList.size()>0){
@@ -470,12 +517,17 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
 
            // 绑定盲注结构
            bindBlindStructure(tournamentId, bo.getBlindStructureId());
-           // 修改报名条件
-           PhysicalTournamentEntryConditions tournamentEntryConditions=new PhysicalTournamentEntryConditions();
-           tournamentEntryConditions.setItemId(bo.getItemsId());
-           tournamentEntryConditions.setRequiredQuantity(bo.getItemsNum());
-           tournamentEntryConditions.setTournamentId(tournamentId);
-           physicalTournamentEntryConditionsMapper.updatePhysicalTournamentEntryConditionsId(tournamentEntryConditions);
+
+
+           List<PhysicalTournamentEntryConditionsVo> physicalTournamentEntryConditionsVos = physicalTournamentEntryConditionsMapper.selectPhysicalTournamentEntryConditionsByTournamentId(tournamentId);
+           for (PhysicalTournamentEntryConditionsVo physicalTournamentEntryConditionsVo : physicalTournamentEntryConditionsVos) {
+               // 修改报名条件
+               PhysicalTournamentEntryConditions tournamentEntryConditions=new PhysicalTournamentEntryConditions();
+               tournamentEntryConditions.setItemId(physicalTournamentEntryConditionsVo.getItemId());
+               tournamentEntryConditions.setRequiredQuantity(physicalTournamentEntryConditionsVo.getRequiredQuantity());
+               tournamentEntryConditions.setTournamentId(tournamentId);
+               physicalTournamentEntryConditionsMapper.updatePhysicalTournamentEntryConditionsId(tournamentEntryConditions);
+           }
 
            //删除奖励排名 同时删除奖励对应信息
            List<PhysicalPrizeDistributionsVo> prizeDistributionsVos = physicalPrizeDistributionsMapper.selectPhysicalPrizeDistributionByTournamentId(tournamentId);
@@ -540,7 +592,15 @@ public class PhysicalTournamentsServiceImpl implements IPhysicalTournamentsServi
         structure.setBlindStructureId(blindStructureId);
         physicalTournamentBlindStructuresMapper.insertPhysicalTournamentBlindStructure(structure);
     }
-
+    private void addEntryCondition2(Long tournamentId, List<PhysicalItemsPrizeDto> itemsConditionList) {
+        for (PhysicalItemsPrizeDto physicalItemsPrizeDto : itemsConditionList) {
+            PhysicalTournamentEntryConditions condition = new PhysicalTournamentEntryConditions();
+            condition.setTournamentId(tournamentId);
+            condition.setItemId(physicalItemsPrizeDto.getItemId());
+            condition.setRequiredQuantity(physicalItemsPrizeDto.getQuantity());
+            physicalTournamentEntryConditionsMapper.insertPhysicalTournamentEntryConditions(condition);
+        }
+    }
     private void addEntryCondition(Long tournamentId, Long itemId, Long requiredQuantity) {
         PhysicalTournamentEntryConditions condition = new PhysicalTournamentEntryConditions();
         condition.setTournamentId(tournamentId);