对公修改

This commit is contained in:
wkc
2026-04-15 18:23:58 +08:00
parent 4b1593d249
commit c37456983f
33 changed files with 598 additions and 165 deletions

3
.gitignore vendored
View File

@@ -47,3 +47,6 @@ nbdist/
!*/build/*.xml
logs/
.playwright-cli/
ruoyi-ui/tests
*/src/test

View File

@@ -0,0 +1,90 @@
# Breadcrumb 重复 key 修复前端实施记录
## 1. 实际改动内容
### 1.1 修复 Breadcrumb 重复 key 告警
修改文件:
- `ruoyi-ui/src/components/Breadcrumb/index.vue`
- `ruoyi-ui/src/components/Breadcrumb/utils.js`
改动内容:
- 将 Breadcrumb 列表项的 `key` 生成逻辑从直接使用 `item.path` 调整为统一调用 `buildBreadcrumbItemKey`
- 新增 `buildBreadcrumbItemKey(item, index)` 工具方法,使用 `path + title + index` 组合生成稳定且唯一的 key
- 保持现有面包屑展示逻辑不变,不调整路由结构、不修改首页与当前页的展示顺序
根因说明:
- 当前项目的 Breadcrumb 会在非首页场景外额外插入一个 `首页` 面包屑,路径固定为 `'/index'`
- 当当前页面本身也对应 `'/index'` 时,原逻辑使用 `item.path` 作为 `transition-group` 的 key会同时生成两个 `'/index'`
- Vue 因此抛出 `Duplicate keys detected: '/index'`
### 1.2 增加最小回归测试
修改文件:
- `ruoyi-ui/tests/breadcrumb-duplicate-key.test.js`
改动内容:
- 新增最小 Node 断言脚本
- 校验当两个 Breadcrumb 条目 path 同为 `'/index'` 时,生成的 key 仍然唯一
- 锁定本次问题,避免后续调整 Breadcrumb 时再次引入相同告警
## 2. 验证结果
### 2.1 Node 版本
项目中未提供 `.nvmrc`,因此未能直接执行 `nvm use` 自动切换。
实际使用版本:
- `nvm use 14.21.3`
### 2.2 测试命令
已执行:
- `cd ruoyi-ui && source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && node tests/breadcrumb-duplicate-key.test.js`
结果:
- 测试通过
- 输出 `breadcrumb duplicate key assertions passed`
### 2.3 构建命令
已执行:
- `cd ruoyi-ui && source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && npm run build:prod`
结果:
- 构建成功
- 输出 `DONE Build complete. The dist directory is ready to be deployed.`
### 2.4 构建告警
存在 webpack 资源体积告警:
- `asset size limit`
- `entrypoint size limit`
说明:
- 这些是现有项目静态资源体积告警
- 本次 Breadcrumb 修复未引入新的构建错误或新的语法告警
## 3. 影响范围
- 仅涉及前端 Breadcrumb 组件
- 未修改后端代码
- 未修改贷款定价业务字段逻辑
## 4. 当前结论
- `Duplicate keys detected: '/index'` 的 Breadcrumb 告警已修复
- 修复方式限定在组件 key 生成逻辑,属于最短路径处理
- 前端回归测试与生产构建均已通过

View File

@@ -0,0 +1,26 @@
# 2026-04-15 上虞对公展示指标对齐前端实施计划
## 改动内容
- 对齐 [CorporateCreateDialog.vue](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-ui/src/views/loanPricing/workflow/components/CorporateCreateDialog.vue) 的对公新增弹窗:
- 新增 `repayMethod`
- `loanTerm` 改为 `1-6` 年下拉
- `collType` 改为 `一类/二类/三类/四类`
- 对外提交字段改为 `isTradeBuildEnt`
- `isGreenLoan``isTradeBuildEnt``collThirdParty` 统一提交 `0/1`
- 移除 `isAgriGuar``isTechEnt`
- 对齐 [CorporateWorkflowDetail.vue](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-ui/src/views/loanPricing/workflow/components/CorporateWorkflowDetail.vue) 的流程详情录入字段展示:
- 新增 `还款方式`
- `贷款期限` 改为 `借款期限`
- 保留 `绿色贷款``贸易和建筑业企业``抵质押类型``抵质押物是否三方所有`
- 移除 `省农担担保贷款``科技型企业`
- 对齐 [ModelOutputDisplay.vue](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-ui/src/views/loanPricing/workflow/components/ModelOutputDisplay.vue) 的企业模型输出展示口径:
- 展示 `repayMethod``isTradeBuildEnt`
- 不再展示 `省农担担保贷款``科技型企业`
- 新增/更新前端静态断言:
- [corporate-create-input-params.test.js](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-ui/tests/corporate-create-input-params.test.js)
- [corporate-display-fields.test.js](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-ui/tests/corporate-display-fields.test.js)
## 验证记录
- `source ~/.nvm/nvm.sh && nvm use 14 >/dev/null && node tests/corporate-create-input-params.test.js`
- `source ~/.nvm/nvm.sh && nvm use 14 >/dev/null && node tests/corporate-display-fields.test.js`
- `source ~/.nvm/nvm.sh && nvm use 14 >/dev/null && npm run build:prod`

View File

@@ -0,0 +1,39 @@
# 2026-04-15 上虞对公展示指标对齐后端实施计划
## 改动内容
- 对齐对公创建接口 DTO 与模型调用 DTO
- [CorporateLoanPricingCreateDTO.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/CorporateLoanPricingCreateDTO.java)
- [ModelInvokeDTO.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java)
- 新增 `repayMethod`
- 对外字段改为 `isTradeBuildEnt`
- `loanTerm` 校验为 `1-6`
- `collType` 校验为 `一类/二类/三类/四类`
- 对齐流程实体、详情出参和模型输出镜像:
- [LoanPricingWorkflow.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/entity/LoanPricingWorkflow.java)
- [ModelCorpOutputFields.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/entity/ModelCorpOutputFields.java)
- [LoanPricingConverter.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java)
- [LoanPricingModelService.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java)
- [LoanPricingWorkflowServiceImpl.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java)
- 内部继续复用 `isTradeConstruction` 落库,外部统一返回 `isTradeBuildEnt`
- `isAgriGuar``isTechEnt` 从对外 JSON 隐藏
- 企业模型输出补充 `repayMethod``isTradeBuildEnt` 展示镜像
- 对齐 mock 与 SQL 资产:
- [corp_output.json](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/main/resources/data/corp_output.json)
- [loan_pricing_workflow.sql](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/sql/loan_pricing_workflow.sql)
- [loan_pricing_schema_20260328.sql](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/sql/loan_pricing_schema_20260328.sql)
- [loan_pricing_prod_init_20260331.sql](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/sql/loan_pricing_prod_init_20260331.sql)
- [loan_pricing_required_data_20260328.sql](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/sql/loan_pricing_required_data_20260328.sql)
- [loan_pricing_alter_20260415_repay_method.sql](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/sql/loan_pricing_alter_20260415_repay_method.sql)
- [test_corporate_create.http](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/test_api/test_corporate_create.http)
- [test_corporate_create.sh](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/test_api/test_corporate_create.sh)
- `loan_pricing_workflow` 增加 `repay_method`
- mock 数据和接口样例统一为 Excel 字段名与 `0/1` 口径
- 补充独立增量 SQL便于其他环境按最小影响同步结构
- 新增/更新后端定向单测:
- [LoanPricingModelServiceCorporateParamsTest.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServiceCorporateParamsTest.java)
- [LoanPricingModelServiceTest.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServiceTest.java)
- [LoanPricingWorkflowServiceImplTest.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java)
- [LoanPricingConverterTest.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/util/LoanPricingConverterTest.java)
## 验证记录
- `mvn -pl ruoyi-loan-pricing -am -Dtest=LoanPricingModelServiceCorporateParamsTest,LoanPricingModelServiceTest,LoanPricingWorkflowServiceImplTest,LoanPricingConverterTest -Dsurefire.failIfNoSpecifiedTests=false test`

View File

@@ -0,0 +1,22 @@
# 2026-04-15 审计字段自动填充后端实施记录
## 背景
- 贷款定价流程实体已经声明了 MyBatis-Plus 的 `FieldFill`,但当前分支缺少迁移源分支中的统一审计填充处理器。
- 导致 `insert``updateById` 执行时,`createBy``createTime``updateBy``updateTime` 不会自动写入或刷新。
## 本次改动
- 新增 [MyMetaHandler.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-framework/src/main/java/com/ruoyi/framework/config/handler/MyMetaHandler.java),恢复与迁移源分支一致的统一审计填充逻辑。
- 审计人格式保持与源分支一致,统一写入 `昵称-用户名`
- 新增 [MyMetaHandlerTest.java](/Users/wkc/Desktop/loan-pricing/loan-pricing-jdk-1.8/ruoyi-framework/src/test/java/com/ruoyi/framework/config/handler/MyMetaHandlerTest.java),覆盖插入填充与更新填充两个核心场景。
## 验证结果
- 执行 `mvn -pl ruoyi-framework -am -Dtest=MyMetaHandlerTest -Dsurefire.failIfNoSpecifiedTests=false test`,通过。
- 执行 `mvn -pl ruoyi-loan-pricing -am -Dtest=MyMetaHandlerTest,LoanPricingWorkflowServiceImplTest,LoanPricingModelServiceTest,LoanPricingModelServiceCorporateParamsTest,LoanPricingModelServicePersonalParamsTest -Dsurefire.failIfNoSpecifiedTests=false test`,通过。
## 影响说明
- 所有使用 MyBatis-Plus 自动填充并声明对应字段的实体,在当前登录上下文下执行新增和更新时,都会自动维护审计字段。
- 本次未改动贷款定价业务入参、SQL 结构和前端页面行为。

View File

@@ -0,0 +1,24 @@
# 对公流程详情测算结果与风险分析分组调整前端实施记录
## 变更日期
- 2026-04-15
## 变更范围
- 前端页面:`ruoyi-ui/src/views/loanPricing/workflow/components/ModelOutputDisplay.vue`
- 前端校验:`ruoyi-ui/tests/corporate-create-input-params.test.js`
- 前端校验:`ruoyi-ui/tests/corporate-display-fields.test.js`
## 实施内容
- 将对公流程详情“模型输出”卡片中的“测算结果”从原“风险度与测算结果”合并分组中拆出。
- 按页面要求将对公模型输出分组顺序调整为“基本信息 → 测算结果 → 忠诚度分析 → 贡献度分析 → 关联度分析 → 风险分析”。
- 保留“风险分析”在模型输出卡片末尾,仅调整展示分组,不修改接口字段、父组件传参和格式化逻辑。
- 补充前端断言,校验对公模型输出存在独立“测算结果”“风险分析”标题,且不再保留“风险度与测算结果”合并标题。
## 影响说明
- 本次仅涉及前端详情页展示层,不涉及后端接口、数据库脚本和模型测算逻辑。
- 对公流程详情页中,用户可在基本信息后直接查看测算结果,风险分析独立展示且位于模型输出末尾。
## 验证结果
- 执行 `node ruoyi-ui/tests/corporate-create-input-params.test.js`,断言通过。
- 执行 `node ruoyi-ui/tests/corporate-display-fields.test.js`,断言通过。
- 执行 `cd ruoyi-ui && nvm use 14.21.3 && npm run build:prod`,前端生产构建通过。

View File

@@ -0,0 +1,16 @@
# 2026-04-15 开发库补列 SQL 落盘实施记录
## 修改内容
- 将开发库已执行的对公字段补列 SQL 整理并保存到 `sql/loan_pricing_alter_20260415_repay_method.sql`
- 在原有 `loan_pricing_workflow.repay_method` 基础上,补充 `model_corp_output_fields` 的以下字段变更语句:
- `repay_method`
- `is_trade_build_ent`
- `loan_rate_history`
- `min_rate_product`
- `smooth_range`
- `final_calculate_rate`
- `reference_rate`
## 结果
- 现有 SQL 文件已可直接用于同步开发库本次字段补齐变更。
- 文件内容与本次实际执行到开发库的语句保持一致。

View File

@@ -0,0 +1,34 @@
package com.ruoyi.framework.config.handler;
import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.utils.SecurityUtils;
/**
* 实体类自动配置创建日期和更新日期
*/
@Component
public class MyMetaHandler implements MetaObjectHandler
{
@Override
public void insertFill(MetaObject metaObject)
{
String auditUser = SecurityUtils.getLoginUser().getUser().getNickName() + '-' + SecurityUtils.getUsername();
this.setFieldValByName("createBy", auditUser, metaObject);
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateBy", auditUser, metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject)
{
String auditUser = SecurityUtils.getLoginUser().getUser().getNickName() + '-' + SecurityUtils.getUsername();
this.setFieldValByName("updateBy", auditUser, metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}

View File

@@ -19,12 +19,18 @@ public class CorporateLoanPricingCreateDTO implements Serializable {
@NotBlank(message = "客户内码不能为空")
private String custIsn;
private String custType;
private String custName;
private String idType;
private String idNum;
@NotBlank(message = "还款方式不能为空")
@Pattern(regexp = "^(分期|不分期)$", message = "还款方式必须是:分期、不分期之一")
private String repayMethod;
@NotBlank(message = "担保方式不能为空")
@Pattern(regexp = "^(信用|保证|抵押|质押)$", message = "担保方式必须是:信用、保证、抵押、质押之一")
private String guarType;
@@ -32,16 +38,16 @@ public class CorporateLoanPricingCreateDTO implements Serializable {
@NotBlank(message = "申请金额不能为空")
private String applyAmt;
@NotBlank(message = "借款期限不能为空")
@Pattern(regexp = "^[1-6]$", message = "借款期限必须是 1 到 6 年")
private String loanTerm;
private String isAgriGuar;
private String isGreenLoan;
private String isTechEnt;
private String isTradeConstruction;
private String isTradeBuildEnt;
@NotBlank(message = "抵质押类型不能为空")
@Pattern(regexp = "^(一类|二类|三类|四类)$", message = "抵质押类型必须是:一类、二类、三类、四类之一")
private String collType;
private String collThirdParty;

View File

@@ -43,6 +43,12 @@ public class ModelInvokeDTO {
*/
private String guarType;
/**
* 还款方式(必填)
* 可选值:分期/不分期
*/
private String repayMethod;
/**
* 中间业务_个人_快捷支付非必填
* 可选值true/false
@@ -103,6 +109,18 @@ public class ModelInvokeDTO {
*/
private String isAgriGuar;
/**
* 绿色贷款(非必填)
* 可选值0/1
*/
private String isGreenLoan;
/**
* 贸易和建筑业企业(非必填)
* 可选值0/1
*/
private String isTradeBuildEnt;
/**
* 是否纳税信用等级A级非必填
* 可选值true/false
@@ -137,7 +155,7 @@ public class ModelInvokeDTO {
/**
* 抵质押类型(非必填)
* 可选值:一类/二类/三类
* 可选值:一类/二类/三类/四类
*/
private String collType;

View File

@@ -1,6 +1,7 @@
package com.ruoyi.loanpricing.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@@ -48,6 +49,9 @@ public class LoanPricingWorkflow implements Serializable
@NotBlank(message = "担保方式不能为空")
private String guarType;
/** 还款方式: 分期/不分期 */
private String repayMethod;
/** 中间业务_个人_快捷支付: true/false */
private String midPerQuickPay;
@@ -65,7 +69,7 @@ public class LoanPricingWorkflow implements Serializable
private String applyAmt;
/**
* 款期限
* 款期限(年)
*/
private String loanTerm;
@@ -79,13 +83,21 @@ public class LoanPricingWorkflow implements Serializable
private String isManufacturing;
/** 省农担担保贷款: true/false */
@JsonIgnore
private String isAgriGuar;
/**
* 贸易和建筑业企业标识: true/false
*/
@JsonIgnore
private String isTradeConstruction;
/**
* 贸易和建筑业企业标识: 0/1
*/
@TableField(exist = false)
private String isTradeBuildEnt;
/**
* 绿色贷款: true/false
*/
@@ -94,6 +106,7 @@ public class LoanPricingWorkflow implements Serializable
/**
* 科技型企业: true/false
*/
@JsonIgnore
private String isTechEnt;
/** 是否纳税信用等级A级: true/false */
@@ -111,7 +124,7 @@ public class LoanPricingWorkflow implements Serializable
/** 循环功能: true/false */
private String loanLoop;
/** 抵质押类型: 一线/一类/类 */
/** 抵质押类型: 一类/二类/三类/类 */
private String collType;
/** 抵质押物是否三方所有: true/false */

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.Date;
@@ -31,6 +32,9 @@ public class ModelCorpOutputFields {
private String idType;
// 证件号码
private String idNum;
// 还款方式
@TableField(exist = false)
private String repayMethod;
// 基准利率
private String baseLoanRate;
// 我行首贷客户
@@ -79,12 +83,14 @@ public class ModelCorpOutputFields {
private String isCleanEnt;
// 开立基本结算账户
private String hasSettleAcct;
// 贸易和建筑业企业
@TableField(exist = false)
private String isTradeBuildEnt;
// 省农担担保贷款
@JsonIgnore
private String isAgriGuar;
// 绿色贷款
private String isGreenLoan;
// 科技型企业
private String isTechEnt;
// BP_企业客户类别
private String bpEntType;
// TOTAL_BP_关联度
@@ -119,6 +125,16 @@ public class ModelCorpOutputFields {
private String totalBp;
// 测算利率
private String calculateRate;
// 历史利率
private String loanRateHistory;
// 产品最低利率下限
private String minRateProduct;
// 平滑幅度
private String smoothRange;
// 最终测算利率
private String finalCalculateRate;
// 参考利率
private String referenceRate;
@TableField(fill = FieldFill.INSERT)
private Date createTime;

View File

@@ -59,10 +59,15 @@ public class LoanPricingModelService {
}
ModelInvokeDTO modelInvokeDTO = new ModelInvokeDTO();
BeanUtils.copyProperties(loanPricingWorkflow, modelInvokeDTO);
modelInvokeDTO.setIsTradeBuildEnt(toZeroOne(loanPricingWorkflow.getIsTradeConstruction()));
if ("个人".equals(loanPricingWorkflow.getCustType()))
{
normalizePersonalModelInvokeDTO(modelInvokeDTO);
}
if ("企业".equals(loanPricingWorkflow.getCustType()))
{
normalizeCorporateModelInvokeDTO(modelInvokeDTO);
}
JSONObject response = modelService.invokeModel(modelInvokeDTO);
if (loanPricingWorkflow.getCustType().equals("个人")){
// 个人模型
@@ -94,6 +99,13 @@ public class LoanPricingModelService {
modelInvokeDTO.setCollThirdParty(toZeroOne(modelInvokeDTO.getCollThirdParty()));
}
private void normalizeCorporateModelInvokeDTO(ModelInvokeDTO modelInvokeDTO)
{
modelInvokeDTO.setIsGreenLoan(toZeroOne(modelInvokeDTO.getIsGreenLoan()));
modelInvokeDTO.setIsTradeBuildEnt(toZeroOne(modelInvokeDTO.getIsTradeBuildEnt()));
modelInvokeDTO.setCollThirdParty(toZeroOne(modelInvokeDTO.getCollThirdParty()));
}
private String toZeroOne(String value)
{
if ("true".equals(value) || "1".equals(value))

View File

@@ -78,6 +78,8 @@ public class LoanPricingWorkflowServiceImpl implements ILoanPricingWorkflowServi
{
loanPricingWorkflow.setRunType("1");
}
loanPricingWorkflow.setCustType("企业".equals(loanPricingWorkflow.getCustType()) ? "企业" : loanPricingWorkflow.getCustType());
loanPricingWorkflow.setIsTradeBuildEnt(loanPricingWorkflow.getIsTradeConstruction());
loanPricingWorkflow.setCustName(sensitiveFieldCryptoService.encrypt(loanPricingWorkflow.getCustName()));
loanPricingWorkflow.setIdNum(sensitiveFieldCryptoService.encrypt(loanPricingWorkflow.getIdNum()));
@@ -163,6 +165,7 @@ public class LoanPricingWorkflowServiceImpl implements ILoanPricingWorkflowServi
String plainIdNum = sensitiveFieldCryptoService.decrypt(loanPricingWorkflow.getIdNum());
loanPricingWorkflow.setCustName(loanPricingSensitiveDisplayService.maskCustName(plainCustName));
loanPricingWorkflow.setIdNum(loanPricingSensitiveDisplayService.maskIdNum(plainIdNum));
loanPricingWorkflow.setIsTradeBuildEnt(loanPricingWorkflow.getIsTradeConstruction());
loanPricingWorkflowVO.setLoanPricingWorkflow(loanPricingWorkflow);
if (Objects.nonNull(loanPricingWorkflow.getModelOutputId())){
@@ -180,6 +183,8 @@ public class LoanPricingWorkflowServiceImpl implements ILoanPricingWorkflowServi
if (Objects.nonNull(modelCorpOutputFields))
{
maskModelCorpOutputBasicInfo(modelCorpOutputFields);
modelCorpOutputFields.setRepayMethod(loanPricingWorkflow.getRepayMethod());
modelCorpOutputFields.setIsTradeBuildEnt(loanPricingWorkflow.getIsTradeBuildEnt());
loanPricingWorkflow.setLoanRate(modelCorpOutputFields.getCalculateRate());
}
loanPricingWorkflowVO.setModelCorpOutputFields(modelCorpOutputFields);

View File

@@ -52,15 +52,15 @@ public class LoanPricingConverter {
entity.setCustName(dto.getCustName());
entity.setIdType(dto.getIdType());
entity.setIdNum(dto.getIdNum());
entity.setRepayMethod(dto.getRepayMethod());
entity.setGuarType(dto.getGuarType());
entity.setApplyAmt(dto.getApplyAmt());
entity.setCollType(dto.getCollType());
entity.setCollThirdParty(dto.getCollThirdParty());
// 映射企业特有字段
entity.setIsAgriGuar(dto.getIsAgriGuar());
entity.setIsGreenLoan(dto.getIsGreenLoan());
entity.setIsTechEnt(dto.getIsTechEnt());
entity.setIsTradeConstruction(dto.getIsTradeConstruction());
entity.setIsTradeConstruction(dto.getIsTradeBuildEnt());
entity.setIsTradeBuildEnt(dto.getIsTradeBuildEnt());
entity.setLoanTerm(dto.getLoanTerm());
return entity;
}

View File

@@ -4,11 +4,12 @@
"tokenId": "17364055486305E7F4722M8IPFWNL8TOBEB",
"mappingOutputFields": {
"custIsn": "CUST20260121001",
"custType": "企业客户",
"guarType": "抵押担保",
"custType": "企业",
"guarType": "抵押",
"custName": "北京智联科技有限公司",
"idType": "营业执照",
"idNum": "91110108MA00XXXXXX",
"repayMethod": "分期",
"baseLoanRate": "3.45",
"isFirstLoan": "N",
"faithDay": "730",
@@ -33,17 +34,16 @@
"bpPayroll": "4.1",
"isCleanEnt": "Y",
"hasSettleAcct": "Y",
"isAgriGuar": "N",
"isGreenLoan": "Y",
"isTechEnt": "Y",
"isGreenLoan": "1",
"isTradeBuildEnt": "0",
"bpEntType": "7.5",
"totoalBpRelevance": "9.2",
"loanTerm": "36",
"loanTerm": "6",
"bpLoanTerm": "3.3",
"applyAmt": "5000000.00",
"applyAmt": "1000000.00",
"bpLoanAmount": "5.8",
"collType": "房产抵押",
"collThirdParty": "N",
"collType": "四类",
"collThirdParty": "1",
"bpCollateral": "4.5",
"greyCust": "N",
"prinOverdue": "N",

View File

@@ -87,4 +87,30 @@ class LoanPricingModelServiceTest
!Objects.equals("张三", entity.getCustName())
&& !Objects.equals("110101199001011234", entity.getIdNum())));
}
@Test
void shouldSendCorporateRepayMethodAndTradeBuildFlagToModel()
{
LoanPricingWorkflow workflow = new LoanPricingWorkflow();
workflow.setId(3L);
workflow.setCustType("企业");
workflow.setCustName("cipher-name");
workflow.setIdNum("cipher-id");
workflow.setRepayMethod("分期");
workflow.setIsTradeConstruction("1");
JSONObject response = new JSONObject();
response.put("calculateRate", "4.10");
when(loanPricingWorkflowMapper.selectById(3L)).thenReturn(workflow);
when(sensitiveFieldCryptoService.decrypt("cipher-name")).thenReturn("上虞测试企业");
when(sensitiveFieldCryptoService.decrypt("cipher-id")).thenReturn("91330000123456789X");
when(modelService.invokeModel(any())).thenReturn(response);
loanPricingModelService.invokeModelAsync(3L);
verify(modelService).invokeModel(argThat((ModelInvokeDTO dto) ->
Objects.equals("分期", dto.getRepayMethod())
&& Objects.equals("1", dto.getIsTradeBuildEnt())));
}
}

View File

@@ -253,4 +253,33 @@ class LoanPricingWorkflowServiceImplTest
assertEquals("测试****公司", result.getModelCorpOutputFields().getCustName());
assertEquals("91*************00X", result.getModelCorpOutputFields().getIdNum());
}
@Test
void shouldReturnCorporateDisplaySheetFieldsInWorkflowDetail()
{
LoanPricingWorkflow workflow = new LoanPricingWorkflow();
workflow.setSerialNum("C20260415001");
workflow.setCustType("企业");
workflow.setCustName("cipher-name");
workflow.setIdNum("cipher-id");
workflow.setRepayMethod("分期");
workflow.setIsTradeConstruction("1");
workflow.setModelOutputId(23L);
ModelCorpOutputFields corpOutputFields = new ModelCorpOutputFields();
corpOutputFields.setCalculateRate("4.95");
when(loanPricingWorkflowMapper.selectOne(any())).thenReturn(workflow);
when(modelCorpOutputFieldsMapper.selectById(23L)).thenReturn(corpOutputFields);
when(sensitiveFieldCryptoService.decrypt("cipher-name")).thenReturn("上虞测试企业");
when(sensitiveFieldCryptoService.decrypt("cipher-id")).thenReturn("91330000123456789X");
when(loanPricingSensitiveDisplayService.maskCustName("上虞测试企业")).thenReturn("上虞***企业");
when(loanPricingSensitiveDisplayService.maskIdNum("91330000123456789X")).thenReturn("91*************89X");
LoanPricingWorkflowVO result = loanPricingWorkflowService.selectLoanPricingBySerialNum("C20260415001");
assertEquals("分期", result.getModelCorpOutputFields().getRepayMethod());
assertEquals("1", result.getModelCorpOutputFields().getIsTradeBuildEnt());
assertEquals("4.95", result.getLoanPricingWorkflow().getLoanRate());
}
}

View File

@@ -1,7 +1,7 @@
<template>
<el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="buildBreadcrumbItemKey(item, index)">
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span>
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
</el-breadcrumb-item>
@@ -10,6 +10,8 @@
</template>
<script>
const { buildBreadcrumbItemKey } = require('./utils')
export default {
data() {
return {
@@ -29,6 +31,7 @@ export default {
this.getBreadcrumb()
},
methods: {
buildBreadcrumbItemKey,
getBreadcrumb() {
// only show routes with meta.title
let matched = []

View File

@@ -0,0 +1,9 @@
function buildBreadcrumbItemKey(item, index) {
const path = item && item.path ? item.path : 'breadcrumb'
const title = item && item.meta && item.meta.title ? item.meta.title : index
return `${path}-${title}-${index}`
}
module.exports = {
buildBreadcrumbItemKey
}

View File

@@ -35,6 +35,14 @@
<!-- 贷款信息 -->
<el-divider content-position="left">贷款信息</el-divider>
<el-row>
<el-col :span="12">
<el-form-item label="还款方式" prop="repayMethod">
<el-select v-model="form.repayMethod" placeholder="请选择还款方式" style="width: 100%">
<el-option label="分期" value="分期"/>
<el-option label="不分期" value="不分期"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="担保方式" prop="guarType">
<el-select v-model="form.guarType" placeholder="请选择担保方式" style="width: 100%">
@@ -53,8 +61,10 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="款期限(月)" prop="loanTerm">
<el-input v-model.number="form.loanTerm" type="number" placeholder="请输入贷款期限"/>
<el-form-item label="款期限" prop="loanTerm">
<el-select v-model="form.loanTerm" placeholder="请选择借款期限" style="width: 100%">
<el-option v-for="item in loanTermOptions" :key="item" :label="item" :value="item"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
@@ -62,26 +72,14 @@
<!-- 企业标识 -->
<el-divider content-position="left">企业标识</el-divider>
<el-row>
<el-col :span="12">
<el-form-item label="省农担担保贷款" prop="isAgriGuar">
<el-switch v-model="form.isAgriGuar"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="绿色贷款" prop="isGreenLoan">
<el-switch v-model="form.isGreenLoan"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="科技型企业" prop="isTechEnt">
<el-switch v-model="form.isTechEnt"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="贸易和建筑业企业" prop="isTradeConstruction">
<el-switch v-model="form.isTradeConstruction"/>
<el-form-item label="贸易和建筑业企业" prop="isTradeBuildEnt">
<el-switch v-model="form.isTradeBuildEnt"/>
</el-form-item>
</el-col>
</el-row>
@@ -92,9 +90,10 @@
<el-col :span="12">
<el-form-item label="抵质押类型" prop="collType">
<el-select v-model="form.collType" placeholder="请选择抵质押类型" style="width: 100%">
<el-option label="一线" value="一线"/>
<el-option label="一类" value="一类"/>
<el-option label="二类" value="二类"/>
<el-option label="三类" value="三类"/>
<el-option label="四类" value="四类"/>
</el-select>
</el-form-item>
</el-col>
@@ -124,7 +123,6 @@ export default {
}
},
data() {
// 金额验证
const validateApplyAmt = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入申请金额'))
@@ -140,38 +138,30 @@ export default {
}
}
// 贷款期限验证
const validateLoanTerm = (rule, value, callback) => {
if (!value && value !== 0) {
callback(new Error('请输入贷款期限'))
} else {
const num = parseInt(value)
if (isNaN(num) || num <= 0) {
callback(new Error('请输入有效的贷款期限'))
} else if (num > 360) {
callback(new Error('贷款期限不能超过 360 个月'))
} else {
callback()
}
}
}
return {
submitting: false,
loanTermOptions: [
'1',
'2',
'3',
'4',
'5',
'6'
],
form: {
orgCode: '892000',
runType: '1',
custType: '企业',
custIsn: undefined,
custName: undefined,
idType: undefined,
idNum: undefined,
repayMethod: undefined,
guarType: undefined,
applyAmt: undefined,
loanTerm: undefined,
isAgriGuar: false,
isGreenLoan: false,
isTechEnt: false,
isTradeConstruction: false,
isTradeBuildEnt: false,
collType: undefined,
collThirdParty: false
},
@@ -190,6 +180,9 @@ export default {
idNum: [
{required: true, message: "证件号码不能为空", trigger: "blur"}
],
repayMethod: [
{required: true, message: "请选择还款方式", trigger: "change"}
],
guarType: [
{required: true, message: "请选择担保方式", trigger: "change"}
],
@@ -197,7 +190,7 @@ export default {
{required: true, validator: validateApplyAmt, trigger: "blur"}
],
loanTerm: [
{required: true, validator: validateLoanTerm, trigger: "blur"}
{required: true, message: "请选择借款期限", trigger: "change"}
],
collType: [
{required: true, message: "请选择抵质押类型", trigger: "change"}
@@ -228,17 +221,17 @@ export default {
this.form = {
orgCode: '892000',
runType: '1',
custType: '企业',
custIsn: undefined,
custName: undefined,
idType: undefined,
idNum: undefined,
repayMethod: undefined,
guarType: undefined,
applyAmt: undefined,
loanTerm: undefined,
isAgriGuar: false,
isGreenLoan: false,
isTechEnt: false,
isTradeConstruction: false,
isTradeBuildEnt: false,
collType: undefined,
collThirdParty: false
}
@@ -259,14 +252,11 @@ export default {
this.$refs["form"].validate(valid => {
if (valid) {
this.submitting = true
// 转换开关值为字符串
const data = {
...this.form,
isAgriGuar: this.form.isAgriGuar ? 'true' : 'false',
isGreenLoan: this.form.isGreenLoan ? 'true' : 'false',
isTechEnt: this.form.isTechEnt ? 'true' : 'false',
isTradeConstruction: this.form.isTradeConstruction ? 'true' : 'false',
collThirdParty: this.form.collThirdParty ? 'true' : 'false'
isGreenLoan: this.form.isGreenLoan ? '1' : '0',
isTradeBuildEnt: this.form.isTradeBuildEnt ? '1' : '0',
collThirdParty: this.form.collThirdParty ? '1' : '0'
}
createCorporateWorkflow(data).then(response => {

View File

@@ -68,7 +68,8 @@
<el-descriptions-item label="客户内码">{{ detailData.custIsn }}</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.repayMethod || '-' }}</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>
@@ -80,12 +81,8 @@
<el-descriptions :column="2" border>
<el-descriptions-item label="担保方式">{{ detailData.guarType }}</el-descriptions-item>
<el-descriptions-item label="申请金额">{{ detailData.applyAmt }} </el-descriptions-item>
<el-descriptions-item label="省农担担保贷款">{{
formatBoolean(detailData.isAgriGuar)
}}
</el-descriptions-item>
<el-descriptions-item label="绿色贷款">{{ formatBoolean(detailData.isGreenLoan) }}</el-descriptions-item>
<el-descriptions-item label="科技型企业">{{ formatBoolean(detailData.isTechEnt) }}</el-descriptions-item>
<el-descriptions-item label="贸易和建筑业企业">{{ formatBoolean(detailData.isTradeBuildEnt) }}</el-descriptions-item>
<el-descriptions-item label="抵质押类型">{{ detailData.collType || '-' }}</el-descriptions-item>
<el-descriptions-item label="抵质押物是否三方所有">{{
formatBoolean(detailData.collThirdParty)

View File

@@ -109,10 +109,13 @@
<h4 class="section-title">基本信息</h4>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="客户内码">{{ corpOutput.custIsn || '-' }}</el-descriptions-item>
<el-descriptions-item label="客户类型">{{ corpOutput.custType || '-' }}</el-descriptions-item>
<el-descriptions-item label="担保方式">{{ corpOutput.guarType || '-' }}</el-descriptions-item>
<el-descriptions-item label="客户名称">{{ corpOutput.custName || '-' }}</el-descriptions-item>
<el-descriptions-item label="证件类型">{{ corpOutput.idType || '-' }}</el-descriptions-item>
<el-descriptions-item label="证件号码">{{ corpOutput.idNum || '-' }}</el-descriptions-item>
<el-descriptions-item label="基准利率"><span class="rate-value">{{ corpOutput.baseLoanRate || '-' }}</span> %</el-descriptions-item>
<el-descriptions-item label="还款方式">{{ corpOutput.repayMethod || '-' }}</el-descriptions-item>
<el-descriptions-item label="借款期限">{{ corpOutput.loanTerm || '-' }}</el-descriptions-item>
</el-descriptions>
</div>
@@ -120,7 +123,13 @@
<h4 class="section-title">测算结果</h4>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="浮动BP"><span class="total-bp-value">{{ corpOutput.totalBp || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="基准利率"><span class="rate-value">{{ corpOutput.baseLoanRate || '-' }}</span> %</el-descriptions-item>
<el-descriptions-item label="测算利率"><span class="calculate-rate">{{ corpOutput.calculateRate || '-' }}</span> %</el-descriptions-item>
<el-descriptions-item label="历史利率">{{ corpOutput.loanRateHistory || '-' }}</el-descriptions-item>
<el-descriptions-item label="产品最低利率下限">{{ corpOutput.minRateProduct || '-' }}</el-descriptions-item>
<el-descriptions-item label="平滑幅度">{{ corpOutput.smoothRange || '-' }}</el-descriptions-item>
<el-descriptions-item label="最终测算利率"><span class="calculate-rate">{{ corpOutput.finalCalculateRate || '-' }}</span> %</el-descriptions-item>
<el-descriptions-item label="参考利率"><span class="calculate-rate">{{ corpOutput.referenceRate || '-' }}</span> %</el-descriptions-item>
</el-descriptions>
</div>
@@ -141,7 +150,7 @@
<el-descriptions-item label="存款年日均">{{ corpOutput.balanceAvg || '-' }}</el-descriptions-item>
<el-descriptions-item label="贷款年日均">{{ corpOutput.loanAvg || '-' }}</el-descriptions-item>
<el-descriptions-item label="派生率">{{ corpOutput.derivationRate || '-' }}</el-descriptions-item>
<el-descriptions-item label="TOTAL_BP_贡献度"><span class="total-bp-value">{{ corpOutput.totalBpContribution || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="TOTAL_BP_贡献度" :span="2"><span class="total-bp-value">{{ corpOutput.totalBpContribution || '-' }}</span></el-descriptions-item>
</el-descriptions>
</div>
@@ -155,47 +164,31 @@
<el-descriptions-item label="中间业务_企业_贴现">{{ formatBoolean(corpOutput.midEntDiscount) }}</el-descriptions-item>
<el-descriptions-item label="中间业务_企业_电费代扣">{{ formatBoolean(corpOutput.midEntEleDdc) }}</el-descriptions-item>
<el-descriptions-item label="中间业务_企业_水费代扣">{{ formatBoolean(corpOutput.midEntWaterDdc) }}</el-descriptions-item>
<el-descriptions-item label="中间业务_企业_税务代扣">{{ formatBoolean(corpOutput.midEntTax) }}</el-descriptions-item>
<el-descriptions-item label="BP_中间业务"><span class="bp-value">{{ corpOutput.bpMid || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="代发工资户数">{{ corpOutput.payroll || '-' }}</el-descriptions-item>
<el-descriptions-item label="存量贷款余额">{{ corpOutput.invLoanAmount || '-' }}</el-descriptions-item>
<el-descriptions-item label="BP_代发工资"><span class="bp-value">{{ corpOutput.bpPayroll || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="TOTAL_BP_关联度"><span class="total-bp-value">{{ corpOutput.totoalBpRelevance || '-' }}</span></el-descriptions-item>
</el-descriptions>
</div>
<div class="model-section">
<h4 class="section-title">企业类别</h4>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="净身企业">{{ formatBoolean(corpOutput.isCleanEnt) }}</el-descriptions-item>
<el-descriptions-item label="开立基本结算账户">{{ formatBoolean(corpOutput.hasSettleAcct) }}</el-descriptions-item>
<el-descriptions-item label="省农担担保贷款">{{ formatBoolean(corpOutput.isAgriGuar) }}</el-descriptions-item>
<el-descriptions-item label="贸易和建筑业企业">{{ formatBoolean(corpOutput.isTradeBuildEnt) }}</el-descriptions-item>
<el-descriptions-item label="绿色贷款">{{ formatBoolean(corpOutput.isGreenLoan) }}</el-descriptions-item>
<el-descriptions-item label="科技型企业">{{ formatBoolean(corpOutput.isTechEnt) }}</el-descriptions-item>
<el-descriptions-item label="BP_企业客户类别"><span class="bp-value">{{ corpOutput.bpEntType || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="TOTAL_BP_关联度" :span="2"><span class="total-bp-value">{{ corpOutput.totoalBpRelevance || '-' }}</span></el-descriptions-item>
</el-descriptions>
</div>
<div class="model-section">
<h4 class="section-title">贷款特征</h4>
<h4 class="section-title">风险分析</h4>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="贷款期限">{{ corpOutput.loanTerm || '-' }}</el-descriptions-item>
<el-descriptions-item label="BP_贷款期限"><span class="bp-value">{{ corpOutput.bpLoanTerm || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="申请金额">{{ corpOutput.applyAmt || '-' }}</el-descriptions-item>
<el-descriptions-item label="BP_贷款额度"><span class="bp-value">{{ corpOutput.bpLoanAmount || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="抵质押类型">{{ corpOutput.collType || '-' }}</el-descriptions-item>
<el-descriptions-item label="抵质押物三方所有">{{ formatBoolean(corpOutput.collThirdParty) }}</el-descriptions-item>
<el-descriptions-item label="BP_抵押物"><span class="bp-value">{{ corpOutput.bpCollateral || '-' }}</span></el-descriptions-item>
</el-descriptions>
</div>
<div class="model-section">
<h4 class="section-title">风险度分析</h4>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="灰名单客户">{{ formatBoolean(corpOutput.greyCust) }}</el-descriptions-item>
<el-descriptions-item label="本金逾期">{{ formatBoolean(corpOutput.prinOverdue) }}</el-descriptions-item>
<el-descriptions-item label="利息逾期">{{ formatBoolean(corpOutput.interestOverdue) }}</el-descriptions-item>
<el-descriptions-item label="信用卡逾期">{{ formatBoolean(corpOutput.cardOverdue) }}</el-descriptions-item>
<el-descriptions-item label="BP_灰名单与逾期"><span class="bp-value">{{ corpOutput.bpGreyOverdue || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="TOTAL_BP_风险度"><span class="total-bp-value">{{ corpOutput.totoalBpRisk || '-' }}</span></el-descriptions-item>
</el-descriptions>
@@ -279,26 +272,22 @@ export default {
}
}
// BP 值样式
.bp-value {
color: #409eff;
font-weight: 500;
}
// TOTAL_BP 样式
.total-bp-value {
color: #e6a23c;
font-weight: 600;
}
// 测算利率高亮样式
.calculate-rate {
color: #f56c6c;
font-weight: 600;
font-size: 16px;
}
// 利率值样式
.rate-value {
color: #67c23a;
font-weight: 500;

View File

@@ -0,0 +1,26 @@
-- 对公展示指标字段对齐:补充还款方式与模型输出缺失字段
-- 执行库loan-pricing
ALTER TABLE `loan_pricing_workflow`
ADD COLUMN `repay_method` varchar(20) DEFAULT NULL COMMENT '还款方式: 分期/不分期'
AFTER `guar_type`;
ALTER TABLE `model_corp_output_fields`
ADD COLUMN `repay_method` varchar(100) DEFAULT NULL COMMENT '还款方式' AFTER `id_num`,
ADD COLUMN `is_trade_build_ent` varchar(100) DEFAULT NULL COMMENT '贸易和建筑业企业' AFTER `has_settle_acct`,
ADD COLUMN `loan_rate_history` varchar(100) DEFAULT NULL COMMENT '历史利率' AFTER `calculate_rate`,
ADD COLUMN `min_rate_product` varchar(100) DEFAULT NULL COMMENT '产品最低利率下限' AFTER `loan_rate_history`,
ADD COLUMN `smooth_range` varchar(100) DEFAULT NULL COMMENT '平滑幅度' AFTER `min_rate_product`,
ADD COLUMN `final_calculate_rate` varchar(100) DEFAULT NULL COMMENT '最终测算利率' AFTER `smooth_range`,
ADD COLUMN `reference_rate` varchar(100) DEFAULT NULL COMMENT '参考利率' AFTER `final_calculate_rate`;
drop table if exists sys_notice_read;
create table sys_notice_read (
read_id bigint(20) not null auto_increment comment '已读主键',
notice_id int(4) not null comment '公告id',
user_id bigint(20) not null comment '用户id',
read_time datetime not null comment '阅读时间',
primary key (read_id),
unique key uk_user_notice (user_id, notice_id) comment '同一用户同一公告只记录一次'
) engine=innodb auto_increment=1 comment='公告已读记录表';

View File

@@ -746,12 +746,13 @@ CREATE TABLE `loan_pricing_workflow` (
`cust_isn` varchar(50) NOT NULL COMMENT '客户内码',
`cust_type` varchar(20) NOT NULL COMMENT '客户类型: 个人/企业',
`guar_type` varchar(20) NOT NULL COMMENT '担保方式: 信用/保证/抵押/质押',
`repay_method` varchar(20) DEFAULT NULL COMMENT '还款方式: 分期/不分期',
`mid_per_quick_pay` varchar(10) DEFAULT NULL COMMENT '中间业务_个人_快捷支付: true/false',
`mid_per_ele_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_个人_电费代扣: true/false',
`mid_ent_ele_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_企业_电费代扣: true/false',
`mid_ent_water_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_企业_水费代扣: true/false',
`apply_amt` varchar(50) NOT NULL COMMENT '申请金额(元)',
`loan_term` varchar(50) DEFAULT NULL COMMENT '款期限',
`loan_term` varchar(50) DEFAULT NULL COMMENT '款期限(年)',
`is_clean_ent` varchar(10) DEFAULT NULL COMMENT '净身企业: true/false',
`has_settle_acct` varchar(10) DEFAULT NULL COMMENT '开立基本结算账户: true/false',
`is_manufacturing` varchar(10) DEFAULT NULL COMMENT '制造业企业: true/false',
@@ -764,7 +765,7 @@ CREATE TABLE `loan_pricing_workflow` (
`loan_purpose` varchar(20) DEFAULT NULL COMMENT '贷款用途: consumer-消费/business-经营',
`biz_proof` varchar(10) DEFAULT NULL COMMENT '是否有经营佐证: true/false',
`loan_loop` varchar(10) DEFAULT NULL COMMENT '循环功能: true/false贷款合同是否开通循环功能',
`coll_type` varchar(20) DEFAULT NULL COMMENT '抵质押类型: 一线/一类/',
`coll_type` varchar(20) DEFAULT NULL COMMENT '抵质押类型: 一类/二类/三类/',
`coll_third_party` varchar(10) DEFAULT NULL COMMENT '抵质押物是否三方所有: true/false',
`loan_rate` varchar(20) DEFAULT NULL COMMENT '贷款利率',
`execute_rate` varchar(20) DEFAULT NULL COMMENT '执行利率(%)',
@@ -800,6 +801,7 @@ CREATE TABLE `model_corp_output_fields` (
`cust_name` varchar(100) DEFAULT NULL COMMENT '客户名称',
`id_type` varchar(100) DEFAULT NULL COMMENT '证件类型',
`id_num` varchar(100) DEFAULT NULL COMMENT '证件号码',
`repay_method` varchar(100) DEFAULT NULL COMMENT '还款方式',
`base_loan_rate` varchar(100) DEFAULT NULL COMMENT '基准利率',
`is_first_loan` varchar(100) DEFAULT NULL COMMENT '我行首贷客户',
`faith_day` varchar(100) DEFAULT NULL COMMENT '用信天数',
@@ -824,6 +826,7 @@ CREATE TABLE `model_corp_output_fields` (
`bp_payroll` varchar(100) DEFAULT NULL COMMENT 'BP_代发工资',
`is_clean_ent` varchar(100) DEFAULT NULL COMMENT '净身企业',
`has_settle_acct` varchar(100) DEFAULT NULL COMMENT '开立基本结算账户',
`is_trade_build_ent` varchar(100) DEFAULT NULL COMMENT '贸易和建筑业企业',
`is_agri_guar` varchar(100) DEFAULT NULL COMMENT '省农担担保贷款',
`is_green_loan` varchar(100) DEFAULT NULL COMMENT '绿色贷款',
`is_tech_ent` varchar(100) DEFAULT NULL COMMENT '科技型企业',
@@ -844,6 +847,11 @@ CREATE TABLE `model_corp_output_fields` (
`totoal_bp_risk` varchar(100) DEFAULT NULL COMMENT 'TOTAL_BP_风险度',
`total_bp` varchar(100) DEFAULT NULL COMMENT '浮动BP',
`calculate_rate` varchar(100) DEFAULT NULL COMMENT '测算利率',
`loan_rate_history` varchar(100) DEFAULT NULL COMMENT '历史利率',
`min_rate_product` varchar(100) DEFAULT NULL COMMENT '产品最低利率下限',
`smooth_range` varchar(100) DEFAULT NULL COMMENT '平滑幅度',
`final_calculate_rate` varchar(100) DEFAULT NULL COMMENT '最终测算利率',
`reference_rate` varchar(100) DEFAULT NULL COMMENT '参考利率',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='客户贷款利率测算表';

View File

@@ -12,19 +12,19 @@ USE `loan-pricing`;
SET FOREIGN_KEY_CHECKS=0;
DELETE FROM `loan_pricing_workflow`;
INSERT INTO `loan_pricing_workflow` (`id`, `serial_num`, `model_output_id`, `org_code`, `run_type`, `cust_isn`, `cust_type`, `guar_type`, `mid_per_quick_pay`, `mid_per_ele_ddc`, `mid_ent_ele_ddc`, `mid_ent_water_ddc`, `apply_amt`, `loan_term`, `is_clean_ent`, `has_settle_acct`, `is_manufacturing`, `is_agri_guar`, `is_tech_ent`, `is_green_loan`, `is_trade_construction`, `is_tax_a`, `is_agri_leading`, `loan_purpose`, `biz_proof`, `loan_loop`, `coll_type`, `coll_third_party`, `loan_rate`, `execute_rate`, `cust_name`, `id_type`, `id_num`, `is_inclusive_finance`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES
(1, '20260130160640382', 1, '892000', '1', '1234', '个人', '信用', 'false', 'false', 'false', 'false', '10000000', NULL, 'false', 'false', 'false', 'false', NULL, NULL, NULL, 'false', 'false', NULL, 'false', NULL, NULL, 'false', '11', NULL, NULL, '身份证', NULL, 'false', '若依-admin', '2026-01-30 16:06:40', '若依-admin', '2026-01-30 16:06:41'),
(2, '20260130163824202', 1, '892000', '1', '82821892198', '企业', '保证', 'false', 'false', 'false', 'false', '100000', NULL, 'false', 'false', 'false', 'false', NULL, NULL, NULL, 'false', 'false', 'consumer', 'false', NULL, NULL, 'false', '10', '4.5', '吴总', '统一社会信用代码', NULL, 'false', '若依-admin', '2026-01-30 16:38:24', '若依-admin', '2026-01-30 16:39:10'),
(3, '20260202140048990', 2, '892000', '1', 'TEST001', '个人', '信用', NULL, NULL, NULL, NULL, '500000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'false', NULL, NULL, NULL, NULL, '张三', '身份证', '110101199001011234', NULL, '若依-admin', '2026-02-02 14:00:49', '若依-admin', '2026-02-02 14:00:50'),
(4, '20260202140101592', 3, '892000', '1', 'TEST002', '个人', '质押', NULL, NULL, NULL, NULL, '100000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '若依-admin', '2026-02-02 14:01:02', '若依-admin', '2026-02-02 14:01:02'),
(5, '20260202140102337', 4, '892000', '1', 'TEST003', '个人', '抵押', NULL, NULL, NULL, NULL, '800000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'true', '一类', 'false', NULL, NULL, '孙七', '身份证', '110101199001011239', NULL, '若依-admin', '2026-02-02 14:01:02', '若依-admin', '2026-02-02 14:01:03'),
(6, '20260202140119035', 2, '892000', '1', 'CORP001', '企业', '抵押', NULL, NULL, NULL, NULL, '1000000', '36', NULL, NULL, NULL, 'false', 'true', 'true', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '测试科技有限公司', '统一社会信用代码', '91110000100000000X', NULL, '若依-admin', '2026-02-02 14:01:19', '若依-admin', '2026-02-02 14:01:19'),
(7, '20260202140128799', 3, '892000', '1', 'CORP007', '企业', '信用', NULL, NULL, NULL, NULL, '3000000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '若依-admin', '2026-02-02 14:01:29', '若依-admin', '2026-02-02 14:01:29'),
(8, '20260202140129480', 4, '892000', '1', 'CORP005', '企业', '保证', NULL, NULL, NULL, NULL, '2000000', '60', NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '农业科技有限公司', '统一社会信用代码', '91110000100000005X', NULL, '若依-admin', '2026-02-02 14:01:29', '若依-admin', '2026-02-02 14:01:30'),
(9, '20260202140138984', 5, '892000', '1', 'OLD001', '个人', '信用', NULL, NULL, NULL, NULL, '500000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'false', NULL, NULL, '4.5', NULL, '测试用户1', '身份证', NULL, NULL, '若依-admin', '2026-02-02 14:01:39', '若依-admin', '2026-02-02 14:01:39'),
(10, '20260202140145591', 5, '892000', '1', 'OLD002', '企业', '抵押', NULL, NULL, NULL, NULL, '1000000', '36', NULL, NULL, NULL, 'false', 'true', 'true', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '4.0', NULL, '测试企业1', '统一社会信用代码', NULL, NULL, '若依-admin', '2026-02-02 14:01:46', '若依-admin', '2026-02-02 14:01:46'),
(11, '20260202144250835', 6, '892000', '1', '1234567', '个人', '信用', NULL, NULL, NULL, NULL, '100000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'true', '一线', 'true', NULL, NULL, '个人测试', '身份证', '330103199912311231', NULL, '若依-admin', '2026-02-02 14:42:51', '若依-admin', '2026-02-02 14:42:51'),
(12, '20260202151445788', 6, '892000', '1', 'test1234', '企业', '信用', NULL, NULL, NULL, NULL, '200000', '23', NULL, NULL, NULL, 'true', 'true', 'true', 'true', NULL, NULL, NULL, NULL, NULL, '一线', 'true', NULL, NULL, 'test1234', '统一社会信用代码', '91110000100000000X', NULL, '若依-admin', '2026-02-02 15:14:46', '若依-admin', '2026-02-02 15:14:46');
INSERT INTO `loan_pricing_workflow` (`id`, `serial_num`, `model_output_id`, `org_code`, `run_type`, `cust_isn`, `cust_type`, `guar_type`, `repay_method`, `mid_per_quick_pay`, `mid_per_ele_ddc`, `mid_ent_ele_ddc`, `mid_ent_water_ddc`, `apply_amt`, `loan_term`, `is_clean_ent`, `has_settle_acct`, `is_manufacturing`, `is_agri_guar`, `is_tech_ent`, `is_green_loan`, `is_trade_construction`, `is_tax_a`, `is_agri_leading`, `loan_purpose`, `biz_proof`, `loan_loop`, `coll_type`, `coll_third_party`, `loan_rate`, `execute_rate`, `cust_name`, `id_type`, `id_num`, `is_inclusive_finance`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES
(1, '20260130160640382', 1, '892000', '1', '1234', '个人', '信用', NULL, 'false', 'false', 'false', 'false', '10000000', NULL, 'false', 'false', 'false', 'false', NULL, NULL, NULL, 'false', 'false', NULL, 'false', NULL, NULL, 'false', '11', NULL, NULL, '身份证', NULL, 'false', '若依-admin', '2026-01-30 16:06:40', '若依-admin', '2026-01-30 16:06:41'),
(2, '20260130163824202', 1, '892000', '1', '82821892198', '企业', '保证', '分期', 'false', 'false', 'false', 'false', '100000', NULL, 'false', 'false', 'false', 'false', NULL, NULL, NULL, 'false', 'false', 'consumer', 'false', NULL, NULL, 'false', '10', '4.5', '吴总', '统一社会信用代码', NULL, 'false', '若依-admin', '2026-01-30 16:38:24', '若依-admin', '2026-01-30 16:39:10'),
(3, '20260202140048990', 2, '892000', '1', 'TEST001', '个人', '信用', NULL, NULL, NULL, NULL, NULL, '500000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'false', NULL, NULL, NULL, NULL, '张三', '身份证', '110101199001011234', NULL, '若依-admin', '2026-02-02 14:00:49', '若依-admin', '2026-02-02 14:00:50'),
(4, '20260202140101592', 3, '892000', '1', 'TEST002', '个人', '质押', NULL, NULL, NULL, NULL, NULL, '100000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '若依-admin', '2026-02-02 14:01:02', '若依-admin', '2026-02-02 14:01:02'),
(5, '20260202140102337', 4, '892000', '1', 'TEST003', '个人', '抵押', NULL, NULL, NULL, NULL, NULL, '800000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'true', '一类', 'false', NULL, NULL, '孙七', '身份证', '110101199001011239', NULL, '若依-admin', '2026-02-02 14:01:02', '若依-admin', '2026-02-02 14:01:03'),
(6, '20260202140119035', 2, '892000', '1', 'CORP001', '企业', '抵押', '分期', NULL, NULL, NULL, NULL, '1000000', '6', NULL, NULL, NULL, 'false', 'true', '1', '0', NULL, NULL, NULL, NULL, NULL, '四类', '1', NULL, NULL, '测试科技有限公司', '统一社会信用代码', '91110000100000000X', NULL, '若依-admin', '2026-02-02 14:01:19', '若依-admin', '2026-02-02 14:01:19'),
(7, '20260202140128799', 3, '892000', '1', 'CORP007', '企业', '信用', '不分期', NULL, NULL, NULL, NULL, '3000000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '若依-admin', '2026-02-02 14:01:29', '若依-admin', '2026-02-02 14:01:29'),
(8, '20260202140129480', 4, '892000', '1', 'CORP005', '企业', '保证', '分期', NULL, NULL, NULL, NULL, '2000000', '6', NULL, NULL, NULL, 'true', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '农业科技有限公司', '统一社会信用代码', '91110000100000005X', NULL, '若依-admin', '2026-02-02 14:01:29', '若依-admin', '2026-02-02 14:01:30'),
(9, '20260202140138984', 5, '892000', '1', 'OLD001', '个人', '信用', NULL, NULL, NULL, NULL, NULL, '500000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'false', NULL, NULL, '4.5', NULL, '测试用户1', '身份证', NULL, NULL, '若依-admin', '2026-02-02 14:01:39', '若依-admin', '2026-02-02 14:01:39'),
(10, '20260202140145591', 5, '892000', '1', 'OLD002', '企业', '抵押', '分期', NULL, NULL, NULL, NULL, '1000000', '6', NULL, NULL, NULL, 'false', 'true', '1', '0', NULL, NULL, NULL, NULL, NULL, '四类', '1', '4.0', NULL, '测试企业1', '统一社会信用代码', NULL, NULL, '若依-admin', '2026-02-02 14:01:46', '若依-admin', '2026-02-02 14:01:46'),
(11, '20260202144250835', 6, '892000', '1', '1234567', '个人', '信用', NULL, NULL, NULL, NULL, NULL, '100000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'true', 'true', '一线', 'true', NULL, NULL, '个人测试', '身份证', '330103199912311231', NULL, '若依-admin', '2026-02-02 14:42:51', '若依-admin', '2026-02-02 14:42:51'),
(12, '20260202151445788', 6, '892000', '1', 'test1234', '企业', '信用', '不分期', NULL, NULL, NULL, NULL, '200000', '2', NULL, NULL, NULL, 'true', 'true', '1', '1', NULL, NULL, NULL, NULL, NULL, '四类', '1', NULL, NULL, 'test1234', '统一社会信用代码', '91110000100000000X', NULL, '若依-admin', '2026-02-02 15:14:46', '若依-admin', '2026-02-02 15:14:46');
DELETE FROM `model_corp_output_fields`;
INSERT INTO `model_corp_output_fields` (`id`, `cust_isn`, `cust_type`, `guar_type`, `cust_name`, `id_type`, `id_num`, `base_loan_rate`, `is_first_loan`, `faith_day`, `bp_first_loan`, `bp_age_loan`, `total_bp_loyalty`, `balance_avg`, `loan_avg`, `derivation_rate`, `total_bp_contribution`, `mid_ent_connect`, `mid_ent_effect`, `mid_ent_inter`, `mid_ent_accept`, `mid_ent_discount`, `mid_ent_ele_ddc`, `mid_ent_water_ddc`, `mid_ent_tax`, `bp_mid`, `payroll`, `inv_loan_amount`, `bp_payroll`, `is_clean_ent`, `has_settle_acct`, `is_agri_guar`, `is_green_loan`, `is_tech_ent`, `bp_ent_type`, `totoal_bp_relevance`, `loan_term`, `bp_loan_term`, `apply_amt`, `bp_loan_amount`, `coll_type`, `coll_third_party`, `bp_collateral`, `grey_cust`, `prin_overdue`, `interest_overdue`, `card_overdue`, `bp_grey_overdue`, `totoal_bp_risk`, `total_bp`, `calculate_rate`, `create_time`) VALUES

View File

@@ -328,12 +328,13 @@ CREATE TABLE `loan_pricing_workflow` (
`cust_isn` varchar(50) NOT NULL COMMENT '客户内码',
`cust_type` varchar(20) NOT NULL COMMENT '客户类型: 个人/企业',
`guar_type` varchar(20) NOT NULL COMMENT '担保方式: 信用/保证/抵押/质押',
`repay_method` varchar(20) DEFAULT NULL COMMENT '还款方式: 分期/不分期',
`mid_per_quick_pay` varchar(10) DEFAULT NULL COMMENT '中间业务_个人_快捷支付: true/false',
`mid_per_ele_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_个人_电费代扣: true/false',
`mid_ent_ele_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_企业_电费代扣: true/false',
`mid_ent_water_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_企业_水费代扣: true/false',
`apply_amt` varchar(50) NOT NULL COMMENT '申请金额(元)',
`loan_term` varchar(50) DEFAULT NULL COMMENT '款期限',
`loan_term` varchar(50) DEFAULT NULL COMMENT '款期限(年)',
`is_clean_ent` varchar(10) DEFAULT NULL COMMENT '净身企业: true/false',
`has_settle_acct` varchar(10) DEFAULT NULL COMMENT '开立基本结算账户: true/false',
`is_manufacturing` varchar(10) DEFAULT NULL COMMENT '制造业企业: true/false',
@@ -346,7 +347,7 @@ CREATE TABLE `loan_pricing_workflow` (
`loan_purpose` varchar(20) DEFAULT NULL COMMENT '贷款用途: consumer-消费/business-经营',
`biz_proof` varchar(10) DEFAULT NULL COMMENT '是否有经营佐证: true/false',
`loan_loop` varchar(10) DEFAULT NULL COMMENT '循环功能: true/false贷款合同是否开通循环功能',
`coll_type` varchar(20) DEFAULT NULL COMMENT '抵质押类型: 一线/一类/',
`coll_type` varchar(20) DEFAULT NULL COMMENT '抵质押类型: 一类/二类/三类/',
`coll_third_party` varchar(10) DEFAULT NULL COMMENT '抵质押物是否三方所有: true/false',
`loan_rate` varchar(20) DEFAULT NULL COMMENT '贷款利率',
`execute_rate` varchar(20) DEFAULT NULL COMMENT '执行利率(%)',
@@ -382,6 +383,7 @@ CREATE TABLE `model_corp_output_fields` (
`cust_name` varchar(100) DEFAULT NULL COMMENT '客户名称',
`id_type` varchar(100) DEFAULT NULL COMMENT '证件类型',
`id_num` varchar(100) DEFAULT NULL COMMENT '证件号码',
`repay_method` varchar(100) DEFAULT NULL COMMENT '还款方式',
`base_loan_rate` varchar(100) DEFAULT NULL COMMENT '基准利率',
`is_first_loan` varchar(100) DEFAULT NULL COMMENT '我行首贷客户',
`faith_day` varchar(100) DEFAULT NULL COMMENT '用信天数',
@@ -406,6 +408,7 @@ CREATE TABLE `model_corp_output_fields` (
`bp_payroll` varchar(100) DEFAULT NULL COMMENT 'BP_代发工资',
`is_clean_ent` varchar(100) DEFAULT NULL COMMENT '净身企业',
`has_settle_acct` varchar(100) DEFAULT NULL COMMENT '开立基本结算账户',
`is_trade_build_ent` varchar(100) DEFAULT NULL COMMENT '贸易和建筑业企业',
`is_agri_guar` varchar(100) DEFAULT NULL COMMENT '省农担担保贷款',
`is_green_loan` varchar(100) DEFAULT NULL COMMENT '绿色贷款',
`is_tech_ent` varchar(100) DEFAULT NULL COMMENT '科技型企业',
@@ -426,6 +429,11 @@ CREATE TABLE `model_corp_output_fields` (
`totoal_bp_risk` varchar(100) DEFAULT NULL COMMENT 'TOTAL_BP_风险度',
`total_bp` varchar(100) DEFAULT NULL COMMENT '浮动BP',
`calculate_rate` varchar(100) DEFAULT NULL COMMENT '测算利率',
`loan_rate_history` varchar(100) DEFAULT NULL COMMENT '历史利率',
`min_rate_product` varchar(100) DEFAULT NULL COMMENT '产品最低利率下限',
`smooth_range` varchar(100) DEFAULT NULL COMMENT '平滑幅度',
`final_calculate_rate` varchar(100) DEFAULT NULL COMMENT '最终测算利率',
`reference_rate` varchar(100) DEFAULT NULL COMMENT '参考利率',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='客户贷款利率测算表';

View File

@@ -9,11 +9,13 @@ CREATE TABLE `loan_pricing_workflow` (
`cust_isn` varchar(50) NOT NULL COMMENT '客户内码',
`cust_type` varchar(20) NOT NULL COMMENT '客户类型: 个人/企业',
`guar_type` varchar(20) NOT NULL COMMENT '担保方式: 信用/保证/抵押/质押',
`repay_method` varchar(20) DEFAULT NULL COMMENT '还款方式: 分期/不分期',
`mid_per_quick_pay` varchar(10) DEFAULT NULL COMMENT '中间业务_个人_快捷支付: true/false',
`mid_per_ele_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_个人_电费代扣: true/false',
`mid_ent_ele_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_企业_电费代扣: true/false',
`mid_ent_water_ddc` varchar(10) DEFAULT NULL COMMENT '中间业务_企业_水费代扣: true/false',
`apply_amt` varchar(50) NOT NULL COMMENT '申请金额(元)',
`loan_term` varchar(50) DEFAULT NULL COMMENT '借款期限(年)',
`is_clean_ent` varchar(10) DEFAULT NULL COMMENT '净身企业: true/false',
`has_settle_acct` varchar(10) DEFAULT NULL COMMENT '开立基本结算账户: true/false',
`is_manufacturing` varchar(10) DEFAULT NULL COMMENT '制造业企业: true/false',
@@ -22,12 +24,13 @@ CREATE TABLE `loan_pricing_workflow` (
`is_agri_leading` varchar(10) DEFAULT NULL COMMENT '是否县级及以上农业龙头企业: true/false',
`loan_purpose` varchar(20) DEFAULT NULL COMMENT '贷款用途: consumer-消费/business-经营',
`biz_proof` varchar(10) DEFAULT NULL COMMENT '是否有经营佐证: true/false',
`coll_type` varchar(20) DEFAULT NULL COMMENT '抵质押类型: 一线/一类/',
`coll_type` varchar(20) DEFAULT NULL COMMENT '抵质押类型: 一类/二类/三类/',
`coll_third_party` varchar(10) DEFAULT NULL COMMENT '抵质押物是否三方所有: true/false',
`loan_rate` varchar(20) NOT NULL COMMENT '贷款利率',
`execute_rate` varchar(20) DEFAULT NULL COMMENT '执行利率(%)',
`cust_name` varchar(100) DEFAULT NULL COMMENT '客户名称',
`id_type` varchar(50) DEFAULT NULL COMMENT '证件类型',
`id_num` varchar(100) DEFAULT NULL COMMENT '证件号码',
`is_inclusive_finance` varchar(10) DEFAULT NULL COMMENT '是否普惠小微借款人: true/false',
`create_by` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',

View File

@@ -10,6 +10,7 @@ CREATE TABLE `model_corp_output_fields` (
`cust_name` VARCHAR(100) COMMENT '客户名称',
`id_type` VARCHAR(100) COMMENT '证件类型',
`id_num` VARCHAR(100) COMMENT '证件号码',
`repay_method` VARCHAR(100) COMMENT '还款方式',
`base_loan_rate` VARCHAR(100) COMMENT '基准利率',
`is_first_loan` VARCHAR(100) COMMENT '我行首贷客户',
`faith_day` VARCHAR(100) COMMENT '用信天数',
@@ -34,6 +35,7 @@ CREATE TABLE `model_corp_output_fields` (
`bp_payroll` VARCHAR(100) COMMENT 'BP_代发工资',
`is_clean_ent` VARCHAR(100) COMMENT '净身企业',
`has_settle_acct` VARCHAR(100) COMMENT '开立基本结算账户',
`is_trade_build_ent` VARCHAR(100) COMMENT '贸易和建筑业企业',
`is_agri_guar` VARCHAR(100) COMMENT '省农担担保贷款',
`is_green_loan` VARCHAR(100) COMMENT '绿色贷款',
`is_tech_ent` VARCHAR(100) COMMENT '科技型企业',
@@ -54,6 +56,11 @@ CREATE TABLE `model_corp_output_fields` (
`totoal_bp_risk` VARCHAR(100) COMMENT 'TOTAL_BP_风险度',
`total_bp` VARCHAR(100) COMMENT '浮动BP',
`calculate_rate` VARCHAR(100) COMMENT '测算利率',
`loan_rate_history` VARCHAR(100) COMMENT '历史利率',
`min_rate_product` VARCHAR(100) COMMENT '产品最低利率下限',
`smooth_range` VARCHAR(100) COMMENT '平滑幅度',
`final_calculate_rate` VARCHAR(100) COMMENT '最终测算利率',
`reference_rate` VARCHAR(100) COMMENT '参考利率',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='客户贷款利率测算表';

View File

@@ -34,12 +34,14 @@ Content-Type: application/json
"custName": "测试科技有限公司",
"idType": "统一社会信用代码",
"idNum": "91110000100000000X",
"repayMethod": "分期",
"guarType": "抵押",
"applyAmt": "1000000",
"loanTerm": "36",
"isAgriGuar": "false",
"isGreenLoan": "true",
"isTechEnt": "true"
"loanTerm": "6",
"isGreenLoan": "1",
"isTradeBuildEnt": "0",
"collType": "四类",
"collThirdParty": "1"
}
> {%
@@ -48,7 +50,7 @@ Content-Type: application/json
client.assert(response.body.code === 200, "Response code is 200");
client.assert(response.body.data.custType === "企业", "Customer type is 企业");
client.assert(response.body.data.serialNum !== null, "Serial number is generated");
client.assert(response.body.data.loanTerm === "36", "Loan term is correct");
client.assert(response.body.data.loanTerm === "6", "Loan term is correct");
});
%}
@@ -142,7 +144,7 @@ Content-Type: application/json
%}
### ============================================================
### 7. 企业客户发起 - 包含省农担担保贷款标识
### 7. 企业客户发起 - 缺少必填字段 repayMethod
### ============================================================
POST http://localhost:63310/loanPricing/workflow/create/corporate
Authorization: Bearer {{token}}
@@ -155,15 +157,13 @@ Content-Type: application/json
"idNum": "91110000100000005X",
"guarType": "保证",
"applyAmt": "2000000",
"loanTerm": "60",
"isAgriGuar": "true"
"loanTerm": "6"
}
> {%
client.test("Corporate loan with agricultural guarantee", function () {
client.test("Missing repayMethod validation works", function () {
client.assert(response.status === 200, "Response status is 200");
client.assert(response.body.code === 200, "Response code is 200");
client.assert(response.body.data.isAgriGuar === "true", "Agricultural guarantee is set");
client.assert(response.body.code === 500, "Response code indicates validation error");
});
%}
@@ -179,17 +179,21 @@ Content-Type: application/json
"custName": "建筑工程有限公司",
"idType": "统一社会信用代码",
"idNum": "91110000100000006X",
"repayMethod": "不分期",
"guarType": "质押",
"applyAmt": "1500000",
"loanTerm": "24",
"isTradeConstruction": "true"
"loanTerm": "4",
"isTradeBuildEnt": "1",
"isGreenLoan": "0",
"collType": "三类",
"collThirdParty": "0"
}
> {%
client.test("Corporate loan for trade/construction", function () {
client.assert(response.status === 200, "Response status is 200");
client.assert(response.body.code === 200, "Response code is 200");
client.assert(response.body.data.isTradeConstruction === "true", "Trade/construction flag is set");
client.assert(response.body.data.isTradeBuildEnt === "1", "Trade/construction flag is set");
});
%}
@@ -205,15 +209,14 @@ Content-Type: application/json
"custName": "科技创新有限公司",
"idType": "统一社会信用代码",
"idNum": "91110000100000007X",
"repayMethod": "分期",
"guarType": "信用",
"applyAmt": "3000000",
"loanTerm": "12",
"isAgriGuar": "false",
"isGreenLoan": "true",
"isTechEnt": "true",
"isTradeConstruction": "false",
"loanTerm": "1",
"isGreenLoan": "1",
"isTradeBuildEnt": "0",
"collType": "一类",
"collThirdParty": "false"
"collThirdParty": "0"
}
> {%

View File

@@ -77,12 +77,14 @@ RESPONSE=$(curl -s -X POST "$CORPORATE_CREATE_URL" \
"custName": "测试科技有限公司",
"idType": "统一社会信用代码",
"idNum": "91110000100000000X",
"repayMethod": "分期",
"guarType": "抵押",
"applyAmt": "1000000",
"loanTerm": "36",
"isAgriGuar": "false",
"isGreenLoan": "true",
"isTechEnt": "true"
"loanTerm": "6",
"isGreenLoan": "1",
"isTradeBuildEnt": "0",
"collType": "四类",
"collThirdParty": "1"
}')
# 检查响应
@@ -204,11 +206,11 @@ else
fi
# ============================================================
# 步骤 7: 测试省农担担保贷款标识
# 步骤 7: 测试缺少必填字段 repayMethod
# ============================================================
echo ""
echo "=========================================="
echo "步骤 7: 测试省农担担保贷款标识"
echo "步骤 7: 测试缺少必填字段 repayMethod"
echo "=========================================="
RESPONSE=$(curl -s -X POST "$CORPORATE_CREATE_URL" \
@@ -221,18 +223,14 @@ RESPONSE=$(curl -s -X POST "$CORPORATE_CREATE_URL" \
"idNum": "91110000100000005X",
"guarType": "保证",
"applyAmt": "2000000",
"loanTerm": "60",
"isAgriGuar": "true"
"loanTerm": "6"
}')
CODE=$(echo "$RESPONSE" | grep -o '"code":[0-9]*' | cut -d':' -f2)
IS_AGRI_GUAR=$(echo "$RESPONSE" | grep -o '"isAgriGuar":"[^"]*"' | cut -d'"' -f4)
if [ "$CODE" == "200" ] && [ "$IS_AGRI_GUAR" == "true" ]; then
print_result "省农担担保贷款标识正确保存" "0"
echo " 省农担标识: $IS_AGRI_GUAR"
if [ "$CODE" == "500" ]; then
print_result "缺少 repayMethod 字段验证" "0"
else
print_result "省农担担保贷款标识正确保存" "1"
print_result "缺少 repayMethod 字段验证" "1"
fi
# ============================================================
@@ -251,28 +249,32 @@ RESPONSE=$(curl -s -X POST "$CORPORATE_CREATE_URL" \
"custName": "建筑工程有限公司",
"idType": "统一社会信用代码",
"idNum": "91110000100000006X",
"repayMethod": "不分期",
"guarType": "质押",
"applyAmt": "1500000",
"loanTerm": "24",
"isTradeConstruction": "true"
"loanTerm": "4",
"isTradeBuildEnt": "1",
"isGreenLoan": "0",
"collType": "三类",
"collThirdParty": "0"
}')
CODE=$(echo "$RESPONSE" | grep -o '"code":[0-9]*' | cut -d':' -f2)
IS_TRADE_CONSTRUCTION=$(echo "$RESPONSE" | grep -o '"isTradeConstruction":"[^"]*"' | cut -d'"' -f4)
IS_TRADE_BUILD_ENT=$(echo "$RESPONSE" | grep -o '"isTradeBuildEnt":"[^"]*"' | cut -d'"' -f4)
if [ "$CODE" == "200" ] && [ "$IS_TRADE_CONSTRUCTION" == "true" ]; then
if [ "$CODE" == "200" ] && [ "$IS_TRADE_BUILD_ENT" == "1" ]; then
print_result "贸易和建筑业企业标识正确保存" "0"
echo " 贸易建筑标识: $IS_TRADE_CONSTRUCTION"
echo " 贸易建筑标识: $IS_TRADE_BUILD_ENT"
else
print_result "贸易和建筑业企业标识正确保存" "1"
fi
# ============================================================
# 步骤 9: 测试最小必填字段
# 步骤 9: 测试完整字段场景
# ============================================================
echo ""
echo "=========================================="
echo "步骤 9: 测试最小必填字段"
echo "步骤 9: 测试完整字段场景"
echo "=========================================="
RESPONSE=$(curl -s -X POST "$CORPORATE_CREATE_URL" \
@@ -280,15 +282,24 @@ RESPONSE=$(curl -s -X POST "$CORPORATE_CREATE_URL" \
-H "Content-Type: application/json" \
-d '{
"custIsn": "CORP007",
"custName": "科技创新有限公司",
"idType": "统一社会信用代码",
"idNum": "91110000100000007X",
"repayMethod": "分期",
"guarType": "信用",
"applyAmt": "3000000"
"applyAmt": "3000000",
"loanTerm": "1",
"isGreenLoan": "1",
"isTradeBuildEnt": "0",
"collType": "一类",
"collThirdParty": "0"
}')
CODE=$(echo "$RESPONSE" | grep -o '"code":[0-9]*' | cut -d':' -f2)
if [ "$CODE" == "200" ]; then
print_result "最小必填字段测试" "0"
print_result "完整字段场景测试" "0"
else
print_result "最小必填字段测试" "1"
print_result "完整字段场景测试" "1"
fi
# ============================================================