lrj
14 小时以前 f04f35b562760afbac0c477357e2a29f77aec3b9
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'
// 模拟数据开关 - 设置为true时使用模拟数据
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 })
}