Browse Source

feat(system): 完善赛事项目管理功能增加成绩类型配置

- 在GameEventProject类型定义中新增计时格式、距离模式、计数单位、成绩数量等字段
- 修改参赛队数字段注释为"代表队数"
- 在项目库对话框中添加参赛性别、比赛阶段、成绩类型等表格列
- 配置表格列显示参赛性别、比赛阶段、比赛轮次、成绩类型、排名方式等信息
- 在主页面index.vue中重构表单布局,添加分组标题和详细配置选项
- 实现成绩类型的详细配置,包括计时类、距离类、计数类等不同规则配置
- 添加排名方式的组合配置逻辑,支持排序方向、特殊规则、统计逻辑等多种组合
- 更新字典数据绑定,添加sys_group_sex和game_order_type字典
- 优化表格列排序和显示逻辑,修复搜索按钮布局问题
zhou 3 weeks ago
parent
commit
f01253fa01

+ 41 - 1
src/api/system/gameEventProject/types.ts

@@ -132,9 +132,29 @@ export interface GameEventProjectVO {
    */
   groupCount: number;
   /**
-   * 参赛队数
+   * 代表队数
    */
   teamCount: number;
+
+  /**
+   * 计时格式
+   */
+  timingFormat: string;
+
+  /**
+   * 距离模式
+   */
+  distanceMode: string;
+
+  /**
+   * 计数单位
+   */
+  countUnit: string;
+
+  /**
+   * 成绩数量
+   */
+  scoreCount: number;
 }
 
 export interface GameEventProjectForm extends BaseEntity {
@@ -257,6 +277,26 @@ export interface GameEventProjectForm extends BaseEntity {
    * 参赛组别(多选用数组,提交前转字符串)
    */
   groups?: string | string[];
+
+  /**
+   * 计时格式
+   */
+  timingFormat?: string;
+
+  /**
+   * 距离模式
+   */
+  distanceMode?: string;
+
+  /**
+   * 计数单位
+   */
+  countUnit?: string;
+
+  /**
+   * 成绩数量
+   */
+  scoreCount?: number;
 }
 
 export interface GameEventProjectQuery extends PageQuery {

+ 22 - 13
src/views/system/gameEventProject/ProjectLibraryDialog.vue

@@ -66,10 +66,10 @@
               />
             </el-select>
           </el-form-item>
-          <el-form-item>
+          <!-- <el-form-item>
             <el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
             <el-button icon="Refresh" @click="resetSearch">重置</el-button>
-          </el-form-item>
+          </el-form-item> -->
         </el-form>
       </div>
 
@@ -77,6 +77,7 @@
       <el-table
         v-loading="loading"
         :data="projectList"
+        row-key="projectId"
         @selection-change="handleSelectionChange"
         height="400"
         border
@@ -85,7 +86,7 @@
         <el-table-column label="项目名称" prop="projectName" min-width="120" />
         <el-table-column label="项目类型" prop="projectType" width="100">
           <template #default="scope">
-            <dict-tag :options="game_project_type" :value="scope.row.projectType || ''" />
+            <dict-tag :options="game_project_type" :value="scope.row.projectType || '-'" />
           </template>
         </el-table-column>
         <el-table-column label="归类" prop="classification" width="100">
@@ -94,29 +95,37 @@
           </template>
         </el-table-column>
         <el-table-column label="比赛场地" prop="location" min-width="120" />
-        <el-table-column label="计算规则" prop="scoreRule" width="100">
+        <el-table-column label="参赛性别" align="center" width="80" prop="gender">
+          <template #default="scope">
+            <dict-tag :options="sys_group_sex" :value="scope.row.gender || '-'" />
+          </template>
+        </el-table-column>
+        <el-table-column label="比赛阶段" prop="gameStage" width="100">
           <template #default="scope">
-            <dict-tag :options="game_score_type" :value="scope.row.scoreRule || ''" />
+            <dict-tag :options="game_stage" :value="scope.row.gameStage || '-'" />
           </template>
         </el-table-column>
         <el-table-column label="比赛轮次" prop="gameRound" width="100">
           <template #default="scope">
-            <dict-tag :options="game_round" :value="scope.row.gameRound || ''" />
+            <dict-tag :options="game_round" :value="scope.row.gameRound || '-'" />
           </template>
         </el-table-column>
-        <el-table-column label="比赛阶段" prop="gameStage" width="100">
+        <el-table-column label="成绩类型" prop="scoreRule" width="100">
           <template #default="scope">
-            <dict-tag :options="game_stage" :value="scope.row.gameStage || ''" />
+            <dict-tag :options="game_score_type" :value="scope.row.scoreRule || '-'" />
           </template>
         </el-table-column>
-        <el-table-column label="排序方式" prop="orderType" width="100">
+        <el-table-column label="排名方式" prop="orderType" :show-overflow-tooltip="true" width="100">
           <template #default="scope">
-            {{ scope.row.orderType === '0' ? '升序' : '降序' }}
+            <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="录取名次" prop="roundType" width="100" />
         <el-table-column label="积分分值" prop="scoreValue" width="120" />
-        <el-table-column label="来源赛事" prop="eventName" min-width="120" />
+        <el-table-column label="来源赛事" prop="eventName" min-width="120" :show-overflow-tooltip="true" />
       </el-table>
 
       <!-- 分页 -->
@@ -152,8 +161,8 @@ import { GameEventProjectVO, GameEventProjectQuery } from '@/api/system/gameEven
 import { GameEventVO } from '@/api/system/gameEvent/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { game_score_type, game_project_type, game_project_classification, game_round, game_stage } = toRefs<any>(
-  proxy?.useDict('game_score_type', 'game_project_type', 'game_project_classification', 'game_round', 'game_stage')
+const { sys_group_sex, game_score_type, game_project_type, game_project_classification, game_round, game_stage, game_order_type } = toRefs<any>(
+  proxy?.useDict('sys_group_sex','game_score_type', 'game_project_type', 'game_project_classification', 'game_round', 'game_stage', 'game_order_type')
 );
 
 const visible = ref(false);

+ 345 - 131
src/views/system/gameEventProject/index.vue

@@ -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>