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/api/activityPlayer.js |  192 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 178 insertions(+), 14 deletions(-)

diff --git a/web/src/api/activityPlayer.js b/web/src/api/activityPlayer.js
index 6c0ef11..0f6bdb4 100644
--- a/web/src/api/activityPlayer.js
+++ b/web/src/api/activityPlayer.js
@@ -8,25 +8,145 @@
   createMockResponse 
 } from './mockData.js'
 
-const GRAPHQL_ENDPOINT = '/api/graphql'
+import { API_CONFIG, graphqlRequest } from '@/config/api'
 
 // 妯℃嫙鏁版嵁寮�鍏� - 璁剧疆涓簍rue鏃朵娇鐢ㄦā鎷熸暟鎹�
-// 宸插垏鎹㈠埌鐪熷疄鏁版嵁妯″紡
 const USE_MOCK_DATA = false
 
-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}`)
+// 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 = `
@@ -46,11 +166,15 @@
         fullPath
       }
       activityName
+      projectName
       description
+      feedback
+      state
       submissionFiles {
         id
         name
         url
+        thumbUrl
         fileExt
         fileSize
         mediaType
@@ -193,4 +317,44 @@
     }))
   }
   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