From 4fa9591629721797386fc11836e3a9deb69cd58c Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期三, 24 九月 2025 17:00:37 +0800
Subject: [PATCH] 修改评分逻辑,支持多个评委

---
 web/src/views/activity-player/rating.vue |  121 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 109 insertions(+), 12 deletions(-)

diff --git a/web/src/views/activity-player/rating.vue b/web/src/views/activity-player/rating.vue
index d21ea7b..d6aa53a 100644
--- a/web/src/views/activity-player/rating.vue
+++ b/web/src/views/activity-player/rating.vue
@@ -30,9 +30,13 @@
       <!-- 鍙充晶闈㈡澘锛氳瘎鍒嗚〃鍗� -->
       <div class="right-panel">
         <RatingForm 
-          v-if="detail.ratingForm"
-          :rating-form="detail.ratingForm"
+          v-if="ratingScheme"
+          :rating-form="ratingScheme"
           :activity-player-id="detail.id"
+          :current-judge-name="currentJudgeInfo?.name"
+          :judge-ratings="judgeRatings"
+          :average-score="averageScore"
+          :existing-rating="currentJudgeRating"
           @submit="handleRatingSubmit"
         />
         <div v-else class="no-rating">
@@ -51,7 +55,14 @@
 import { ref, onMounted } from 'vue'
 import { useRoute } from 'vue-router'
 import { ElMessage, ElSkeleton, ElEmpty } from 'element-plus'
-import { getActivityPlayerDetail, saveActivityPlayerRating } from '@/api/activityPlayer'
+import { 
+  getActivityPlayerDetail, 
+  saveActivityPlayerRating,
+  getJudgeRatingsForPlayer,
+  getCurrentJudgeRating,
+  getAverageScoreForPlayer,
+  getCurrentJudgeInfo
+} from '@/api/activityPlayer'
 import PlayerInfoCard from '@/components/PlayerInfoCard.vue'
 import SubmissionFiles from '@/components/SubmissionFiles.vue'
 import RatingForm from '@/components/RatingForm.vue'
@@ -59,16 +70,97 @@
 const route = useRoute()
 const loading = ref(true)
 const detail = ref(null)
+const ratingScheme = ref(null)
+const currentJudgeInfo = ref(null)
+const judgeRatings = ref([])
+const currentJudgeRating = ref(null)
+const averageScore = ref(0)
 
 const loadDetail = async () => {
   try {
     loading.value = true
-    const id = route.params.id
-    const response = await getActivityPlayerDetail(id)
+    const response = await getActivityPlayerDetail(route.params.id)
+    console.log('API鍝嶅簲:', response)
+    
+    // 妫�鏌ュ搷搴旀暟鎹粨鏋�
+    if (!response) {
+      throw new Error('API鍝嶅簲鏁版嵁涓虹┖')
+    }
+    
+    if (!response.activityPlayerDetail) {
+      throw new Error('鏈壘鍒伴�夋墜璇︽儏鏁版嵁')
+    }
+    
     detail.value = response.activityPlayerDetail
+    
+    // 浣跨敤浠庡悗绔幏鍙栫殑鐪熷疄璇勫垎妯℃澘鏁版嵁
+    if (detail.value.ratingForm) {
+      ratingScheme.value = {
+        schemeId: detail.value.ratingForm.schemeId,
+        schemeName: detail.value.ratingForm.schemeName,
+        items: detail.value.ratingForm.items || [],
+        totalMaxScore: detail.value.ratingForm.totalMaxScore || 0
+      }
+      console.log('浣跨敤鐪熷疄璇勫垎妯℃澘鏁版嵁:', ratingScheme.value)
+    } else {
+      console.warn('鏈壘鍒拌瘎鍒嗘ā鏉挎暟鎹紝浣跨敤榛樿妯℃澘')
+      // 濡傛灉娌℃湁璇勫垎妯℃澘鏁版嵁锛屼娇鐢ㄩ粯璁ゆā鏉�
+      ratingScheme.value = {
+        schemeId: "1",
+        schemeName: "榛樿璇勫垎鏍囧噯",
+        items: [
+          { id: "1", name: "缁煎悎璇勫垎", maxScore: 100, orderNo: 1 }
+        ],
+        totalMaxScore: 100
+      }
+    }
+
+    // 鑾峰彇褰撳墠璇勫淇℃伅
+    try {
+      const judgeInfoResponse = await getCurrentJudgeInfo()
+      console.log('璇勫淇℃伅鍝嶅簲:', judgeInfoResponse)
+      if (judgeInfoResponse && judgeInfoResponse.currentJudgeInfo) {
+        currentJudgeInfo.value = judgeInfoResponse.currentJudgeInfo
+      }
+    } catch (error) {
+      console.error('鑾峰彇璇勫淇℃伅澶辫触:', error)
+    }
+
+    // 鑾峰彇鎵�鏈夎瘎濮旇瘎鍒嗙姸鎬�
+    try {
+      const judgeRatingsResponse = await getJudgeRatingsForPlayer(route.params.id)
+      console.log('璇勫璇勫垎鐘舵�佸搷搴�:', judgeRatingsResponse)
+      if (judgeRatingsResponse && judgeRatingsResponse.judgeRatingsForPlayer) {
+        judgeRatings.value = judgeRatingsResponse.judgeRatingsForPlayer
+      }
+    } catch (error) {
+      console.error('鑾峰彇璇勫璇勫垎鐘舵�佸け璐�:', error)
+    }
+
+    // 鑾峰彇褰撳墠璇勫鐨勮瘎鍒�
+    try {
+      const currentRatingResponse = await getCurrentJudgeRating(route.params.id)
+      console.log('褰撳墠璇勫璇勫垎鍝嶅簲:', currentRatingResponse)
+      if (currentRatingResponse && currentRatingResponse.currentJudgeRating) {
+        currentJudgeRating.value = currentRatingResponse.currentJudgeRating
+      }
+    } catch (error) {
+      console.error('鑾峰彇褰撳墠璇勫璇勫垎澶辫触:', error)
+    }
+
+    // 鑾峰彇骞冲潎鍒�
+    try {
+      const averageScoreResponse = await getAverageScoreForPlayer(route.params.id)
+      console.log('骞冲潎鍒嗗搷搴�:', averageScoreResponse)
+      if (averageScoreResponse && averageScoreResponse.averageScoreForPlayer !== undefined) {
+        averageScore.value = averageScoreResponse.averageScoreForPlayer
+      }
+    } catch (error) {
+      console.error('鑾峰彇骞冲潎鍒嗗け璐�:', error)
+    }
   } catch (error) {
-    console.error('鍔犺浇鎶ュ悕璇︽儏澶辫触:', error)
-    ElMessage.error('鍔犺浇鎶ュ悕璇︽儏澶辫触')
+    console.error('鍔犺浇璇︽儏澶辫触:', error)
+    ElMessage.error('鍔犺浇璇︽儏澶辫触')
   } finally {
     loading.value = false
   }
@@ -78,13 +170,15 @@
   try {
     console.log('璇勫垎鎻愪氦:', ratingData)
     
-    // 鏋勯�犳彁浜ゆ暟鎹�
+    // 鏋勯�犳彁浜ゆ暟鎹� - 灏� scores 瀵硅薄杞崲涓� ratings 鏁扮粍
+    const ratings = Object.entries(ratingData.scores || {}).map(([itemId, score]) => ({
+      itemId: parseInt(itemId),
+      score: score
+    }))
+    
     const input = {
       activityPlayerId: detail.value.id,
-      ratings: ratingData.ratings.map(item => ({
-        itemId: item.itemId,
-        score: item.score
-      })),
+      ratings: ratings,
       comment: ratingData.comment || ''
     }
     
@@ -93,6 +187,9 @@
     
     if (result.saveActivityPlayerRating) {
       ElMessage.success('璇勫垎鎻愪氦鎴愬姛')
+      
+      // 閲嶆柊鍔犺浇鏁版嵁浠ユ洿鏂拌瘎鍒嗙姸鎬�
+      await loadDetail()
     } else {
       ElMessage.error('璇勫垎鎻愪氦澶辫触')
     }

--
Gitblit v1.8.0