@@ -46,13 +42,6 @@
-
-
-
+
+
+
')
+const summaryEnd = personalDetail.indexOf('', 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')
diff --git a/ruoyi-ui/tests/retail-display-fields.test.js b/ruoyi-ui/tests/retail-display-fields.test.js
index 22d9363..3306524 100644
--- a/ruoyi-ui/tests/retail-display-fields.test.js
+++ b/ruoyi-ui/tests/retail-display-fields.test.js
@@ -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(``)
+ const end = source.indexOf('', 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('业务信息
')
+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('基本信息
')
- && modelOutput.indexOf('label="灰黑名单客户"') < modelOutput.indexOf('测算结果
'),
- '灰黑名单客户未展示在个人模型输出基础信息中'
+ 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('基本信息
'),
+ '个人详情仍展示运行模式或模型输出基本信息'
)
console.log('retail display fields assertions passed')
diff --git a/ruoyi-ui/tests/workflow-detail-card-order.test.js b/ruoyi-ui/tests/workflow-detail-card-order.test.js
index 442db7a..7cdae20 100644
--- a/ruoyi-ui/tests/workflow-detail-card-order.test.js
+++ b/ruoyi-ui/tests/workflow-detail-card-order.test.js
@@ -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('')
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')
diff --git a/ruoyi-admin/src/main/resources/db/changelog/changes/20260812-add-model-output-black-cust-branch-bp.sql b/sql/20260814-production.sql
similarity index 54%
rename from ruoyi-admin/src/main/resources/db/changelog/changes/20260812-add-model-output-black-cust-branch-bp.sql
rename to sql/20260814-production.sql
index f1c430b..0878fd3 100644
--- a/ruoyi-admin/src/main/resources/db/changelog/changes/20260812-add-model-output-black-cust-branch-bp.sql
+++ b/sql/20260814-production.sql
@@ -1,11 +1,16 @@
---liquibase formatted sql
+-- 2026-08-14 production database changes
---changeset loan-pricing:20260812-01-add-retail-black-cust-branch-bp runInTransaction:false
+-- Personal model output fields
ALTER TABLE `model_retail_output_fields`
ADD COLUMN `black_cust` varchar(100) DEFAULT NULL COMMENT '黑名单客户' AFTER `grey_cust`,
ADD COLUMN `branch_bp` varchar(100) DEFAULT NULL COMMENT '行社下调BP' AFTER `reference_rate`;
---changeset loan-pricing:20260812-02-add-corp-black-cust-branch-bp runInTransaction:false
+-- Corporate model output fields
ALTER TABLE `model_corp_output_fields`
ADD COLUMN `black_cust` varchar(100) DEFAULT NULL COMMENT '黑名单客户' AFTER `grey_cust`,
ADD COLUMN `branch_bp` varchar(100) DEFAULT NULL COMMENT '行社下调BP' AFTER `reference_rate`;
+
+-- Workflow collateral source fields
+ALTER TABLE `loan_pricing_workflow`
+ ADD COLUMN `collateral_nature` varchar(50) DEFAULT NULL COMMENT '抵押物性质' AFTER `loan_loop`,
+ ADD COLUMN `is_nine_area` varchar(10) DEFAULT NULL COMMENT '是否属于九地: 是/否' AFTER `collateral_nature`;