From 09707d312e0685381eb173f35d6484c8082dfff8 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Thu, 9 Apr 2026 16:05:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=8A=E8=99=9E=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E6=B5=8B=E7=AE=97=E8=BE=93=E5=85=A5=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E4=B8=8E=E8=AE=A1=E5=88=92=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...hangyu-retail-input-params-backend-plan.md | 201 +++++++++++++ ...4-09-shangyu-retail-input-params-design.md | 264 ++++++++++++++++++ ...angyu-retail-input-params-frontend-plan.md | 212 ++++++++++++++ ...04-09-shangyu-retail-input-params-plans.md | 25 ++ 4 files changed, 702 insertions(+) create mode 100644 doc/2026-04-09-shangyu-retail-input-params-backend-plan.md create mode 100644 doc/2026-04-09-shangyu-retail-input-params-design.md create mode 100644 doc/2026-04-09-shangyu-retail-input-params-frontend-plan.md create mode 100644 doc/implementation-report-2026-04-09-shangyu-retail-input-params-plans.md diff --git a/doc/2026-04-09-shangyu-retail-input-params-backend-plan.md b/doc/2026-04-09-shangyu-retail-input-params-backend-plan.md new file mode 100644 index 0000000..7eff2c5 --- /dev/null +++ b/doc/2026-04-09-shangyu-retail-input-params-backend-plan.md @@ -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 "完成个人测算输入参数后端联调" +``` diff --git a/doc/2026-04-09-shangyu-retail-input-params-design.md b/doc/2026-04-09-shangyu-retail-input-params-design.md new file mode 100644 index 0000000..788b827 --- /dev/null +++ b/doc/2026-04-09-shangyu-retail-input-params-design.md @@ -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. 非目标 + +- 不调整企业新增弹窗 +- 不修改企业模型调用参数 +- 不修改流程列表逻辑 +- 不改模型返回字段映射逻辑 diff --git a/doc/2026-04-09-shangyu-retail-input-params-frontend-plan.md b/doc/2026-04-09-shangyu-retail-input-params-frontend-plan.md new file mode 100644 index 0000000..541abba --- /dev/null +++ b/doc/2026-04-09-shangyu-retail-input-params-frontend-plan.md @@ -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 + + + + + + +``` + +- [ ] **Step 2: 增加 `loanTerm` 固定年限下拉** + +```vue + + + + + +``` + +- [ ] **Step 3: 修正 `collType` 选项为 Excel 定义** + +```vue + + + +``` + +- [ ] **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 +{{ detailData.loanPurpose || '-' }} +``` + +- [ ] **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 "完成个人测算输入参数前端联调" +``` diff --git a/doc/implementation-report-2026-04-09-shangyu-retail-input-params-plans.md b/doc/implementation-report-2026-04-09-shangyu-retail-input-params-plans.md new file mode 100644 index 0000000..7eecfa2 --- /dev/null +++ b/doc/implementation-report-2026-04-09-shangyu-retail-input-params-plans.md @@ -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”,文档评审环节未使用子代理,后续执行时将在当前会话内推进 +- 本次仅产出设计与计划文档,尚未进入代码实施阶段