From f04f35b562760afbac0c477357e2a29f77aec3b9 Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期四, 02 十月 2025 13:51:47 +0800
Subject: [PATCH] fix: 修复评审次数重复显示问题

---
 web/src/api/activityPlayer.js |  314 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 301 insertions(+), 13 deletions(-)

diff --git a/web/src/api/activityPlayer.js b/web/src/api/activityPlayer.js
index 4dd43eb..204ce15 100644
--- a/web/src/api/activityPlayer.js
+++ b/web/src/api/activityPlayer.js
@@ -1,18 +1,152 @@
-const GRAPHQL_ENDPOINT = '/api/graphql'
+import { 
+  mockActivityPlayerDetail, 
+  mockRatingScheme, 
+  mockCurrentJudgeInfo, 
+  mockJudgeRatings, 
+  mockCurrentJudgeRating, 
+  mockAverageScore,
+  createMockResponse 
+} from './mockData.js'
 
-async function graphqlRequest(query, variables = {}) {
-  const response = await fetch(GRAPHQL_ENDPOINT, {
-    method: 'POST',
-    headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify({ query, variables })
-  })
-  if (!response.ok) {
-    const text = await response.text()
-    throw new Error(`HTTP ${response.status}: ${text}`)
+import { API_CONFIG, graphqlRequest } from '@/config/api'
+
+// 妯℃嫙鏁版嵁寮�鍏� - 璁剧疆涓簍rue鏃朵娇鐢ㄦā鎷熸暟鎹�
+const USE_MOCK_DATA = false
+
+// GraphQL鏌ヨ璇彞
+const GET_ACTIVITY_PLAYERS_QUERY = `
+  query GetActivityPlayers($activityId: ID!, $page: Int!, $size: Int!, $name: String) {
+    activityPlayers(activityId: $activityId, page: $page, size: $size, name: $name) {
+      content {
+        id
+        playerId
+        activityId
+        signupTime
+        state
+        stateName
+        player {
+          id
+          name
+          phone
+          regionId
+          region {
+            id
+            name
+          }
+        }
+      }
+      totalElements
+      page
+      size
+    }
   }
-  const result = await response.json()
-  if (result.errors) throw new Error(result.errors.map(e => e.message).join('\n'))
-  return result.data
+`
+
+const GET_ACTIVITY_PLAYER_QUERY = `
+  query GetActivityPlayer($id: ID!) {
+    activityPlayer(id: $id) {
+      id
+      playerId
+      activityId
+      signupTime
+      state
+      stateName
+      player {
+        id
+        name
+        phone
+        regionId
+        region {
+          id
+          name
+        }
+      }
+      activity {
+        id
+        name
+        description
+      }
+      attachments {
+        id
+        fileName
+        fileUrl
+        fileSize
+        uploadTime
+      }
+    }
+  }
+`
+
+const SAVE_ACTIVITY_PLAYER_MUTATION = `
+  mutation SaveActivityPlayer($input: ActivityPlayerInput!) {
+    saveActivityPlayer(input: $input) {
+      id
+      playerId
+      activityId
+      signupTime
+      state
+      stateName
+    }
+  }
+`
+
+const DELETE_ACTIVITY_PLAYER_MUTATION = `
+  mutation DeleteActivityPlayer($id: ID!) {
+    deleteActivityPlayer(id: $id)
+  }
+`
+
+// API鍑芥暟
+export const getActivityPlayers = async (activityId, page = 0, size = 10, name = '') => {
+  if (USE_MOCK_DATA) {
+    return mockActivityPlayers
+  }
+  
+  try {
+    const data = await graphqlRequest(GET_ACTIVITY_PLAYERS_QUERY, { activityId, page, size, name })
+    return data.activityPlayers
+  } catch (error) {
+    throw new Error(error.message || '鑾峰彇姣旇禌鎶ュ悕鍒楄〃澶辫触')
+  }
+}
+
+export const getActivityPlayer = async (id) => {
+  if (USE_MOCK_DATA) {
+    return mockActivityPlayerDetail
+  }
+  
+  try {
+    const data = await graphqlRequest(GET_ACTIVITY_PLAYER_QUERY, { id })
+    return data.activityPlayer
+  } catch (error) {
+    throw new Error(error.message || '鑾峰彇姣旇禌鎶ュ悕璇︽儏澶辫触')
+  }
+}
+
+export const saveActivityPlayer = async (activityPlayerData) => {
+  if (USE_MOCK_DATA) {
+    return { ...activityPlayerData, id: Date.now().toString() }
+  }
+  
+  try {
+    const data = await graphqlRequest(SAVE_ACTIVITY_PLAYER_MUTATION, { input: activityPlayerData })
+    return data.saveActivityPlayer
+  } catch (error) {
+    throw new Error(error.message || '淇濆瓨姣旇禌鎶ュ悕澶辫触')
+  }
+}
+
+export const deleteActivityPlayer = async (id) => {
+  if (USE_MOCK_DATA) {
+    return true
+  }
+  
+  try {
+    const data = await graphqlRequest(DELETE_ACTIVITY_PLAYER_MUTATION, { id })
+    return data.deleteActivityPlayer
+  } catch (error) {
+    throw new Error(error.message || '鍒犻櫎姣旇禌鎶ュ悕澶辫触')
+  }
 }
 
 const GET_ACTIVITY_PLAYER_DETAIL = `
@@ -26,12 +160,21 @@
         description
         avatarUrl
       }
+      regionInfo {
+        id
+        name
+        fullPath
+      }
       activityName
+      projectName
       description
+      feedback
+      state
       submissionFiles {
         id
         name
         url
+        thumbUrl
         fileExt
         fileSize
         mediaType
@@ -55,6 +198,11 @@
  * 鑾峰彇姣旇禌鎶ュ悕璇︽儏锛堢敤浜庤瘎鍒嗭級
  */
 export function getActivityPlayerDetail(id) {
+  if (USE_MOCK_DATA) {
+    return Promise.resolve(createMockResponse({
+      activityPlayerDetail: mockActivityPlayerDetail
+    }))
+  }
   return graphqlRequest(GET_ACTIVITY_PLAYER_DETAIL, { id })
 }
 
@@ -68,5 +216,145 @@
  * 淇濆瓨姣旇禌鎶ュ悕璇勫垎
  */
 export function saveActivityPlayerRating(input) {
+  if (USE_MOCK_DATA) {
+    console.log('妯℃嫙淇濆瓨璇勫垎鏁版嵁:', input)
+    return Promise.resolve(createMockResponse({
+      saveActivityPlayerRating: true
+    }))
+  }
   return graphqlRequest(SAVE_ACTIVITY_PLAYER_RATING, { input })
+}
+
+const GET_JUDGE_RATINGS_FOR_PLAYER = `
+  query GetJudgeRatingsForPlayer($activityPlayerId: ID!) {
+    judgeRatingsForPlayer(activityPlayerId: $activityPlayerId) {
+      judgeId
+      judgeName
+      totalScore
+      status
+      isCurrentJudge
+    }
+  }
+`
+
+/**
+ * 鑾峰彇鎸囧畾閫夋墜鐨勬墍鏈夎瘎濮旇瘎鍒嗙姸鎬�
+ */
+export function getJudgeRatingsForPlayer(activityPlayerId) {
+  if (USE_MOCK_DATA) {
+    return Promise.resolve(createMockResponse({
+      judgeRatingsForPlayer: mockJudgeRatings
+    }))
+  }
+  return graphqlRequest(GET_JUDGE_RATINGS_FOR_PLAYER, { activityPlayerId })
+}
+
+const GET_CURRENT_JUDGE_RATING = `
+  query GetCurrentJudgeRating($activityPlayerId: ID!) {
+    currentJudgeRating(activityPlayerId: $activityPlayerId) {
+      id
+      totalScore
+      status
+      remark
+      items {
+        ratingItemId
+        ratingItemName
+        score
+        weightedScore
+      }
+    }
+  }
+`
+
+/**
+ * 鑾峰彇褰撳墠璇勫瀵规寚瀹氶�夋墜鐨勮瘎鍒�
+ */
+export function getCurrentJudgeRating(activityPlayerId) {
+  if (USE_MOCK_DATA) {
+    return Promise.resolve(createMockResponse({
+      currentJudgeRating: mockCurrentJudgeRating
+    }))
+  }
+  return graphqlRequest(GET_CURRENT_JUDGE_RATING, { activityPlayerId })
+}
+
+const GET_AVERAGE_SCORE_FOR_PLAYER = `
+  query GetAverageScoreForPlayer($activityPlayerId: ID!) {
+    averageScoreForPlayer(activityPlayerId: $activityPlayerId)
+  }
+`
+
+/**
+ * 鑾峰彇鎸囧畾閫夋墜鐨勫钩鍧囧垎
+ */
+export function getAverageScoreForPlayer(activityPlayerId) {
+  if (USE_MOCK_DATA) {
+    return Promise.resolve(createMockResponse({
+      averageScoreForPlayer: mockAverageScore
+    }))
+  }
+  return graphqlRequest(GET_AVERAGE_SCORE_FOR_PLAYER, { activityPlayerId })
+}
+
+const GET_CURRENT_JUDGE_INFO = `
+  query GetCurrentJudgeInfo {
+    currentJudgeInfo {
+      judgeId
+      judgeName
+      title
+      company
+    }
+  }
+`
+
+/**
+ * 鑾峰彇褰撳墠璇勫淇℃伅
+ */
+export function getCurrentJudgeInfo() {
+  if (USE_MOCK_DATA) {
+    return Promise.resolve(createMockResponse({
+      currentJudgeInfo: mockCurrentJudgeInfo
+    }))
+  }
+  return graphqlRequest(GET_CURRENT_JUDGE_INFO)
+}
+
+// 瀹℃牳鐩稿叧mutations
+const APPROVE_ACTIVITY_PLAYER = `
+  mutation ApproveActivityPlayer($activityPlayerId: ID!, $feedback: String) {
+    approveActivityPlayer(activityPlayerId: $activityPlayerId, feedback: $feedback)
+  }
+`
+
+const REJECT_ACTIVITY_PLAYER = `
+  mutation RejectActivityPlayer($activityPlayerId: ID!, $feedback: String!) {
+    rejectActivityPlayer(activityPlayerId: $activityPlayerId, feedback: $feedback)
+  }
+`
+
+const UPDATE_PLAYER_FEEDBACK = `
+  mutation UpdatePlayerFeedback($activityPlayerId: ID!, $feedback: String!) {
+    updatePlayerFeedback(activityPlayerId: $activityPlayerId, feedback: $feedback)
+  }
+`
+
+/**
+ * 瀹℃牳閫氳繃
+ */
+export function approveActivityPlayer(activityPlayerId, feedback = '') {
+  return graphqlRequest(APPROVE_ACTIVITY_PLAYER, { activityPlayerId, feedback })
+}
+
+/**
+ * 瀹℃牳椹冲洖
+ */
+export function rejectActivityPlayer(activityPlayerId, feedback) {
+  return graphqlRequest(REJECT_ACTIVITY_PLAYER, { activityPlayerId, feedback })
+}
+
+/**
+ * 鏇存柊瀹℃牳鎰忚
+ */
+export function updatePlayerFeedback(activityPlayerId, feedback) {
+  return graphqlRequest(UPDATE_PLAYER_FEEDBACK, { activityPlayerId, feedback })
 }
\ No newline at end of file

--
Gitblit v1.8.0