feat: 支持评估版本隔离的报告、匹配及PDF导出功能

新增revisionId参数到路由、服务及导出接口,实现不同评估版本的隔离访问。删除已废弃的需求相关服务文件,移除取消采集的融资金额、期限和用途字段,更新相关页面提示文本。同时更新文档,说明评估版本、最新资料及产品展示规则的调整,支持前台正常业务名称显示,去除环境标签。
This commit is contained in:
hujun
2026-09-30 19:11:44 +08:00
parent 542c107317
commit 3b2a0139e4
34 changed files with 1389 additions and 338 deletions
+21 -9
View File
@@ -1,16 +1,22 @@
<template>
<view :class="compact ? 'export-area export-compact' : 'export-area'">
<view class="export-row"><text class="export-label">{{ compact ? '评估 #' + assessmentId + ' · 已保存' : '报告已保存至融资档案' }}</text><button class="export-button" :disabled="busy" @click="download">{{ busy ? '正在生成…' : '下载PDF' }}</button></view>
<text v-if="message.length > 0" :class="failed ? 'export-message export-error' : 'export-message'">{{ message }}</text>
<text v-if="message.length == 0 && !compact" class="export-message">导出不含身份信息,请妥善保管下载文件。</text>
<view :class="toolbar ? 'export-area export-toolbar' : (compact ? 'export-area export-compact' : 'export-area')">
<view class="export-row"><text v-if="!toolbar" class="export-label">{{ compact ? '评估 #' + assessmentId + ' · 已保存' : '报告已保存至融资档案' }}</text><button :class="toolbar ? 'export-button toolbar-button' : 'export-button'" :disabled="busy" @click="download">{{ toolbar ? (busy ? '…' : toolbarLabel) : (busy ? '正在生成…' : '下载PDF') }}</button></view>
<text v-if="message.length > 0 && !toolbar" :class="failed ? 'export-message export-error' : 'export-message'">{{ message }}</text>
<text v-if="message.length == 0 && !compact && !toolbar" class="export-message">导出不含身份信息,请妥善保管下载文件。</text>
</view>
</template>
<script setup lang="uts">
import { getSession } from '@/services/api.uts'
import { ReportDownload, downloadReportPdf } from '@/packages/finance/services/report-export.uts'
// 报告页使用紧凑入口,下载进度和错误始终展示;其他页面保留原布局。
const props = defineProps({ assessmentId: { type: String, required: true }, compact: { type: Boolean, default: false } })
const emit = defineEmits(['authrequired', 'sessionchanged'])
// 顶栏模式由报告页显示完整导出回执,避免窄导航栏中的错误消息被裁切。
const props = defineProps({ revisionId: { type: String, default: '' }, assessmentId: { type: String, required: true }, compact: { type: Boolean, default: false }, toolbar: { type: Boolean, default: false } })
const emit = defineEmits(['authrequired', 'sessionchanged', 'statuschange'])
// #ifdef MP-WEIXIN
const toolbarLabel = 'PDF'
// #endif
// #ifndef MP-WEIXIN
const toolbarLabel = '下载PDF'
// #endif
const busy = ref(false); const message = ref(''); const failed = ref(false)
let operation: ReportDownload | null = null; let generation = 0
const ownerToken = getSession()?.getString('token') ?? ''
@@ -20,15 +26,16 @@
if (getSession() == null) { emit('authrequired'); return }
if (getSession()?.getString('token') != ownerToken) { emit('sessionchanged'); return }
const request = ++generation; busy.value = true; failed.value = false; message.value = ''
if (props.toolbar) emit('statuschange', '正在生成PDF…')
const token = getSession()?.getString('token') ?? ''
operation = downloadReportPdf(props.assessmentId)
operation = downloadReportPdf(props.assessmentId, props.revisionId)
try { const result = await operation!.done; if (request == generation) message.value = result }
catch (err) {
if (request != generation) return
failed.value = true; message.value = err instanceof Error ? err.message : '下载失败,请检查网络后重试。'
if (getSession() == null) emit('authrequired')
else if (getSession()?.getString('token') != token) emit('sessionchanged')
} finally { if (request == generation) { busy.value = false; operation = null } }
} finally { if (request == generation) { busy.value = false; operation = null; if (props.toolbar) emit('statuschange', message.value) } }
}
// 父页面离开即移除报告,组件销毁时中止下载,避免隐藏页面导出旧账户资料。
onUnmounted(() => dispose())
@@ -41,4 +48,9 @@
.export-message { color: #8393a6; font-size: 22rpx; line-height: 36rpx; margin-top: 12rpx; }
.export-error { color: #a05d37; }
.export-compact { margin-top: 0; margin-bottom: 0; }
.export-toolbar { margin: 0; }
.toolbar-button { background-color: #0868f7; color: #fff; margin: 0; padding: 0 16rpx; height: 50rpx; line-height: 50rpx; font-size: 21rpx; border-radius: 12rpx; }
/* #ifdef MP-WEIXIN */
.toolbar-button { width: 32px; height: 32px; line-height: 32px; padding: 0; font-size: 11px; }
/* #endif */
</style>