From ba94ceae1315174798ae1967ef62268c6d16cd5b Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期一, 06 十月 2025 22:07:06 +0800 Subject: [PATCH] feat: 评审与活动相关改动 - backend(GraphQL): Activity schema 增加 updateActivityState(id, state);实现 resolver/service 仅更新 state=2 作为逻辑删除 - backend(GraphQL): region.graphqls 新增 Query leafRegions - backend(GraphQL): player.graphqls 的 projectReviewApplications 增加可选参数 regionId - backend(Service): listProjectReviewApplications 绑定 regionId 参数,修复 QueryParameterException - frontend(web): 新增 api/activity.js 的 updateActivityState 并接入 activity-list 删除逻辑 - frontend(web): review-list.vue 权限仅校验登录,移除角色限制;查询参数修正为 name/regionId - frontend(web): 删除未引用的 ActivityList.vue - frontend(web): projectReviewNew.js GraphQL 查询增加 name 参数 --- wx/pages/profile/employee-review-detail.js | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 106 insertions(+), 12 deletions(-) diff --git a/wx/pages/profile/employee-review-detail.js b/wx/pages/profile/employee-review-detail.js index 0b6dadc..1e8e9e7 100644 --- a/wx/pages/profile/employee-review-detail.js +++ b/wx/pages/profile/employee-review-detail.js @@ -20,6 +20,7 @@ fullUrl fullThumbUrl fileExt + fileSize mediaType } } @@ -43,8 +44,12 @@ loading: false, submitting: false, activityPlayerId: null, - detail: null, - feedback: '' + detail: { + playerInfo: {}, + submissionFiles: [] + }, + feedback: '', + mediaList: [] }, onLoad(options) { @@ -76,16 +81,17 @@ return } + const mediaList = (detail.submissionFiles || []).map(item => this.transformMediaFile(item)) + const playerInfo = detail.playerInfo || {} + this.setData({ detail: { ...detail, + playerInfo, stateText: this.getStateText(detail.state), - submissionFiles: (detail.submissionFiles || []).map(file => ({ - id: file.id, - name: file.name, - url: file.fullUrl || file.fullThumbUrl || '' - })) + submissionFiles: mediaList }, + mediaList, feedback: detail.feedback || '' }) } catch (error) { @@ -93,6 +99,32 @@ wx.showToast({ title: '鍔犺浇澶辫触', icon: 'none' }) } finally { this.setData({ loading: false }) + } + }, + + transformMediaFile(file = {}) { + const url = file.fullUrl || file.fullThumbUrl || file.url || '' + const thumbUrl = file.fullThumbUrl || file.fullUrl || url + const ext = (file.fileExt || '').toLowerCase() + let mediaType = 'file' + + if (file.mediaType === 1 || ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'heic'].includes(ext)) { + mediaType = 'image' + } else if (file.mediaType === 2 || ['mp4', 'mov', 'avi', 'wmv', 'mkv', 'webm', 'flv'].includes(ext)) { + mediaType = 'video' + } else if (ext === 'pdf') { + mediaType = 'pdf' + } else if (['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'wps', 'txt', 'rtf'].includes(ext)) { + mediaType = 'word' + } + + return { + id: file.id, + name: file.name || '璧勬枡鏂囦欢', + url, + thumbUrl, + mediaType, + size: Number(file.fileSize) || 0 } }, @@ -119,9 +151,10 @@ this.setData({ submitting: true }) try { + const trimmedFeedback = (this.data.feedback || '').trim() const variables = { id: Number(this.data.activityPlayerId), - feedback: this.data.feedback ? this.data.feedback.trim() : null + feedback: trimmedFeedback ? trimmedFeedback : null } const result = await graphqlRequest(mutation, variables) const success = result && (action === 'APPROVE' ? result.approveActivityPlayer : result.rejectActivityPlayer) @@ -143,13 +176,74 @@ } }, - previewFile(e) { - const url = e.currentTarget.dataset.url - if (url) { - wx.navigateTo({ url: `/pages/webview/webview?url=${encodeURIComponent(url)}` }) + onMediaTap(e) { + const index = Number(e.currentTarget.dataset.index) + const mediaList = this.data.mediaList || [] + const media = mediaList[index] + if (!media) return + + if (media.mediaType === 'image') { + const images = mediaList.filter(item => item.mediaType === 'image').map(item => item.url) + wx.previewImage({ + current: media.url, + urls: images + }) + } else if (media.mediaType === 'video') { + wx.navigateTo({ + url: `/pages/video/video?url=${encodeURIComponent(media.url)}&title=${encodeURIComponent(media.name)}` + }) + } else { + this.openDocumentMedia(media) } }, + async openDocumentMedia(media) { + try { + wx.showLoading({ title: '鎵撳紑涓�...' }) + const downloadRes = await new Promise((resolve, reject) => { + wx.downloadFile({ + url: media.url, + success: resolve, + fail: reject + }) + }) + + if (downloadRes.statusCode !== 200) { + throw new Error('鏂囦欢涓嬭浇澶辫触') + } + + await new Promise((resolve, reject) => { + wx.openDocument({ + filePath: downloadRes.tempFilePath, + showMenu: true, + success: resolve, + fail: reject + }) + }) + } catch (error) { + console.error('鎵撳紑鏂囦欢澶辫触:', error) + wx.showToast({ + title: '鏃犳硶鎵撳紑鏂囦欢', + icon: 'error' + }) + } finally { + wx.hideLoading() + } + }, + + getFileSizeText(size) { + if (!size || size <= 0) { + return '鏈煡澶у皬' + } + if (size < 1024) { + return `${size}B` + } + if (size < 1024 * 1024) { + return `${(size / 1024).toFixed(1)}KB` + } + return `${(size / (1024 * 1024)).toFixed(1)}MB` + }, + getStateText(state) { switch (state) { case 0: -- Gitblit v1.8.0