feat: 支持评估版本隔离的报告、匹配及PDF导出功能
新增revisionId参数到路由、服务及导出接口,实现不同评估版本的隔离访问。删除已废弃的需求相关服务文件,移除取消采集的融资金额、期限和用途字段,更新相关页面提示文本。同时更新文档,说明评估版本、最新资料及产品展示规则的调整,支持前台正常业务名称显示,去除环境标签。
This commit is contained in:
@@ -27,7 +27,7 @@
|
||||
<view v-for="column in columns" :key="column.id" class="overview-value"><text :class="overviewClass(column, row.id)">{{ cell(column, row.id) }}</text></view>
|
||||
</view>
|
||||
</view>
|
||||
<text class="overview-note">{{ hasDemo ? '含演示产品,仅供功能验证。' : '' }}展示顺序不代表优劣。</text>
|
||||
<text class="overview-note">展示顺序不代表优劣,具体条件以机构核验为准。</text>
|
||||
<view class="details-toggle" @click="detailsOpen = !detailsOpen"><text class="summary-title">详细条件与匹配依据</text><text class="detail-toggle-label">{{ detailsOpen ? '收起' : '展开' }}</text></view>
|
||||
<text v-if="detailsOpen" class="scroll-hint">左右滑动查看各产品 · 长内容可在单元格内上下滑动</text>
|
||||
<view v-if="detailsOpen" class="table">
|
||||
@@ -40,7 +40,6 @@
|
||||
<text class="product-name">{{ column.data!.item.product.name }}</text>
|
||||
<text class="hint">{{ column.data!.item.product.bank }} · v{{ column.data!.item.product.version }}</text>
|
||||
<text :class="column.data!.item.state == 'eligible' ? 'state good' : (column.data!.item.state == 'ineligible' ? 'state blocked' : 'state pending')">{{ column.data!.item.stateLabel }}</text>
|
||||
<text v-if="column.data!.item.product.demo" class="demo">演示产品 · 非真实申请</text>
|
||||
<text class="detail" @click="detail(column.id)">查看依据与详情 ›</text>
|
||||
</template>
|
||||
<template v-else><text class="product-name">产品 #{{ column.id }}</text><text class="hint">{{ column.loading ? '正在读取历史资料…' : problem(column) }}</text><button v-if="!column.loading" class="retry" @click="loadColumn(column.id)">重试此列</button></template>
|
||||
@@ -54,7 +53,7 @@
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
<text class="footer-note">历史参数保留评估时版本;当前可用状态单独展示。缺失信息不会被推断为零,演示产品仅供功能验证。</text>
|
||||
<text class="footer-note">历史参数保留评估时版本;当前可用状态单独展示。缺失信息不会被推断为零。</text>
|
||||
<button class="secondary" @click="consult">产品差异,咨询AI</button>
|
||||
<button class="secondary" @click="toMatches">返回本次匹配</button>
|
||||
</template>
|
||||
@@ -72,13 +71,13 @@
|
||||
type CompareColumn = { id: string, loading: boolean, error: string, data: MatchDetail | null }
|
||||
type CompareRow = { id: string, label: string, height: number }
|
||||
const { pageStyle, contentStyle } = usePageLayout()
|
||||
const assessmentId = ref(''); const ids = ref<string[]>([]); const columns = ref<CompareColumn[]>([]); const routeError = ref('')
|
||||
const revisionId = ref(''); const assessmentId = ref(''); const ids = ref<string[]>([]); const columns = ref<CompareColumn[]>([]); const routeError = ref('')
|
||||
const detailsOpen = ref(false)
|
||||
// 首屏并排展示短参数;长证据保留原宽表,展开后读取完整内容,不截断判断依据。
|
||||
const overviewRows: CompareRow[] = [{ id: 'state', label: '匹配状态', height: 0 }, { id: 'amount', label: '额度范围', height: 0 }, { id: 'term', label: '期限范围', height: 0 }, { id: 'rate', label: '年化利率', height: 0 }]
|
||||
let visible = false; let generation = 0
|
||||
const rows: CompareRow[] = [
|
||||
{ id: 'availability', label: '当前状态', height: 160 }, { id: 'coverage', label: '需求覆盖依据', height: 360 },
|
||||
{ id: 'availability', label: '当前状态', height: 160 },
|
||||
{ id: 'amount', label: '额度范围', height: 120 }, { id: 'term', label: '期限范围', height: 120 }, { id: 'rate', label: '年化利率', height: 120 },
|
||||
{ id: 'objects', label: '适用对象', height: 120 }, { id: 'regions', label: '适用地区', height: 140 },
|
||||
{ id: 'positive', label: '已满足条件', height: 360 }, { id: 'blocking', label: '不符条件', height: 300 }, { id: 'cautions', label: '待核实与提示', height: 300 },
|
||||
@@ -96,7 +95,6 @@
|
||||
}
|
||||
const usable = (column: CompareColumn): boolean => !column.loading && column.data != null && problem(column).length == 0
|
||||
const complete = computed((): boolean => ids.value.length >= 2 && columns.value.length == ids.value.length && columns.value.every((c: CompareColumn): boolean => usable(c)))
|
||||
const hasDemo = computed((): boolean => columns.value.some((c: CompareColumn): boolean => usable(c) && c.data!.item.product.demo))
|
||||
const overviewClass = (column: CompareColumn, key: string): string => {
|
||||
if (key == 'amount') return 'overview-text overview-amount'
|
||||
if (key != 'state' || !usable(column)) return 'overview-text'
|
||||
@@ -108,10 +106,6 @@
|
||||
// 核心表也保留当前不可用提示,不能让历史符合条件被误读为现在仍可办理。
|
||||
if (key == 'state') return m.stateLabel + (m.availability != 'available' ? ' · ' + m.availabilityLabel : '')
|
||||
if (key == 'availability') return m.availabilityLabel + ';不改变历史结论'
|
||||
if (key == 'coverage') {
|
||||
const demand = m.positive.concat(m.blocking).concat(m.cautions).filter((r: MatchReason): boolean => r.fields.some((f: string): boolean => ['requestedAmountYuan','requestedTermMonths','purposeCode'].includes(f)))
|
||||
return compareReasonText(demand, '未提供需求覆盖依据,请查看完整匹配详情。')
|
||||
}
|
||||
if (key == 'positive') return compareReasonText(m.positive, '暂无已确认满足的条件')
|
||||
if (key == 'blocking') return compareReasonText(m.blocking, '未发现已知不符条件;仍以核验为准')
|
||||
if (key == 'cautions') return compareReasonText(m.cautions, '暂无待核实提示;不代表已获审批')
|
||||
@@ -134,8 +128,8 @@
|
||||
const token = session.getString('token') ?? ''; const request = generation
|
||||
column.loading = true; column.error = ''; column.data = null
|
||||
try {
|
||||
const result = await fetchMatchDetailRecord(assessmentId.value, id)
|
||||
if (visible && request == generation && getSession()?.getString('token') == token) column.data = result
|
||||
const result = await fetchMatchDetailRecord(assessmentId.value, id, revisionId.value)
|
||||
if (visible && request == generation && getSession()?.getString('token') == token) { if (revisionId.value.length == 0) revisionId.value = result.revisionId; if (revisionId.value != result.revisionId) throw new Error('评估版本已变化,请重新加载对比。'); column.data = result }
|
||||
} catch (err) {
|
||||
if (!visible || request != generation) return
|
||||
if (getSession()?.getString('token') != token) {
|
||||
@@ -150,21 +144,23 @@
|
||||
}
|
||||
const toMatches = () => {
|
||||
if (!validRecordId(assessmentId.value)) { uni.redirectTo({ url: '/packages/finance/archive/archive' }); return }
|
||||
uni.redirectTo({ url: '/packages/finance/matches/matches' + compareQuery(assessmentId.value, ids.value) })
|
||||
uni.redirectTo({ url: '/packages/finance/matches/matches' + compareQuery(assessmentId.value, ids.value, revisionId.value) })
|
||||
}
|
||||
const back = () => { if (getCurrentPages().length > 1) uni.navigateBack(); else toMatches() }
|
||||
const consult = () => { uni.navigateTo({ url: assistantRoute(assessmentId.value, ids.value, 'compare') }) }
|
||||
const consult = () => { uni.navigateTo({ url: assistantRoute(assessmentId.value, ids.value, 'compare', '', revisionId.value) }) }
|
||||
const remove = (id: string) => {
|
||||
const next = ids.value.filter((value: string): boolean => value != id)
|
||||
saveCompareSelection(assessmentId.value, next)
|
||||
saveCompareSelection(assessmentId.value, next, revisionId.value)
|
||||
// 用新路由替换当前页,使刷新/分享恢复实际选择,而不是已移除的旧ID。
|
||||
uni.redirectTo({ url: '/packages/finance/compare/compare' + compareQuery(assessmentId.value, next) })
|
||||
uni.redirectTo({ url: '/packages/finance/compare/compare' + compareQuery(assessmentId.value, next, revisionId.value) })
|
||||
}
|
||||
const detail = (id: string) => { uni.navigateTo({ url: '/packages/finance/product/product' + compareQuery(assessmentId.value, ids.value) + '&productId=' + id + '&tab=explanation&from=compare' }) }
|
||||
const detail = (id: string) => { uni.navigateTo({ url: '/packages/finance/product/product' + compareQuery(assessmentId.value, ids.value, revisionId.value) + '&productId=' + id + '&tab=explanation&from=compare' }) }
|
||||
onLoad((options) => {
|
||||
revisionId.value = options?.['revisionId'] ?? '';
|
||||
if (revisionId.value.length > 0 && !validRecordId(revisionId.value)) routeError.value = '版本编号无效,请返回重新选择。'
|
||||
assessmentId.value = options?.['assessmentId'] ?? ''
|
||||
if (!validRecordId(assessmentId.value)) { routeError.value = '评估编号无效,请从融资档案重新选择。'; return }
|
||||
try { ids.value = parseCompareIds(options?.['productIds'] ?? ''); saveCompareSelection(assessmentId.value, ids.value) }
|
||||
try { ids.value = parseCompareIds(options?.['productIds'] ?? ''); saveCompareSelection(assessmentId.value, ids.value, revisionId.value) }
|
||||
catch (err) { routeError.value = err instanceof Error ? err.message : '对比参数无效' }
|
||||
})
|
||||
onShow(() => {
|
||||
|
||||
Reference in New Issue
Block a user