anxin-ruoyi/.kiro/specs/bank-selection-logic-fix/design.md

6.5 KiB
Raw Permalink Blame History

设计文档

概述

银行选择逻辑优化设计旨在简化贷款申请流程,消除用户在申请和提交阶段的重复银行选择操作。通过重构前端组件和后端数据模型,实现一次选择、多次使用的用户体验。

架构

当前架构问题

  • 贷款申请创建时选择银行,但不保存提交说明
  • 详情页面需要重新选择银行和填写说明
  • 银行选择状态不明确,用户体验混乱

优化后架构

  • 贷款申请创建时同时保存银行选择和提交说明
  • 详情页面直接使用已保存的银行信息
  • 提供修改银行选择的独立功能
  • 实现一键提交机制

组件和接口

前端组件修改

LoanManagement.vue 组件优化

数据模型扩展:

// 贷款申请表单增加提交说明字段
const loanApplicationForm = ref({
  loanAmount: null,
  loanTermMonths: 12,
  loanPurpose: '服务周期人工成本融资',
  submitComments: '', // 新增:提交说明
  selectedBankId: null, // 新增选择的银行ID
  bankInstitutionName: '', // 新增:银行名称
  interestRate: null, // 新增:利率
  monthlyPayment: null // 新增:月还款额
});

// 详情页面表单简化
const detailSubmitForm = ref({
  quickSubmit: false // 简化为快速提交标志
});

界面布局调整:

  1. 申请贷款对话框增加提交说明输入框
  2. 银行选择表格移至提交说明之前
  3. 详情页面简化银行选择界面
  4. 增加一键提交按钮

新增组件功能

银行选择状态显示:

// 银行选择状态计算
const getBankSelectionStatus = (loan) => {
  if (!loan.bankInstitutionId) return 'NOT_SELECTED';
  if (loan.loanStatus === 'PENDING') return 'SELECTED_PENDING';
  if (loan.loanStatus === 'SUBMITTED') return 'SUBMITTED';
  return 'UNKNOWN';
};

// 状态文本映射
const bankSelectionStatusText = {
  'NOT_SELECTED': '未选择银行',
  'SELECTED_PENDING': '已选择银行,待提交',
  'SUBMITTED': '已提交至银行'
};

后端接口修改

ServicePeriodLoan 数据模型扩展

新增字段:

public class ServicePeriodLoan {
    // 现有字段...
    
    /** 提交说明 */
    private String submitComments;
    
    /** 银行选择时间 */
    private Date bankSelectedTime;
    
    /** 银行选择变更历史 */
    private String bankSelectionHistory;
    
    /** 是否可一键提交 */
    private Boolean quickSubmitEnabled;
}

API 接口优化

贷款申请接口增强:

@PostMapping("/apply")
public AjaxResult applyLoanWithBankSelection(@RequestBody LoanApplicationRequest request) {
    // 验证银行选择信息
    if (request.getBankInstitutionId() == null) {
        return AjaxResult.error("请选择银行");
    }
    
    // 创建贷款申请并保存银行信息
    ServicePeriodLoan loan = new ServicePeriodLoan();
    loan.setBankInstitutionId(request.getBankInstitutionId());
    loan.setSubmitComments(request.getSubmitComments());
    loan.setBankSelectedTime(new Date());
    loan.setQuickSubmitEnabled(true);
    
    return servicePeriodLoanService.createLoanWithBankSelection(loan);
}

一键提交接口:

@PostMapping("/quick-submit/{loanId}")
public AjaxResult quickSubmitToBank(@PathVariable Long loanId) {
    ServicePeriodLoan loan = servicePeriodLoanService.selectById(loanId);
    
    // 验证是否可以一键提交
    if (!loan.getQuickSubmitEnabled() || loan.getBankInstitutionId() == null) {
        return AjaxResult.error("贷款申请信息不完整,无法提交");
    }
    
    // 直接提交到银行
    loan.setLoanStatus("SUBMITTED");
    loan.setApprovalStatus("SUBMITTED");
    loan.setSubmitTime(new Date());
    
    return servicePeriodLoanService.updateLoan(loan);
}

数据模型

数据库表结构修改

service_period_loan 表新增字段:

ALTER TABLE service_period_loan 
ADD COLUMN submit_comments TEXT COMMENT '提交说明',
ADD COLUMN bank_selected_time DATETIME COMMENT '银行选择时间',
ADD COLUMN bank_selection_history TEXT COMMENT '银行选择变更历史',
ADD COLUMN quick_submit_enabled TINYINT(1) DEFAULT 1 COMMENT '是否可一键提交';

数据流转优化

申请阶段数据流:

  1. 用户选择银行 → 保存银行ID和基本信息
  2. 用户填写说明 → 保存提交说明
  3. 用户确认申请 → 创建完整的贷款申请记录

提交阶段数据流:

  1. 系统读取已保存的银行信息
  2. 用户确认提交 → 直接使用已保存信息
  3. 系统更新贷款状态为已提交

正确性属性

属性是一个特征或行为,应该在系统的所有有效执行中保持为真。属性作为人类可读规范和机器可验证正确性保证之间的桥梁。

属性 1: 银行选择一致性

对于任何贷款申请,如果在创建时选择了银行,那么在提交时应该使用相同的银行信息,除非用户明确修改 验证: 需求 1.2, 1.5

属性 2: 提交说明保持性

对于任何贷款申请,如果在创建时填写了提交说明,那么在提交时应该使用相同的说明内容,除非用户明确修改 验证: 需求 1.2, 1.5

属性 3: 状态显示准确性

对于任何贷款申请,系统显示的银行选择状态应该与实际的银行选择情况完全一致 验证: 需求 3.1, 3.2, 3.3, 3.4, 3.5

属性 4: 一键提交条件

对于任何贷款申请,当且仅当包含完整信息(金额、期限、用途、银行、说明)时,系统应该允许一键提交 验证: 需求 4.1, 4.2

属性 5: 修改操作幂等性

对于任何银行选择修改操作,如果修改前后的银行信息相同,那么系统状态应该保持不变 验证: 需求 2.4, 2.5

属性 6: 变更历史完整性

对于任何银行选择变更,系统应该记录变更前的状态、变更后的状态和变更时间 验证: 需求 5.1, 5.2, 5.3

错误处理

银行选择错误处理

  • 银行信息缺失: 显示友好提示,引导用户选择银行
  • 银行服务不可用: 提供备选银行选项或稍后重试
  • 利率计算错误: 使用默认利率并标记需要人工确认

数据一致性错误处理

  • 银行信息不匹配: 自动同步最新银行信息
  • 状态不一致: 根据实际数据重新计算状态
  • 历史记录丢失: 记录错误日志但不影响主流程

用户操作错误处理

  • 重复提交: 检测并阻止重复提交操作
  • 无效修改: 验证修改权限和数据有效性
  • 网络中断: 提供本地缓存和重试机制