优化个人贷款流程及模型展示
This commit is contained in:
@@ -41,7 +41,15 @@
|
||||
<thead><tr><th>模型输出结果</th><th>影响BP</th></tr></thead>
|
||||
<tbody>
|
||||
<tr v-for="(row, index) in retailContributionRows" :key="`retail-contribution-${index}`" :class="{ 'is-total-row': row.total }">
|
||||
<td><span v-if="row.summary">汇总</span><div v-else v-for="item in row.results" :key="item.label" class="result-item"><span class="result-label">{{ item.label }}</span><span class="result-value">{{ item.value }}</span></div></td>
|
||||
<td>
|
||||
<span v-if="row.summary">
|
||||
汇总
|
||||
<el-tooltip v-if="row.summaryTooltip" :content="row.summaryTooltip" placement="top">
|
||||
<i class="el-icon-question analysis-help" tabindex="0" aria-label="查看贡献度汇总上限"></i>
|
||||
</el-tooltip>
|
||||
</span>
|
||||
<div v-else v-for="item in row.results" :key="item.label" class="result-item"><span class="result-label">{{ item.label }}</span><span class="result-value">{{ item.value }}</span></div>
|
||||
</td>
|
||||
<td><span v-if="row.bpLabel" :class="row.total ? 'total-bp-value' : 'bp-value'">{{ row.bpLabel }}:{{ row.bpValue }}</span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -55,8 +63,26 @@
|
||||
<thead><tr><th>模型输出结果</th><th>影响BP</th></tr></thead>
|
||||
<tbody>
|
||||
<tr v-for="(row, index) in retailRelevanceRows" :key="`retail-relevance-${index}`" :class="{ 'is-total-row': row.total }">
|
||||
<td><span v-if="row.summary">汇总</span><div v-else v-for="item in row.results" :key="item.label" class="result-item"><span class="result-label">{{ item.label }}</span><span class="result-value">{{ item.value }}</span></div></td>
|
||||
<td><span :class="row.total ? 'total-bp-value' : 'bp-value'">{{ row.bpLabel }}:{{ row.bpValue }}</span></td>
|
||||
<td>
|
||||
<span v-if="row.summary">汇总</span>
|
||||
<div v-else v-for="item in row.results" :key="item.label" class="result-item">
|
||||
<span class="result-label">{{ item.label }}</span>
|
||||
<el-tooltip v-if="item.tooltip" :content="item.tooltip" placement="top">
|
||||
<i class="el-icon-question analysis-help" tabindex="0" :aria-label="`${item.label}提示`"></i>
|
||||
</el-tooltip>
|
||||
<span v-if="item.showValue !== false" class="result-value">{{ item.value }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<span :class="row.total ? 'total-bp-value' : 'bp-value'">
|
||||
<template v-if="row.bpLabel">
|
||||
{{ row.bpLabel }}
|
||||
<el-tooltip v-if="row.bpTooltip" :content="row.bpTooltip" placement="top">
|
||||
<i class="el-icon-question analysis-help" tabindex="0" aria-label="查看中间业务BP上限"></i>
|
||||
</el-tooltip>:
|
||||
</template>{{ row.bpValue }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -172,6 +198,10 @@ export default {
|
||||
corpOutput: {
|
||||
type: Object,
|
||||
default: null
|
||||
},
|
||||
guarType: {
|
||||
type: String,
|
||||
default: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -190,49 +220,46 @@ export default {
|
||||
this.resultItem('贷款年日均', this.retailOutput.loanAvg),
|
||||
this.resultItem('派生率', this.formatRate(this.retailOutput.derivationRate))
|
||||
]),
|
||||
this.totalRow('TOTAL_BP_贡献度', this.retailOutput.totalBpContribution)
|
||||
this.totalRow('TOTAL_BP_贡献度', this.retailOutput.totalBpContribution, '最高上限100BP')
|
||||
]
|
||||
},
|
||||
retailRelevanceRows() {
|
||||
return [
|
||||
this.groupedAnalysisRow([
|
||||
this.resultItem('中间业务_个人_信用卡', this.retailOutput.midPerCard),
|
||||
this.resultItem('中间业务_个人_一码通', this.retailOutput.midPerPass),
|
||||
this.resultItem('中间业务_个人_丰收互联', this.retailOutput.midPerHarvest),
|
||||
this.resultItem('中间业务_个人_有效客户', this.retailOutput.midPerEffect),
|
||||
this.resultItem('中间业务_个人_快捷支付', this.retailOutput.midPerQuickPay),
|
||||
this.resultItem('中间业务_个人_电费代扣', this.retailOutput.midPerEleDdc),
|
||||
this.resultItem('中间业务_个人_水费代扣', this.retailOutput.midPerWaterDdc),
|
||||
this.resultItem('中间业务_个人_华数费代扣', this.retailOutput.midPerHuashuDdc),
|
||||
this.resultItem('中间业务_个人_煤气费代扣', this.retailOutput.midPerGasDdc),
|
||||
this.resultItem('中间业务_个人_市民卡', this.retailOutput.midPerCitizencard),
|
||||
this.resultItem('中间业务_个人_理财业务', this.retailOutput.midPerFinMan),
|
||||
this.resultItem('中间业务_个人_etc', this.retailOutput.midPerEtc)
|
||||
], 'BP_中间业务', this.retailOutput.bpMid),
|
||||
this.middleBusinessRow('中间业务_个人_信用卡', this.retailOutput.midPerCard, '办理减5个BP,信用卡额度1万元及以上的再减10个BP'),
|
||||
this.middleBusinessRow('中间业务_个人_一码通', this.retailOutput.midPerPass),
|
||||
this.middleBusinessRow('中间业务_个人_丰收互联', this.retailOutput.midPerHarvest),
|
||||
this.middleBusinessRow('中间业务_个人_有效客户', this.retailOutput.midPerEffect),
|
||||
this.middleBusinessRow('中间业务_个人_快捷支付', this.retailOutput.midPerQuickPay),
|
||||
this.middleBusinessRow('中间业务_个人_电费代扣', this.retailOutput.midPerEleDdc),
|
||||
this.middleBusinessRow('中间业务_个人_水费代扣', this.retailOutput.midPerWaterDdc),
|
||||
this.middleBusinessRow('中间业务_个人_华数费代扣', this.retailOutput.midPerHuashuDdc),
|
||||
this.middleBusinessRow('中间业务_个人_煤气费代扣', this.retailOutput.midPerGasDdc),
|
||||
this.middleBusinessRow('中间业务_个人_市民卡', this.retailOutput.midPerCitizencard),
|
||||
this.middleBusinessRow('中间业务_个人_理财业务', this.retailOutput.midPerFinMan),
|
||||
this.middleBusinessRow('中间业务_个人_etc', this.retailOutput.midPerEtc),
|
||||
this.summaryRow('BP_中间业务', this.retailOutput.bpMid, '最高上限-30BP'),
|
||||
this.totalRow('TOTAL_BP_关联度', this.retailOutput.totalBpRelevance)
|
||||
]
|
||||
},
|
||||
retailRiskRows() {
|
||||
return [
|
||||
const rows = [
|
||||
this.analysisRow('申请金额', this.retailOutput.applyAmt, 'BP_贷款额度', this.retailOutput.bpLoanAmount),
|
||||
this.groupedAnalysisRow([
|
||||
this.resultItem('贷款用途', this.formatLoanPurpose(this.retailOutput.loanPurpose)),
|
||||
this.resultItem('营业执照', this.formatBoolean(this.retailOutput.bizProof))
|
||||
], 'BP_贷款用途', this.retailOutput.bpLoanUse),
|
||||
this.analysisRow('循环功能', this.formatBoolean(this.retailOutput.loanLoop), 'BP_循环功能', this.retailOutput.bpLoanLoop),
|
||||
this.groupedAnalysisRow([
|
||||
this.resultItem('抵质押类型', this.retailOutput.collType),
|
||||
this.resultItem('抵质押物三方所有', this.formatBoolean(this.retailOutput.collThirdParty))
|
||||
], 'BP_抵押物', this.retailOutput.bpCollateral),
|
||||
this.groupedAnalysisRow([
|
||||
this.resultItem('灰名单客户', this.formatBoolean(this.retailOutput.greyCust)),
|
||||
this.resultItem('黑名单客户', this.formatBoolean(this.retailOutput.blackCust)),
|
||||
this.resultItem('本金逾期', this.formatBoolean(this.retailOutput.prinOverdue)),
|
||||
this.resultItem('利息逾期', this.formatBoolean(this.retailOutput.interestOverdue)),
|
||||
this.resultItem('信用卡逾期', this.formatBoolean(this.retailOutput.cardOverdue))
|
||||
], 'BP_灰名单与逾期', this.retailOutput.bpGreyOverdue),
|
||||
this.totalRow('TOTAL_BP_风险度', this.retailOutput.totalBpRisk)
|
||||
this.analysisRow('循环功能', this.formatBoolean(this.retailOutput.loanLoop), 'BP_循环功能', this.retailOutput.bpLoanLoop)
|
||||
]
|
||||
if (this.guarType === '抵押' || this.guarType === '质押') {
|
||||
rows.push(this.analysisRow('抵押物第三方所有', this.formatBoolean(this.retailOutput.collThirdParty), 'BP_抵押物', this.retailOutput.bpCollateral))
|
||||
}
|
||||
rows.push(
|
||||
this.analysisRow('本金逾期', this.formatBoolean(this.retailOutput.prinOverdue), 'BP_本金逾期', this.retailOutput.bpPrinOverdue),
|
||||
this.analysisRow('利息逾期', this.formatBoolean(this.retailOutput.interestOverdue), 'BP_利息逾期', this.retailOutput.bpIinterestOverdue),
|
||||
this.analysisRow('信用卡逾期', this.formatBoolean(this.retailOutput.cardOverdue), 'BP_信用卡逾期', this.retailOutput.bpCardOverdue),
|
||||
this.totalRow('TOTAL_BP_风险度', this.retailOutput.totalBpRisk)
|
||||
)
|
||||
return rows
|
||||
},
|
||||
corporateLoyaltyRows() {
|
||||
return [
|
||||
@@ -296,8 +323,8 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
formatRate,
|
||||
resultItem(label, value) {
|
||||
return {label, value: this.formatOutputValue(value)}
|
||||
resultItem(label, value, tooltip = null, showValue = true) {
|
||||
return {label, value: this.formatOutputValue(value), tooltip, showValue}
|
||||
},
|
||||
groupedAnalysisRow(results, bpLabel, bpValue, total = false, category = null) {
|
||||
return {results, bpLabel, bpValue: this.formatOutputValue(bpValue), total, category}
|
||||
@@ -305,8 +332,14 @@ export default {
|
||||
analysisRow(resultLabel, resultValue, bpLabel, bpValue) {
|
||||
return this.groupedAnalysisRow([this.resultItem(resultLabel, resultValue)], bpLabel, bpValue)
|
||||
},
|
||||
totalRow(bpLabel, bpValue) {
|
||||
return {summary: true, bpLabel, bpValue: this.formatOutputValue(bpValue), total: true}
|
||||
middleBusinessRow(resultLabel, bpValue, tooltip = null) {
|
||||
return this.groupedAnalysisRow([this.resultItem(resultLabel, null, tooltip, false)], null, bpValue)
|
||||
},
|
||||
summaryRow(bpLabel, bpValue, bpTooltip) {
|
||||
return {summary: true, bpLabel, bpValue: this.formatOutputValue(bpValue), bpTooltip, total: false}
|
||||
},
|
||||
totalRow(bpLabel, bpValue, summaryTooltip = null) {
|
||||
return {summary: true, bpLabel, bpValue: this.formatOutputValue(bpValue), total: true, summaryTooltip}
|
||||
},
|
||||
/** 格式化布尔值为中文 */
|
||||
formatBoolean(value) {
|
||||
@@ -362,6 +395,14 @@ export default {
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.analysis-help {
|
||||
margin-left: 4px;
|
||||
color: #909399;
|
||||
cursor: help;
|
||||
font-size: 14px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.output-analysis-table {
|
||||
width: 100%;
|
||||
table-layout: fixed;
|
||||
|
||||
@@ -52,6 +52,14 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="贷款用途" prop="loanPurpose">
|
||||
<el-select v-model="form.loanPurpose" placeholder="请选择贷款用途" style="width: 100%">
|
||||
<el-option label="经营" value="business"/>
|
||||
<el-option label="消费" value="consumer"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="借款期限(年)" prop="loanTerm">
|
||||
<el-select v-model="form.loanTerm" placeholder="请选择借款期限" style="width: 100%">
|
||||
@@ -242,6 +250,7 @@ export default {
|
||||
idNum: this.customerMap ? (this.customerMap.cust_id || '').substring(3) : undefined,
|
||||
guarType: undefined,
|
||||
applyAmt: undefined,
|
||||
loanPurpose: undefined,
|
||||
loanTerm: undefined,
|
||||
businessType: undefined,
|
||||
loanRateHistory: undefined,
|
||||
@@ -274,6 +283,9 @@ export default {
|
||||
applyAmt: [
|
||||
{required: true, validator: validateApplyAmt, trigger: "blur"}
|
||||
],
|
||||
loanPurpose: [
|
||||
{required: true, message: "请选择贷款用途", trigger: "change"}
|
||||
],
|
||||
loanTerm: [
|
||||
{required: true, message: "请选择借款期限", trigger: "change"}
|
||||
],
|
||||
@@ -397,6 +409,7 @@ export default {
|
||||
idNum: this.editData.idNum,
|
||||
guarType: this.editData.guarType,
|
||||
applyAmt: this.editData.applyAmt,
|
||||
loanPurpose: this.editData.loanPurpose,
|
||||
loanTerm: this.editData.loanTerm,
|
||||
businessType: this.editData.businessType,
|
||||
loanRateHistory: this.editData.loanRateHistory,
|
||||
@@ -418,6 +431,7 @@ export default {
|
||||
idNum: this.customerMap ? (this.customerMap.cust_id || '').substring(3) : undefined,
|
||||
guarType: undefined,
|
||||
applyAmt: undefined,
|
||||
loanPurpose: undefined,
|
||||
loanTerm: undefined,
|
||||
businessType: undefined,
|
||||
loanRateHistory: undefined,
|
||||
|
||||
@@ -57,6 +57,14 @@
|
||||
<el-descriptions-item label="客户名称">{{ detailData.custName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="证件类型">{{ detailData.idType }}</el-descriptions-item>
|
||||
<el-descriptions-item label="证件号码">{{ detailData.idNum }}</el-descriptions-item>
|
||||
<el-descriptions-item label="灰名单客户">{{
|
||||
formatBoolean(retailOutput && retailOutput.greyCust)
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="黑名单客户">{{
|
||||
formatBoolean(retailOutput && retailOutput.blackCust)
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="创建时间">{{ detailData.createTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="创建者">{{ detailData.createBy }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
@@ -95,6 +103,7 @@
|
||||
<!-- 模型输出卡片 -->
|
||||
<ModelOutputDisplay
|
||||
:cust-type="detailData.custType"
|
||||
:guar-type="detailData.guarType"
|
||||
:retail-output="retailOutput"
|
||||
:corp-output="null"
|
||||
/>
|
||||
|
||||
@@ -19,10 +19,12 @@ assert(
|
||||
)
|
||||
|
||||
assert(
|
||||
!personalCreateDialog.includes('label="贷款用途"') &&
|
||||
!personalCreateDialog.includes('prop="loanPurpose"') &&
|
||||
!personalCreateDialog.includes('loanPurpose:'),
|
||||
'个人新增弹窗不应继续保留贷款用途字段'
|
||||
personalCreateDialog.includes('label="贷款用途"') &&
|
||||
personalCreateDialog.includes('prop="loanPurpose"') &&
|
||||
personalCreateDialog.includes('loanPurpose: undefined') &&
|
||||
personalCreateDialog.includes('loanPurpose: this.editData.loanPurpose') &&
|
||||
personalCreateDialog.includes('请选择贷款用途'),
|
||||
'个人新增弹窗缺少贷款用途、必填校验或编辑回显'
|
||||
)
|
||||
|
||||
assert(
|
||||
@@ -31,8 +33,9 @@ assert(
|
||||
)
|
||||
|
||||
assert(
|
||||
!personalCreateDialog.includes("value=\"consumer\"") && !personalCreateDialog.includes("value=\"business\""),
|
||||
'个人新增弹窗不应继续保留贷款用途选项'
|
||||
personalCreateDialog.includes('label="经营" value="business"') &&
|
||||
personalCreateDialog.includes('label="消费" value="consumer"'),
|
||||
'个人新增弹窗贷款用途选项或协议值不正确'
|
||||
)
|
||||
|
||||
assert(
|
||||
|
||||
@@ -42,15 +42,22 @@ assert(
|
||||
'个人流程详情关键信息未展示产品最低利率下限'
|
||||
)
|
||||
|
||||
assert(
|
||||
personalDetail.includes(':guar-type="detailData.guarType"'),
|
||||
'个人模型输出未使用流程担保方式控制抵押物行'
|
||||
)
|
||||
|
||||
const requiredRetailFields = [
|
||||
'retailOutput.loanRateHistory',
|
||||
'retailOutput.smoothRange',
|
||||
'retailOutput.finalCalculateRate',
|
||||
'retailOutput.referenceRate',
|
||||
'retailOutput.blackCust',
|
||||
'retailOutput.branchBp',
|
||||
'retailOutput.bpLoanUse',
|
||||
'retailOutput.midPerGasDdc'
|
||||
'retailOutput.midPerGasDdc',
|
||||
'retailOutput.bpPrinOverdue',
|
||||
'retailOutput.bpIinterestOverdue',
|
||||
'retailOutput.bpCardOverdue'
|
||||
]
|
||||
|
||||
requiredRetailFields.forEach((field) => {
|
||||
@@ -63,10 +70,18 @@ assert(
|
||||
)
|
||||
|
||||
assert(
|
||||
detailCard.includes('label="客户名称"')
|
||||
&& !detailCard.includes('label="灰黑名单客户"')
|
||||
&& !detailCard.includes('retailOutput && retailOutput.greyBlackCust'),
|
||||
'个人流程详情基本信息不应展示灰黑名单客户'
|
||||
basicInfo.includes('label="灰名单客户"')
|
||||
&& basicInfo.includes('retailOutput && retailOutput.greyCust')
|
||||
&& basicInfo.includes('label="黑名单客户"')
|
||||
&& basicInfo.includes('retailOutput && retailOutput.blackCust'),
|
||||
'个人流程详情基本信息缺少灰名单客户或黑名单客户'
|
||||
)
|
||||
|
||||
assert(
|
||||
!modelOutput.includes("this.resultItem('灰名单客户', this.formatBoolean(this.retailOutput.greyCust))")
|
||||
&& !modelOutput.includes("this.resultItem('黑名单客户', this.formatBoolean(this.retailOutput.blackCust))")
|
||||
&& !modelOutput.includes("'BP_灰名单与逾期', this.retailOutput.bpGreyOverdue"),
|
||||
'个人风险度不应继续展示灰黑客户或旧聚合BP'
|
||||
)
|
||||
|
||||
assert(
|
||||
|
||||
Reference in New Issue
Block a user