| | |
| | | |
| | | // GraphQL 查询语句 |
| | | |
| | | // 获取进行中的比赛列表(包括阶段) |
| | | const GET_ACTIVE_ACTIVITIES_QUERY = ` |
| | | query GetActiveActivities { |
| | | allActivities { |
| | | // 获取进行中的比赛阶段列表 |
| | | const GET_ACTIVITY_STAGES_QUERY = ` |
| | | query GetActivityStages { |
| | | allActivityStages { |
| | | id |
| | | pid |
| | | name |
| | |
| | | activityName |
| | | projectName |
| | | description |
| | | stageId |
| | | submissionFiles { |
| | | id |
| | | name |
| | |
| | | currentJudgeRating(activityPlayerId: $activityPlayerId) { |
| | | id |
| | | totalScore |
| | | comments |
| | | ratingItems { |
| | | itemId |
| | | itemName |
| | | status |
| | | remark |
| | | items { |
| | | ratingItemId |
| | | ratingItemName |
| | | score |
| | | maxScore |
| | | weightedScore |
| | | } |
| | | } |
| | | } |
| | | ` |
| | | |
| | | // 获取指定评委的评分明细 |
| | | const GET_JUDGE_RATING_DETAIL_QUERY = ` |
| | | query GetJudgeRatingDetail($activityPlayerId: ID!, $judgeId: ID!) { |
| | | judgeRatingDetail(activityPlayerId: $activityPlayerId, judgeId: $judgeId) { |
| | | id |
| | | totalScore |
| | | status |
| | | remark |
| | | items { |
| | | ratingItemId |
| | | ratingItemName |
| | | score |
| | | weightedScore |
| | | } |
| | | } |
| | | } |
| | |
| | | // API 函数 |
| | | |
| | | /** |
| | | * 获取进行中的比赛阶段列表(state=1且pid>0的比赛阶段) |
| | | * 按比赛分组排序,显示格式为"比赛名 + 阶段名" |
| | | * 获取进行中的比赛阶段列表 |
| | | * 后端已经过滤了比赛阶段(pid>0且state=1),直接返回 |
| | | */ |
| | | export const getActiveActivities = async () => { |
| | | try { |
| | | const data = await graphqlRequest(GET_ACTIVE_ACTIVITIES_QUERY) |
| | | console.log('=== 调用 getActiveActivities ===') |
| | | const result = await graphqlRequest(GET_ACTIVITY_STAGES_QUERY) |
| | | console.log('GraphQL 返回数据:', result) |
| | | |
| | | // 过滤出state=1且pid>0的比赛阶段 |
| | | const stages = data.allActivities.filter(activity => |
| | | activity.state === 1 && activity.pid > 0 |
| | | ) |
| | | // 后端已经过滤了比赛阶段,直接返回 |
| | | const activities = result.data.allActivityStages || [] |
| | | console.log('处理后的 activities:', activities) |
| | | |
| | | // 按比赛ID(pid)分组排序,确保同一比赛的不同阶段放在一起 |
| | | stages.sort((a, b) => { |
| | | // 首先按比赛ID排序 |
| | | if (a.pid !== b.pid) { |
| | | return a.pid - b.pid |
| | | } |
| | | // 同一比赛内按阶段ID排序 |
| | | return a.id - b.id |
| | | }) |
| | | |
| | | return stages |
| | | return activities |
| | | } catch (error) { |
| | | console.error('获取活动列表失败:', error) |
| | | throw new Error(error.message || '获取活动列表失败') |
| | | console.error('getActiveActivities 错误:', error) |
| | | throw new Error(error.message || '获取比赛阶段失败') |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | export const getCompetitionProjects = async (activityId, page = 0, size = 10) => { |
| | | try { |
| | | const data = await graphqlRequest(GET_COMPETITION_PROJECTS_QUERY, { |
| | | const result = await graphqlRequest(GET_COMPETITION_PROJECTS_QUERY, { |
| | | activityId, |
| | | page, |
| | | size |
| | | }) |
| | | |
| | | const projects = data.activityPlayerApplications || [] |
| | | const projects = result.data.activityPlayerApplications || [] |
| | | |
| | | // 为每个项目获取评分统计 |
| | | const enrichedProjects = await Promise.all( |
| | |
| | | */ |
| | | export const getProjectDetail = async (id) => { |
| | | try { |
| | | const data = await graphqlRequest(GET_PROJECT_DETAIL_QUERY, { id }) |
| | | return data.activityPlayerDetail |
| | | const result = await graphqlRequest(GET_PROJECT_DETAIL_QUERY, { id }) |
| | | return result.data.activityPlayerDetail |
| | | } catch (error) { |
| | | throw new Error(error.message || '获取项目详情失败') |
| | | } |
| | |
| | | */ |
| | | export const getRatingStats = async (activityPlayerId) => { |
| | | try { |
| | | const data = await graphqlRequest(GET_RATING_STATS_QUERY, { activityPlayerId }) |
| | | const result = await graphqlRequest(GET_RATING_STATS_QUERY, { activityPlayerId }) |
| | | |
| | | const ratings = data.judgeRatingsForPlayer || [] |
| | | const averageScore = data.averageScoreForPlayer || 0 |
| | | const ratings = result.data.judgeRatingsForPlayer || [] |
| | | const averageScore = result.data.averageScoreForPlayer || 0 |
| | | |
| | | // 只计算已评分的评委 |
| | | const ratedJudges = ratings.filter(rating => rating.hasRated) |
| | |
| | | */ |
| | | export const getCurrentJudgeRating = async (activityPlayerId) => { |
| | | try { |
| | | const data = await graphqlRequest(GET_CURRENT_JUDGE_RATING_QUERY, { activityPlayerId }) |
| | | return data.currentJudgeRating |
| | | const result = await graphqlRequest(GET_CURRENT_JUDGE_RATING_QUERY, { activityPlayerId }) |
| | | return result.data.currentJudgeRating |
| | | } catch (error) { |
| | | throw new Error(error.message || '获取当前评委评分失败') |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取指定评委的评分明细 |
| | | */ |
| | | export const getJudgeRatingDetail = async (activityPlayerId, judgeId) => { |
| | | try { |
| | | const result = await graphqlRequest(GET_JUDGE_RATING_DETAIL_QUERY, { activityPlayerId, judgeId }) |
| | | return result.data.judgeRatingDetail |
| | | } catch (error) { |
| | | throw new Error(error.message || '获取评委评分明细失败') |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | export const submitRating = async (ratingInput) => { |
| | | try { |
| | | const data = await graphqlRequest(SUBMIT_RATING_MUTATION, { input: ratingInput }) |
| | | return data.saveActivityPlayerRating |
| | | const result = await graphqlRequest(SUBMIT_RATING_MUTATION, { input: ratingInput }) |
| | | return result.data.saveActivityPlayerRating |
| | | } catch (error) { |
| | | throw new Error(error.message || '提交评分失败') |
| | | } |