Ver Fonte

feat(tournaments): 添加赛事配置下拉选择功能

- 新增 selectTournamentConfigSelList API 接口用于获取赛事配置下拉列表
- 在赛事管理界面将比赛项目字段替换为比赛配置下拉选择框
- 在赛事模板界面添加比赛配置下拉选择功能
- 移除原有的比赛项目、开赛最低人数、延迟卡时间及数量字段
- 添加 configId 字段验证规则并初始化配置选项数据
- 实现配置选项的异步加载和数据映射处理
fugui001 há 2 semanas atrás
pai
commit
3df349b676

+ 9 - 0
src/api/system/business/tournamentConfig/index.ts

@@ -61,3 +61,12 @@ export const delConfig = (id: string | number | Array<string | number>) => {
     method: 'delete'
   });
 };
+/**
+ * 查询赛事配置下拉列表
+ */
+export const selectTournamentConfigSelList = (): AxiosPromise<ConfigVO> => {
+  return request({
+    url: '/business/tournamentConfig/selectTournamentConfigSelList',
+    method: 'get'
+  });
+};

+ 2 - 0
src/api/system/business/tournaments/types.ts

@@ -100,6 +100,8 @@ export interface TournamentsForm extends BaseEntity {
    */
   name?: string;
 
+  configId?: number;
+
   /**
    * 比赛开始时间
    */

+ 1 - 0
src/api/system/business/tournamentsTemplate/types.ts

@@ -186,6 +186,7 @@ export interface TournamentsForm extends BaseEntity {
   tagId?: number[];
   categoryId?: number[];
   remark?: string;
+  configId?: number;
 }
 
 export interface ItemsPrize {

+ 38 - 8
src/views/system/business/tournaments/index.vue

@@ -291,10 +291,15 @@
     </el-dialog>-->
     <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body @close="cancel">
       <el-form ref="tournamentsFormRef" :model="form" :rules="rules" label-width="120px">
-        <el-form-item label="比赛项目" prop="gameVariant">
+        <!--        <el-form-item label="比赛项目" prop="gameVariant">
           <el-select aria-required="true" v-model="form.gameVariant" placeholder="请选择" :disabled="dialog.mode === 'view'">
             <el-option v-for="dict in game_variant_type" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
           </el-select>
+        </el-form-item>-->
+        <el-form-item label="比赛配置" prop="configId">
+          <el-select v-model="form.configId" placeholder="选项" :disabled="dialog.mode === 'view'">
+            <el-option v-for="item in configOptions" :key="item.id" :label="item.label" :value="item.id" />
+          </el-select>
         </el-form-item>
         <el-form-item label="比赛类型" prop="gameType">
           <el-select aria-required="true" v-model="form.gameType" placeholder="请选择" :disabled="dialog.mode === 'view'">
@@ -440,9 +445,9 @@
             :disabled="dialog.mode === 'view'"
           />
         </el-form-item>
-        <el-form-item label="开赛最低人数" prop="minPlayers">
+        <!--        <el-form-item label="开赛最低人数" prop="minPlayers">
           <el-input v-model="form.minPlayers" placeholder="请输入开赛最低人数" :disabled="dialog.mode === 'view'" />
-        </el-form-item>
+        </el-form-item>-->
         <!-- 盲注表 -->
         <el-form-item label="盲注等级" prop="blindStructureId">
           <div style="display: flex; align-items: center">
@@ -546,12 +551,12 @@
             <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="延迟卡时间" prop="delayCardTime" v-if="form.isDelay === 1">
+        <!--        <el-form-item label="延迟卡时间" prop="delayCardTime" v-if="form.isDelay === 1">
           <el-input v-model="form.delayCardTime" placeholder="请输入延迟卡时间" :disabled="dialog.mode === 'view'" />
-        </el-form-item>
-        <el-form-item label="延迟卡数量" prop="delayCardNum" v-if="form.isDelay === 1">
+        </el-form-item>-->
+        <!--        <el-form-item label="延迟卡数量" prop="delayCardNum" v-if="form.isDelay === 1">
           <el-input v-model="form.delayCardNum" placeholder="请输入延迟卡数量" :disabled="dialog.mode === 'view'" />
-        </el-form-item>
+        </el-form-item>-->
         <el-form-item label="重复买入" prop="rebuy">
           <div style="display: flex; align-items: center; gap: 10px; width: 100%">
             <el-select v-model="form.rebuy" placeholder="请选择" :disabled="dialog.mode === 'view'" style="flex: 1">
@@ -579,7 +584,6 @@
             <el-select v-model="form.itemsId" placeholder="请选择道具类型" :disabled="dialog.mode === 'view'" style="flex: 1">
               <el-option v-for="item in itemOptions" :key="item.id" :label="item.label" :value="item.id" />
             </el-select>
-
             <el-form-item prop="itemsNum" style="margin-bottom: 0; flex: 1">
               <el-input v-model.number="form.itemsNum" placeholder="数量" :disabled="dialog.mode === 'view'" style="width: 100%" />
             </el-form-item>
@@ -787,6 +791,7 @@ import { selectItemsSelList } from '@/api/system/business/items';
 import { selectBlindLevelsById } from '@/api/system/business/levels';
 import { selectBlingStructuresInfo } from '@/api/system/business/structures';
 import { listClaims, deleteClaim, auditSendReward } from '@/api/system/business/claims';
+import { selectTournamentConfigSelList } from '@/api/system/business/tournamentConfig';
 import { TournamentsVO, TournamentsQuery, TournamentsForm, TournamentsBindStructuresVO } from '@/api/system/business/tournaments/types';
 import { ref } from 'vue';
 import LevelsIndex from '@/views/system/business/levels/index.vue';
@@ -1066,6 +1071,7 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
     id: [{ required: true, message: '不能为空', trigger: 'blur' }],
     name: [{ required: true, message: '赛事名称不能为空', trigger: 'blur' }],
     startTime: [{ required: true, message: '比赛开始时间不能为空', trigger: 'blur' }],
+    configId: [{ required: true, message: '不能为空', trigger: 'blur' }],
     gameType: [{ required: true, message: '游戏类型不能为空', trigger: 'change' }],
     gameVariant: [{ required: true, message: '玩法类型不能为空', trigger: 'change' }],
     qualifierType: [{ required: true, message: '晋级条件类型不能为空', trigger: 'change' }],
@@ -1537,6 +1543,7 @@ onMounted(() => {
 
   loadTagOptions();
   loadCategoryOptions();
+  loadConfigOptions();
 });
 
 async function getAssignList() {
@@ -2153,6 +2160,29 @@ const getGameVariantText = (value: string | number | null | undefined): string =
       return '未知';
   }
 };
+// 下拉选项数据 selectBlingStructuresInfo
+const configOptions = ref<{ id: number; label: string }[]>([]);
+
+// 加载报名条件选项
+const loadConfigOptions = async () => {
+  try {
+    const res = await selectTournamentConfigSelList();
+    if (res.code === 200) {
+      // 类型断言
+      const data = res.data as unknown as { id: number; name: string }[];
+      // 过滤掉 id === 2 的项,并映射为 { id, label }
+      configOptions.value = data.map((item) => ({
+        id: item.id,
+        label: item.name
+      }));
+    } else {
+      ElMessage.error('加载失败:' + res.msg);
+    }
+  } catch (error) {
+    console.error('请求出错:', error);
+    ElMessage.error('请求失败,请检查网络');
+  }
+};
 </script>
 <style scoped>
 .more-rewards {

+ 35 - 5
src/views/system/business/tournamentsTemplate/index.vue

@@ -160,10 +160,15 @@
     </el-card>
     <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body @close="cancel">
       <el-form ref="tournamentsFormRef" :model="form" :rules="rules" label-width="120px">
-        <el-form-item label="比赛项目" prop="gameVariant">
+<!--        <el-form-item label="比赛项目" prop="gameVariant">
           <el-select aria-required="true" v-model="form.gameVariant" placeholder="请选择" :disabled="dialog.mode === 'view'">
             <el-option v-for="dict in game_variant_type" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
           </el-select>
+        </el-form-item>-->
+        <el-form-item label="比赛配置" prop="configId">
+          <el-select v-model="form.configId" placeholder="选项" :disabled="dialog.mode === 'view'">
+            <el-option v-for="item in configOptions" :key="item.id" :label="item.label" :value="item.id" />
+          </el-select>
         </el-form-item>
         <el-form-item label="比赛类型" prop="gameType">
           <el-select aria-required="true" v-model="form.gameType" placeholder="请选择" :disabled="dialog.mode === 'view'">
@@ -308,9 +313,9 @@
             :disabled="dialog.mode === 'view'"
           />
         </el-form-item>-->
-        <el-form-item label="最小参赛人数" prop="minPlayers">
+<!--        <el-form-item label="最小参赛人数" prop="minPlayers">
           <el-input v-model="form.minPlayers" placeholder="请输入最小参赛人数" :disabled="dialog.mode === 'view'" />
-        </el-form-item>
+        </el-form-item>-->
         <!-- 盲注表 -->
         <el-form-item label="盲注等级" prop="blindStructureId">
           <div style="display: flex; align-items: center">
@@ -389,12 +394,12 @@
             <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="延迟卡时间" prop="delayCardTime" v-if="form.isDelay === 1">
+<!--        <el-form-item label="延迟卡时间" prop="delayCardTime" v-if="form.isDelay === 1">
           <el-input v-model="form.delayCardTime" placeholder="请输入延迟卡时间" :disabled="dialog.mode === 'view'" />
         </el-form-item>
         <el-form-item label="延迟卡数量" prop="delayCardNum" v-if="form.isDelay === 1">
           <el-input v-model="form.delayCardNum" placeholder="请输入延迟卡数量" :disabled="dialog.mode === 'view'" />
-        </el-form-item>
+        </el-form-item>-->
         <el-form-item label="重复买入" prop="rebuy">
           <div style="display: flex; align-items: center; gap: 10px; width: 100%">
             <el-select v-model="form.rebuy" placeholder="请选择" :disabled="dialog.mode === 'view'" style="flex: 1">
@@ -557,6 +562,7 @@ import LevelsIndex from '@/views/system/business/levels/index.vue';
 import { ElSelect } from 'element-plus';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 import { selectTagSelList, selectCategorySelList } from '@/api/system/business/tag';
+import { selectTournamentConfigSelList } from '@/api/system/business/tournamentConfig';
 const { tournaments_type, tournaments_time, tournaments_status, game_variant_type, qualifier_type } = toRefs<any>(
   proxy?.useDict('tournaments_type', 'tournaments_time', 'tournaments_status', 'game_variant_type', 'qualifier_type')
 );
@@ -1208,6 +1214,7 @@ onMounted(() => {
   loadSelectData('');
   loadTagOptions();
   loadCategoryOptions();
+  loadConfigOptions();
 });
 
 async function getAssignList() {
@@ -1643,6 +1650,29 @@ const submitGenerateForm = () => {
     }
   });
 };
+// 下拉选项数据 selectBlingStructuresInfo
+const configOptions = ref<{ id: number; label: string }[]>([]);
+
+// 加载报名条件选项
+const loadConfigOptions = async () => {
+  try {
+    const res = await selectTournamentConfigSelList();
+    if (res.code === 200) {
+      // 类型断言
+      const data = res.data as unknown as { id: number; name: string }[];
+      // 过滤掉 id === 2 的项,并映射为 { id, label }
+      configOptions.value = data.map((item) => ({
+        id: item.id,
+        label: item.name
+      }));
+    } else {
+      ElMessage.error('加载失败:' + res.msg);
+    }
+  } catch (error) {
+    console.error('请求出错:', error);
+    ElMessage.error('请求失败,请检查网络');
+  }
+};
 </script>
 <style scoped>
 .more-rewards {