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