const { API_BASE_URL, authHeader, request } = require('../../utils/request') Page({ data: { id: '', report: null, data: null, qualityPercent: 0, dimensionCount: 0, shareLoading: false, shareStatusText: '' }, onLoad(query) { this.setData({ id: query.id }) this.loadReport() }, async loadReport() { try { const report = await request({ url: `/reports/${this.data.id}` }) const data = report.report_data || {} if (data.dimensions) { data.dimensions = data.dimensions.map((item) => ({ ...item, confidencePercent: Math.round((item.confidence || 0) * 100) })) } const handSideText = { left: '左手', right: '右手', unknown: '未知手' }[report.hand_side] || '未知手' this.setData({ report: { ...report, handSideText, createdDate: (report.created_at || '').replace('T', ' ').slice(0, 16) }, data, qualityPercent: Math.round(((data.quality_check && data.quality_check.confidence) || 0) * 100), dimensionCount: data.dimensions ? data.dimensions.length : 0 }) } catch (error) { wx.showToast({ title: error.message || '加载失败', icon: 'none' }) } }, deleteReport() { wx.showModal({ title: '删除报告', content: '删除后将无法恢复,关联照片也会被清理。', success: async (res) => { if (!res.confirm) return try { await request({ url: `/reports/${this.data.id}`, method: 'DELETE' }) wx.showToast({ title: '已删除' }) wx.switchTab({ url: '/pages/history/history' }) } catch (error) { wx.showToast({ title: error.message || '删除失败', icon: 'none' }) } } }) }, generateShareImage() { this.setData({ shareLoading: true, shareStatusText: '分享图生成中,通常需要 30-120 秒。你可以先继续查看报告。' }) request({ url: `/reports/${this.data.id}/share-image-jobs`, method: 'POST' }) .then((job) => this.pollShareImageJob(job.id, 0)) .catch((error) => { this.setData({ shareLoading: false, shareStatusText: '' }) wx.showToast({ title: error.message || '创建任务失败', icon: 'none' }) }) }, pollShareImageJob(jobId, count) { if (count > 80) { this.setData({ shareLoading: false, shareStatusText: '' }) wx.showToast({ title: '生成时间较长,请稍后再试', icon: 'none' }) return } request({ url: `/reports/share-image-jobs/${jobId}` }) .then((job) => { if (job.status === 'completed') { this.downloadShareImage(jobId) return } if (job.status === 'failed') { this.setData({ shareLoading: false, shareStatusText: '' }) wx.showToast({ title: job.error_message || '分享图生成失败', icon: 'none' }) return } setTimeout(() => this.pollShareImageJob(jobId, count + 1), 2000) }) .catch((error) => { this.setData({ shareLoading: false, shareStatusText: '' }) wx.showToast({ title: error.message || '查询任务失败', icon: 'none' }) }) }, downloadShareImage(jobId) { wx.downloadFile({ url: `${API_BASE_URL}/reports/share-image-jobs/${jobId}/image`, header: authHeader(), success: (res) => { if (res.statusCode >= 200 && res.statusCode < 300) { wx.previewImage({ current: res.tempFilePath, urls: [res.tempFilePath] }) } else { wx.showToast({ title: '分享图下载失败', icon: 'none' }) } }, fail: () => wx.showToast({ title: '分享图下载失败', icon: 'none' }), complete: () => { this.setData({ shareLoading: false, shareStatusText: '' }) } }) }, onShareAppMessage() { return { title: '我在赛博先生生成了一份手相报告', path: '/pages/index/index' } } })