新增上虞个人测算输入参数设计与计划文档
This commit is contained in:
201
doc/2026-04-09-shangyu-retail-input-params-backend-plan.md
Normal file
201
doc/2026-04-09-shangyu-retail-input-params-backend-plan.md
Normal file
@@ -0,0 +1,201 @@
|
||||
# 上虞个人利率测算输入参数后端 Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 补齐个人创建 DTO、流程转换和模型调用参数,使个人模型请求完整覆盖 Excel 要求的输入字段。
|
||||
|
||||
**Architecture:** 维持现有“页面提交 -> DTO -> Workflow -> ModelInvokeDTO -> form-urlencoded 调用”的链路,只在个人创建与模型调用相关文件中补齐字段和转换规则。通过后端单元测试与真实接口联调覆盖必填、正常和分支场景。
|
||||
|
||||
**Tech Stack:** Spring Boot、MyBatis-Plus、Lombok、JUnit、Maven
|
||||
|
||||
---
|
||||
|
||||
## 文件结构
|
||||
|
||||
- Modify: [ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java)
|
||||
- 增加 `loanPurpose`、`loanTerm`
|
||||
- Modify: [ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java)
|
||||
- 将新增字段映射到 `LoanPricingWorkflow`
|
||||
- Modify: [ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java)
|
||||
- 增加 `loanTerm`、`loanLoop`
|
||||
- Modify: [ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java)
|
||||
- 在个人模型调用前规范化 `0/1`
|
||||
- Create: [ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java)
|
||||
- 覆盖字段存在与值转换
|
||||
|
||||
### Task 1: 为新增字段补失败测试
|
||||
|
||||
**Files:**
|
||||
- Create: `ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java`
|
||||
|
||||
- [ ] **Step 1: 编写字段与转换测试**
|
||||
|
||||
```java
|
||||
@Test
|
||||
void shouldContainLoanPurposeLoanTermAndLoanLoop() {
|
||||
assertThat(ModelInvokeDTO.class.getDeclaredField("loanTerm")).isNotNull();
|
||||
assertThat(ModelInvokeDTO.class.getDeclaredField("loanLoop")).isNotNull();
|
||||
}
|
||||
```
|
||||
|
||||
```java
|
||||
@Test
|
||||
void shouldConvertPersonalBooleanFlagsToZeroOne() {
|
||||
// 构造个人流程对象,断言模型请求中的 bizProof/loanLoop/collThirdParty 为 1/0
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 运行测试并确认先失败**
|
||||
|
||||
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingModelServicePersonalParamsTest test`
|
||||
|
||||
Expected: FAIL,提示字段不存在或转换逻辑未实现
|
||||
|
||||
- [ ] **Step 3: 保持测试只覆盖本次改动相关链路**
|
||||
|
||||
```java
|
||||
// 仅断言 PersonalLoanPricingCreateDTO / LoanPricingConverter / ModelInvokeDTO / LoanPricingModelService
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 再次运行测试确认失败原因稳定**
|
||||
|
||||
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingModelServicePersonalParamsTest test`
|
||||
|
||||
Expected: FAIL,失败点与新增字段缺失一致
|
||||
|
||||
- [ ] **Step 5: 提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java
|
||||
git commit -m "新增个人测算输入参数后端测试"
|
||||
```
|
||||
|
||||
### Task 2: 补齐个人创建 DTO 与流程映射
|
||||
|
||||
**Files:**
|
||||
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java`
|
||||
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java`
|
||||
|
||||
- [ ] **Step 1: 在个人 DTO 中增加 `loanPurpose`**
|
||||
|
||||
```java
|
||||
@NotBlank(message = "贷款用途不能为空")
|
||||
@Pattern(regexp = "^(consumer|business)$", message = "贷款用途必须是 consumer 或 business")
|
||||
private String loanPurpose;
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 在个人 DTO 中增加 `loanTerm`**
|
||||
|
||||
```java
|
||||
@NotBlank(message = "借款期限不能为空")
|
||||
private String loanTerm;
|
||||
```
|
||||
|
||||
- [ ] **Step 3: 在转换器中映射新增字段**
|
||||
|
||||
```java
|
||||
entity.setLoanPurpose(dto.getLoanPurpose());
|
||||
entity.setLoanTerm(dto.getLoanTerm());
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 运行相关测试确认 DTO 与映射通过**
|
||||
|
||||
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingModelServicePersonalParamsTest test`
|
||||
|
||||
Expected: 仍可能 FAIL,但失败点已推进到模型调用层
|
||||
|
||||
- [ ] **Step 5: 提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java
|
||||
git commit -m "补齐个人测算创建参数字段"
|
||||
```
|
||||
|
||||
### Task 3: 补齐模型调用 DTO 与个人参数规范化
|
||||
|
||||
**Files:**
|
||||
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java`
|
||||
- Modify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java`
|
||||
|
||||
- [ ] **Step 1: 在模型调用 DTO 中增加缺失字段**
|
||||
|
||||
```java
|
||||
private String loanTerm;
|
||||
private String loanLoop;
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 在个人模型调用前做 `0/1` 转换**
|
||||
|
||||
```java
|
||||
if ("个人".equals(loanPricingWorkflow.getCustType())) {
|
||||
modelInvokeDTO.setBizProof(toZeroOne(modelInvokeDTO.getBizProof()));
|
||||
modelInvokeDTO.setLoanLoop(toZeroOne(modelInvokeDTO.getLoanLoop()));
|
||||
modelInvokeDTO.setCollThirdParty(toZeroOne(modelInvokeDTO.getCollThirdParty()));
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: 抽出最小辅助方法,避免散落重复逻辑**
|
||||
|
||||
```java
|
||||
private String toZeroOne(String value) {
|
||||
if ("true".equals(value) || "1".equals(value)) return "1";
|
||||
if ("false".equals(value) || "0".equals(value)) return "0";
|
||||
return value;
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 运行测试确认通过**
|
||||
|
||||
Run: `mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingModelServicePersonalParamsTest test`
|
||||
|
||||
Expected: PASS
|
||||
|
||||
- [ ] **Step 5: 提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java
|
||||
git commit -m "规范个人测算模型调用参数"
|
||||
```
|
||||
|
||||
### Task 4: 后端联调与接口验证
|
||||
|
||||
**Files:**
|
||||
- Verify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/controller/LoanPricingWorkflowController.java`
|
||||
- Verify: `ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/impl/LoanPricingWorkflowServiceImpl.java`
|
||||
|
||||
- [ ] **Step 1: 重新编译并重启后端进程**
|
||||
|
||||
Run: `mvn -pl ruoyi-admin -am package -DskipTests`
|
||||
|
||||
Expected: 打包成功,随后重启运行中的后端服务使最新代码生效
|
||||
|
||||
- [ ] **Step 2: 验证正常场景**
|
||||
|
||||
Run: 调用 `POST /loanPricing/workflow/create/personal`
|
||||
|
||||
Expected:
|
||||
- 返回创建成功
|
||||
- 请求体包含 `loanPurpose`、`loanTerm`
|
||||
- 模型请求中带出 `loanLoop`
|
||||
|
||||
- [ ] **Step 3: 验证必填缺失场景**
|
||||
|
||||
Run: 缺少 `loanPurpose` 或 `loanTerm` 分别调用接口
|
||||
|
||||
Expected: 返回参数校验失败
|
||||
|
||||
- [ ] **Step 4: 验证分支场景**
|
||||
|
||||
Run: 以不同开关组合调用接口
|
||||
|
||||
Expected:
|
||||
- `bizProof=true` -> 模型入参 `1`
|
||||
- `bizProof=false` -> 模型入参 `0`
|
||||
- `loanLoop=true/false` 与 `collThirdParty=true/false` 同理
|
||||
|
||||
- [ ] **Step 5: 验证结束后停止后端进程并提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/service/LoanPricingModelService.java ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java
|
||||
git commit -m "完成个人测算输入参数后端联调"
|
||||
```
|
||||
264
doc/2026-04-09-shangyu-retail-input-params-design.md
Normal file
264
doc/2026-04-09-shangyu-retail-input-params-design.md
Normal file
@@ -0,0 +1,264 @@
|
||||
# 上虞个人利率测算输入参数对齐设计文档
|
||||
|
||||
## 1. 背景
|
||||
|
||||
根据 [doc/上虞利率测算接口文档.xlsx](/Users/wkc/Desktop/loan-pricing/loan-pricing/doc/上虞利率测算接口文档.xlsx) 的 `入参` sheet,个人利率测算模型当前要求的输入参数为:
|
||||
|
||||
- `serialNum`
|
||||
- `orgCode`
|
||||
- `runType`
|
||||
- `custIsn`
|
||||
- `custType`
|
||||
- `custName`
|
||||
- `idType`
|
||||
- `idNum`
|
||||
- `guarType`
|
||||
- `applyAmt`
|
||||
- `loanPurpose`
|
||||
- `loanTerm`
|
||||
- `bizProof`
|
||||
- `loanLoop`
|
||||
- `collThirdParty`
|
||||
- `collType`
|
||||
|
||||
现有个人新增弹窗与模型调用链路未完全覆盖该输入集合:
|
||||
|
||||
- 页面缺少 `loanPurpose`
|
||||
- 页面缺少 `loanTerm`
|
||||
- `collType` 选项与 Excel 不一致
|
||||
- 页面开关字段当前提交的是 `true/false`
|
||||
- 模型调用 DTO 当前缺少 `loanTerm`、`loanLoop`
|
||||
|
||||
本次目标是按 Excel 的个人输入参数定义,对齐个人新增弹窗输入项和模型调用入参,不扩展到企业链路,不引入兜底或兼容分支。
|
||||
|
||||
## 2. 已确认范围
|
||||
|
||||
- 仅处理个人新增弹窗
|
||||
- 仅处理个人创建流程到模型调用的入参链路
|
||||
- 保持现有页面交互结构,不新增系统字段输入区
|
||||
- `loanTerm` 使用固定年限下拉,选项按 Excel 定义
|
||||
- 系统字段继续自动生成或默认赋值
|
||||
- 不修改企业新增弹窗
|
||||
- 不修改模型计算规则
|
||||
|
||||
## 3. 输入参数获取方式整理
|
||||
|
||||
### 3.1 系统自动带值
|
||||
|
||||
以下字段不放到新增弹窗中,由现有服务链路自动提供:
|
||||
|
||||
- `serialNum`
|
||||
- 由 `LoanPricingWorkflowServiceImpl#createLoanPricing` 按时间戳生成
|
||||
- `orgCode`
|
||||
- 由 `LoanPricingWorkflowServiceImpl#createLoanPricing` 在空值时补默认值
|
||||
- `runType`
|
||||
- 由 `LoanPricingWorkflowServiceImpl#createLoanPricing` 在空值时补默认值 `1`
|
||||
- `custType`
|
||||
- 由 `LoanPricingConverter#toEntity(PersonalLoanPricingCreateDTO)` 固定写为 `个人`
|
||||
|
||||
### 3.2 用户直接输入
|
||||
|
||||
- 文本输入:
|
||||
- `custIsn`
|
||||
- `custName`
|
||||
- `idNum`
|
||||
- `applyAmt`
|
||||
- 下拉选择:
|
||||
- `idType`
|
||||
- `guarType`
|
||||
- `loanPurpose`
|
||||
- `loanTerm`
|
||||
- `collType`
|
||||
- 开关选择:
|
||||
- `bizProof`
|
||||
- `loanLoop`
|
||||
- `collThirdParty`
|
||||
|
||||
## 4. 现状分析
|
||||
|
||||
### 4.1 前端现状
|
||||
|
||||
[PersonalCreateDialog.vue](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue) 当前已经提供:
|
||||
|
||||
- `custIsn`
|
||||
- `custName`
|
||||
- `idType`
|
||||
- `idNum`
|
||||
- `guarType`
|
||||
- `applyAmt`
|
||||
- `bizProof`
|
||||
- `loanLoop`
|
||||
- `collType`
|
||||
- `collThirdParty`
|
||||
|
||||
当前缺失或不一致点:
|
||||
|
||||
- 缺少 `loanPurpose`
|
||||
- 缺少 `loanTerm`
|
||||
- `collType` 选项为 `一线/一类/二类`,与 Excel 的 `一类/二类/三类` 不一致
|
||||
- 开关字段提交值为 `true/false`
|
||||
|
||||
### 4.2 后端现状
|
||||
|
||||
[PersonalLoanPricingCreateDTO.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/PersonalLoanPricingCreateDTO.java) 当前未定义:
|
||||
|
||||
- `loanPurpose`
|
||||
- `loanTerm`
|
||||
|
||||
[LoanPricingConverter.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/util/LoanPricingConverter.java) 当前未把以上字段映射到 `LoanPricingWorkflow`。
|
||||
|
||||
[ModelInvokeDTO.java](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-loan-pricing/src/main/java/com/ruoyi/loanpricing/domain/dto/ModelInvokeDTO.java) 当前未定义:
|
||||
|
||||
- `loanTerm`
|
||||
- `loanLoop`
|
||||
|
||||
这意味着即使页面补齐字段,当前模型调用也无法完整带出 Excel 要求的个人入参。
|
||||
|
||||
## 5. 方案对比
|
||||
|
||||
### 方案一:页面补齐用户输入,系统字段继续自动带值
|
||||
|
||||
做法:
|
||||
|
||||
- 在个人新增弹窗新增 `loanPurpose` 下拉
|
||||
- 在个人新增弹窗新增 `loanTerm` 固定年限下拉
|
||||
- 修正 `collType` 选项
|
||||
- 后端 DTO、转换器、模型调用 DTO 同步补字段
|
||||
- 模型调用前统一将开关字段转换为 Excel 要求的 `0/1`
|
||||
|
||||
优点:
|
||||
|
||||
- 与现有个人/企业创建方式一致
|
||||
- 改动最小
|
||||
- 页面输入、流程入库、模型调用职责边界清晰
|
||||
|
||||
缺点:
|
||||
|
||||
- 需要同时修改前后端
|
||||
|
||||
### 方案二:前端少改,后端在模型调用前兜底补参数
|
||||
|
||||
做法:
|
||||
|
||||
- 页面只补部分字段
|
||||
- 其余由后端按默认逻辑拼接模型参数
|
||||
|
||||
优点:
|
||||
|
||||
- 页面改动更少
|
||||
|
||||
缺点:
|
||||
|
||||
- 页面输入和真实模型入参不一致
|
||||
- 后续排查问题时难以定位参数来源
|
||||
- 不符合本次“按现有输入方式整理字段获取方式”的要求
|
||||
|
||||
### 方案三:Excel 全量字段全部暴露到弹窗
|
||||
|
||||
做法:
|
||||
|
||||
- 把 `serialNum`、`orgCode`、`runType`、`custType` 也作为页面字段给用户填写
|
||||
|
||||
优点:
|
||||
|
||||
- 页面可见字段与 Excel 完全一一对应
|
||||
|
||||
缺点:
|
||||
|
||||
- 与当前产品交互方式不一致
|
||||
- 增加误填风险
|
||||
- 不符合最短路径要求
|
||||
|
||||
## 6. 设计结论
|
||||
|
||||
采用方案一。
|
||||
|
||||
### 6.1 页面设计
|
||||
|
||||
个人新增弹窗保留现有分组结构,在“贷款信息”区域补齐:
|
||||
|
||||
- `loanPurpose`
|
||||
- 下拉选项:`consumer`、`business`
|
||||
- `loanTerm`
|
||||
- 固定年限下拉
|
||||
- 选项按 Excel 的 `1/2/3/4/5/6……` 组织
|
||||
|
||||
同时修正:
|
||||
|
||||
- `collType` 选项改为 `一类/二类/三类`
|
||||
|
||||
### 6.2 参数来源设计
|
||||
|
||||
- 系统带值:
|
||||
- `serialNum`
|
||||
- `orgCode`
|
||||
- `runType`
|
||||
- `custType`
|
||||
- 页面透传:
|
||||
- `custIsn`
|
||||
- `custName`
|
||||
- `idType`
|
||||
- `idNum`
|
||||
- `guarType`
|
||||
- `applyAmt`
|
||||
- `loanPurpose`
|
||||
- `loanTerm`
|
||||
- `collType`
|
||||
- 页面开关,经模型调用层转换:
|
||||
- `bizProof`
|
||||
- `loanLoop`
|
||||
- `collThirdParty`
|
||||
|
||||
### 6.3 链路设计
|
||||
|
||||
1. 前端提交个人创建请求时,补齐 `loanPurpose`、`loanTerm`
|
||||
2. 后端个人创建 DTO 接收新增字段
|
||||
3. 转换器将新增字段写入 `LoanPricingWorkflow`
|
||||
4. 模型调用 DTO 增加 `loanPurpose`、`loanTerm`、`loanLoop`
|
||||
5. `LoanPricingModelService` 在调用模型前,将个人链路中的开关字段转换为 `0/1`
|
||||
6. `ModelService` 继续以 `application/x-www-form-urlencoded` 方式调用模型接口
|
||||
|
||||
### 6.4 展示闭环
|
||||
|
||||
为保证输入项可在详情页回看,个人详情页同步补齐:
|
||||
|
||||
- `loanPurpose`
|
||||
|
||||
`loanTerm` 详情展示已存在,不需要新增区域。
|
||||
|
||||
## 7. 校验与错误处理
|
||||
|
||||
- 前端新增 `loanPurpose` 必选校验
|
||||
- 前端新增 `loanTerm` 必选校验
|
||||
- `loanTerm` 只能通过固定下拉选择,不提供自由输入
|
||||
- 后端 DTO 对 `loanPurpose`、`loanTerm` 增加必填约束
|
||||
- 保持现有创建失败与模型调用失败的错误提示方式
|
||||
- 不新增兼容逻辑、兜底逻辑或补丁式分支
|
||||
|
||||
## 8. 验证设计
|
||||
|
||||
- 前端源码断言个人新增弹窗已出现 `loanPurpose`、`loanTerm`
|
||||
- 前端源码断言 `loanTerm` 为固定下拉、`collType` 选项为 `一类/二类/三类`
|
||||
- 后端测试或源码断言 `PersonalLoanPricingCreateDTO`、`LoanPricingConverter`、`ModelInvokeDTO` 已补齐字段
|
||||
- 重启后端后,覆盖以下接口验证:
|
||||
- 正常场景:完整参数创建成功
|
||||
- 必填缺失场景:缺少 `loanPurpose` 或 `loanTerm` 被拦截
|
||||
- 分支场景:`bizProof`、`loanLoop`、`collThirdParty` 开关不同组合能正确转换为 `0/1`
|
||||
- 启动前端页面并通过浏览器检查:
|
||||
- 新增弹窗展示正确
|
||||
- 提交流程后详情页能回显 `loanPurpose`、`loanTerm`
|
||||
- 验证完成后停止本次启动的前后端进程
|
||||
|
||||
## 9. 待确认项
|
||||
|
||||
- 当前代码中的 `orgCode` 默认值为 `892000`
|
||||
- `ModelInvokeDTO` 注释中写的是固定值 `931000`
|
||||
|
||||
本次设计不擅自调整该默认值,保持现有运行逻辑,待业务另行确认后再处理。
|
||||
|
||||
## 10. 非目标
|
||||
|
||||
- 不调整企业新增弹窗
|
||||
- 不修改企业模型调用参数
|
||||
- 不修改流程列表逻辑
|
||||
- 不改模型返回字段映射逻辑
|
||||
212
doc/2026-04-09-shangyu-retail-input-params-frontend-plan.md
Normal file
212
doc/2026-04-09-shangyu-retail-input-params-frontend-plan.md
Normal file
@@ -0,0 +1,212 @@
|
||||
# 上虞个人利率测算输入参数前端 Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 按 Excel 补齐个人新增弹窗输入项,确保页面提交字段与个人模型入参要求一致。
|
||||
|
||||
**Architecture:** 仅修改个人创建弹窗和个人详情页,沿用当前 Element UI 表单结构,不新增页面层级。通过前端源码断言覆盖新增字段、选项和值转换,确保页面输入与现有交互方式保持一致。
|
||||
|
||||
**Tech Stack:** Vue 2、Element UI、RuoYi 前端请求封装、Node 源码断言脚本
|
||||
|
||||
---
|
||||
|
||||
## 文件结构
|
||||
|
||||
- 修改: [ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue)
|
||||
- 补齐 `loanPurpose`、`loanTerm`
|
||||
- 修正 `collType` 选项
|
||||
- 调整个人开关字段提交值
|
||||
- 修改: [ruoyi-ui/src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-ui/src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue)
|
||||
- 补齐 `loanPurpose` 展示
|
||||
- 如有需要,扩展布尔格式化兼容 `0/1`
|
||||
- 新增: [ruoyi-ui/tests/personal-create-input-params.test.js](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-ui/tests/personal-create-input-params.test.js)
|
||||
- 断言新增弹窗字段、选项和值转换逻辑
|
||||
- 修改: [ruoyi-ui/package.json](/Users/wkc/Desktop/loan-pricing/loan-pricing/ruoyi-ui/package.json)
|
||||
- 新增针对本次改动的测试命令
|
||||
|
||||
### Task 1: 为个人新增弹窗补失败断言
|
||||
|
||||
**Files:**
|
||||
- Create: `ruoyi-ui/tests/personal-create-input-params.test.js`
|
||||
- Modify: `ruoyi-ui/package.json`
|
||||
|
||||
- [ ] **Step 1: 编写失败断言脚本**
|
||||
|
||||
```js
|
||||
const requiredFields = ['form.loanPurpose', 'form.loanTerm']
|
||||
const requiredOptions = ['value="consumer"', 'value="business"', 'label="一类"', 'label="二类"', 'label="三类"']
|
||||
const requiredConversions = [
|
||||
"bizProof: this.form.bizProof ? '1' : '0'",
|
||||
"loanLoop: this.form.loanLoop ? '1' : '0'",
|
||||
"collThirdParty: this.form.collThirdParty ? '1' : '0'"
|
||||
]
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 运行断言并确认先失败**
|
||||
|
||||
Run: `npm --prefix ruoyi-ui run test:personal-create-input-params`
|
||||
|
||||
Expected: FAIL,提示缺少 `loanPurpose` 或 `loanTerm` 或值转换未按 `1/0`
|
||||
|
||||
- [ ] **Step 3: 在 `package.json` 注册测试命令**
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"test:personal-create-input-params": "node tests/personal-create-input-params.test.js"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 再次运行断言并确认仍处于失败态**
|
||||
|
||||
Run: `npm --prefix ruoyi-ui run test:personal-create-input-params`
|
||||
|
||||
Expected: FAIL,失败原因与新增字段缺失一致
|
||||
|
||||
- [ ] **Step 5: 提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-ui/tests/personal-create-input-params.test.js ruoyi-ui/package.json
|
||||
git commit -m "新增个人测算输入参数前端断言"
|
||||
```
|
||||
|
||||
### Task 2: 补齐个人新增弹窗字段与选项
|
||||
|
||||
**Files:**
|
||||
- Modify: `ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue`
|
||||
|
||||
- [ ] **Step 1: 增加 `loanPurpose` 表单项**
|
||||
|
||||
```vue
|
||||
<el-form-item label="贷款用途" prop="loanPurpose">
|
||||
<el-select v-model="form.loanPurpose" placeholder="请选择贷款用途" style="width: 100%">
|
||||
<el-option label="消费" value="consumer" />
|
||||
<el-option label="经营" value="business" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 增加 `loanTerm` 固定年限下拉**
|
||||
|
||||
```vue
|
||||
<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>
|
||||
```
|
||||
|
||||
- [ ] **Step 3: 修正 `collType` 选项为 Excel 定义**
|
||||
|
||||
```vue
|
||||
<el-option label="一类" value="一类" />
|
||||
<el-option label="二类" value="二类" />
|
||||
<el-option label="三类" value="三类" />
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 为新增字段补表单状态与校验**
|
||||
|
||||
```js
|
||||
form: {
|
||||
loanPurpose: undefined,
|
||||
loanTerm: undefined
|
||||
},
|
||||
rules: {
|
||||
loanPurpose: [{ required: true, message: '请选择贷款用途', trigger: 'change' }],
|
||||
loanTerm: [{ required: true, message: '请选择借款期限', trigger: 'change' }]
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 5: 提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue
|
||||
git commit -m "补齐个人新增弹窗输入字段"
|
||||
```
|
||||
|
||||
### Task 3: 调整前端提交值与详情展示
|
||||
|
||||
**Files:**
|
||||
- Modify: `ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue`
|
||||
- Modify: `ruoyi-ui/src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue`
|
||||
|
||||
- [ ] **Step 1: 在提交逻辑中改为 `1/0` 值**
|
||||
|
||||
```js
|
||||
const data = {
|
||||
...this.form,
|
||||
bizProof: this.form.bizProof ? '1' : '0',
|
||||
loanLoop: this.form.loanLoop ? '1' : '0',
|
||||
collThirdParty: this.form.collThirdParty ? '1' : '0'
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 在详情页补齐 `loanPurpose` 展示**
|
||||
|
||||
```vue
|
||||
<el-descriptions-item label="贷款用途">{{ detailData.loanPurpose || '-' }}</el-descriptions-item>
|
||||
```
|
||||
|
||||
- [ ] **Step 3: 兼容详情页 `0/1` 布尔展示**
|
||||
|
||||
```js
|
||||
if (value === 'true' || value === true || value === '1' || value === 1) return '是'
|
||||
if (value === 'false' || value === false || value === '0' || value === 0) return '否'
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 运行前端源码断言并确认通过**
|
||||
|
||||
Run: `npm --prefix ruoyi-ui run test:personal-create-input-params`
|
||||
|
||||
Expected: PASS,输出断言通过信息
|
||||
|
||||
- [ ] **Step 5: 提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue ruoyi-ui/src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue
|
||||
git commit -m "调整个人测算前端提交与展示"
|
||||
```
|
||||
|
||||
### Task 4: 页面联调与回归验证
|
||||
|
||||
**Files:**
|
||||
- Verify: `ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue`
|
||||
- Verify: `ruoyi-ui/src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue`
|
||||
|
||||
- [ ] **Step 1: 启动前端开发服务**
|
||||
|
||||
Run: `npm --prefix ruoyi-ui run dev`
|
||||
|
||||
Expected: 成功启动并输出本地访问地址
|
||||
|
||||
- [ ] **Step 2: 打开流程页面验证新增弹窗**
|
||||
|
||||
Run: 在浏览器中进入 `/loanPricing/workflow`
|
||||
|
||||
Expected:
|
||||
- 出现 `贷款用途`
|
||||
- 出现 `借款期限(年)` 固定下拉
|
||||
- `抵质押类型` 选项为 `一类/二类/三类`
|
||||
|
||||
- [ ] **Step 3: 结合后端联调创建个人流程**
|
||||
|
||||
Run: 在页面中填写完整参数并提交
|
||||
|
||||
Expected: 创建成功,不出现参数缺失报错
|
||||
|
||||
- [ ] **Step 4: 打开详情页验证回显**
|
||||
|
||||
Run: 打开刚创建的个人流程详情
|
||||
|
||||
Expected:
|
||||
- 页面展示 `贷款用途`
|
||||
- 页面展示 `借款期限`
|
||||
- 开关字段显示为“是/否”
|
||||
|
||||
- [ ] **Step 5: 验证结束后停止前端进程并提交**
|
||||
|
||||
```bash
|
||||
git add ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue ruoyi-ui/src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue ruoyi-ui/tests/personal-create-input-params.test.js ruoyi-ui/package.json
|
||||
git commit -m "完成个人测算输入参数前端联调"
|
||||
```
|
||||
@@ -0,0 +1,25 @@
|
||||
# 上虞个人利率测算输入参数文档产出记录
|
||||
|
||||
## 实施时间
|
||||
- 2026-04-09
|
||||
|
||||
## 修改内容
|
||||
- 新增个人利率测算输入参数对齐设计文档
|
||||
- 新增个人利率测算输入参数前端实施计划
|
||||
- 新增个人利率测算输入参数后端实施计划
|
||||
- 按 Excel `入参` sheet 整理个人新增弹窗字段获取方式和模型调用参数来源
|
||||
- 明确 `loanTerm` 使用固定年限下拉,选项按 Excel 组织
|
||||
- 明确系统字段 `serialNum`、`orgCode`、`runType`、`custType` 继续自动带值
|
||||
- 明确个人开关字段在模型调用层转换为 `0/1`
|
||||
|
||||
## 修改文件
|
||||
- `doc/2026-04-09-shangyu-retail-input-params-design.md`
|
||||
- `doc/2026-04-09-shangyu-retail-input-params-frontend-plan.md`
|
||||
- `doc/2026-04-09-shangyu-retail-input-params-backend-plan.md`
|
||||
- `doc/implementation-report-2026-04-09-shangyu-retail-input-params-plans.md`
|
||||
|
||||
## 说明
|
||||
- 设计文档保存路径已核对为项目现有的 `doc/` 目录
|
||||
- 按项目要求,本次实施计划拆分为前端与后端两份文档
|
||||
- 由于仓库约束为“不开启 subagent”,文档评审环节未使用子代理,后续执行时将在当前会话内推进
|
||||
- 本次仅产出设计与计划文档,尚未进入代码实施阶段
|
||||
Reference in New Issue
Block a user