Files
loan-pricing/doc/2026-03-28-workflow-calculate-rate-list-design.md

5.6 KiB
Raw Blame History

流程列表测算利率展示设计文档

1. 背景

当前流程列表页已经展示“执行利率(%)”,但还没有展示“测算利率(%)”。现有测算利率并不存放在流程表 loan_pricing_workflow 中,而是存放在模型输出表中:

  • 个人客户:model_retail_output_fields.calculate_rate
  • 企业客户:model_corp_output_fields.calculate_rate

本次需求是在流程列表页新增“测算利率(%)”列,并与“执行利率(%)”同时展示。

2. 已确认约束

  • 仅为流程列表页新增“测算利率(%)”展示
  • 测算利率直接取模型输出表中的 calculate_rate
  • 不新增冗余字段回写到 loan_pricing_workflow
  • 正式方案采用联表 SQL一次查出流程表和两张模型输出表所需字段
  • 文档和计划统一保存在 doc 目录

3. 现状分析

当前流程列表页数据来源为 /loanPricing/workflow/list,后端列表接口直接基于 LoanPricingWorkflow 分页返回流程表字段。现状存在两个限制:

  1. 流程表本身只有 loanRateexecuteRate
  2. 测算利率 calculateRate 分散在个人、企业两张模型输出表中

因此,如果不改列表查询链路,前端无法直接在列表页拿到统一的测算利率字段。

4. 方案对比

方案一:后端分页后按记录补查测算利率

做法:

  • 先查流程表分页结果
  • 再根据每条记录的 custTypemodelOutputId 到对应模型输出表查询 calculateRate

优点:

  • 改动可控

缺点:

  • 查询次数随列表记录数增加
  • 服务层补查逻辑分散
  • 不符合本次已选定的联表方案

方案二:联表 SQL 一次查询流程列表和测算利率

做法:

  • loan_pricing_workflow 为主表
  • 基于 model_output_id 左连接 model_retail_output_fieldsmodel_corp_output_fields
  • 统一返回一个列表专用字段 calculateRate

优点:

  • 一次查询返回列表展示所需数据
  • 前端消费简单
  • 不需要额外补查或详情接口拼装

缺点:

  • Mapper 查询层需要新增列表专用 SQL
  • 返回对象需要从实体扩展为列表专用对象

方案三:前端逐条拉详情拼装测算利率

做法:

  • 列表先只返回流程数据
  • 前端逐条再请求详情,取详情中的测算利率

优点:

  • 后端改动相对少

缺点:

  • 请求次数多
  • 列表渲染复杂
  • 属于补丁式方案,不符合本次约束

5. 设计结论

采用方案二:联表 SQL 一次查询流程表和两张模型输出表,统一返回流程列表展示对象。

最终效果:

  • 流程列表页新增“测算利率(%)”列
  • 默认放在“执行利率(%)”前面
  • “测算利率(%)”展示统一返回字段 calculateRate
  • “执行利率(%)”继续展示 executeRate

6. 后端设计

6.1 返回对象

为流程列表新增列表专用返回对象,至少包含:

  • 业务方流水号
  • 客户名称
  • 客户类型
  • 担保方式
  • 申请金额
  • 测算利率 calculateRate
  • 执行利率 executeRate
  • 创建时间
  • 创建者

不再让列表接口直接返回裸 LoanPricingWorkflow 实体。

6.2 SQL 设计

loan_pricing_workflow 为主表,联表查询:

  • LEFT JOIN model_retail_output_fields mr ON lpw.model_output_id = mr.id
  • LEFT JOIN model_corp_output_fields mc ON lpw.model_output_id = mc.id

测算利率统一按客户类型取值,返回别名 calculateRate。可采用 CASE WHEN 或等价写法:

  • 当客户类型为“个人”时取 mr.calculate_rate
  • 当客户类型为“企业”时取 mc.calculate_rate

6.3 分页与筛选

保留当前列表分页和筛选能力:

  • 按创建者模糊查询
  • 按客户名称模糊查询
  • 按机构号模糊查询
  • 按更新时间倒序

分页能力仍由当前列表接口承担,不改变接口入口路径。

7. 前端设计

流程列表页 ruoyi-ui/src/views/loanPricing/workflow/index.vue 新增一列:

  • 列名:测算利率(%)
  • 位置:放在 执行利率(%) 前面
  • 绑定字段:calculateRate

现有 执行利率(%) 列不改,继续绑定 executeRate

8. 边界与非目标

本次不包含以下内容:

  • 不修改详情页测算利率展示逻辑
  • 不修改执行利率设置逻辑
  • 不修改流程创建逻辑
  • 不修改数据库表结构
  • 不新增流程表冗余字段存放测算利率
  • 不让前端按客户类型自行拼装测算利率来源

9. 风险与控制

风险点主要有两个:

  1. 联表后返回结构变化,可能影响前端列表字段读取
  2. 个人/企业客户测算利率来源不同,若统一字段取值逻辑写错,会出现空值或串值

控制方式:

  • 使用列表专用返回对象,避免污染实体语义
  • 在 SQL 中用统一别名 calculateRate 输出
  • 保持 executeRate 字段逻辑不变
  • 通过源码和接口结果核对个人、企业两类记录的展示值

10. 验证方案

实施后需要完成以下验证:

  1. 后端列表查询结果中包含 calculateRate
  2. 个人客户记录的 calculateRate 来自 model_retail_output_fields.calculate_rate
  3. 企业客户记录的 calculateRate 来自 model_corp_output_fields.calculate_rate
  4. 前端流程列表页新增“测算利率(%)”列,且位于“执行利率(%)”前面
  5. 流程列表页同时正常展示“测算利率(%)”和“执行利率(%)”
  6. 列表查询、查看详情、设置执行利率功能不受影响

11. 实施范围

  • 前端:流程列表页 1 个页面文件
  • 后端Controller / Service / Mapper / 列表返回对象
  • 数据库:无表结构改动

本次属于列表查询结构增强与前端展示补充,不涉及数据模型持久化变更。