Files
LCXiaoguan/首付分期功能修复总结.md
Admin 9f5a484689 feat: 首付分期功能实现 - 项目初始化提交
- 添加首付分期功能相关表结构和数据
- 实现首付分期策略管理
- 添加首付分期支付详情管理
- 完善项目相关功能模块
- 修复外键类型问题
- 添加相关初始化脚本和文档
2025-09-11 17:03:58 +08:00

126 lines
4.8 KiB
Markdown
Raw 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.

# 首付分期功能修复总结
## 问题描述
用户在保存政策数据时遇到错误:
```
保存政策数据失败: 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. 验证政策数据是否正确保存
## 预期结果
- 政策数据成功保存,不再出现类型转换错误
- 分期方案和政策数据正确关联
- 页面正常跳转和显示
## 影响范围
- 仅影响首付分期功能中的政策数据保存
- 不影响其他模块功能
- 向前兼容,不影响已有数据
## 验证状态
✅ 编译成功
✅ 服务重启成功
✅ 数据类型匹配修复
✅ 验证注解添加成功
✅ 数值字段类型转换优化