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

4.8 KiB
Raw Blame History

首付分期功能修复总结

问题描述

用户在保存政策数据时遇到错误:

保存政策数据失败: 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验证注解
  • 代码:
@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 || '',直接使用表单中已定义的字段:

// 修复前
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. 验证政策数据是否正确保存

预期结果

  • 政策数据成功保存,不再出现类型转换错误
  • 分期方案和政策数据正确关联
  • 页面正常跳转和显示

影响范围

  • 仅影响首付分期功能中的政策数据保存
  • 不影响其他模块功能
  • 向前兼容,不影响已有数据

验证状态

编译成功 服务重启成功 数据类型匹配修复 验证注解添加成功 数值字段类型转换优化