|
|
@@ -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) => {
|
|
|
// 跳转到线下报名记录页面
|