Forráskód Böngészése

加赛事截止级别

wengan01 5 napja
szülő
commit
b69ee7b2e0

+ 11 - 0
src/api/system/physical/tournaments/index.ts

@@ -76,3 +76,14 @@ export const selectPhysicalTournamentsLeagueId = (): AxiosPromise<TournamentsVO[
     method: 'get'
   });
 };
+
+/**
+ * 发布赛事(草稿 → 已发布)
+ * @param id 赛事ID
+ */
+export const publishTournament = (id: string | number) => {
+  return request({
+    url: '/physical/tournaments/publishTournament/' + id,
+    method: 'put'
+  });
+};

+ 3 - 0
src/api/system/physical/tournaments/types.ts

@@ -11,6 +11,7 @@ export interface TournamentsVO {
   startingChips: number;
   levelDuration: number;
   startBlindLevel?: number;
+  endBlindLevel?: number;
   lateRegistrationLevel: number;
   maxPlayers: number;
   minPlayers: number;
@@ -56,6 +57,7 @@ export interface TournamentsForm extends BaseEntity {
   levelDuration?: number;
   lateRegistrationLevel?: number;
   startBlindLevel?: number;
+  endBlindLevel?: number;
   maxPlayers?: number;
   minPlayers?: number;
   conditionNote?: string;
@@ -135,4 +137,5 @@ export interface TournamentsQuery extends PageQuery {
   params?: any;
   leagueTournamentId?: string | number;
   isFace: number;
+  publishStatus?: number; // tab分类筛选:0=全部, 1=草稿, 2=已发布, 3=进行中, 4=已结束
 }

+ 93 - 6
src/views/system/physical/tournaments/index.vue

@@ -51,6 +51,14 @@
         </el-row>
       </template>
 
+      <el-tabs v-model="activeTab" @tab-change="handleTabChange" style="margin-bottom: 10px">
+        <el-tab-pane label="全部" name="0" />
+        <el-tab-pane label="草稿" name="1" />
+        <el-tab-pane label="已发布" name="2" />
+        <el-tab-pane label="进行中" name="3" />
+        <el-tab-pane label="已结束" name="4" />
+      </el-tabs>
+
       <el-table v-loading="loading" border :data="tournamentsList">
         <el-table-column label="比赛ID" align="center" prop="id" width="70" />
         <el-table-column label="比赛名" align="center" prop="name" />
@@ -104,7 +112,7 @@
           </template>
         </el-table-column>
         <el-table-column label="开始级别" align="center" prop="startBlindLevel" />
-        <el-table-column label="截止级别" align="center" prop="lateRegistrationLevel" />
+        <el-table-column label="报名截止级别" align="center" prop="lateRegistrationLevel" />
         <el-table-column label="盲注表" align="center" prop="blindStructuresName" />
         <el-table-column label="奖励" align="center">
           <template #default="scope">
@@ -158,6 +166,7 @@
                     删除
                   </el-dropdown-item>
                   <el-dropdown-item @click="handleCopy(scope.row)" v-hasPermi="['business:tournaments:query']">复制</el-dropdown-item>
+                  <el-dropdown-item @click="handlePublish(scope.row)" v-hasPermi="['physical:tournaments:edit']" :disabled="scope.row.status !== -1">发布</el-dropdown-item>
                   <el-dropdown-item @click="handleToggleShow(scope.row)" v-hasPermi="['physical:tournaments:edit']">
                     {{ scope.row.isShow === 1 ? '隐藏' : '展示' }}
                   </el-dropdown-item>
@@ -275,9 +284,28 @@
             <el-button type="primary" @click="handleViewLevels" :disabled="dialog.mode === 'view'">预览</el-button>
           </div>
         </el-form-item>
-        <!-- 报名截止至 -->
-        <el-form-item label="起始级别" prop="lateRegistrationLevel">
-          <el-select v-model="form.startBlindLevel" placeholder="选项" style="width: 200px" :disabled="dialog.mode === 'view'">
+        <!-- 起始级别 -->
+        <el-form-item label="起始级别" prop="startBlindLevel">
+          <el-select
+            v-model="form.startBlindLevel"
+            placeholder="选项"
+            style="width: 200px"
+            :disabled="dialog.mode === 'view'"
+            @change="handleStartBlindLevelChange"
+          >
+            <el-option v-for="item in itemOptionsStructuresLevel" :key="item.id" :label="item.label" :value="item.id" />
+          </el-select>
+        </el-form-item>
+        <!-- 截止级别:走完该级别后赛事自动完赛 -->
+        <el-form-item label="截止级别" prop="endBlindLevel">
+          <el-select
+            v-model="form.endBlindLevel"
+            placeholder="选项"
+            style="width: 200px"
+            :disabled="dialog.mode === 'view'"
+            clearable
+            :key="'end-' + form.blindStructureId"
+          >
             <el-option v-for="item in itemOptionsStructuresLevel" :key="item.id" :label="item.label" :value="item.id" />
           </el-select>
         </el-form-item>
@@ -473,7 +501,8 @@ import {
   addTournaments,
   updateTournaments,
   updateByTournament,
-  selectPhysicalTournamentsLeagueId
+  selectPhysicalTournamentsLeagueId,
+  publishTournament
 } from '@/api/system/physical/tournaments';
 import { TournamentsVO, TournamentsQuery, TournamentsForm } from '@/api/system/physical/tournaments/types';
 import { selectItemsSelList, selectXianXiaItemsSelList } from '@/api/system/business/items';
@@ -503,6 +532,7 @@ const ids = ref<Array<string | number>>([]);
 const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
+const activeTab = ref('0');
 
 const queryFormRef = ref<ElFormInstance>();
 const tournamentsFormRef = ref<ElFormInstance>();
@@ -528,6 +558,8 @@ const initFormData: TournamentsForm = {
   startingChips: undefined,
   levelDuration: undefined,
   lateRegistrationLevel: undefined,
+  startBlindLevel: undefined,
+  endBlindLevel: undefined,
   maxPlayers: undefined,
   minPlayers: undefined,
   rewardPlayers: undefined,
@@ -589,7 +621,8 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
     qualifierValue: undefined,
     params: {},
     leagueTournamentId: undefined, // ← 新增字段
-    startTimeOne: ''
+    startTimeOne: '',
+    publishStatus: 0
   },
   rules: {
     id: [{ required: true, message: '不能为空', trigger: 'blur' }],
@@ -597,6 +630,23 @@ const data = reactive<PageData<TournamentsForm, TournamentsQuery>>({
     startTime: [{ required: true, message: '比赛开始时间不能为空', trigger: 'blur' }],
     gameType: [{ required: true, message: '游戏类型不能为空', trigger: 'change' }],
     lateRegistrationLevel: [{ required: true, message: '截止报名级别不能为空', trigger: 'change' }],
+    endBlindLevel: [
+      {
+        validator: (rule: any, value: any, callback: any) => {
+          if (value === undefined || value === null || value === '') {
+            callback();
+            return;
+          }
+          const startLevel = data.form.startBlindLevel;
+          if (startLevel !== undefined && startLevel !== null && Number(value) <= Number(startLevel)) {
+            callback(new Error('截止级别必须大于起始级别'));
+          } else {
+            callback();
+          }
+        },
+        trigger: 'change'
+      }
+    ],
     leagueTournamentId: [{ required: true, message: '所属联赛不能为空', trigger: 'change' }],
     leagueTournamentRegionId: [{ required: true, message: '所属赛区不能为空', trigger: 'change' }],
     competitionIcon: [{ required: true, message: '比赛图标不能为空', trigger: 'change' }],
@@ -769,6 +819,8 @@ const resetQuery = () => {
   queryParams.value.name = '';
   queryParams.value.startTimeOne = '';
   queryParams.value.tournamentType = '';
+  queryParams.value.publishStatus = 0;
+  activeTab.value = '0';
   // 重置页码
   queryParams.value.pageNum = 1;
   // 直接执行搜索
@@ -1075,6 +1127,15 @@ const handleBlindStructureChange = async (value: number) => {
       if (currentLevel && !list.some((item) => item.id === currentLevel)) {
         data.form.lateRegistrationLevel = null;
       }
+      // 判断当前选择的 截止级别/起始级别 是否在新列表中
+      const currentEndLevel = data.form.endBlindLevel;
+      if (currentEndLevel && !list.some((item) => item.id === currentEndLevel)) {
+        data.form.endBlindLevel = null;
+      }
+      const currentStartLevel = data.form.startBlindLevel;
+      if (currentStartLevel && !list.some((item) => item.id === currentStartLevel)) {
+        data.form.startBlindLevel = null;
+      }
     } else {
       alert('加载失败:' + res.msg);
     }
@@ -1082,6 +1143,12 @@ const handleBlindStructureChange = async (value: number) => {
     console.error('请求出错:', error);
   }
 };
+// 起始级别变化时,重新校验截止级别(截止级别必须大于起始级别)
+const handleStartBlindLevelChange = () => {
+  if (form.value.endBlindLevel !== undefined && form.value.endBlindLevel !== null) {
+    tournamentsFormRef.value?.validateField('endBlindLevel').catch(() => {});
+  }
+};
 // 跳转到盲注表页面,并关闭当前弹窗
 const handleGoToStructures = () => {
   dialog.visible = false; // 关闭弹窗
@@ -1405,6 +1472,26 @@ const handleToggleShow = async (row: TournamentsVO) => {
     }
   }
 };
+/** 发布赛事 */
+const handlePublish = async (row: TournamentsVO) => {
+  try {
+    await proxy?.$modal.confirm(`确认要发布该赛事吗?发布后赛事将对用户可见。`);
+    await publishTournament(row.id);
+    proxy?.$modal.msgSuccess('发布成功');
+    await getList();
+  } catch (error) {
+    if (error !== 'cancel') {
+      console.error('发布失败:', error);
+      proxy?.$modal.msgError('发布失败,请重试');
+    }
+  }
+};
+/** tab 切换 */
+const handleTabChange = (tabName: string) => {
+  queryParams.value.publishStatus = Number(tabName);
+  queryParams.value.pageNum = 1;
+  getList();
+};
 /** 查询按钮操作 */
 const handleQueryItem = (row: TournamentsVO) => {
   // 跳转到线下报名记录页面