| | |
| | | data: { |
| | | projectId: '', |
| | | projectDetail: null, |
| | | timeline: [], |
| | | ratingStats: null, |
| | | loading: true, |
| | | error: '', |
| | | statusText: '', |
| | | genderText: '', |
| | | educationText: '', |
| | | timelineLoading: false, |
| | | timelineError: '', |
| | | showRatingDetail: false, |
| | | ratingDetail: null, |
| | | ratingDetailLoading: false, |
| | | ratingDetailError: '' |
| | | educationText: '' |
| | | }, |
| | | |
| | | onLoad(options) { |
| | |
| | | error: '' |
| | | }) |
| | | |
| | | // 调用API获取项目详情 |
| | | const projectDetail = await this.getProjectDetailFromAPI(this.data.projectId) |
| | | |
| | | if (!projectDetail) { |
| | | throw new Error('项目详情获取失败') |
| | | } |
| | | |
| | | if (projectDetail) { |
| | | // 处理文件大小显示 |
| | | if (projectDetail.submissionFiles) { |
| | | projectDetail.submissionFiles.forEach(file => { |
| | | file.fileSizeText = this.formatFileSize(file.fileSize) |
| | | // 字段已经是正确的名称,无需映射 |
| | | // fullUrl, fullThumbUrl, fileSize, fileExt 都是正确的字段名 |
| | | }) |
| | | } |
| | | |
| | | // 获取评分统计 |
| | | const ratingStats = await this.getRatingStatsFromAPI(this.data.projectId) |
| | | |
| | | // 处理评分时间显示 |
| | | if (ratingStats && ratingStats.judgeRatings) { |
| | | ratingStats.judgeRatings.forEach(rating => { |
| | | if (rating.ratingTime) { |
| | | rating.ratingTimeText = this.formatDateTime(rating.ratingTime) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | this.setData({ |
| | | projectDetail, |
| | | ratingStats, |
| | | statusText: this.getStatusText(projectDetail.state), |
| | | genderText: this.getGenderText(projectDetail.playerInfo?.gender), |
| | | educationText: this.getEducationText(projectDetail.playerInfo?.education) |
| | | educationText: this.getEducationText(projectDetail.playerInfo?.education), |
| | | loading: false |
| | | }) |
| | | |
| | | await this.loadProjectTimeline(this.data.projectId) |
| | | } else { |
| | | throw new Error('项目详情获取失败') |
| | | } |
| | | } catch (error) { |
| | | console.error('加载项目详情失败:', error) |
| | | this.setData({ |
| | | error: error.message || '加载失败,请重试' |
| | | error: error.message || '加载失败,请重试', |
| | | loading: false |
| | | }) |
| | | } finally { |
| | | this.setData({ loading: false }) |
| | | } |
| | | }, |
| | | |
| | |
| | | } |
| | | }, |
| | | |
| | | async loadProjectTimeline(activityPlayerId) { |
| | | if (!activityPlayerId) { |
| | | return |
| | | // 获取评分统计 |
| | | async getRatingStatsFromAPI(projectId) { |
| | | // 暂时返回空的评分数据,避免GraphQL查询错误 |
| | | // TODO: 需要后端提供合适的评分统计查询接口 |
| | | try { |
| | | return { |
| | | averageScore: null, |
| | | ratingCount: 0, |
| | | judgeRatings: [] |
| | | } |
| | | |
| | | const idNumber = Number(activityPlayerId) |
| | | const variables = { |
| | | activityPlayerId: Number.isNaN(idNumber) ? activityPlayerId : idNumber |
| | | } catch (error) { |
| | | throw error |
| | | } |
| | | }, |
| | | |
| | | this.setData({ |
| | | timelineLoading: true, |
| | | timelineError: '' |
| | | }) |
| | | |
| | | // 获取评委评分详情 |
| | | async getJudgeRatingDetail(activityPlayerId, judgeId) { |
| | | const query = ` |
| | | query ProjectStageTimeline($activityPlayerId: ID!) { |
| | | projectStageTimeline(activityPlayerId: $activityPlayerId) { |
| | | activityId |
| | | activityName |
| | | stages { |
| | | stageId |
| | | stageName |
| | | matchTime |
| | | sortOrder |
| | | participated |
| | | activityPlayerId |
| | | averageScore |
| | | ratingCount |
| | | hasRating |
| | | latestRatingTime |
| | | } |
| | | query GetJudgeRatingDetail($activityPlayerId: ID!, $judgeId: ID!) { |
| | | judgeRatingDetail(activityPlayerId: $activityPlayerId, judgeId: $judgeId) { |
| | | remark |
| | | } |
| | | } |
| | | ` |
| | | |
| | | try { |
| | | const result = await app.graphqlRequest(query, variables) |
| | | const projectStageTimeline = result && result.projectStageTimeline ? result.projectStageTimeline : null |
| | | const stages = projectStageTimeline && projectStageTimeline.stages ? projectStageTimeline.stages : [] |
| | | |
| | | const timeline = stages.map(stage => { |
| | | const hasScore = stage.hasRating && stage.averageScore !== null && stage.averageScore !== undefined |
| | | let scoreText = '未参赛' |
| | | if (stage.participated) { |
| | | scoreText = hasScore ? `平均分:${Number(stage.averageScore).toFixed(2)}` : '未评分' |
| | | } |
| | | |
| | | return { |
| | | ...stage, |
| | | matchTimeText: stage.matchTime ? this.formatDateTime(stage.matchTime) : '', |
| | | scoreText, |
| | | displayAverageScore: hasScore ? Number(stage.averageScore).toFixed(2) : null, |
| | | isClickable: stage.participated && hasScore && !!stage.activityPlayerId |
| | | } |
| | | }) |
| | | |
| | | this.setData({ |
| | | timeline, |
| | | timelineLoading: false |
| | | }) |
| | | const result = await app.graphqlRequest(query, { activityPlayerId, judgeId }) |
| | | return result.judgeRatingDetail |
| | | } catch (error) { |
| | | console.error('加载阶段时间轴失败:', error) |
| | | this.setData({ |
| | | timelineError: error.message || '时间轴加载失败', |
| | | timelineLoading: false |
| | | }) |
| | | throw error |
| | | } |
| | | }, |
| | | |
| | | async fetchStageRatingDetail(activityPlayerId) { |
| | | const idNumber = Number(activityPlayerId) |
| | | const variables = { |
| | | activityPlayerId: Number.isNaN(idNumber) ? activityPlayerId : idNumber |
| | | } |
| | | |
| | | const query = ` |
| | | query StageJudgeRatings($activityPlayerId: ID!) { |
| | | stageJudgeRatings(activityPlayerId: $activityPlayerId) { |
| | | activityPlayerId |
| | | stageId |
| | | stageName |
| | | matchTime |
| | | ratingCount |
| | | averageScore |
| | | judgeRatings { |
| | | judgeId |
| | | judgeName |
| | | totalScore |
| | | feedback |
| | | ratingTime |
| | | } |
| | | } |
| | | } |
| | | ` |
| | | |
| | | const result = await app.graphqlRequest(query, variables) |
| | | const detail = result && result.stageJudgeRatings ? result.stageJudgeRatings : null |
| | | |
| | | const sourceJudgeRatings = detail && detail.judgeRatings ? detail.judgeRatings : [] |
| | | const judgeRatings = sourceJudgeRatings.map(item => ({ |
| | | ...item, |
| | | totalScoreText: item.totalScore !== null && item.totalScore !== undefined ? `${Number(item.totalScore).toFixed(2)}分` : '未评分', |
| | | ratingTimeText: item.ratingTime ? this.formatDateTime(item.ratingTime) : '' |
| | | })) |
| | | |
| | | const averageScoreValue = detail && detail.averageScore !== undefined && detail.averageScore !== null |
| | | ? detail.averageScore |
| | | : null |
| | | |
| | | return { |
| | | activityPlayerId: detail && detail.activityPlayerId ? detail.activityPlayerId : variables.activityPlayerId, |
| | | stageId: detail && detail.stageId ? detail.stageId : null, |
| | | stageName: detail && detail.stageName ? detail.stageName : '阶段信息', |
| | | matchTime: detail && detail.matchTime ? detail.matchTime : null, |
| | | matchTimeText: detail && detail.matchTime ? this.formatDateTime(detail.matchTime) : '', |
| | | ratingCount: detail && detail.ratingCount ? detail.ratingCount : 0, |
| | | averageScore: averageScoreValue, |
| | | averageScoreText: averageScoreValue !== null ? Number(averageScoreValue).toFixed(2) : '暂无评分', |
| | | judgeRatings |
| | | } |
| | | }, |
| | | |
| | | async openStageDetail(e) { |
| | | const { playerId } = e.currentTarget.dataset |
| | | const clickable = e.currentTarget.dataset.clickable === true || e.currentTarget.dataset.clickable === 'true' |
| | | const participated = e.currentTarget.dataset.participated === true || e.currentTarget.dataset.participated === 'true' |
| | | |
| | | if (!playerId || !participated) { |
| | | return |
| | | } |
| | | |
| | | if (!clickable) { |
| | | wx.showToast({ |
| | | title: '暂无评分', |
| | | icon: 'none' |
| | | }) |
| | | return |
| | | } |
| | | |
| | | this.setData({ |
| | | showRatingDetail: true, |
| | | ratingDetailLoading: true, |
| | | ratingDetailError: '', |
| | | ratingDetail: { judgeRatings: [] } |
| | | }) |
| | | |
| | | try { |
| | | const detail = await this.fetchStageRatingDetail(playerId) |
| | | this.setData({ |
| | | ratingDetail: detail, |
| | | ratingDetailLoading: false |
| | | }) |
| | | } catch (error) { |
| | | console.error('加载阶段评分详情失败:', error) |
| | | this.setData({ |
| | | ratingDetailError: error.message || '加载失败', |
| | | ratingDetailLoading: false |
| | | }) |
| | | } |
| | | }, |
| | | |
| | | closeStageDetail() { |
| | | this.setData({ |
| | | showRatingDetail: false, |
| | | ratingDetail: null, |
| | | ratingDetailError: '' |
| | | }) |
| | | }, |
| | | |
| | | // 预览文件 |