From 8337c34fcc761d07acaad796d10f3e12e9bbe2d1 Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期日, 05 十月 2025 08:56:04 +0800
Subject: [PATCH] feat: 微信项目详情支持阶段评分时间轴
---
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