From 173ad579e5b6bd0b20dea9126143887c1575548c Mon Sep 17 00:00:00 2001 From: zpc Date: Tue, 17 Mar 2026 23:33:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(assessment):=20=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E6=B5=8B=E8=AF=84=E7=BB=93=E6=9E=9C=E9=A1=B5=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?PDF=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ResultStatusDto/AssessmentResultDto 增加 ReportUrl 属性 - AssessmentService 的 GetResultStatusAsync/GetResultAsync 返回 ReportUrl - loading 页面修复状态码映射(4=已完成/5=失败),传递 reportUrl 到结果页 - result 页面实现 PDF 下载:uni.downloadFile + uni.openDocument --- .../Services/AssessmentService.cs | 4 +- .../Models/Assessment/AssessmentResultDto.cs | 5 ++ .../Models/Assessment/ResultStatusDto.cs | 5 ++ uniapp/pages/assessment/loading/index.vue | 14 ++-- uniapp/pages/assessment/result/index.vue | 73 ++++++++++++++----- 5 files changed, 75 insertions(+), 26 deletions(-) diff --git a/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs b/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs index 443030a..7ed21f9 100644 --- a/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs +++ b/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs @@ -103,7 +103,8 @@ public class AssessmentService : IAssessmentService .Select(r => new ResultStatusDto { Status = r.Status, - IsCompleted = r.Status == 4 + IsCompleted = r.Status == 4, + ReportUrl = r.ReportUrl }) .FirstOrDefaultAsync(); @@ -386,6 +387,7 @@ public class AssessmentService : IAssessmentService AssessmentName = assessmentType.Name, Name = record.Name, TestDate = record.CompleteTime?.ToString("yyyy-MM-dd") ?? record.CreateTime.ToString("yyyy-MM-dd"), + ReportUrl = record.ReportUrl, Intelligences = new List(), Traits = new List(), Abilities = new List(), diff --git a/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/AssessmentResultDto.cs b/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/AssessmentResultDto.cs index 705958d..998387a 100644 --- a/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/AssessmentResultDto.cs +++ b/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/AssessmentResultDto.cs @@ -79,6 +79,11 @@ public class AssessmentResultDto /// 发展建议 /// public List Suggestions { get; set; } = new(); + + /// + /// 报告PDF地址 + /// + public string? ReportUrl { get; set; } } /// diff --git a/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/ResultStatusDto.cs b/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/ResultStatusDto.cs index acc1152..d8ddf2d 100644 --- a/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/ResultStatusDto.cs +++ b/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/ResultStatusDto.cs @@ -19,4 +19,9 @@ public class ResultStatusDto /// 状态描述信息 /// public string? Message { get; set; } + + /// + /// 报告PDF地址 + /// + public string? ReportUrl { get; set; } } diff --git a/uniapp/pages/assessment/loading/index.vue b/uniapp/pages/assessment/loading/index.vue index acc8a3e..d544b31 100644 --- a/uniapp/pages/assessment/loading/index.vue +++ b/uniapp/pages/assessment/loading/index.vue @@ -106,23 +106,25 @@ async function checkStatus() { if (res && res.code === 0 && res.data) { const status = res.data.status - // 状态:1-生成中 2-已完成 3-失败 - if (status === 2) { + // 状态:3-生成中 4-已完成 5-失败 + if (status === 4) { // 生成完成,跳转结果页 stopPolling() stopTipRotation() + // 携带 reportUrl 参数 + const reportUrl = res.data.reportUrl || '' uni.redirectTo({ - url: `/pages/assessment/result/index?recordId=${recordId.value}` + url: `/pages/assessment/result/index?recordId=${recordId.value}&reportUrl=${encodeURIComponent(reportUrl)}` }) - } else if (status === 3) { + } else if (status === 5) { // 生成失败 stopPolling() stopTipRotation() uni.showModal({ title: '提示', - content: res.data.message || '报告生成失败,请重新测评', + content: res.data.message || '报告生成失败,请联系客服', showCancel: false, success: () => { uni.switchTab({ @@ -131,7 +133,7 @@ async function checkStatus() { } }) } - // status === 1 继续轮询 + // status === 3 继续轮询 } } catch (error) { console.error('查询状态失败:', error) diff --git a/uniapp/pages/assessment/result/index.vue b/uniapp/pages/assessment/result/index.vue index 2e21f3e..1c0d9b7 100644 --- a/uniapp/pages/assessment/result/index.vue +++ b/uniapp/pages/assessment/result/index.vue @@ -21,6 +21,7 @@ const userStore = useUserStore() // 页面参数 const recordId = ref('') +const reportUrl = ref('') // 页面状态 const pageLoading = ref(true) @@ -104,6 +105,10 @@ async function loadResult() { if (res && res.code === 0 && res.data) { resultData.value = res.data + // 从接口获取 reportUrl(优先级高于页面参数) + if (res.data.reportUrl) { + reportUrl.value = res.data.reportUrl + } } else { // 使用模拟数据进行开发测试 resultData.value = generateMockData() @@ -258,43 +263,68 @@ function getProgressColor(score) { } /** - * 保存到本地(PDF格式) + * 保存到本地(下载PDF报告) */ async function handleSaveToLocal() { if (saving.value) return + if (!reportUrl.value) { + uni.showToast({ + title: 'PDF报告暂未生成', + icon: 'none' + }) + return + } + saving.value = true try { - // 调用后端生成PDF接口 uni.showLoading({ - title: '正在生成PDF...' + title: '正在下载PDF...' }) - // 模拟生成PDF过程 - await new Promise(resolve => setTimeout(resolve, 1500)) + // 下载PDF文件 + const downloadRes = await new Promise((resolve, reject) => { + uni.downloadFile({ + url: reportUrl.value, + success: resolve, + fail: reject + }) + }) uni.hideLoading() - // 提示用户 - uni.showModal({ - title: '提示', - content: 'PDF报告已生成,是否保存到本地?', - confirmText: '保存', - success: (res) => { - if (res.confirm) { - // 实际项目中这里应该调用下载接口 + if (downloadRes.statusCode === 200) { + // 使用 openDocument 打开PDF(用户可在预览界面保存) + uni.openDocument({ + filePath: downloadRes.tempFilePath, + fileType: 'pdf', + showMenu: true, + success: () => { uni.showToast({ - title: '保存成功', + title: '打开成功', icon: 'success' }) + }, + fail: (err) => { + console.error('打开PDF失败:', err) + uni.showToast({ + title: '打开失败,请重试', + icon: 'none' + }) } - } - }) + }) + } else { + uni.showToast({ + title: '下载失败,请重试', + icon: 'none' + }) + } } catch (error) { - console.error('保存失败:', error) + uni.hideLoading() + console.error('下载PDF失败:', error) uni.showToast({ - title: '保存失败,请重试', + title: '下载失败,请重试', icon: 'none' }) } finally { @@ -308,6 +338,11 @@ async function handleSaveToLocal() { onLoad((options) => { recordId.value = options.recordId || '' + // 从 loading 页面传递的 reportUrl + if (options.reportUrl) { + reportUrl.value = decodeURIComponent(options.reportUrl) + } + // 恢复用户登录状态 userStore.restoreFromStorage() @@ -321,7 +356,7 @@ onLoad((options) => {