|
@@ -4,18 +4,29 @@
|
|
|
<div v-show="showSearch" class="mb-[10px]">
|
|
|
<el-card shadow="hover">
|
|
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
|
|
- <el-form-item label="赛事组别" prop="groupName">
|
|
|
- <el-input v-model="queryParams.groupName" placeholder="请输入组名" clearable @keyup.enter="handleQuery" />
|
|
|
+ <el-form-item label="项目类型" prop="projectTypeFilter">
|
|
|
+ <el-select v-model="projectTypeFilter" placeholder="请选择项目类型" clearable @change="handleProjectTypeFilterChange">
|
|
|
+ <el-option
|
|
|
+ v-for="dict in game_project_type"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
|
- <!-- <el-form-item label="包含项目列表" prop="projectList">
|
|
|
- <el-input v-model="queryParams.projectList" placeholder="请输入包含项目列表" clearable @keyup.enter="handleQuery" />
|
|
|
- </el-form-item> -->
|
|
|
- <!-- <el-form-item label="排序字段" prop="sortOrder">
|
|
|
- <el-input v-model="queryParams.sortOrder" placeholder="请输入排序字段" clearable @keyup.enter="handleQuery" />
|
|
|
+ <el-form-item label="项目" prop="projectId">
|
|
|
+ <el-select v-model="queryParams.projectId" placeholder="请选择项目" clearable>
|
|
|
+ <el-option
|
|
|
+ v-for="project in filteredProjectList"
|
|
|
+ :key="project.projectId"
|
|
|
+ :label="project.projectName"
|
|
|
+ :value="project.projectId"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="组别" prop="groupName">
|
|
|
+ <el-input v-model="queryParams.groupName" placeholder="请输入组别名称" clearable @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="排序规则(0升序1降序)" prop="sortRule">
|
|
|
- <el-input v-model="queryParams.sortRule" placeholder="请输入排序规则(0升序1降序)" clearable @keyup.enter="handleQuery" />
|
|
|
- </el-form-item> -->
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
|
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
|
@@ -50,17 +61,38 @@
|
|
|
|
|
|
<el-table v-loading="loading" border :data="gameEventGroupList" @selection-change="handleSelectionChange">
|
|
|
<el-table-column type="selection" width="55" align="center" />
|
|
|
- <el-table-column label="主键" align="center" prop="groupId" v-if="columns[0].visible" />
|
|
|
- <!-- <el-table-column label="赛事ID" align="center" prop="eventId" /> -->
|
|
|
- <el-table-column label="组别" align="center" prop="groupName" v-if="columns[1].visible" />
|
|
|
- <el-table-column label="包含项目" align="center" prop="projectList" v-if="columns[2].visible" />
|
|
|
- <el-table-column label="成员性别" align="center" prop="memberGender" v-if="columns[3].visible">
|
|
|
+ <el-table-column label="组别id" align="center" prop="groupId" v-if="columns[0].visible" />
|
|
|
+ <el-table-column label="项目类型" align="center" v-if="columns[1].visible">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :options="game_project_type" :value="getProjectTypeByProjectId(scope.row.projectId) || ''" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="项目" align="center" v-if="columns[2].visible">
|
|
|
<template #default="scope">
|
|
|
- {{ genderMap[scope.row.memberGender] || '未知' }}
|
|
|
+ {{ getProjectNameByProjectId(scope.row.projectId) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="组别" align="center" prop="groupName" v-if="columns[3].visible" />
|
|
|
+ <el-table-column label="人/组" align="center" prop="personNum" v-if="columns[4].visible" />
|
|
|
+ <el-table-column label="组数" align="center" prop="includeGroupNum" v-if="columns[5].visible" />
|
|
|
+ <el-table-column label="道数" align="center" prop="trackNum" v-if="columns[6].visible" />
|
|
|
+ <el-table-column label="场地数量" align="center" prop="fieldNum" v-if="columns[7].visible" />
|
|
|
+ <el-table-column label="每组用时(分钟)" align="center" prop="duration" v-if="columns[8].visible" />
|
|
|
+ <el-table-column label="比赛时间" align="center" v-if="columns[9].visible">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ scope.row.beginTime }} - {{ scope.row.endTime }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="成员性别" align="center" prop="memberGender" v-if="columns[10].visible">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :options="sys_user_sex" :value="scope.row.memberGender" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
|
|
<template #default="scope">
|
|
|
+ <el-tooltip content="分组" placement="top">
|
|
|
+ <el-button link type="success" icon="Grid" @click="handleGroup(scope.row)" v-hasPermi="['system:gameEventGroup:edit']"></el-button>
|
|
|
+ </el-tooltip>
|
|
|
<el-tooltip content="修改" placement="top">
|
|
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:gameEventGroup:edit']"></el-button>
|
|
|
</el-tooltip>
|
|
@@ -73,31 +105,125 @@
|
|
|
|
|
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
</el-card>
|
|
|
+
|
|
|
<!-- 添加或修改赛事分组对话框 -->
|
|
|
- <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
|
|
|
- <el-form ref="gameEventGroupFormRef" :model="form" :rules="rules" label-width="80px">
|
|
|
- <el-form-item label="组名" prop="groupName">
|
|
|
- <el-input v-model="form.groupName" placeholder="请输入组名" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="包含项目" prop="projectList">
|
|
|
- <el-transfer
|
|
|
- v-model="form.selectedProjects"
|
|
|
- :data="gameEventProjectList"
|
|
|
- :titles="['可选项目', '已选项目']"
|
|
|
- :button-texts="['移除', '添加']"
|
|
|
- filterable
|
|
|
- style="width: 100%"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="成员性别" prop="memberGender">
|
|
|
- <el-select v-model="form.memberGender" placeholder="请选择性别">
|
|
|
- <el-option label="不分男女" value="0"></el-option>
|
|
|
- <el-option label="男" value="1"></el-option>
|
|
|
- <el-option label="女" value="2"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
+ <el-dialog :title="dialog.title" v-model="dialog.visible" width="900px" append-to-body>
|
|
|
+ <el-form ref="gameEventGroupFormRef" :model="form" :rules="rules" label-width="120px">
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="项目类型" prop="projectTypeFilter">
|
|
|
+ <el-select
|
|
|
+ v-model="formProjectTypeFilter"
|
|
|
+ placeholder="请选择项目类型"
|
|
|
+ style="width: 100%"
|
|
|
+ @change="handleFormProjectTypeFilterChange"
|
|
|
+ :disabled="!!form.groupId"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in game_project_type"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="项目" prop="projectId">
|
|
|
+ <el-select
|
|
|
+ v-model="form.projectId"
|
|
|
+ placeholder="请选择项目"
|
|
|
+ style="width: 100%"
|
|
|
+ @change="handleFormProjectChange"
|
|
|
+ :disabled="!formProjectTypeFilter || !!form.groupId"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="project in filteredFormProjectList"
|
|
|
+ :key="project.projectId"
|
|
|
+ :label="project.projectName"
|
|
|
+ :value="project.projectId"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="组别名称" prop="groupName">
|
|
|
+ <el-input v-model="form.groupName" placeholder="请输入组别名称" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="成员性别" prop="memberGender">
|
|
|
+ <el-select v-model="form.memberGender" placeholder="请选择性别" style="width: 100%">
|
|
|
+ <el-option
|
|
|
+ v-for="dict in sys_user_sex"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="人/组" prop="personNum">
|
|
|
+ <el-input-number v-model="form.personNum" :min="1" placeholder="请输入每组人数" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="组数" prop="includeGroupNum">
|
|
|
+ <el-input-number v-model="form.includeGroupNum" :min="1" placeholder="请输入组数" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="道数" prop="trackNum">
|
|
|
+ <el-input-number v-model="form.trackNum" :min="1" placeholder="请输入道数" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="场地数量" prop="fieldNum">
|
|
|
+ <el-input-number v-model="form.fieldNum" :min="1" placeholder="请输入场地数量" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="每组用时(分钟)" prop="duration">
|
|
|
+ <el-input-number v-model="form.duration" :min="1" placeholder="请输入每组用时" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="组别开始时间" prop="beginTime">
|
|
|
+ <el-time-picker
|
|
|
+ v-model="form.beginTime"
|
|
|
+ placeholder="选择开始时间"
|
|
|
+ format="HH:mm"
|
|
|
+ value-format="HH:mm"
|
|
|
+ style="width: 100%"
|
|
|
+ :disabled="!form.projectId"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="预计结束时间" prop="endTime">
|
|
|
+ <el-input v-model="calculatedEndTime" placeholder="自动计算" disabled style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
<el-form-item label="备注" prop="remark">
|
|
|
- <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
|
|
|
+ <el-input v-model="form.remark" type="textarea" placeholder="请输入备注内容" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
@@ -111,22 +237,21 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup name="GameEventGroup" lang="ts">
|
|
|
-import { nextTick, ref, onMounted } from 'vue';
|
|
|
+import { nextTick, ref, onMounted, computed } from 'vue';
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
import { listGameEventGroup, getGameEventGroup, delGameEventGroup, addGameEventGroup, updateGameEventGroup } from '@/api/system/gameEventGroup';
|
|
|
import { listGameEventProject } from '@/api/system/gameEventProject';
|
|
|
import { GameEventGroupVO, GameEventGroupQuery, GameEventGroupForm } from '@/api/system/gameEventGroup/types';
|
|
|
+import { GameEventProjectVO } from '@/api/system/gameEventProject/types';
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
+const router = useRouter();
|
|
|
|
|
|
-// 性别映射
|
|
|
-const genderMap = {
|
|
|
- '0': '不分男女',
|
|
|
- '1': '男',
|
|
|
- '2': '女'
|
|
|
-};
|
|
|
+// 字典数据
|
|
|
+const { game_project_type, sys_user_sex } = toRefs<any>(proxy?.useDict('game_project_type', 'sys_user_sex'));
|
|
|
|
|
|
const gameEventGroupList = ref<GameEventGroupVO[]>([]);
|
|
|
-const gameEventProjectList = ref<Array<{ key: string; label: string }>>([]); // 赛事项目列表(用于穿梭框)
|
|
|
+const projectList = ref<GameEventProjectVO[]>([]);
|
|
|
const buttonLoading = ref(false);
|
|
|
const loading = ref(true);
|
|
|
const showSearch = ref(true);
|
|
@@ -135,12 +260,23 @@ const single = ref(true);
|
|
|
const multiple = ref(true);
|
|
|
const total = ref(0);
|
|
|
|
|
|
+// 项目类型过滤器(用于查询和表单,不存储在数据中)
|
|
|
+const projectTypeFilter = ref<string>('');
|
|
|
+const formProjectTypeFilter = ref<string>('');
|
|
|
+
|
|
|
// 列显隐数据
|
|
|
const columns = ref<FieldOption[]>([
|
|
|
- { key: 0, label: '主键', visible: false },
|
|
|
- { key: 1, label: '赛事组别', visible: true },
|
|
|
- { key: 2, label: '包含项目', visible: true },
|
|
|
- { key: 3, label: '成员性别', visible: true },
|
|
|
+ { key: 0, label: '组别id', visible: false },
|
|
|
+ { key: 1, label: '项目类型', visible: true },
|
|
|
+ { key: 2, label: '项目', visible: true },
|
|
|
+ { key: 3, label: '组别', visible: true },
|
|
|
+ { key: 4, label: '人/组', visible: true },
|
|
|
+ { key: 5, label: '组数', visible: true },
|
|
|
+ { key: 6, label: '道数', visible: true },
|
|
|
+ { key: 7, label: '场地数量', visible: true },
|
|
|
+ { key: 8, label: '每组用时(分钟)', visible: true },
|
|
|
+ { key: 9, label: '比赛时间', visible: true },
|
|
|
+ { key: 10, label: '成员性别', visible: true },
|
|
|
]);
|
|
|
|
|
|
const queryFormRef = ref<ElFormInstance>();
|
|
@@ -156,29 +292,86 @@ const initFormData: GameEventGroupForm = {
|
|
|
eventId: undefined,
|
|
|
groupName: undefined,
|
|
|
projectList: undefined,
|
|
|
- selectedProjects: [], // 添加已选项目列表
|
|
|
+ selectedProjects: [],
|
|
|
memberGender: undefined,
|
|
|
sortOrder: undefined,
|
|
|
sortRule: undefined,
|
|
|
status: undefined,
|
|
|
- remark: undefined
|
|
|
+ remark: undefined,
|
|
|
+ includeGroupNum: undefined,
|
|
|
+ projectId: undefined,
|
|
|
+ personNum: undefined,
|
|
|
+ beginTime: undefined,
|
|
|
+ endTime: undefined,
|
|
|
+ trackNum: undefined,
|
|
|
+ fieldNum: undefined,
|
|
|
+ duration: undefined
|
|
|
};
|
|
|
+
|
|
|
const data = reactive<PageData<GameEventGroupForm, GameEventGroupQuery>>({
|
|
|
form: { ...initFormData },
|
|
|
queryParams: {
|
|
|
pageNum: 1,
|
|
|
pageSize: 10,
|
|
|
- orderByColumn: '',
|
|
|
- isAsc: ''
|
|
|
+ orderByColumn: undefined,
|
|
|
+ isAsc: undefined,
|
|
|
+ projectId: undefined,
|
|
|
+ groupName: undefined
|
|
|
},
|
|
|
rules: {
|
|
|
- groupName: [{ required: true, message: '项目组名称不能为空', trigger: 'blur' }],
|
|
|
- memberGender: [{ required: true, message: '成员性别不能为空', trigger: 'change' }]
|
|
|
+ projectId: [{ required: true, message: '请选择项目', trigger: 'change' }],
|
|
|
+ groupName: [{ required: true, message: '组别名称不能为空', trigger: 'blur' }],
|
|
|
+ memberGender: [{ required: true, message: '成员性别不能为空', trigger: 'change' }],
|
|
|
+ personNum: [{ required: true, message: '每组人数不能为空', trigger: 'blur' }],
|
|
|
+ includeGroupNum: [{ required: true, message: '组数不能为空', trigger: 'blur' }],
|
|
|
+ trackNum: [{ required: true, message: '道数不能为空', trigger: 'blur' }],
|
|
|
+ fieldNum: [{ required: true, message: '场地数量不能为空', trigger: 'blur' }],
|
|
|
+ duration: [{ required: true, message: '每组用时不能为空', trigger: 'blur' }],
|
|
|
+ beginTime: [{ required: true, message: '开始时间不能为空', trigger: 'change' }]
|
|
|
}
|
|
|
});
|
|
|
|
|
|
const { queryParams, form, rules } = toRefs(data);
|
|
|
|
|
|
+// 过滤后的项目列表(用于查询)
|
|
|
+const filteredProjectList = computed(() => {
|
|
|
+ if (!projectTypeFilter.value) return projectList.value;
|
|
|
+ return projectList.value.filter(project => project.projectType === projectTypeFilter.value);
|
|
|
+});
|
|
|
+
|
|
|
+// 过滤后的项目列表(用于表单)
|
|
|
+const filteredFormProjectList = computed(() => {
|
|
|
+ if (!formProjectTypeFilter.value) return [];
|
|
|
+ return projectList.value.filter(project => project.projectType === formProjectTypeFilter.value);
|
|
|
+});
|
|
|
+
|
|
|
+// 根据项目ID获取项目类型
|
|
|
+const getProjectTypeByProjectId = (projectId: string | number) => {
|
|
|
+ if (!projectId) return '';
|
|
|
+ const project = projectList.value.find(p => p.projectId === projectId);
|
|
|
+ return project?.projectType || '';
|
|
|
+};
|
|
|
+
|
|
|
+// 根据项目ID获取项目名称
|
|
|
+const getProjectNameByProjectId = (projectId: string | number) => {
|
|
|
+ if (!projectId) return '';
|
|
|
+ const project = projectList.value.find(p => p.projectId === projectId);
|
|
|
+ return project?.projectName || '';
|
|
|
+};
|
|
|
+
|
|
|
+// 计算预计结束时间
|
|
|
+const calculatedEndTime = computed(() => {
|
|
|
+ if (!form.value.beginTime || !form.value.duration || !form.value.includeGroupNum) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+
|
|
|
+ const beginTime = new Date(`2000-01-01 ${form.value.beginTime}`);
|
|
|
+ const totalMinutes = form.value.duration * form.value.includeGroupNum;
|
|
|
+ const endTime = new Date(beginTime.getTime() + totalMinutes * 60 * 1000);
|
|
|
+
|
|
|
+ return endTime.toTimeString().slice(0, 5); // 返回 HH:mm 格式
|
|
|
+});
|
|
|
+
|
|
|
/** 查询赛事分组列表 */
|
|
|
const getList = async () => {
|
|
|
loading.value = true;
|
|
@@ -196,10 +389,33 @@ const getProjectList = async () => {
|
|
|
orderByColumn: '',
|
|
|
isAsc: ''
|
|
|
});
|
|
|
- gameEventProjectList.value = res.rows.map((item) => ({
|
|
|
- key: String(item.projectId),
|
|
|
- label: `${item.projectName}`
|
|
|
- }));
|
|
|
+ projectList.value = res.rows;
|
|
|
+};
|
|
|
+
|
|
|
+// 查询条件中项目类型变化
|
|
|
+const handleProjectTypeFilterChange = () => {
|
|
|
+ queryParams.value.projectId = undefined;
|
|
|
+};
|
|
|
+
|
|
|
+// 表单中项目类型变化
|
|
|
+const handleFormProjectTypeFilterChange = () => {
|
|
|
+ form.value.projectId = undefined;
|
|
|
+ form.value.beginTime = undefined;
|
|
|
+ form.value.endTime = undefined;
|
|
|
+ form.value.trackNum = undefined;
|
|
|
+ form.value.fieldNum = undefined;
|
|
|
+ form.value.duration = undefined;
|
|
|
+};
|
|
|
+
|
|
|
+// 表单中项目变化
|
|
|
+const handleFormProjectChange = () => {
|
|
|
+ if (form.value.projectId) {
|
|
|
+ const selectedProject = projectList.value.find(p => p.projectId === form.value.projectId);
|
|
|
+ if (selectedProject) {
|
|
|
+ // 可以在这里设置一些默认值或者进行其他处理
|
|
|
+ console.log('选中的项目:', selectedProject);
|
|
|
+ }
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
/** 取消按钮 */
|
|
@@ -211,6 +427,7 @@ const cancel = () => {
|
|
|
/** 表单重置 */
|
|
|
const reset = () => {
|
|
|
form.value = { ...initFormData };
|
|
|
+ formProjectTypeFilter.value = '';
|
|
|
gameEventGroupFormRef.value?.resetFields();
|
|
|
};
|
|
|
|
|
@@ -223,6 +440,7 @@ const handleQuery = () => {
|
|
|
/** 重置按钮操作 */
|
|
|
const resetQuery = () => {
|
|
|
queryFormRef.value?.resetFields();
|
|
|
+ projectTypeFilter.value = '';
|
|
|
handleQuery();
|
|
|
};
|
|
|
|
|
@@ -251,11 +469,12 @@ const handleUpdate = async (row?: GameEventGroupVO) => {
|
|
|
const res = await getGameEventGroup(_groupId);
|
|
|
Object.assign(form.value, res.data);
|
|
|
|
|
|
- // 处理项目列表,将逗号分隔的字符串转换为数组
|
|
|
- if (res.data.projectList) {
|
|
|
- form.value.selectedProjects = res.data.projectList.split(',');
|
|
|
- } else {
|
|
|
- form.value.selectedProjects = [];
|
|
|
+ // 根据项目ID设置项目类型过滤器
|
|
|
+ if (res.data.projectId) {
|
|
|
+ const project = projectList.value.find(p => p.projectId === res.data.projectId);
|
|
|
+ if (project) {
|
|
|
+ formProjectTypeFilter.value = project.projectType;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
dialog.visible = true;
|
|
@@ -270,17 +489,52 @@ const handleUpdate = async (row?: GameEventGroupVO) => {
|
|
|
const submitForm = () => {
|
|
|
gameEventGroupFormRef.value?.validate(async (valid: boolean) => {
|
|
|
if (valid) {
|
|
|
- buttonLoading.value = true;
|
|
|
- // 处理项目列表数据,将数组转换为逗号分隔的字符串
|
|
|
- const submitForm = { ...form.value };
|
|
|
- if (submitForm.selectedProjects && submitForm.selectedProjects.length > 0) {
|
|
|
- submitForm.projectList = submitForm.selectedProjects.join(',');
|
|
|
- } else {
|
|
|
- submitForm.projectList = '';
|
|
|
+ // 校验组数和道数的关系
|
|
|
+ if (form.value.includeGroupNum && form.value.trackNum && form.value.personNum) {
|
|
|
+ const totalCapacity = form.value.includeGroupNum * form.value.trackNum;
|
|
|
+ if (totalCapacity < form.value.personNum) {
|
|
|
+ const recommendedGroupNum = Math.ceil(form.value.personNum / form.value.trackNum);
|
|
|
+ proxy?.$modal.msgError(`组数过小请重新输入,推荐组数:${recommendedGroupNum}`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自动计算结束时间
|
|
|
+ if (form.value.beginTime && form.value.duration && form.value.includeGroupNum) {
|
|
|
+ const beginTime = new Date(`2000-01-01 ${form.value.beginTime}`);
|
|
|
+ const totalMinutes = form.value.duration * form.value.includeGroupNum;
|
|
|
+ const endTime = new Date(beginTime.getTime() + totalMinutes * 60 * 1000);
|
|
|
+ form.value.endTime = endTime.toTimeString().slice(0, 5);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证时间范围
|
|
|
+ if (form.value.beginTime && form.value.endTime) {
|
|
|
+ const beginTime = new Date(`2000-01-01 ${form.value.beginTime}`);
|
|
|
+ const endTime = new Date(`2000-01-01 ${form.value.endTime}`);
|
|
|
+
|
|
|
+ if (beginTime >= endTime) {
|
|
|
+ proxy?.$modal.msgError('组别结束时间必须晚于开始时间');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证组别时间是否在项目时间范围内
|
|
|
+ if (form.value.projectId) {
|
|
|
+ const selectedProject = projectList.value.find(p => p.projectId === form.value.projectId);
|
|
|
+ if (selectedProject && selectedProject.startTime && selectedProject.endTime) {
|
|
|
+ const projectStart = new Date(`2000-01-01 ${selectedProject.startTime}`);
|
|
|
+ const projectEnd = new Date(`2000-01-01 ${selectedProject.endTime}`);
|
|
|
+
|
|
|
+ if (beginTime < projectStart || endTime > projectEnd) {
|
|
|
+ proxy?.$modal.msgError('组别比赛时间必须在项目比赛时间范围内');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- // 删除selectedProjects属性,因为它不需要提交到后端
|
|
|
- delete submitForm.selectedProjects;
|
|
|
|
|
|
+ buttonLoading.value = true;
|
|
|
+ const submitForm = { ...form.value };
|
|
|
+
|
|
|
if (form.value.groupId) {
|
|
|
await updateGameEventGroup(submitForm).finally(() => (buttonLoading.value = false));
|
|
|
} else {
|
|
@@ -313,7 +567,13 @@ const handleExport = () => {
|
|
|
);
|
|
|
};
|
|
|
|
|
|
+/** 分组按钮操作 */
|
|
|
+const handleGroup = (row: GameEventGroupVO) => {
|
|
|
+ router.push({ path: '/system/gameEventGroup/detail', query: { id: row.groupId } });
|
|
|
+};
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
getList();
|
|
|
+ getProjectList();
|
|
|
});
|
|
|
</script>
|