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

205 lines
6.5 KiB
Markdown
Raw Permalink 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.

# 设计文档
## 概述
银行选择逻辑优化设计旨在简化贷款申请流程,消除用户在申请和提交阶段的重复银行选择操作。通过重构前端组件和后端数据模型,实现一次选择、多次使用的用户体验。
## 架构
### 当前架构问题
- 贷款申请创建时选择银行,但不保存提交说明
- 详情页面需要重新选择银行和填写说明
- 银行选择状态不明确,用户体验混乱
### 优化后架构
- 贷款申请创建时同时保存银行选择和提交说明
- 详情页面直接使用已保存的银行信息
- 提供修改银行选择的独立功能
- 实现一键提交机制
## 组件和接口
### 前端组件修改
#### LoanManagement.vue 组件优化
**数据模型扩展:**
```javascript
// 贷款申请表单增加提交说明字段
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. 增加一键提交按钮
#### 新增组件功能
**银行选择状态显示:**
```javascript
// 银行选择状态计算
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 数据模型扩展
**新增字段:**
```java
public class ServicePeriodLoan {
// 现有字段...
/** 提交说明 */
private String submitComments;
/** 银行选择时间 */
private Date bankSelectedTime;
/** 银行选择变更历史 */
private String bankSelectionHistory;
/** 是否可一键提交 */
private Boolean quickSubmitEnabled;
}
```
#### API 接口优化
**贷款申请接口增强:**
```java
@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);
}
```
**一键提交接口:**
```java
@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 表新增字段:**
```sql
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**
## 错误处理
### 银行选择错误处理
- **银行信息缺失**: 显示友好提示,引导用户选择银行
- **银行服务不可用**: 提供备选银行选项或稍后重试
- **利率计算错误**: 使用默认利率并标记需要人工确认
### 数据一致性错误处理
- **银行信息不匹配**: 自动同步最新银行信息
- **状态不一致**: 根据实际数据重新计算状态
- **历史记录丢失**: 记录错误日志但不影响主流程
### 用户操作错误处理
- **重复提交**: 检测并阻止重复提交操作
- **无效修改**: 验证修改权限和数据有效性
- **网络中断**: 提供本地缓存和重试机制