Files
loan-pricing/doc/2026-04-09-shangyu-retail-input-params-backend-plan.md

7.9 KiB
Raw Blame History

上虞个人利率测算输入参数后端 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


文件结构

Task 1: 为新增字段补失败测试

Files:

  • Create: ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/service/LoanPricingModelServicePersonalParamsTest.java

  • Step 1: 编写字段与转换测试

@Test
void shouldContainLoanPurposeLoanTermAndLoanLoop() {
    assertThat(ModelInvokeDTO.class.getDeclaredField("loanTerm")).isNotNull();
    assertThat(ModelInvokeDTO.class.getDeclaredField("loanLoop")).isNotNull();
}
@Test
void shouldConvertPersonalBooleanFlagsToZeroOne() {
    // 构造个人流程对象,断言模型请求中的 bizProof/loanLoop/collThirdParty 为 1/0
}
  • Step 2: 运行测试并确认先失败

Run: mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingModelServicePersonalParamsTest test

Expected: FAIL提示字段不存在或转换逻辑未实现

  • Step 3: 保持测试只覆盖本次改动相关链路
// 仅断言 PersonalLoanPricingCreateDTO / LoanPricingConverter / ModelInvokeDTO / LoanPricingModelService
  • Step 4: 再次运行测试确认失败原因稳定

Run: mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingModelServicePersonalParamsTest test

Expected: FAIL失败点与新增字段缺失一致

  • Step 5: 提交
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

@NotBlank(message = "贷款用途不能为空")
@Pattern(regexp = "^(consumer|business)$", message = "贷款用途必须是 consumer 或 business")
private String loanPurpose;
  • Step 2: 在个人 DTO 中增加 loanTerm
@NotBlank(message = "借款期限不能为空")
private String loanTerm;
  • Step 3: 在转换器中映射新增字段
entity.setLoanPurpose(dto.getLoanPurpose());
entity.setLoanTerm(dto.getLoanTerm());
  • Step 4: 运行相关测试确认 DTO 与映射通过

Run: mvn -pl ruoyi-loan-pricing -Dtest=LoanPricingModelServicePersonalParamsTest test

Expected: 仍可能 FAIL但失败点已推进到模型调用层

  • Step 5: 提交
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 中增加缺失字段

private String loanTerm;
private String loanLoop;
  • Step 2: 在个人模型调用前做 0/1 转换
if ("个人".equals(loanPricingWorkflow.getCustType())) {
    modelInvokeDTO.setBizProof(toZeroOne(modelInvokeDTO.getBizProof()));
    modelInvokeDTO.setLoanLoop(toZeroOne(modelInvokeDTO.getLoanLoop()));
    modelInvokeDTO.setCollThirdParty(toZeroOne(modelInvokeDTO.getCollThirdParty()));
}
  • Step 3: 抽出最小辅助方法,避免散落重复逻辑
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: 提交
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:

  • 返回创建成功

  • 请求体包含 loanPurposeloanTerm

  • 模型请求中带出 loanLoop

  • Step 3: 验证必填缺失场景

Run: 缺少 loanPurposeloanTerm 分别调用接口

Expected: 返回参数校验失败

  • Step 4: 验证分支场景

Run: 以不同开关组合调用接口

Expected:

  • bizProof=true -> 模型入参 1

  • bizProof=false -> 模型入参 0

  • loanLoop=true/falsecollThirdParty=true/false 同理

  • Step 5: 验证结束后停止后端进程并提交

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 "完成个人测算输入参数后端联调"