From 93eb6b470773bc49ea6e1a9d4cbd914eb95d525b Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期二, 30 九月 2025 17:38:04 +0800
Subject: [PATCH] feat: 完善比赛晋级功能并清理测试文件

---
 web/src/views/ActivityDetail.vue |   84 ++++++++++++++++++++++++++++++++---------
 1 files changed, 65 insertions(+), 19 deletions(-)

diff --git a/web/src/views/ActivityDetail.vue b/web/src/views/ActivityDetail.vue
index 7b33dda..886b867 100644
--- a/web/src/views/ActivityDetail.vue
+++ b/web/src/views/ActivityDetail.vue
@@ -21,8 +21,6 @@
           <el-descriptions-item label="鎶ュ悕鎴鏃堕棿">{{ formatDateTime(activity.signupDeadline) }}</el-descriptions-item>
           <el-descriptions-item label="姣旇禌寮�濮嬫椂闂�">{{ formatDateTime(activity.matchTime) }}</el-descriptions-item>
           <el-descriptions-item label="姣旇禌鍦板潃">{{ activity.address || '-' }}</el-descriptions-item>
-          <el-descriptions-item label="浜烘暟">{{ activity.playerMax || '-' }}</el-descriptions-item>
-          <el-descriptions-item label="褰撳墠鎶ュ悕浜烘暟">{{ activity.playerCount || 0 }}</el-descriptions-item>
           <el-descriptions-item label="璇勫垎妯℃澘">
             {{ activity.ratingScheme ? activity.ratingScheme.name : '-' }}
           </el-descriptions-item>
@@ -38,26 +36,17 @@
         <!-- 姣旇禌闃舵 -->
         <div v-if="activity.stages && activity.stages.length > 0" class="stages-section">
           <h3>姣旇禌闃舵</h3>
-          <el-table :data="activity.stages" style="width: 100%">
-            <el-table-column prop="name" label="闃舵鍚嶇О" min-width="150" />
+          <el-table :data="sortedStages" style="width: 100%" table-layout="auto">
+            <el-table-column prop="sortOrder" label="椤哄簭" width="80" align="center" />
+            <el-table-column prop="name" label="闃舵鍚嶇О" width="200" show-overflow-tooltip />
             <el-table-column prop="matchTime" label="寮�濮嬫椂闂�" width="180">
               <template #default="{ row }">
                 {{ formatDateTime(row.matchTime) }}
               </template>
             </el-table-column>
-            <el-table-column prop="address" label="鍦板潃" min-width="150">
+            <el-table-column prop="address" label="鍦板潃" min-width="120" show-overflow-tooltip>
               <template #default="{ row }">
                 {{ row.address || '-' }}
-              </template>
-            </el-table-column>
-            <el-table-column prop="playerMax" label="鏈�澶т汉鏁�" width="100">
-              <template #default="{ row }">
-                {{ row.playerMax || '-' }}
-              </template>
-            </el-table-column>
-            <el-table-column prop="playerCount" label="瀹為檯浜烘暟" width="100">
-              <template #default="{ row }">
-                {{ row.playerCount || 0 }}
               </template>
             </el-table-column>
             <el-table-column prop="stateName" label="鐘舵��" width="100">
@@ -65,11 +54,36 @@
                 <el-tag :type="getStateType(row.state)">{{ row.stateName }}</el-tag>
               </template>
             </el-table-column>
-            <el-table-column label="鎿嶄綔" width="200">
+            <el-table-column label="鎿嶄綔" width="220" fixed="right">
               <template #default="{ row }">
                 <el-button size="small" @click="viewStageDetail(row)">鏌ョ湅璇︽儏</el-button>
                 <el-button size="small" type="warning" @click="closeStage(row)" v-if="row.state === 1">鍏抽棴</el-button>
                 <el-button size="small" type="danger" @click="deleteStage(row)">鍒犻櫎</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+
+        <!-- 璇勫淇℃伅 -->
+        <div v-if="activity.judges && activity.judges.length > 0" class="judges-section">
+          <h3>璇勫淇℃伅</h3>
+          <el-table :data="activity.judges" style="width: 100%">
+            <el-table-column prop="name" label="璇勫濮撳悕" min-width="120" />
+            <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="150" />
+            <el-table-column prop="description" label="绠�浠�" min-width="200" show-overflow-tooltip />
+            <el-table-column label="璐熻矗闃舵" min-width="200">
+              <template #default="{ row }">
+                <el-tag 
+                  v-for="stageId in row.stageIds" 
+                  :key="stageId" 
+                  size="small" 
+                  style="margin-right: 5px;"
+                >
+                  {{ getStageName(stageId) }}
+                </el-tag>
+                <el-tag v-if="!row.stageIds || row.stageIds.length === 0" type="info" size="small">
+                  鍏ㄩ儴闃舵
+                </el-tag>
               </template>
             </el-table-column>
           </el-table>
@@ -96,7 +110,6 @@
           </el-descriptions-item>
           <el-descriptions-item label="寮�濮嬫椂闂�">{{ formatDateTime(selectedStage.matchTime) }}</el-descriptions-item>
           <el-descriptions-item label="鍦板潃">{{ selectedStage.address || '-' }}</el-descriptions-item>
-          <el-descriptions-item label="浜烘暟">{{ selectedStage.playerMax || '-' }}</el-descriptions-item>
           <el-descriptions-item label="璇勫垎妯℃澘">
             {{ selectedStage.ratingScheme ? selectedStage.ratingScheme.name : '缁ф壙姣旇禌妯℃澘' }}
           </el-descriptions-item>
@@ -112,7 +125,7 @@
 </template>
 
 <script setup>
-import { ref, onMounted } from 'vue'
+import { ref, onMounted, computed } from 'vue'
 import { useRouter, useRoute } from 'vue-router'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { getActivity } from '@/api/activity'
@@ -125,6 +138,16 @@
 const activity = ref(null)
 const stageDialogVisible = ref(false)
 const selectedStage = ref(null)
+
+// 璁$畻灞炴��
+const sortedStages = computed(() => {
+  if (!activity.value || !activity.value.stages) return []
+  return [...activity.value.stages].sort((a, b) => {
+    const orderA = a.sortOrder || 999
+    const orderB = b.sortOrder || 999
+    return orderA - orderB
+  })
+})
 
 // 鍔犺浇姣旇禌璇︽儏
 const loadActivity = async () => {
@@ -142,7 +165,7 @@
 
 // 鎿嶄綔澶勭悊
 const handleEdit = () => {
-  router.push(`/activity/form/${route.params.id}`)
+  router.push(`/activity/edit/${route.params.id}`)
 }
 
 const goBack = () => {
@@ -207,6 +230,20 @@
   }
 }
 
+const getStageName = (stageId) => {
+  if (!activity.value) return '鏈煡闃舵'
+  
+  // 鍙鏌ユ瘮璧涢樁娈�
+  if (activity.value.stages) {
+    const stage = activity.value.stages.find(s => s.id === stageId)
+    if (stage) {
+      return stage.name
+    }
+  }
+  
+  return '鏈煡闃舵'
+}
+
 // 鐢熷懡鍛ㄦ湡
 onMounted(() => {
   loadActivity()
@@ -253,6 +290,15 @@
   color: #303133;
 }
 
+.judges-section {
+  margin-top: 30px;
+}
+
+.judges-section h3 {
+  margin-bottom: 15px;
+  color: #303133;
+}
+
 .players-section {
   margin-top: 30px;
 }

--
Gitblit v1.8.0