|
|
@@ -63,22 +63,48 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="比赛场地" align="center" prop="location" v-if="columns[4].visible" />
|
|
|
- <el-table-column label="计算规则" align="center" prop="scoreRule" v-if="columns[5].visible">
|
|
|
+ <el-table-column label="参赛性别" align="center" width="80" prop="gender" v-if="columns[17]?.visible">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :options="sys_group_sex" :value="scope.row.gender || ''" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="参赛组别" align="center" width="120" prop="groups" v-if="columns[18]?.visible" />
|
|
|
+ <el-table-column label="比赛阶段" align="center" prop="gameStage" v-if="columns[13].visible">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :options="game_stage" :value="scope.row.gameStage || ''" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="比赛轮次" align="center" prop="gameRound" v-if="columns[12].visible">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :options="game_round" :value="scope.row.gameRound || ''" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="成绩类型" align="center" width="105" prop="scoreRule" v-if="columns[5].visible">
|
|
|
<template #default="scope">
|
|
|
<dict-tag :options="game_score_type" :value="scope.row.scoreRule || ''" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="开始时间" align="center" prop="startTime" width="180" v-if="columns[6].visible">
|
|
|
+ <el-table-column label="排名方式" align="center" width="150" prop="orderType" :show-overflow-tooltip="true" v-if="columns[11].visible">
|
|
|
+ <template #default="scope">
|
|
|
+ <template v-if="scope.row.orderType">
|
|
|
+ <dict-tag :options="game_order_type" :value="scope.row.orderType.split(',')" />
|
|
|
+ </template>
|
|
|
+ <span v-else>--</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="开始时间" align="center" sortable prop="startTime" width="180" v-if="columns[6].visible">
|
|
|
<template #default="scope">
|
|
|
<span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="结束时间" align="center" prop="endTime" width="180" v-if="columns[7].visible">
|
|
|
+ <el-table-column label="结束时间" align="center" sortable prop="endTime" width="180" v-if="columns[7].visible">
|
|
|
<template #default="scope">
|
|
|
<span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="裁判组" align="center" width="150" prop="refereeGroup" v-if="columns[8].visible">
|
|
|
+ <el-table-column label="录取名次" align="center" prop="roundType" v-if="columns[9].visible" />
|
|
|
+ <el-table-column label="积分分值" align="center" prop="scoreValue" :show-overflow-tooltip="true" v-if="columns[11].visible" />
|
|
|
+ <!-- <el-table-column label="裁判组" align="center" width="150" prop="refereeGroup" v-if="columns[8].visible">
|
|
|
<template #default="scope">
|
|
|
<el-button
|
|
|
v-if="scope.row.refereeGroups && scope.row.refereeGroups.size > 0"
|
|
|
@@ -90,46 +116,30 @@
|
|
|
</el-button>
|
|
|
<span v-else style="color: #999;">暂无裁判</span>
|
|
|
</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="参赛人数" align="center" prop="athleteCount" v-if="columns[14].visible">
|
|
|
+ </el-table-column> -->
|
|
|
+ <el-table-column label="参赛人数" align="center" sortable width="110" prop="athleteCount" v-if="columns[14].visible">
|
|
|
<template #default="scope">
|
|
|
<el-link type="primary" :underline="false" @click="handleViewStats(scope.row, 'athlete')">
|
|
|
{{ scope.row.athleteCount || 0 }}
|
|
|
</el-link>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="代表队数" align="center" prop="teamCount" v-if="columns[15].visible">
|
|
|
+ <el-table-column label="代表队数" align="center" sortable width="110" prop="teamCount" v-if="columns[15].visible">
|
|
|
<template #default="scope">
|
|
|
<el-link type="primary" :underline="false" @click="handleViewStats(scope.row, 'team')">
|
|
|
{{ scope.row.teamCount || 0 }}
|
|
|
</el-link>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="分组数" align="center" prop="groupCount" v-if="columns[16].visible">
|
|
|
+ <el-table-column label="分组数" align="center" sortable width="110" prop="groupCount" v-if="columns[16].visible">
|
|
|
<template #default="scope">
|
|
|
<el-link type="primary" :underline="false" @click="handleViewStats(scope.row, 'group')">
|
|
|
{{ scope.row.groupCount || 0 }}
|
|
|
</el-link>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="录取名次" align="center" prop="roundType" v-if="columns[9].visible" />
|
|
|
- <el-table-column label="排序方式" align="center" prop="orderType" v-if="columns[10].visible">
|
|
|
- <template #default="scope">
|
|
|
- {{ scope.row.orderType === '0' ? '升序' : '降序' }}
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="积分分值" align="center" prop="scoreValue" :show-overflow-tooltip="true" v-if="columns[11].visible" />
|
|
|
- <!-- <el-table-column label="奖项" align="center" prop="award" /> -->
|
|
|
- <el-table-column label="比赛轮次" align="center" prop="gameRound" v-if="columns[12].visible">
|
|
|
- <template #default="scope">
|
|
|
- <dict-tag :options="game_round" :value="scope.row.gameRound || ''" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="比赛阶段" align="center" prop="gameStage" v-if="columns[13].visible">
|
|
|
- <template #default="scope">
|
|
|
- <dict-tag :options="game_stage" :value="scope.row.gameStage || ''" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
+
|
|
|
+
|
|
|
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
|
|
|
<template #default="scope">
|
|
|
<el-tooltip content="修改" placement="top">
|
|
|
@@ -150,96 +160,220 @@
|
|
|
|
|
|
<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="500px" append-to-body>
|
|
|
- <el-form ref="gameEventProjectFormRef" :model="form" :rules="rules" label-width="90px">
|
|
|
- <el-form-item label="项目名称" prop="projectName">
|
|
|
- <el-input v-model="form.projectName" placeholder="请输入项目名称" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="项目类型" prop="projectType">
|
|
|
- <div style="display: flex; width: 100%">
|
|
|
- <el-select v-model="form.projectType" filterable clearable placeholder="请选择项目类型" style="flex: 1">
|
|
|
- <el-option v-for="dict in game_project_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-select>
|
|
|
- <el-button link type="primary" icon="Plus" style="margin-left: 5px; font-size: 18px" @click="handleAddProjectType" />
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="参赛性别" prop="gender">
|
|
|
- <el-select v-model="form.gender" placeholder="请选择参赛性别" clearable style="width: 100%">
|
|
|
- <el-option v-for="dict in sys_group_sex" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="参赛组别" prop="groups">
|
|
|
- <div style="display: flex; width: 100%; align-items: center">
|
|
|
- <el-select v-model="form.groups" multiple collapse-tags filterable placeholder="请选择参赛组别" style="flex: 1">
|
|
|
- <el-option v-for="item in rankGroupOptions" :key="item.rgId" :label="item.rgName" :value="item.rgId.toString()" />
|
|
|
- </el-select>
|
|
|
- <el-button link type="primary" icon="Plus" style="margin-left: 5px; font-size: 18px" @click="handleAddRankGroup" />
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="比赛场地" prop="location">
|
|
|
- <el-input v-model="form.location" placeholder="请输入比赛场地" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="归类" prop="classification">
|
|
|
- <el-radio-group v-model="form.classification" style="width: 100%">
|
|
|
- <el-radio v-for="dict in game_project_classification" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="比赛阶段" prop="gameStage">
|
|
|
- <el-radio-group v-model="form.gameStage" style="width: 100%">
|
|
|
- <el-radio v-for="dict in game_stage" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="比赛轮次" prop="gameRound">
|
|
|
- <el-radio-group v-model="form.gameRound" style="width: 100%">
|
|
|
- <el-radio v-for="dict in game_round" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="成绩类型" prop="scoreRule">
|
|
|
- <el-radio-group v-model="form.scoreRule" style="width: 100%">
|
|
|
- <el-radio v-for="dict in game_score_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="排名方式" prop="orderType">
|
|
|
- <el-radio-group v-model="form.orderType">
|
|
|
- <el-radio value="0">升序</el-radio>
|
|
|
- <el-radio value="1">降序</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="限报人数" prop="limitPerson">
|
|
|
- <template #label>
|
|
|
- <span>
|
|
|
- <el-tooltip content="项目限制报名的运动员数量,0表示不限。" placement="top">
|
|
|
- <el-icon>
|
|
|
- <question-filled />
|
|
|
- </el-icon>
|
|
|
- </el-tooltip>
|
|
|
- 限报人数</span>
|
|
|
- </template>
|
|
|
- <el-input-number v-model="form.limitPerson" :min="0" :max="100" size="small" controls-position="right" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="录取名次" prop="roundType">
|
|
|
- <el-input v-model="form.roundType" placeholder="请输入录取名次" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="积分分值" prop="scoreValue">
|
|
|
- <template #label>
|
|
|
- <span>
|
|
|
- <el-tooltip content="各值之间以英文逗号分隔" placement="top">
|
|
|
- <el-icon>
|
|
|
- <question-filled />
|
|
|
- </el-icon>
|
|
|
- </el-tooltip>
|
|
|
- 积分</span>
|
|
|
- </template>
|
|
|
- <el-input v-model="form.scoreValue" placeholder="请输入名次对应的积分" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="开始时间" prop="startTime">
|
|
|
- <el-date-picker clearable v-model="form.startTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开始时间">
|
|
|
- </el-date-picker>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="结束时间" prop="endTime">
|
|
|
- <el-date-picker clearable v-model="form.endTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择结束时间">
|
|
|
- </el-date-picker>
|
|
|
+ <el-dialog :title="dialog.title" v-model="dialog.visible" width="850px" append-to-body>
|
|
|
+ <el-form ref="gameEventProjectFormRef" :model="form" :rules="rules" label-width="100px">
|
|
|
+
|
|
|
+ <el-divider content-position="left">
|
|
|
+ <el-icon style="vertical-align: middle; margin-right: 5px;"><InfoFilled /></el-icon>
|
|
|
+ <span style="vertical-align: middle; font-weight: bold;">基础信息</span>
|
|
|
+ </el-divider>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="项目名称" prop="projectName">
|
|
|
+ <el-input v-model="form.projectName" placeholder="请输入项目名称" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="项目类型" prop="projectType">
|
|
|
+ <div style="display: flex; width: 100%; align-items: center">
|
|
|
+ <el-select v-model="form.projectType" filterable clearable placeholder="请选择项目类型" style="flex: 1">
|
|
|
+ <el-option v-for="dict in game_project_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ </el-select>
|
|
|
+ <el-button link type="primary" icon="Plus" style="margin-left: 5px; font-size: 18px" @click="handleAddProjectType" />
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="参赛性别" prop="gender">
|
|
|
+ <el-radio-group v-model="form.gender">
|
|
|
+ <el-radio v-for="dict in sys_group_sex" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="参赛组别" prop="groups">
|
|
|
+ <div style="display: flex; width: 100%; align-items: center">
|
|
|
+ <el-select v-model="form.groups" filterable placeholder="请选择参赛组别" style="flex: 1">
|
|
|
+ <el-option v-for="item in rankGroupOptions" :key="item.rgId" :label="item.rgName" :value="item.rgName" />
|
|
|
+ </el-select>
|
|
|
+ <el-button link type="primary" icon="Plus" style="margin-left: 5px; font-size: 18px" @click="handleAddRankGroup" />
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="项目归类" prop="classification">
|
|
|
+ <el-radio-group v-model="form.classification">
|
|
|
+ <el-radio v-for="dict in game_project_classification" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="比赛场地" prop="location">
|
|
|
+ <el-input v-model="form.location" placeholder="请输入比赛场地" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-divider content-position="left">
|
|
|
+ <el-icon style="vertical-align: middle; margin-right: 5px;"><Operation /></el-icon>
|
|
|
+ <span style="vertical-align: middle; font-weight: bold;">规则配置</span>
|
|
|
+ </el-divider>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="比赛阶段" prop="gameStage">
|
|
|
+ <el-radio-group v-model="form.gameStage">
|
|
|
+ <el-radio v-for="dict in game_stage" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="比赛轮次" prop="gameRound">
|
|
|
+ <el-radio-group v-model="form.gameRound">
|
|
|
+ <el-radio v-for="dict in game_round" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="24">
|
|
|
+ <div style="background-color: #f8f9fb; padding: 15px; border-radius: 8px; margin-bottom: 20px;">
|
|
|
+ <el-form-item label="成绩类型" prop="scoreRule">
|
|
|
+ <el-radio-group v-model="form.scoreRule" style="width: 100%">
|
|
|
+ <el-row :gutter="10" style="width: 100%">
|
|
|
+ <el-col :span="6"><el-radio value="1">计时类</el-radio></el-col>
|
|
|
+ <el-col :span="6"><el-radio value="2">距离类</el-radio></el-col>
|
|
|
+ <el-col :span="6"><el-radio value="3">单次计数</el-radio></el-col>
|
|
|
+ <el-col :span="6"><el-radio value="4">多次计数</el-radio></el-col>
|
|
|
+ <el-col :span="6"><el-radio value="5">排名类</el-radio></el-col>
|
|
|
+ <el-col :span="6"><el-radio value="6">远度距离</el-radio></el-col>
|
|
|
+ <el-col :span="6"><el-radio value="7">高度距离</el-radio></el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <!-- 子配置项 -->
|
|
|
+ <el-row v-if="form.scoreRule === '1' || ['2', '6', '7'].includes(form.scoreRule) || form.scoreRule === '3' || form.scoreRule === '4'">
|
|
|
+ <el-col :span="12" v-if="form.scoreRule === '1'">
|
|
|
+ <el-form-item label="计时格式" prop="timingFormat">
|
|
|
+ <el-radio-group v-model="form.timingFormat">
|
|
|
+ <el-radio value="0">00:00:00.000</el-radio>
|
|
|
+ <el-radio value="1">00:00.00</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12" v-if="['2', '6', '7'].includes(form.scoreRule)">
|
|
|
+ <el-form-item label="距离模式" prop="distanceMode">
|
|
|
+ <el-radio-group v-model="form.distanceMode">
|
|
|
+ <el-radio value="0">单轮最高</el-radio>
|
|
|
+ <el-radio value="1">双轮最高</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12" v-if="form.scoreRule === '3' || form.scoreRule === '4'">
|
|
|
+ <el-form-item label="计数单位" prop="countUnit">
|
|
|
+ <el-radio-group v-model="form.countUnit">
|
|
|
+ <el-radio label="个">个</el-radio>
|
|
|
+ <el-radio label="分">分</el-radio>
|
|
|
+ <el-radio label="环">环</el-radio>
|
|
|
+ <el-radio label="条">条</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12" v-if="form.scoreRule === '4'">
|
|
|
+ <el-form-item label="成绩数量" prop="scoreCount">
|
|
|
+ <el-input-number v-model="form.scoreCount" :min="1" :max="20" size="small" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-divider border-style="dashed" style="margin: 12px 0" />
|
|
|
+
|
|
|
+ <el-form-item label="排名方式">
|
|
|
+ <div class="order-type-combined">
|
|
|
+ <div class="order-row">
|
|
|
+ <span class="order-label">排序方向:</span>
|
|
|
+ <el-radio-group v-model="orderGroup.val1" clearable @change="handleOrderChange(1)">
|
|
|
+ <el-radio value="0" :disabled="orderGroup.val3 === '4'">升序(1...9)</el-radio>
|
|
|
+ <el-radio value="1" :disabled="orderGroup.val3 === '4'">降序(9...1)</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
+ <div class="order-row" v-if="form.scoreRule === '3'">
|
|
|
+ <span class="order-label">特殊规则:</span>
|
|
|
+ <el-radio-group v-model="orderGroup.val2" clearable @change="handleOrderChange(2)">
|
|
|
+ <el-radio value="2">失误次数A(1...9)</el-radio>
|
|
|
+ <el-radio value="3">失误次数B(9...1)</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
+ <div class="order-row" v-if="['2', '4', '6', '7'].includes(form.scoreRule)">
|
|
|
+ <span class="order-label">统计逻辑:</span>
|
|
|
+ <el-radio-group v-model="orderGroup.val3" clearable @change="handleOrderChange(3)">
|
|
|
+ <el-radio value="4">求和</el-radio>
|
|
|
+ <el-radio value="5">最大值</el-radio>
|
|
|
+ <el-radio value="6">最小值</el-radio>
|
|
|
+ <el-radio value="7">平均值</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-divider content-position="left">
|
|
|
+ <el-icon style="vertical-align: middle; margin-right: 5px;"><Calendar /></el-icon>
|
|
|
+ <span style="vertical-align: middle; font-weight: bold;">录取与时间</span>
|
|
|
+ </el-divider>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="录取名次" prop="roundType">
|
|
|
+ <el-input v-model="form.roundType" placeholder="请输入录取名次" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="限报人数" prop="limitPerson">
|
|
|
+ <template #label>
|
|
|
+ <span>
|
|
|
+ <el-tooltip content="单个项目限报人数,0为不限制" placement="top">
|
|
|
+ <el-icon style="cursor: pointer; color: #409eff; margin-right: 2px;"><QuestionFilled /></el-icon>
|
|
|
+ </el-tooltip>
|
|
|
+ 限报人数
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ <el-input-number v-model="form.limitPerson" :min="0" style="width: 100%" controls-position="right" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="积分分值" prop="scoreValue">
|
|
|
+ <template #label>
|
|
|
+ <span>
|
|
|
+ <el-tooltip content="名次对应积分,逗号分隔。如:10,8,6,5,4,3,2,1" placement="top">
|
|
|
+ <el-icon style="cursor: pointer; color: #409eff; margin-right: 2px;"><QuestionFilled /></el-icon>
|
|
|
+ </el-tooltip>
|
|
|
+ 积分分值
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ <el-input v-model="form.scoreValue" type="textarea" :rows="2" placeholder="请输入积分分值" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="开始时间" prop="startTime">
|
|
|
+ <el-date-picker clearable v-model="form.startTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="开始时间" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="结束时间" prop="endTime">
|
|
|
+ <el-date-picker clearable v-model="form.endTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="结束时间" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-divider content-position="left">
|
|
|
+ <el-icon style="vertical-align: middle; margin-right: 5px;"><EditPen /></el-icon>
|
|
|
+ <span style="vertical-align: middle; font-weight: bold;">其他</span>
|
|
|
+ </el-divider>
|
|
|
+ <el-form-item label="备注" prop="remark">
|
|
|
+ <el-input v-model="form.remark" type="textarea" placeholder="请输入备注内容" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -282,9 +416,9 @@ import StatsDetailDialog from './StatsDetailDialog.vue';
|
|
|
import { ElMessageBox } from 'element-plus';
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
-const { game_score_type, game_project_type, game_project_classification, game_round, game_stage, sys_group_sex } = toRefs<any>(proxy?.useDict('game_score_type', 'game_project_type', 'game_project_classification', 'game_round', 'game_stage', 'sys_group_sex'));
|
|
|
+const { game_score_type, game_project_type, game_project_classification, game_round, game_stage, sys_group_sex, game_order_type } = toRefs<any>(proxy?.useDict('game_score_type', 'game_project_type', 'game_project_classification', 'game_round', 'game_stage', 'sys_group_sex', 'game_order_type'));
|
|
|
|
|
|
-const gameEventGroupList = ref<any[]>([]); // ���·����б�
|
|
|
+const gameEventGroupList = ref<any[]>([]); // ·б
|
|
|
|
|
|
const gameEventProjectList = ref<GameEventProjectVO[]>([]);
|
|
|
const rankGroupOptions = ref<any[]>([]);
|
|
|
@@ -312,6 +446,13 @@ const refereeGroupDialogRef = ref<(InstanceType<typeof RefereeGroupDialog> & Ref
|
|
|
const projectLibraryDialog = ref<(InstanceType<typeof ProjectLibraryDialog> & ProjectLibraryDialogInstance) | null>(null);
|
|
|
const statsDetailDialogRef = ref<any>(null);
|
|
|
|
|
|
+// 排名方式组合逻辑
|
|
|
+const orderGroup = reactive({
|
|
|
+ val1: null as string | null,
|
|
|
+ val2: null as string | null,
|
|
|
+ val3: null as string | null
|
|
|
+});
|
|
|
+
|
|
|
const dialog = reactive<DialogOption>({
|
|
|
visible: false,
|
|
|
title: ''
|
|
|
@@ -330,12 +471,14 @@ const columns = ref<FieldOption[]>([
|
|
|
{ key: 8, label: '裁判组', visible: true },
|
|
|
{ key: 9, label: '录取名次', visible: true },
|
|
|
{ key: 10, label: '积分分值', visible: true },
|
|
|
- { key: 11, label: '排序方式', visible: true },
|
|
|
+ { key: 11, label: '排名方式', visible: true },
|
|
|
{ key: 12, label: '比赛轮次', visible: true },
|
|
|
{ key: 13, label: '比赛阶段', visible: true },
|
|
|
{ key: 14, label: '参赛人数', visible: true },
|
|
|
{ key: 15, label: '代表队数', visible: true },
|
|
|
- { key: 16, label: '分组数', visible: true }
|
|
|
+ { key: 16, label: '分组数', visible: true },
|
|
|
+ { key: 17, label: '参赛性别', visible: true },
|
|
|
+ { key: 18, label: '参赛组别', visible: true }
|
|
|
]);
|
|
|
|
|
|
const initFormData: GameEventProjectForm = {
|
|
|
@@ -353,15 +496,19 @@ const initFormData: GameEventProjectForm = {
|
|
|
limitPerson: 0,
|
|
|
roundType: undefined,
|
|
|
orderType: '0',
|
|
|
- scoreRule: undefined,
|
|
|
+ scoreRule: '1',
|
|
|
scoreValue: undefined,
|
|
|
award: undefined,
|
|
|
gameRound: undefined,
|
|
|
gameStage: undefined,
|
|
|
gender: undefined,
|
|
|
- groups: [],
|
|
|
+ groups: undefined,
|
|
|
status: '0',
|
|
|
- remark: undefined
|
|
|
+ remark: undefined,
|
|
|
+ timingFormat: '0',
|
|
|
+ distanceMode: '0',
|
|
|
+ countUnit: '个',
|
|
|
+ scoreCount: 1
|
|
|
};
|
|
|
const data = reactive<PageData<GameEventProjectForm, GameEventProjectQuery>>({
|
|
|
form: { ...initFormData },
|
|
|
@@ -377,6 +524,7 @@ const data = reactive<PageData<GameEventProjectForm, GameEventProjectQuery>>({
|
|
|
projectType: [{ required: true, message: '项目类型不能为空', trigger: 'change' }],
|
|
|
classification: [{ required: true, message: '归类不能为空', trigger: 'change' }],
|
|
|
orderType: [{ required: true, message: '排序方式不能为空', trigger: 'change' }],
|
|
|
+ scoreRule: [{ required: true, message: '成绩类型不能为空', trigger: 'change' }]
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -452,11 +600,15 @@ const handleUpdate = (row?: GameEventProjectVO) => {
|
|
|
const projectId = row?.projectId || ids.value.at(0);
|
|
|
getGameEventProject(projectId).then(response => {
|
|
|
Object.assign(form.value, response.data);
|
|
|
- // 将 groups 字符串转为数组以便多选回显
|
|
|
- if (typeof form.value.groups === 'string' && form.value.groups) {
|
|
|
- form.value.groups = form.value.groups.split(',');
|
|
|
- } else {
|
|
|
- form.value.groups = [];
|
|
|
+ // 处理排名方式回显
|
|
|
+ orderGroup.val1 = null; orderGroup.val2 = null; orderGroup.val3 = null;
|
|
|
+ if (form.value.orderType) {
|
|
|
+ const types = form.value.orderType.split(',');
|
|
|
+ types.forEach(t => {
|
|
|
+ if (['0', '1'].includes(t)) orderGroup.val1 = t;
|
|
|
+ if (['2', '3'].includes(t)) orderGroup.val2 = t;
|
|
|
+ if (['4', '5', '6', '7'].includes(t)) orderGroup.val3 = t;
|
|
|
+ });
|
|
|
}
|
|
|
dialog.visible = true;
|
|
|
dialog.title = '修改赛事项目';
|
|
|
@@ -469,11 +621,14 @@ const submitForm = (isContinue = false) => {
|
|
|
if (valid) {
|
|
|
buttonLoading.value = true;
|
|
|
const submitData = { ...form.value };
|
|
|
- // 提交前将 groups 数组转为逗号分隔字符串
|
|
|
- if (Array.isArray(submitData.groups)) {
|
|
|
- submitData.groups = submitData.groups.join(',');
|
|
|
- }
|
|
|
|
|
|
+ // 合并排名方式
|
|
|
+ const orderTypes = [];
|
|
|
+ if (orderGroup.val1) orderTypes.push(orderGroup.val1);
|
|
|
+ if (orderGroup.val2) orderTypes.push(orderGroup.val2);
|
|
|
+ if (orderGroup.val3) orderTypes.push(orderGroup.val3);
|
|
|
+ submitData.orderType = orderTypes.join(',');
|
|
|
+
|
|
|
if (submitData.projectId !== undefined) {
|
|
|
updateGameEventProject(submitData).then(response => {
|
|
|
proxy?.$modal.msgSuccess('修改成功');
|
|
|
@@ -500,6 +655,35 @@ const submitForm = (isContinue = false) => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+/** 监听成绩类型变化,重置子配置和排名方式建议 */
|
|
|
+watch(() => form.value.scoreRule, (newVal) => {
|
|
|
+ orderGroup.val1 = null; orderGroup.val2 = null; orderGroup.val3 = null;
|
|
|
+ if (newVal === '1') { // 计时类
|
|
|
+ form.value.timingFormat = '0';
|
|
|
+ orderGroup.val1 = '0'; // 计时通常升序
|
|
|
+ } else if (['2', '6', '7'].includes(newVal)) { // 距离相关类
|
|
|
+ form.value.distanceMode = '0';
|
|
|
+ orderGroup.val1 = '1'; // 距离通常降序
|
|
|
+ } else if (newVal === '3') { // 单次计数
|
|
|
+ form.value.countUnit = '个';
|
|
|
+ orderGroup.val1 = '1';
|
|
|
+ } else if (newVal === '4') { // 多次计数
|
|
|
+ form.value.countUnit = '个';
|
|
|
+ form.value.scoreCount = 1;
|
|
|
+ orderGroup.val3 = '4'; // 默认求和
|
|
|
+ } else if (newVal === '5') { // 排名类
|
|
|
+ orderGroup.val1 = '0';
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+/** 处理排名方式切换逻辑 */
|
|
|
+const handleOrderChange = (type: number) => {
|
|
|
+ if (type === 3 && orderGroup.val3 === '4') {
|
|
|
+ // 选中求和,清空第一层
|
|
|
+ orderGroup.val1 = null;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
/** 删除按钮操作 */
|
|
|
const handleDelete = (row?: GameEventProjectVO) => {
|
|
|
const projectIds = row?.projectId || ids.value;
|
|
|
@@ -651,3 +835,33 @@ onMounted(() => {
|
|
|
});
|
|
|
|
|
|
</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.order-type-combined {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+.order-row {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+.order-label {
|
|
|
+ font-size: 13px;
|
|
|
+ color: #606266;
|
|
|
+ width: 85px;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
+.order-divider {
|
|
|
+ margin: 0 10px;
|
|
|
+ color: #dcdfe6;
|
|
|
+}
|
|
|
+:deep(.el-divider__text) {
|
|
|
+ font-size: 15px;
|
|
|
+ color: #303133;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+:deep(.el-form-item__label) {
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+</style>
|