feat: 首付分期功能实现 - 项目初始化提交
- 添加首付分期功能相关表结构和数据 - 实现首付分期策略管理 - 添加首付分期支付详情管理 - 完善项目相关功能模块 - 修复外键类型问题 - 添加相关初始化脚本和文档
This commit is contained in:
126
首付分期功能修复总结.md
Normal file
126
首付分期功能修复总结.md
Normal file
@ -0,0 +1,126 @@
|
||||
# 首付分期功能修复总结
|
||||
|
||||
## 问题描述
|
||||
用户在保存政策数据时遇到错误:
|
||||
```
|
||||
保存政策数据失败: Error: Invalid property 'periodicpolicyid' of bean class [org.dromara.system.domain.bo.TPolicyBo]: Could not instantiate property type [java.lang.Long] to auto-grow nested property path
|
||||
```
|
||||
|
||||
## 问题分析
|
||||
该错误是由于前端发送的`periodicpolicyid`字段类型与后端`TPolicyBo`类中的`Long`类型不匹配导致的Spring MVC数据绑定失败。
|
||||
|
||||
## 修复内容
|
||||
|
||||
### 1. 前端修复 (ruoyi-ui/src/views/system/periodicpolicy/add/index.vue)
|
||||
- **问题位置**: 第577行
|
||||
- **修改前**: `periodicpolicyid: parseInt(schemeId) || 0`
|
||||
- **修改后**: `periodicpolicyid: Number(schemeId)`
|
||||
- **原因**: 使用`Number`确保将字符串正确转换为整数类型,避免Spring MVC的Long类型转换错误
|
||||
|
||||
### 2. 后端修复 (ruoyi-modules/ruoyi-businessdata/src/main/java/org/dromara/system/domain/bo/TPolicyBo.java)
|
||||
- **问题**: `periodicpolicyid`字段缺少验证注解
|
||||
- **修改**: 添加`@NotNull`验证注解
|
||||
- **代码**:
|
||||
```java
|
||||
@NotNull(message = "分期方案主键ID不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private Long periodicpolicyid;
|
||||
```
|
||||
|
||||
### 3. 额外修复
|
||||
- **usableHousesCount字段**:移除了`Number()`转换,让Spring MVC自动处理类型转换
|
||||
- **数据验证优化**:移除了所有前端手动类型转换,避免转换错误的可能性
|
||||
- **关键问题**:修复了Spring无法实例化Long类型的问题
|
||||
|
||||
## 技术细节
|
||||
|
||||
### 数据类型映射解决方案
|
||||
|
||||
#### 问题描述
|
||||
Spring MVC无法将前端字符串类型的periodicpolicyid转换为后端Long类型,导致`java.lang.NoSuchMethodException: java.lang.Long.<init>()`异常。
|
||||
|
||||
#### 根本原因
|
||||
1. **后端Long包装类型**:TPolicyBo中periodicpolicyid定义为Long包装类型
|
||||
2. **Spring转换限制**:Spring MVC无法将字符串直接转换为Long包装类型
|
||||
3. **前端字符串格式**:前端传递的是字符串格式的ID
|
||||
|
||||
#### 解决方案
|
||||
1. **前端修复**:移除Number()转换,让Spring MVC自动完成字符串到Long的转换
|
||||
2. **数据验证**:确保前端传递的是有效的数字字符串
|
||||
3. **Spring配置**:无需额外配置,Spring MVC可自动处理
|
||||
|
||||
#### 关键修复
|
||||
- **文件**:`ruoyi-ui/src/views/system/periodicpolicy/add/index.vue`
|
||||
- **修改**:第557行移除`Number()`转换,直接使用schemeId值
|
||||
- **验证**:保存方案和政策数据时不再出现类型转换错误
|
||||
|
||||
### 字段映射修复
|
||||
|
||||
#### 新问题描述
|
||||
- **错误信息**: `ReferenceError: selectedProjects is not defined`
|
||||
- **发生位置**: ruoyi-ui/src/views/system/periodicpolicy/add/index.vue
|
||||
- **影响**: 保存方案时前端报错,无法正确传递项目GUID数据
|
||||
|
||||
#### 根本原因分析
|
||||
前端代码中引用了未定义的变量`selectedProjects`,该变量在组件中从未被定义或初始化。代码试图使用`selectedProjects.value.map()`来处理项目数据,但由于变量不存在导致运行时错误。
|
||||
|
||||
#### 解决方案
|
||||
将`selectedProjects.value.map(...)`替换为`form.value.projguids || ''`和`form.value.projnames || ''`,直接使用表单中已定义的字段:
|
||||
|
||||
```javascript
|
||||
// 修复前
|
||||
const planData = {
|
||||
schemeName: form.value.schemeName,
|
||||
ProjGUIDs: selectedProjects.value.map(item => item.projguid).join(','),
|
||||
projnames: selectedProjects.value.map(item => item.projname).join(','),
|
||||
// ...
|
||||
}
|
||||
|
||||
// 修复后
|
||||
const planData = {
|
||||
schemeName: form.value.schemeName,
|
||||
projguids: form.value.projguids || '',
|
||||
projnames: form.value.projnames || '',
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
#### 后续问题
|
||||
- **新问题**: `保存方案失败: Error: 分期GUID不能为空`
|
||||
- **原因**: 前端字段名`ProjGUIDs`与后端数据库字段名`projguids`不匹配
|
||||
- **解决**: 将前端字段名统一改为`projguids`(小写开头),与后端保持一致
|
||||
|
||||
#### 验证方法
|
||||
1. 访问 http://localhost:80/system/periodicpolicy
|
||||
2. 点击"新增"创建分期方案
|
||||
3. 选择项目并添加政策数据
|
||||
4. 点击"保存方案",验证能够成功保存且不再出现字段相关的错误
|
||||
|
||||
### 验证分组
|
||||
- **新增模式**: AddGroup.class
|
||||
- **编辑模式**: EditGroup.class
|
||||
- **字段验证**: 确保periodicpolicyid不为null
|
||||
|
||||
## 测试步骤
|
||||
1. 访问 http://localhost:80/system/periodicpolicy
|
||||
2. 点击"新增"按钮创建首付分期方案
|
||||
3. 填写方案基本信息
|
||||
4. 添加关联政策数据
|
||||
5. 点击"保存"按钮
|
||||
6. 验证政策数据是否正确保存
|
||||
|
||||
## 预期结果
|
||||
- 政策数据成功保存,不再出现类型转换错误
|
||||
- 分期方案和政策数据正确关联
|
||||
- 页面正常跳转和显示
|
||||
|
||||
## 影响范围
|
||||
- 仅影响首付分期功能中的政策数据保存
|
||||
- 不影响其他模块功能
|
||||
- 向前兼容,不影响已有数据
|
||||
|
||||
## 验证状态
|
||||
✅ 编译成功
|
||||
✅ 服务重启成功
|
||||
✅ 数据类型匹配修复
|
||||
✅ 验证注解添加成功
|
||||
✅ 数值字段类型转换优化
|
||||
Reference in New Issue
Block a user