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

216 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 流程列表测算利率展示后端实施计划
> **For agentic workers:** REQUIRED: Use superpowers:executing-plans to implement this plan in this repository. Do not use subagents. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 让流程列表接口通过联表 SQL 一次返回测算利率 `calculateRate` 和执行利率 `executeRate`
**Architecture:** 后端为流程列表新增列表专用返回对象,替换当前直接返回 `LoanPricingWorkflow` 实体分页的方式。Mapper 层新增联表 SQL`loan_pricing_workflow` 为主表,左连接个人和企业模型输出表,并统一产出 `calculateRate` 字段供前端直接消费。
**Tech Stack:** Spring Boot、MyBatis Plus、Lombok、Maven、XML Mapper
---
### Task 1: 建立流程列表专用返回对象
**Files:**
- Create: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVO.java`
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/ILoanPricingWorkflowService.java`
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/controller/LoanPricingWorkflowController.java`
- [ ] **Step 1: 写一个失败测试,约束列表返回对象需要包含测算利率**
Create/Test: `ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVOTest.java`
测试示例:
```java
@Test
void shouldExposeCalculateRateAndExecuteRateFields() throws Exception {
LoanPricingWorkflowListVO vo = new LoanPricingWorkflowListVO();
vo.setCalculateRate("6.15");
vo.setExecuteRate("5.80");
assertEquals("6.15", vo.getCalculateRate());
assertEquals("5.80", vo.getExecuteRate());
}
```
- [ ] **Step 2: 运行测试确认在对象未创建前失败**
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingWorkflowListVOTest test`
Expected: FAIL提示 `LoanPricingWorkflowListVO` 不存在或缺少字段。
- [ ] **Step 3: 新增列表专用 VO**
创建 `LoanPricingWorkflowListVO`,至少包含:
```java
private String serialNum;
private String custName;
private String custType;
private String guarType;
private String applyAmt;
private String calculateRate;
private String executeRate;
private Date createTime;
private String createBy;
```
- [ ] **Step 4: 修改 Service 接口与 Controller 返回类型**
将列表分页返回从:
```java
IPage<LoanPricingWorkflow>
```
调整为:
```java
IPage<LoanPricingWorkflowListVO>
```
并同步更新 Controller 列表接口使用的新分页结果类型。
- [ ] **Step 5: 再次运行测试确认返回对象字段已可用**
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingWorkflowListVOTest test`
Expected: PASS
- [ ] **Step 6: 提交这一小步**
Run: `git add ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVO.java ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/ILoanPricingWorkflowService.java ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/controller/LoanPricingWorkflowController.java ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVOTest.java && git commit -m "新增流程列表测算利率返回对象"`
Expected: 生成仅包含 VO 与接口调整的中文提交。
### Task 2: 新增联表 SQL 返回统一测算利率
**Files:**
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/mapper/LoanPricingWorkflowMapper.java`
- Create: `ruoyi-loan-pricing/src/main/resources/mapper/loanpricing/LoanPricingWorkflowMapper.xml`
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java`
- Test: `ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java`
- [ ] **Step 1: 写一个失败测试,约束服务层返回的列表对象要透传 `calculateRate`**
Create/Test: `ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java`
测试示例:
```java
@Test
void shouldReturnPagedWorkflowListWithCalculateRate() {
Page<LoanPricingWorkflowListVO> page = new Page<>(1, 10);
LoanPricingWorkflow query = new LoanPricingWorkflow();
LoanPricingWorkflowListVO row = new LoanPricingWorkflowListVO();
row.setCalculateRate("6.15");
when(loanPricingWorkflowMapper.selectWorkflowPageWithRates(any(), any())).thenReturn(new Page<LoanPricingWorkflowListVO>().setRecords(List.of(row)));
IPage<LoanPricingWorkflowListVO> result = service.selectLoanPricingPage(page, query);
assertEquals("6.15", result.getRecords().get(0).getCalculateRate());
}
```
- [ ] **Step 2: 运行测试确认在方法未接入前失败**
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingWorkflowServiceImplTest test`
Expected: FAIL提示方法签名不匹配或 Mapper 自定义方法不存在。
- [ ] **Step 3: 在 Mapper 接口声明列表专用分页方法**
`LoanPricingWorkflowMapper` 中新增类似方法:
```java
IPage<LoanPricingWorkflowListVO> selectWorkflowPageWithRates(
Page<LoanPricingWorkflowListVO> page,
@Param("query") LoanPricingWorkflow query);
```
- [ ] **Step 4: 在 XML 中实现联表 SQL**
创建 `LoanPricingWorkflowMapper.xml`,编写列表专用查询,关键逻辑至少包含:
```xml
SELECT
lpw.serial_num AS serialNum,
lpw.cust_name AS custName,
lpw.cust_type AS custType,
lpw.guar_type AS guarType,
lpw.apply_amt AS applyAmt,
CASE
WHEN lpw.cust_type = '个人' THEN mr.calculate_rate
WHEN lpw.cust_type = '企业' THEN mc.calculate_rate
ELSE NULL
END AS calculateRate,
lpw.execute_rate AS executeRate,
lpw.create_time AS createTime,
lpw.create_by AS createBy
FROM loan_pricing_workflow lpw
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
```
并保留当前筛选条件和按更新时间倒序。
- [ ] **Step 5: 在 ServiceImpl 中改为调用联表分页方法**
将列表分页实现从:
```java
return loanPricingWorkflowMapper.selectPage(page, wrapper);
```
切换为调用新的 Mapper 联表分页方法,保留查询参数透传。
- [ ] **Step 6: 运行服务层测试确认通过**
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingWorkflowServiceImplTest test`
Expected: PASS
- [ ] **Step 7: 如需补充 XML 级验证,再运行模块测试**
Run: `mvn -pl ruoyi-loan-pricing test`
Expected: 至少本次新增测试通过;若存在其他失败,需先区分是否为既有问题。
- [ ] **Step 8: 提交这一小步**
Run: `git add ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/mapper/LoanPricingWorkflowMapper.java ruoyi-loan-pricing/src/main/resources/mapper/loanpricing/LoanPricingWorkflowMapper.xml ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImplTest.java && git commit -m "新增流程列表测算利率联表查询"`
Expected: 生成包含联表 SQL 与服务切换的中文提交。
### Task 3: 完成后端留档与接口验证
**Files:**
- Create: `doc/implementation-report-2026-03-28-workflow-calculate-rate-list-backend.md`
- [ ] **Step 1: 补充后端实施记录**
实施记录至少写明:
```markdown
- 列表接口返回类型已调整为列表专用 VO
- 后端通过联表 SQL 一次返回 `calculateRate``executeRate`
- 个人客户测算利率来自 `model_retail_output_fields.calculate_rate`
- 企业客户测算利率来自 `model_corp_output_fields.calculate_rate`
```
- [ ] **Step 2: 验证列表接口返回结构**
Run: 按项目现有方式启动后端后,请求 `/loanPricing/workflow/list`
Expected: 返回行数据中包含 `calculateRate``executeRate`
- [ ] **Step 3: 核对个人和企业记录的测算利率来源**
Run: 使用已有测试数据各抽取一条个人和企业记录,对比接口返回与模型输出表数据。
Expected: 个人记录取自零售模型输出表,企业记录取自对公模型输出表。
- [ ] **Step 4: 如果为验证启动了后端进程,结束对应进程**
Run: `ps -ef | rg 'RuoYiApplication|java'`
Expected: 对本次验证启动的后端进程执行停止;对非本次启动进程不做处理。
- [ ] **Step 5: 提交后端实施记录**
Run: `git add doc/implementation-report-2026-03-28-workflow-calculate-rate-list-backend.md && git commit -m "补充测算利率列表后端实施记录"`
Expected: 生成仅包含后端留档内容的中文提交。