From afeeed281e60466b576fbe74d339634cc5d07b82 Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期三, 08 十月 2025 08:56:42 +0800 Subject: [PATCH] 修复评审功能和用户认证问题 --- wx/pages/project/detail.js | 328 +++++++++++++++--------------------------------------- 1 files changed, 93 insertions(+), 235 deletions(-) diff --git a/wx/pages/project/detail.js b/wx/pages/project/detail.js index 49a5ed8..9e95a97 100644 --- a/wx/pages/project/detail.js +++ b/wx/pages/project/detail.js @@ -5,18 +5,12 @@ 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) { @@ -36,38 +30,51 @@ // 鍔犺浇椤圭洰璇︽儏 async loadProjectDetail() { try { - this.setData({ - loading: true, - error: '' + this.setData({ + loading: true, + error: '' }) + // 璋冪敤API鑾峰彇椤圭洰璇︽儏 const projectDetail = await this.getProjectDetailFromAPI(this.data.projectId) + + if (projectDetail) { + // 澶勭悊鏂囦欢澶у皬鏄剧ず + if (projectDetail.submissionFiles) { + projectDetail.submissionFiles.forEach(file => { + file.fileSizeText = this.formatFileSize(file.fileSize) + }) + } - if (!projectDetail) { + // 鑾峰彇璇勫垎缁熻 + 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), + loading: false + }) + } else { throw new Error('椤圭洰璇︽儏鑾峰彇澶辫触') } - - if (projectDetail.submissionFiles) { - projectDetail.submissionFiles.forEach(file => { - file.fileSizeText = this.formatFileSize(file.fileSize) - }) - } - - this.setData({ - projectDetail, - statusText: this.getStatusText(projectDetail.state), - genderText: this.getGenderText(projectDetail.playerInfo?.gender), - educationText: this.getEducationText(projectDetail.playerInfo?.education) - }) - - await this.loadProjectTimeline(this.data.projectId) } catch (error) { console.error('鍔犺浇椤圭洰璇︽儏澶辫触:', error) this.setData({ - error: error.message || '鍔犺浇澶辫触锛岃閲嶈瘯' + error: error.message || '鍔犺浇澶辫触锛岃閲嶈瘯', + loading: false }) - } finally { - this.setData({ loading: false }) } }, @@ -78,62 +85,42 @@ query GetProjectDetail($id: ID!) { activityPlayerDetail(id: $id) { id - playerInfo { - id - name - phone - gender - birthday - education - introduction - description - avatarUrl - avatar { - id - fullUrl - fullThumbUrl - name - fileSize - fileExt - } - userInfo { - userId - name - phone - avatarUrl - } - } - regionInfo { - id - name - fullPath - } - activityName + activityId + playerId + playerName + playerGender + playerPhone + playerEducation + playerBirthDate + playerIdCard + playerAddress projectName - description - feedback - state - stageId - submissionFiles { + projectDescription + projectCategory + projectTags + projectFiles { id - fullUrl - fullThumbUrl - name + fileName + fileUrl fileSize - fileExt - mediaType + fileType + uploadTime } - ratingForm { - schemeId - schemeName - items { - id - name - maxScore - orderNo - } - totalMaxScore + submitTime + reviewTime + reviewerId + reviewerName + score + rating { + id + judgeId + judgeName + score + feedback + ratingTime } + state + feedback } } ` @@ -146,174 +133,45 @@ } }, - async loadProjectTimeline(activityPlayerId) { - if (!activityPlayerId) { - return - } - - const idNumber = Number(activityPlayerId) - const variables = { - activityPlayerId: Number.isNaN(idNumber) ? activityPlayerId : idNumber - } - - this.setData({ - timelineLoading: true, - timelineError: '' - }) - + // 鑾峰彇璇勫垎缁熻 + async getRatingStatsFromAPI(projectId) { const query = ` - query ProjectStageTimeline($activityPlayerId: ID!) { - projectStageTimeline(activityPlayerId: $activityPlayerId) { - activityId - activityName - stages { - stageId - stageName - matchTime - sortOrder - participated - activityPlayerId - averageScore - ratingCount - hasRating - latestRatingTime - } - } - } - ` - - 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 - }) - } catch (error) { - console.error('鍔犺浇闃舵鏃堕棿杞村け璐�:', error) - this.setData({ - timelineError: error.message || '鏃堕棿杞村姞杞藉け璐�', - timelineLoading: false - }) - } - }, - - 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 + query GetRatingStats($activityPlayerId: ID!) { + ratingStats(activityPlayerId: $activityPlayerId) { averageScore - judgeRatings { - judgeId - judgeName - totalScore - feedback - ratingTime + totalRatings + scoreDistribution { + score + count } } } ` - 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 + try { + const result = await app.graphqlRequest(query, { activityPlayerId: projectId }) + return result.ratingStats + } catch (error) { + throw error } }, - 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: [] } - }) + // 鑾峰彇璇勫璇勫垎璇︽儏 + async getJudgeRatingDetail(activityPlayerId, judgeId) { + const query = ` + query GetJudgeRatingDetail($activityPlayerId: ID!, $judgeId: ID!) { + judgeRatingDetail(activityPlayerId: $activityPlayerId, judgeId: $judgeId) { + remark + } + } + ` try { - const detail = await this.fetchStageRatingDetail(playerId) - this.setData({ - ratingDetail: detail, - ratingDetailLoading: false - }) + const result = await app.graphqlRequest(query, { activityPlayerId, judgeId }) + return result.judgeRatingDetail } catch (error) { - console.error('鍔犺浇闃舵璇勫垎璇︽儏澶辫触:', error) - this.setData({ - ratingDetailError: error.message || '鍔犺浇澶辫触', - ratingDetailLoading: false - }) + throw error } - }, - - closeStageDetail() { - this.setData({ - showRatingDetail: false, - ratingDetail: null, - ratingDetailError: '' - }) }, // 棰勮鏂囦欢 -- Gitblit v1.8.0