移除liquidbase 需求20260817

This commit is contained in:
wkc
2026-08-24 12:31:08 +08:00
parent 9552e2acb8
commit cb29c38bf1
24 changed files with 245 additions and 847 deletions

View File

@@ -427,8 +427,8 @@ export default {
isGreenLoan: this.isOne(this.editData.isGreenLoan),
isTradeBuildEnt: this.isOne(this.editData.isTradeBuildEnt),
collType: this.editData.guarType === '质押' ? this.editData.collType : undefined,
collateralNature: undefined,
isNineArea: undefined,
collateralNature: this.editData.collateralNature,
isNineArea: this.editData.isNineArea,
collThirdParty: this.isOne(this.editData.collThirdParty),
couponRate: this.editData.couponRate
}
@@ -575,9 +575,10 @@ export default {
}
if (this.isMortgage) {
data.collType = this.resolveMortgageCollateralType()
} else {
delete data.collateralNature
delete data.isNineArea
}
delete data.collateralNature
delete data.isNineArea
if (this.isCollateralGuarantee) {
data.collThirdParty = this.form.collThirdParty ? '1' : '0'
} else {

View File

@@ -13,14 +13,10 @@
<el-descriptions-item label="客户名称">{{ detailData.custName }}</el-descriptions-item>
<el-descriptions-item label="客户类型">{{ detailData.custType }}</el-descriptions-item>
<el-descriptions-item label="申请金额">{{ detailData.applyAmt }} </el-descriptions-item>
<el-descriptions-item label="基准利率">
<span class="rate-value">{{ getBaseLoanRate() }}</span> %
</el-descriptions-item>
<el-descriptions-item label="浮动BP">
<span class="total-bp-value">{{ getTotalBp() }}</span>
</el-descriptions-item>
<el-descriptions-item label="最终测算利率">
<span class="calculate-rate">{{ getCalculateRate() }}</span> %
<el-descriptions-item label="期限">{{ detailData.loanTerm || '-' }}</el-descriptions-item>
<el-descriptions-item label="担保方式">{{ detailData.guarType || '-' }}</el-descriptions-item>
<el-descriptions-item label="产品最低利率下限">
<span class="rate-value">{{ formatRate(corpOutput && corpOutput.minRateProduct) }}</span> %
</el-descriptions-item>
<el-descriptions-item label="执行利率">
<div class="execute-rate-input-wrapper">
@@ -46,13 +42,6 @@
<!-- 右侧面板 -->
<div class="right-panel">
<!-- 模型输出卡片 -->
<ModelOutputDisplay
:cust-type="detailData.custType"
:retail-output="null"
:corp-output="corpOutput"
/>
<!-- 流程详情卡片 -->
<el-card class="detail-card">
<div slot="header" class="card-header">
@@ -64,11 +53,10 @@
<h4 class="section-title">基本信息</h4>
<el-descriptions :column="2" border>
<el-descriptions-item label="机构编码">{{ detailData.orgCode }}</el-descriptions-item>
<el-descriptions-item label="运行模式">{{ detailData.runType }}</el-descriptions-item>
<el-descriptions-item label="客户内码">{{ detailData.custIsn }}</el-descriptions-item>
<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="贷款期限">{{ detailData.loanTerm || '-' }}</el-descriptions-item>
<el-descriptions-item label="创建时间">{{ detailData.createTime }}</el-descriptions-item>
<el-descriptions-item label="创建者">{{ detailData.createBy }}</el-descriptions-item>
</el-descriptions>
@@ -81,10 +69,17 @@
<el-descriptions-item label="担保方式">{{ detailData.guarType }}</el-descriptions-item>
<el-descriptions-item label="申请金额">{{ detailData.applyAmt }} </el-descriptions-item>
<el-descriptions-item label="业务种类">{{ detailData.businessType || '-' }}</el-descriptions-item>
<el-descriptions-item label="贷款期限">{{ detailData.loanTerm || '-' }}</el-descriptions-item>
<el-descriptions-item label="历史贷款利率">{{ formatRate(detailData.loanRateHistory) }}</el-descriptions-item>
<el-descriptions-item label="余值覆盖">{{ formatBoolean(detailData.resCover) }}</el-descriptions-item>
<el-descriptions-item label="绿色贷款">{{ formatBoolean(detailData.isGreenLoan) }}</el-descriptions-item>
<el-descriptions-item label="贸易和建筑业企业">{{ formatBoolean(detailData.isTradeBuildEnt) }}</el-descriptions-item>
<el-descriptions-item v-if="detailData.guarType === '抵押'" label="抵押物性质">
{{ detailData.collateralNature || '-' }}
</el-descriptions-item>
<el-descriptions-item v-if="detailData.guarType === '抵押'" label="是否属于九地">
{{ detailData.isNineArea || '-' }}
</el-descriptions-item>
<el-descriptions-item label="抵质押类型">{{ detailData.collType || '-' }}</el-descriptions-item>
<el-descriptions-item label="抵质押物是否三方所有">{{
formatBoolean(detailData.collThirdParty)
@@ -94,6 +89,13 @@
</div>
</el-card>
<!-- 模型输出卡片 -->
<ModelOutputDisplay
:cust-type="detailData.custType"
:retail-output="null"
:corp-output="corpOutput"
/>
<!-- 议价池卡片 -->
<BargainingPoolDisplay
v-if="bargainingPool"
@@ -155,18 +157,6 @@ export default {
if (value === 'false' || value === false || value === '0' || value === 0) return '否'
return value || '-'
},
/** 获取基准利率 */
getBaseLoanRate() {
return this.formatRate(this.corpOutput?.baseLoanRate)
},
/** 获取浮动BP */
getTotalBp() {
return this.corpOutput?.totalBp || '-'
},
/** 获取最终测算利率 */
getCalculateRate() {
return this.formatRate(this.corpOutput?.finalCalculateRate)
},
/** 设定执行利率 */
handleSetExecuteRate() {
const value = this.executeRateInput
@@ -248,16 +238,6 @@ export default {
font-weight: 500;
}
.total-bp-value {
color: #e6a23c;
font-weight: 600;
}
.calculate-rate {
color: #f56c6c;
font-weight: 600;
font-size: 16px;
}
}
}

View File

@@ -3,7 +3,8 @@
:close-on-click-modal="false" @close="handleClose">
<el-form :model="queryForm" inline size="small">
<el-form-item label="客户号">
<el-input v-model="queryForm.custId" placeholder="请输入客户号" clearable @keyup.enter.native="handleQuery"/>
<el-input v-model="queryForm.custId" placeholder="请输入客户号" clearable
@keydown.enter.native.prevent="handleQuery"/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" :loading="loading" @click="handleQuery">查询</el-button>

View File

@@ -403,8 +403,8 @@ export default {
bizProof: this.isOne(this.editData.bizProof),
loanLoop: this.isOne(this.editData.loanLoop),
collType: this.editData.guarType === '质押' ? this.editData.collType : undefined,
collateralNature: undefined,
isNineArea: undefined,
collateralNature: this.editData.collateralNature,
isNineArea: this.editData.isNineArea,
collThirdParty: this.isOne(this.editData.collThirdParty),
couponRate: this.editData.couponRate
}
@@ -546,9 +546,10 @@ export default {
}
if (this.isMortgage) {
data.collType = this.resolveMortgageCollateralType()
} else {
delete data.collateralNature
delete data.isNineArea
}
delete data.collateralNature
delete data.isNineArea
if (this.isCollateralGuarantee) {
data.collThirdParty = this.form.collThirdParty ? '1' : '0'
} else {

View File

@@ -13,14 +13,10 @@
<el-descriptions-item label="客户名称">{{ detailData.custName }}</el-descriptions-item>
<el-descriptions-item label="客户类型">{{ detailData.custType }}</el-descriptions-item>
<el-descriptions-item label="申请金额">{{ detailData.applyAmt }} </el-descriptions-item>
<el-descriptions-item label="基准利率">
<span class="rate-value">{{ getBaseLoanRate() }}</span> %
</el-descriptions-item>
<el-descriptions-item label="浮动BP">
<span class="total-bp-value">{{ getTotalBp() }}</span>
</el-descriptions-item>
<el-descriptions-item label="最终测算利率">
<span class="calculate-rate">{{ getCalculateRate() }}</span> %
<el-descriptions-item label="期限">{{ detailData.loanTerm || '-' }}</el-descriptions-item>
<el-descriptions-item label="担保方式">{{ detailData.guarType || '-' }}</el-descriptions-item>
<el-descriptions-item label="产品最低利率下限">
<span class="rate-value">{{ formatRate(retailOutput && retailOutput.minRateProduct) }}</span> %
</el-descriptions-item>
<el-descriptions-item label="执行利率">
<div class="execute-rate-input-wrapper">
@@ -46,13 +42,6 @@
<!-- 右侧面板 -->
<div class="right-panel">
<!-- 模型输出卡片 -->
<ModelOutputDisplay
:cust-type="detailData.custType"
:retail-output="retailOutput"
:corp-output="null"
/>
<!-- 流程详情卡片 -->
<el-card class="detail-card">
<div slot="header" class="card-header">
@@ -64,8 +53,8 @@
<h4 class="section-title">基本信息</h4>
<el-descriptions :column="2" border>
<el-descriptions-item label="机构编码">{{ detailData.orgCode }}</el-descriptions-item>
<el-descriptions-item label="运行模式">{{ detailData.runType }}</el-descriptions-item>
<el-descriptions-item label="客户内码">{{ detailData.custIsn }}</el-descriptions-item>
<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="创建时间">{{ detailData.createTime }}</el-descriptions-item>
@@ -88,6 +77,12 @@
}}
</el-descriptions-item>
<el-descriptions-item label="循环功能">{{ formatBoolean(detailData.loanLoop) }}</el-descriptions-item>
<el-descriptions-item v-if="detailData.guarType === '抵押'" label="抵押物性质">
{{ detailData.collateralNature || '-' }}
</el-descriptions-item>
<el-descriptions-item v-if="detailData.guarType === '抵押'" label="是否属于九地">
{{ detailData.isNineArea || '-' }}
</el-descriptions-item>
<el-descriptions-item label="抵质押类型">{{ detailData.collType || '-' }}</el-descriptions-item>
<el-descriptions-item label="抵质押物是否三方所有">{{
formatBoolean(detailData.collThirdParty)
@@ -97,6 +92,13 @@
</div>
</el-card>
<!-- 模型输出卡片 -->
<ModelOutputDisplay
:cust-type="detailData.custType"
:retail-output="retailOutput"
:corp-output="null"
/>
<!-- 议价池卡片 -->
<BargainingPoolDisplay
v-if="bargainingPool"
@@ -164,18 +166,6 @@ export default {
if (value === 'business') return '经营'
return value || '-'
},
/** 获取基准利率 */
getBaseLoanRate() {
return this.formatRate(this.retailOutput?.baseLoanRate)
},
/** 获取浮动BP */
getTotalBp() {
return this.retailOutput?.totalBp || '-'
},
/** 获取最终测算利率 */
getCalculateRate() {
return this.formatRate(this.retailOutput?.finalCalculateRate)
},
/** 设定执行利率 */
handleSetExecuteRate() {
const value = this.executeRateInput
@@ -257,16 +247,6 @@ export default {
font-weight: 500;
}
.total-bp-value {
color: #e6a23c;
font-weight: 600;
}
.calculate-rate {
color: #f56c6c;
font-weight: 600;
font-size: 16px;
}
}
}

View File

@@ -82,17 +82,19 @@ assert(
)
assert(
!personalCreateDialog.includes('label="是否有经营佐证"') &&
!personalCreateDialog.includes('prop="bizProof"') &&
!personalCreateDialog.includes('bizProof:') &&
personalCreateDialog.includes('label="是否有营业执照"') &&
personalCreateDialog.includes('prop="bizProof"') &&
personalCreateDialog.includes('bizProof: false') &&
personalCreateDialog.includes('bizProof: this.isOne(this.editData.bizProof)') &&
personalCreateDialog.includes("bizProof: this.form.bizProof ? '1' : '0'") &&
personalCreateDialog.includes("loanLoop: this.form.loanLoop ? '1' : '0'") &&
personalCreateDialog.includes("data.collThirdParty = this.form.collThirdParty ? '1' : '0'") &&
personalCreateDialog.includes('data.collType = this.resolveMortgageCollateralType()') &&
personalCreateDialog.includes('delete data.collateralNature') &&
personalCreateDialog.includes('delete data.isNineArea') &&
personalCreateDialog.includes('collateralNature: this.editData.collateralNature') &&
personalCreateDialog.includes('isNineArea: this.editData.isNineArea') &&
personalCreateDialog.includes('delete data.collType') &&
personalCreateDialog.includes('delete data.collThirdParty'),
'个人新增弹窗开关字段或非抵质押提交字段处理不正确'
'个人新增弹窗营业执照、抵押来源字段、开关字段或非抵质押提交字段处理不正确'
)
assert(
@@ -100,6 +102,19 @@ assert(
'个人详情页缺少贷款用途展示'
)
assert(
personalDetail.includes('label="是否有营业执照"') && personalDetail.includes('detailData.bizProof'),
'个人详情页缺少营业执照展示'
)
assert(
personalDetail.includes('label="抵押物性质"') &&
personalDetail.includes('detailData.collateralNature') &&
personalDetail.includes('label="是否属于九地"') &&
personalDetail.includes('detailData.isNineArea'),
'个人详情页缺少抵押物性质或九地展示'
)
assert(
personalDetail.includes("value === '1'") && personalDetail.includes("value === '0'"),
'个人详情页布尔格式化未兼容 1/0'

View File

@@ -7,15 +7,22 @@ function read(relativePath) {
}
const personalDetail = read('src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue')
const summaryStart = personalDetail.indexOf('<el-card class="summary-card">')
const summaryEnd = personalDetail.indexOf('</el-card>', summaryStart)
const summaryCard = personalDetail.slice(summaryStart, summaryEnd)
assert(summaryStart !== -1 && summaryEnd !== -1, '个人流程详情缺少关键信息卡片')
assert(
/label="最终测算利率"/.test(personalDetail),
'个人流程详情左侧缺少“最终测算利率”标签'
!/label="(?:基准利率|浮动BP|最终测算利率)"/.test(summaryCard),
'个人流程详情关键信息不应展示基准利率、浮动BP或最终测算利率'
)
assert(
/return this\.retailOutput\?\.finalCalculateRate \|\| '-'/.test(personalDetail),
'个人流程详情没有使用 finalCalculateRate 展示最终测算利率'
/label="期限"/.test(summaryCard)
&& /label="担保方式"/.test(summaryCard)
&& /label="产品最低利率下限"/.test(summaryCard),
'个人流程详情关键信息缺少期限、担保方式或产品最低利率下限'
)
console.log('personal final calculate rate display assertions passed')
console.log('personal key information display assertions passed')

View File

@@ -9,18 +9,48 @@ function read(relativePath) {
const personalDetail = read('src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue')
const modelOutput = read('src/views/loanPricing/workflow/components/ModelOutputDisplay.vue')
function extractCard(source, className) {
const start = source.indexOf(`<el-card class="${className}">`)
const end = source.indexOf('</el-card>', start)
assert(start !== -1 && end !== -1, `缺少卡片: ${className}`)
return source.slice(start, end)
}
const summaryCard = extractCard(personalDetail, 'summary-card')
const detailCard = extractCard(personalDetail, 'detail-card')
const businessInfoStart = detailCard.indexOf('<h4 class="section-title">业务信息</h4>')
const basicInfo = detailCard.slice(0, businessInfoStart)
const businessInfo = detailCard.slice(businessInfoStart)
assert(
personalDetail.includes('label="借款期限"') && personalDetail.includes('detailData.loanTerm'),
'个人详情页缺少借款期限展示'
!basicInfo.includes('label="借款期限"')
&& businessInfo.includes('label="借款期限"')
&& businessInfo.includes('detailData.loanTerm'),
'个人详情页借款期限未展示在业务信息中'
)
;['期限', '担保方式', '产品最低利率下限'].forEach((label) => {
assert(summaryCard.includes(`label="${label}"`), `个人流程详情关键信息缺少字段: ${label}`)
})
;['基准利率', '浮动BP', '最终测算利率'].forEach((label) => {
assert(!summaryCard.includes(`label="${label}"`), `个人流程详情关键信息不应展示字段: ${label}`)
})
assert(
personalDetail.includes('formatRate(retailOutput && retailOutput.minRateProduct)'),
'个人流程详情关键信息未展示产品最低利率下限'
)
const requiredRetailFields = [
'retailOutput.greyBlackCust',
'retailOutput.loanRateHistory',
'retailOutput.minRateProduct',
'retailOutput.smoothRange',
'retailOutput.finalCalculateRate',
'retailOutput.referenceRate'
'retailOutput.referenceRate',
'retailOutput.blackCust',
'retailOutput.branchBp',
'retailOutput.bpLoanUse',
'retailOutput.midPerGasDdc'
]
requiredRetailFields.forEach((field) => {
@@ -28,9 +58,26 @@ requiredRetailFields.forEach((field) => {
})
assert(
modelOutput.indexOf('label="灰黑名单客户"') > modelOutput.indexOf('<h4 class="section-title">基本信息</h4>')
&& modelOutput.indexOf('label="灰黑名单客户"') < modelOutput.indexOf('<h4 class="section-title">测算结果</h4>'),
'灰黑名单客户未展示在个人模型输出基础信息中'
modelOutput.includes("this.resultItem('营业执照', this.formatBoolean(this.retailOutput.bizProof))"),
'个人风险度缺少营业执照或 BP_贷款用途关联展示'
)
assert(
detailCard.includes('label="客户名称"')
&& !detailCard.includes('label="灰黑名单客户"')
&& !detailCard.includes('retailOutput && retailOutput.greyBlackCust'),
'个人流程详情基本信息不应展示灰黑名单客户'
)
assert(
!basicInfo.includes('label="基准利率"')
&& !basicInfo.includes('retailOutput && retailOutput.baseLoanRate'),
'个人流程详情基本信息不应展示基准利率'
)
assert(
!detailCard.includes('label="运行模式"') && !modelOutput.includes('<h4 class="section-title">基本信息</h4>'),
'个人详情仍展示运行模式或模型输出基本信息'
)
console.log('retail display fields assertions passed')

View File

@@ -6,22 +6,22 @@ function read(relativePath) {
return fs.readFileSync(path.join(__dirname, '..', relativePath), 'utf8')
}
function assertModelOutputBeforeDetailCard(source, label) {
function assertDetailCardBeforeModelOutput(source, label) {
const modelOutputIndex = source.indexOf('<ModelOutputDisplay')
const detailCardIndex = source.indexOf('<el-card class="detail-card">')
assert(modelOutputIndex !== -1, `${label} 缺少模型输出卡片`)
assert(detailCardIndex !== -1, `${label} 缺少流程详情卡片`)
assert(
modelOutputIndex < detailCardIndex,
`${label}模型输出卡片应位于流程详情卡片上方`
detailCardIndex < modelOutputIndex,
`${label}流程详情卡片应位于模型输出卡片上方`
)
}
const personalDetail = read('src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue')
const corporateDetail = read('src/views/loanPricing/workflow/components/CorporateWorkflowDetail.vue')
assertModelOutputBeforeDetailCard(personalDetail, '个人流程详情')
assertModelOutputBeforeDetailCard(corporateDetail, '企业流程详情')
assertDetailCardBeforeModelOutput(personalDetail, '个人流程详情')
assertDetailCardBeforeModelOutput(corporateDetail, '企业流程详情')
console.log('workflow detail card order assertions passed')