feat: 支持评估版本隔离的报告、匹配及PDF导出功能
新增revisionId参数到路由、服务及导出接口,实现不同评估版本的隔离访问。删除已废弃的需求相关服务文件,移除取消采集的融资金额、期限和用途字段,更新相关页面提示文本。同时更新文档,说明评估版本、最新资料及产品展示规则的调整,支持前台正常业务名称显示,去除环境标签。
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
<text class="history-link">{{ historyOpen ? '收起记录' : '切换记录' }}</text>
|
||||
</view>
|
||||
<view v-if="historyOpen" class="history-list">
|
||||
<text class="history-note">每次提交独立保存,请选择要查看的记录。</text>
|
||||
<text class="history-note">新建评估独立保存;修改记录可在版本历史查看。</text>
|
||||
<view v-for="item in records" :key="item.id" :class="item.id == selectedId ? 'history-row history-selected' : 'history-row'" @click="chooseRecord(item.id)">
|
||||
<view class="record-caption"><text class="history-title">{{ item.submittedAt }} · #{{ item.id }}</text><text class="record-meta">{{ item.city }} · {{ item.statusLabel }}</text></view><text class="history-state">{{ item.id == selectedId ? '当前' : '查看' }}</text>
|
||||
</view>
|
||||
@@ -50,10 +50,17 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="detail != null" class="record-picker">
|
||||
<view class="record-picker-head"><text class="record-title">本评估版本历史</text></view>
|
||||
<view v-for="item in versions" :key="item.revisionId" class="history-row" @click="chooseVersion(item.revisionId)"><text class="history-title">第 {{ item.revisionNo }} 版 · {{ item.submittedAt }} · {{ item.statusLabel }}</text><text class="history-state">{{ detail!.record.revisionId == item.revisionId ? '当前查看' : '查看' }}</text></view>
|
||||
<text v-if="versionsError.length > 0" class="error-text">{{ versionsError }}</text><text v-if="versionsLoading" class="history-note">正在读取版本…</text><text v-else-if="versionsMore || versionsError.length > 0" class="text-action" @click="moreVersions">继续读取版本</text>
|
||||
</view>
|
||||
<button v-if="detail != null" class="new-action" @click="editAssessment">修改资料并重新评估</button>
|
||||
<text v-if="detail != null && detail!.record.message.length > 0" class="task-note">{{ detail!.record.message }}</text>
|
||||
<button v-if="detail != null" class="primary-button main-action" @click="openAnalysis">{{ detail!.record.status == 'succeeded' ? '查看分析报告' : '查看分析状态 / 重试' }}</button>
|
||||
<button v-if="detail != null && detail!.record.status != 'succeeded' && detail!.record.hasReport" class="new-action" @click="openPreviousReport">查看上次成功结果</button>
|
||||
<button :class="detail == null ? 'primary-button main-action' : 'new-action'" :disabled="loading" @click="start">发起新的{{ type == 'personal' ? '个人' : '企业' }}评估</button>
|
||||
<text class="local-note">已提交资料只读保留;再次评估会新建记录。
|
||||
<text class="local-note">修改会在本评估下保存新版本;新建评估另建记录。
|
||||
未提交的填写内容不会保存。</text>
|
||||
</view>
|
||||
</scroll-view>
|
||||
@@ -65,16 +72,17 @@
|
||||
import { usePageLayout } from '@/services/layout.uts'
|
||||
import { getSession } from '@/services/api.uts'
|
||||
import { clearAssessmentFlow } from '@/services/assessment-flow.uts'
|
||||
import { AssessmentRecord, AssessmentDetail, ArchiveSection, fetchAssessments, fetchAssessmentDetail, fetchArchiveCompleteness } from '@/packages/finance/services/records.uts'
|
||||
import { AssessmentRecord, AssessmentDetail, ArchiveSection, fetchAssessments, fetchAssessmentDetail, fetchArchiveCompleteness, fetchAssessmentRevisions } from '@/packages/finance/services/records.uts'
|
||||
const { pageStyle, contentStyle } = usePageLayout()
|
||||
const type = ref('personal'); const selectedId = ref(''); const records = ref<AssessmentRecord[]>([])
|
||||
const revisionId = ref(''); const versions = ref<AssessmentRecord[]>([]); const versionsMore = ref(false); const versionsError = ref(''); const versionsLoading = ref(false); let versionsCursor = ''
|
||||
const detail = ref<AssessmentDetail | null>(null); const expanded = ref(''); const historyOpen = ref(false)
|
||||
const loading = ref(false); const error = ref(''); const listError = ref(''); const listLoading = ref(false); const hasMore = ref(false)
|
||||
const completeness = ref<number | null>(null); const completenessFailed = ref(false)
|
||||
const completenessMessage = ref('提交评估后,查看对应报告的资料完整度。')
|
||||
let cursor = ''; let generation = 0; let reportRequest = 0; let visible = false; let routeError = ''; let routeId = ''; let owner = ''
|
||||
const sections = computed((): ArchiveSection[] => detail.value != null ? detail.value!.sections : [
|
||||
{ id: 'basic', icon: 'file-text', title: '基本信息', note: type.value == 'enterprise' ? '企业、联系人与融资需求' : '身份、联系方式与融资需求', fields: [], provided: 0 },
|
||||
{ id: 'basic', icon: 'file-text', title: '基本信息', note: type.value == 'enterprise' ? '企业与联系人信息' : '身份与联系方式', fields: [], provided: 0 },
|
||||
{ id: 'income', icon: 'income', title: type.value == 'enterprise' ? '经营信息' : '职业与收入', note: type.value == 'enterprise' ? '经营行业、月数与营收' : '职业、收入与缴纳情况', fields: [], provided: 0 },
|
||||
{ id: 'assets', icon: 'asset', title: '资产与负债', note: '贷款、信用卡额度与房车情况', fields: [], provided: 0 },
|
||||
{ id: 'authorization', icon: 'authorization', title: '资料与授权', note: '私有资料与外部查询授权', fields: [], provided: 0 }
|
||||
@@ -85,7 +93,7 @@
|
||||
return section.provided > 0 ? '已记录' : '未填写'
|
||||
}
|
||||
const clearView = () => {
|
||||
detail.value = null; records.value = []; cursor = ''; hasMore.value = false; expanded.value = ''
|
||||
detail.value = null; records.value = []; versions.value = []; versionsMore.value = false; versionsError.value = ''; versionsCursor = ''; versionsLoading.value = false; cursor = ''; hasMore.value = false; expanded.value = ''
|
||||
completeness.value = null; completenessFailed.value = false; reportRequest++
|
||||
completenessMessage.value = '提交评估后,查看对应报告的资料完整度。'
|
||||
error.value = ''; listError.value = ''; listLoading.value = false
|
||||
@@ -104,7 +112,7 @@
|
||||
const reportSequence = ++reportRequest
|
||||
completeness.value = null; completenessFailed.value = false; completenessMessage.value = '正在读取本次报告的资料完整度…'
|
||||
try {
|
||||
const result = await fetchArchiveCompleteness(id)
|
||||
const result = await fetchArchiveCompleteness(id, detail.value?.record.revisionId ?? revisionId.value)
|
||||
if (active(request, token) && reportSequence == reportRequest) { completeness.value = result.percent; completenessMessage.value = result.description }
|
||||
} catch (err) {
|
||||
if (active(request, token) && reportSequence == reportRequest) {
|
||||
@@ -123,6 +131,18 @@
|
||||
if (active(request, token)) listError.value = err instanceof Error ? err.message : '历史记录读取失败,请重试'
|
||||
} finally { if (active(request, token)) listLoading.value = false }
|
||||
}
|
||||
const readVersions = async (append: boolean, request: number, token: string) => {
|
||||
versionsLoading.value = true; versionsError.value = ''
|
||||
try {
|
||||
const page = await fetchAssessmentRevisions(selectedId.value, append ? versionsCursor : '')
|
||||
if (!active(request, token)) return
|
||||
versions.value = append ? versions.value.concat(page.items) : page.items; versionsMore.value = page.hasMore; versionsCursor = page.nextCursor
|
||||
} catch (err) { if (active(request, token)) versionsError.value = err instanceof Error ? err.message : '版本历史读取失败' }
|
||||
finally { if (active(request, token)) versionsLoading.value = false }
|
||||
}
|
||||
const moreVersions = () => { if (!versionsLoading.value) readVersions(versions.value.length > 0, generation, owner) }
|
||||
const chooseVersion = (id: string) => { uni.redirectTo({ url: '/packages/finance/archive/archive?assessmentId=' + selectedId.value + '&revisionId=' + id }) }
|
||||
const editAssessment = () => { if (detail.value != null) uni.navigateTo({ url: '/packages/finance/assessment/assessment?editId=' + selectedId.value }) }
|
||||
const refresh = async () => {
|
||||
const request = ++generation; clearView(); loading.value = true
|
||||
const session = getSession()
|
||||
@@ -132,7 +152,7 @@
|
||||
try {
|
||||
// 显式ID先校验本人详情;失败不能自动切到最新记录,掩盖越权或已删除状态。
|
||||
if (selectedId.value.length > 0) {
|
||||
const result = await fetchAssessmentDetail(selectedId.value)
|
||||
const result = await fetchAssessmentDetail(selectedId.value, revisionId.value)
|
||||
if (!active(request, token)) return
|
||||
detail.value = result; type.value = result.record.type
|
||||
await readList(false, request, token)
|
||||
@@ -142,7 +162,7 @@
|
||||
if (listError.value.length > 0) throw new Error(listError.value)
|
||||
if (records.value.length > 0) {
|
||||
selectedId.value = records.value[0].id
|
||||
const result = await fetchAssessmentDetail(selectedId.value)
|
||||
const result = await fetchAssessmentDetail(selectedId.value, revisionId.value)
|
||||
if (!active(request, token)) return
|
||||
detail.value = result
|
||||
}
|
||||
@@ -151,6 +171,7 @@
|
||||
if (listError.value.length > 0) historyOpen.value = true
|
||||
loading.value = false
|
||||
if (detail.value != null) {
|
||||
await readVersions(false, request, token)
|
||||
if (detail.value!.record.status == 'succeeded') await readCompleteness(detail.value!.record.id, request, token)
|
||||
else completenessMessage.value = detail.value!.record.status == 'failed' ? '本次分析未完成,暂没有报告完整度;已提交资料已保留。' : '本次分析尚未完成,报告生成后可查看完整度。'
|
||||
}
|
||||
@@ -167,12 +188,15 @@
|
||||
const chooseRecord = (id: string) => { if (id == selectedId.value) { historyOpen.value = false; return }; uni.redirectTo({ url: '/packages/finance/archive/archive?type=' + type.value + '&assessmentId=' + encodeURIComponent(id) }) }
|
||||
const showLatest = () => { uni.redirectTo({ url: '/packages/finance/archive/archive?type=' + type.value }) }
|
||||
const start = () => { clearAssessmentFlow(); uni.navigateTo({ url: '/packages/finance/assessment/assessment?type=' + type.value }) }
|
||||
const openPreviousReport = () => { if (detail.value != null) uni.navigateTo({ url: '/packages/finance/report/report?assessmentId=' + selectedId.value + '&revisionId=' + detail.value!.record.publishedRevisionId }) }
|
||||
const openAnalysis = () => {
|
||||
if (detail.value == null) return
|
||||
const page = detail.value!.record.status == 'succeeded' ? 'report/report' : 'analyzing/analyzing'
|
||||
uni.navigateTo({ url: '/packages/finance/' + page + '?assessmentId=' + encodeURIComponent(detail.value!.record.id) })
|
||||
uni.navigateTo({ url: '/packages/finance/' + page + '?assessmentId=' + encodeURIComponent(detail.value!.record.id) + (page == 'report/report' ? '&revisionId=' + detail.value!.record.revisionId : '') })
|
||||
}
|
||||
onLoad((options) => {
|
||||
revisionId.value = options?.['revisionId'] ?? ''
|
||||
if (revisionId.value.length > 0 && !/^[1-9][0-9]{0,9}$/.test(revisionId.value)) routeError = '版本编号无效,请重新选择。'
|
||||
type.value = options?.['type'] ?? 'personal'; routeId = options?.['assessmentId'] ?? ''; selectedId.value = routeId
|
||||
if (!['personal', 'enterprise'].includes(type.value)) { type.value = 'personal'; routeError = '档案类型无效,请重新选择。' }
|
||||
if (options?.['assessmentId'] != null && !/^[1-9][0-9]{0,9}$/.test(routeId)) routeError = '评估编号无效,请重新选择历史记录。'
|
||||
|
||||
Reference in New Issue
Block a user