From 915d80766dd8e0157e9b9510b3634ed758eb5c5a Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期日, 05 十月 2025 14:45:58 +0800 Subject: [PATCH] feat: 新增员工审核入口与审核页面 --- wx/pages/judge/review.js | 269 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 162 insertions(+), 107 deletions(-) diff --git a/wx/pages/judge/review.js b/wx/pages/judge/review.js index babef8a..27afd37 100644 --- a/wx/pages/judge/review.js +++ b/wx/pages/judge/review.js @@ -9,7 +9,7 @@ // 鎻愪氦浣滃搧淇℃伅 submission: null, - submissionId: '', + activityPlayerId: '', // 娲诲姩淇℃伅 activity: null, @@ -53,7 +53,7 @@ onLoad(options) { if (options.id) { - this.setData({ submissionId: options.id }) + this.setData({ activityPlayerId: options.id }) this.loadSubmissionDetail() } }, @@ -71,99 +71,130 @@ this.setData({ loading: true }) const query = ` - query GetSubmissionDetail($id: ID!) { - submission(id: $id) { + query GetActivityPlayerDetail($id: ID!) { + activityPlayerDetail(id: $id) { id - title + projectName description - files { + activityName + stageId + state + playerInfo { + id + name + phone + gender + birthday + education + introduction + userInfo { + userId + name + phone + avatarUrl + } + } + regionInfo { + id + name + fullPath + } + submissionFiles { id name url - type - size + fullUrl + fileExt + fileSize + mediaType + thumbUrl + fullThumbUrl } - images - videos - submittedAt - status - participant { - id - name - school - major - avatar - } - team { - id - name - members { - id - name - role - } - } - activity { - id - title - description - judgeCriteria { + ratingForm { + schemeId + schemeName + totalMaxScore + items { id name description maxScore weight + sortOrder } - } - myReview { - id - scores - comment - totalScore - status - reviewedAt } } } ` - const result = await graphqlRequest(query, { id: this.data.submissionId }) + const result = await graphqlRequest(query, { id: this.data.activityPlayerId }) - if (result && result.submission) { - const submission = result.submission + if (result && result.activityPlayerDetail) { + const detail = result.activityPlayerDetail - // 涓烘瘡涓枃浠舵坊鍔犱笅杞界姸鎬� - if (submission.files) { - submission.files = submission.files.map(file => ({ - ...file, + // 鏋勫缓submission瀵硅薄浠ュ吋瀹圭幇鏈夌殑WXML妯℃澘 + const submission = { + id: detail.id, + title: detail.projectName, + description: detail.description, + files: detail.submissionFiles ? detail.submissionFiles.map(file => ({ + id: file.id, + name: file.name, + url: file.fullUrl || file.url, + type: file.fileExt, + size: file.fileSize, isDownloading: this.data.downloadingFiles.indexOf(file.id) > -1 - })) + })) : [], + images: detail.submissionFiles ? detail.submissionFiles + .filter(file => file.mediaType === 1) + .map(file => file.fullUrl || file.url) : [], + videos: detail.submissionFiles ? detail.submissionFiles + .filter(file => file.mediaType === 2) + .map(file => file.fullUrl || file.url) : [], + participant: { + id: detail.playerInfo.id, + name: detail.playerInfo.name, + school: detail.regionInfo ? detail.regionInfo.name : '', + major: detail.playerInfo.education || '', + avatar: detail.playerInfo.userInfo?.avatarUrl || '/images/default-avatar.svg' + }, + status: detail.state === 1 ? 'APPROVED' : detail.state === 2 ? 'REJECTED' : 'PENDING' + } + + // 鏋勫缓activity瀵硅薄 + const activity = { + id: detail.stageId, + title: detail.activityName, + description: detail.description, + judgeCriteria: detail.ratingForm ? detail.ratingForm.items || [] : [] } // 鍒濆鍖栬瘎鍒嗘暟鎹� const scores = {} let maxScore = 0 - if (submission.activity.judgeCriteria) { - submission.activity.judgeCriteria.forEach(criterion => { - scores[criterion.id] = submission.myReview ? - submission.myReview.scores[criterion.id] || 0 : 0 + if (activity.judgeCriteria) { + activity.judgeCriteria.forEach(criterion => { + scores[criterion.id] = 0 // 鏆傛椂璁句负0锛屽悗缁渶瑕佹煡璇㈠凡鏈夎瘎鍒� maxScore += criterion.maxScore }) } this.setData({ submission, - activity: submission.activity, - criteria: submission.activity.judgeCriteria || [], + activity, + criteria: activity.judgeCriteria || [], scores, maxScore, - existingReview: submission.myReview, - reviewStatus: submission.myReview ? submission.myReview.status : 'PENDING', - comment: submission.myReview ? submission.myReview.comment : '' + existingReview: null, // 鏆傛椂璁句负null锛屽悗缁渶瑕佹煡璇㈠凡鏈夎瘎鍒� + reviewStatus: 'PENDING', + comment: '' }) this.calculateTotalScore() + + // 妫�鏌ユ槸鍚﹀凡鏈夎瘎鍒� + this.checkReviewStatus() } } catch (error) { console.error('鍔犺浇浣滃搧璇︽儏澶辫触:', error) @@ -180,30 +211,50 @@ async checkReviewStatus() { try { const query = ` - query CheckReviewStatus($submissionId: ID!) { - reviewStatus(submissionId: $submissionId) { + query GetCurrentJudgeRating($activityPlayerId: ID!) { + currentJudgeRating(activityPlayerId: $activityPlayerId) { + id + totalScore + comment status - canReview - deadline + ratedAt + items { + ratingItemId + ratingItemName + score + maxScore + } } } ` - const result = await graphqlRequest(query, { submissionId: this.data.submissionId }) + const result = await graphqlRequest(query, { activityPlayerId: this.data.activityPlayerId }) - if (result && result.reviewStatus) { - const { status, canReview, deadline } = result.reviewStatus + if (result && result.currentJudgeRating) { + const rating = result.currentJudgeRating - if (!canReview) { - wx.showModal({ - title: '鏃犳硶璇勫', - content: deadline ? `璇勫宸叉埅姝紙鎴鏃堕棿锛�${formatDate(deadline)}锛塦 : '褰撳墠鏃犳硶杩涜璇勫', - showCancel: false, - success: () => { - wx.navigateBack() - } + // 濡傛灉宸叉湁璇勫垎锛屽~鍏呮暟鎹� + const scores = {} + let totalScore = 0 + + if (rating.items) { + rating.items.forEach(item => { + scores[item.ratingItemId] = item.score + totalScore += item.score }) } + + this.setData({ + scores, + totalScore, + comment: rating.comment || '', + existingReview: rating, + reviewStatus: rating.status || 'COMPLETED' + }) + + console.log('宸插姞杞界幇鏈夎瘎鍒�:', rating) + } else { + console.log('褰撳墠璇勫灏氭湭璇勫垎') } } catch (error) { console.error('妫�鏌ヨ瘎瀹$姸鎬佸け璐�:', error) @@ -388,34 +439,37 @@ try { wx.showLoading({ title: '淇濆瓨涓�...' }) - const { submissionId, scores, comment, totalScore } = this.data + const { activityPlayerId, scores, comment, criteria, activity } = this.data + + // 鏋勫缓璇勫垎椤规暟缁� + const ratings = criteria.map(criterion => ({ + itemId: criterion.id, + score: scores[criterion.id] || 0 + })) const mutation = ` - mutation SaveReviewDraft($input: ReviewDraftInput!) { - saveReviewDraft(input: $input) { - success - review { - id - status - } - } + mutation SaveActivityPlayerRating($input: ActivityPlayerRatingInput!) { + saveActivityPlayerRating(input: $input) } ` const input = { - submissionId, - scores, - comment: comment.trim(), - totalScore + activityPlayerId, + stageId: activity.stageId, + ratings, + comment: comment.trim() } const result = await graphqlRequest(mutation, { input }) - if (result && result.saveReviewDraft.success) { + if (result && result.saveActivityPlayerRating) { wx.showToast({ title: '鑽夌宸蹭繚瀛�', icon: 'success' }) + + // 閲嶆柊鍔犺浇璇勫垎鐘舵�� + await this.checkReviewStatus() } } catch (error) { console.error('淇濆瓨鑽夌澶辫触:', error) @@ -451,41 +505,42 @@ this.setData({ submitting: true }) wx.showLoading({ title: '鎻愪氦涓�...' }) - const { submissionId, scores, comment, totalScore } = this.data + const { activityPlayerId, scores, comment, criteria, activity } = this.data + + // 鏋勫缓璇勫垎椤规暟缁� + const ratings = criteria.map(criterion => ({ + itemId: criterion.id, + score: scores[criterion.id] || 0 + })) const mutation = ` - mutation SubmitReview($input: ReviewSubmitInput!) { - submitReview(input: $input) { - success - review { - id - status - reviewedAt - } - } + mutation SaveActivityPlayerRating($input: ActivityPlayerRatingInput!) { + saveActivityPlayerRating(input: $input) } ` const input = { - submissionId, - scores, - comment: comment.trim(), - totalScore + activityPlayerId, + stageId: activity.stageId, + ratings, + comment: comment.trim() } const result = await graphqlRequest(mutation, { input }) - if (result && result.submitReview.success) { + if (result && result.saveActivityPlayerRating) { wx.showToast({ - title: '璇勫鎻愪氦鎴愬姛', + title: '璇勫垎鎻愪氦鎴愬姛', icon: 'success' }) // 鏇存柊鐘舵�� this.setData({ - reviewStatus: 'COMPLETED', - existingReview: result.submitReview.review + reviewStatus: 'COMPLETED' }) + + // 閲嶆柊鍔犺浇璇勫垎鐘舵�� + await this.checkReviewStatus() // 寤惰繜杩斿洖涓婁竴椤� setTimeout(() => { @@ -493,7 +548,7 @@ }, 1500) } } catch (error) { - console.error('鎻愪氦璇勫澶辫触:', error) + console.error('鎻愪氦璇勫垎澶辫触:', error) wx.showToast({ title: '鎻愪氦澶辫触', icon: 'error' @@ -507,7 +562,7 @@ // 鏌ョ湅鍏朵粬璇勫 onViewOtherReviews() { wx.navigateTo({ - url: `/pages/judge/reviews?submissionId=${this.data.submissionId}` + url: `/pages/judge/reviews?activityPlayerId=${this.data.activityPlayerId}` }) }, -- Gitblit v1.8.0