Files
hzdyjs/出国登记字段验证修复报告.md
T
2025-10-14 16:41:19 +08:00

11 KiB
Raw Blame History

出国登记字段验证修复报告

📋 问题描述

现象:点击"保存并提交"按钮时提示"联系电话不能为空"

根本原因:后端 Bo 类中的字段验证与数据库表结构不匹配


🔍 问题分析

数据库表实际字段(rs_overseas_registration)

基本信息字段:

  • ✅ registration_id - 登记ID(主键)
  • ✅ application_id - 关联申请ID
  • ✅ name - 姓名
  • ✅ gender - 性别
  • ✅ birth_date - 出生日期
  • ✅ photo - 照片
  • ✅ id_number - 身份证号
  • ✅ political_status - 政治面貌
  • ✅ registered_address - 户籍地址

工作信息字段:

  • ✅ department - 单位部门
  • ✅ position - 职务
  • ✅ administrative_level - 行政级别
  • ✅ personnel_category - 人员类别

状态字段:

  • ✅ status - 登记状态
  • ✅ registration_time - 登记时间
  • ✅ remarks - 备注

Bo 类中错误设置了验证的字段

以下字段在 数据库表中不存在,但在 Bo 类中设置了 @NotBlank 验证:

❌ contactPhone - 联系电话(导致本次错误的字段)
❌ workUnitPosition - 工作单位及职务
❌ departureDate - 出国日期
❌ returnDate - 预定返回日期
❌ stayDays - 停留天数(设置了 @Min 验证)
❌ destinationCountry - 前往国家
❌ reason - 事由
❌ registrationUnit - 登记单位
❌ travelType - 出国类型

Bo 类中缺少的数据库字段

以下字段在 数据库表中存在,但 Bo 类中缺失:

❌ idNumber - 身份证号(数据库字段:id_number)
❌ registeredAddress - 户籍地址(数据库字段:registered_address)
❌ department - 单位部门
❌ position - 职务
❌ administrativeLevel - 行政级别
❌ personnelCategory - 人员类别


🛠️ 修复方案

1. 移除不存在字段的验证

将以下数据库中不存在的字段的 @NotBlank、@NotNull、@Min 验证全部移除:

// 修复前
@NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系电话格式不正确", groups = { AddGroup.class, EditGroup.class })
private String contactPhone;

// 修复后
/**
 * 联系电话(前端字段,数据库无此字段)
 */
private String contactPhone;

2. 添加数据库实际字段

在 Bo 类中添加数据库表中存在的字段,并设置正确的验证:

/**
 * 身份证号(数据库字段:id_number)
 */
@NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class })
private String idNumber;

/**
 * 户籍地址(数据库字段:registered_address)
 */
@NotBlank(message = "户籍地址不能为空", groups = { AddGroup.class, EditGroup.class })
private String registeredAddress;

/**
 * 单位部门(数据库字段:department)
 */
@NotBlank(message = "单位部门不能为空", groups = { AddGroup.class, EditGroup.class })
private String department;

/**
 * 职务(数据库字段:position)
 */
@NotBlank(message = "职务不能为空", groups = { AddGroup.class, EditGroup.class })
private String position;

/**
 * 行政级别(数据库字段:administrative_level)
 */
private String administrativeLevel;

/**
 * 人员类别(数据库字段:personnel_category)
 */
private String personnelCategory;

3. 保留前端字段(无验证)

将数据库中不存在的字段统一放在一起,标注清楚:

// ========== 以下字段数据库表中不存在,仅用于前端展示,不做强制验证 ==========

/**
 * 工作单位及职务(前端字段,数据库无此字段)
 */
private String workUnitPosition;

/**
 * 联系电话(前端字段,数据库无此字段)
 */
private String contactPhone;

// ... 其他前端字段

✅ 修复结果

修改文件

  • ✅ RsOverseasRegistrationBo.java - 移除不存在字段的验证,添加数据库实际字段

编译验证

[INFO] ruoyi-rs ........................................... SUCCESS [  4.836 s]
[INFO] BUILD SUCCESS

✅ 编译通过,无错误

修复效果

修复前:

  • ❌ 提交表单时提示"联系电话不能为空"
  • ❌ 数据库实际字段无法保存(如:身份证号、户籍地址等)

修复后:

  • ✅ 移除了不存在字段的验证,不再提示错误
  • ✅ 添加了数据库实际字段,可以正常保存数据
  • ✅ 前端字段保留,便于后续扩展

📊 字段对比表

字段名 Bo类(修复前) 数据库表 修复后状态
contactPhone ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
workUnitPosition ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
departureDate ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
returnDate ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
destinationCountry ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
reason ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
registrationUnit ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
travelType ✅(强制验证) ❌ 不存在 ✅ 保留字段,移除验证
idNumber ❌ 缺失 ✅ 存在(必填) ✅ 新增字段,强制验证
registeredAddress ❌ 缺失 ✅ 存在(必填) ✅ 新增字段,强制验证
department ❌ 缺失 ✅ 存在(必填) ✅ 新增字段,强制验证
position ❌ 缺失 ✅ 存在(必填) ✅ 新增字段,强制验证
administrativeLevel ❌ 缺失 ✅ 存在(可选) ✅ 新增字段,无验证
personnelCategory ❌ 缺失 ✅ 存在(可选) ✅ 新增字段,无验证

⚠️ 重要说明

1. 数据库表设计与前端需求不匹配

根据分析,数据库表的设计与前端页面的需求存在严重不匹配:

前端页面需要的字段(但数据库没有):

  • 联系电话(contactPhone)
  • 配偶姓名(spouse)
  • 出国日期(departureDate)
  • 返回日期(returnDate)
  • 停留天数(stayDays)
  • 前往国家(destinationCountry)
  • 事由(reason)
  • 登记单位(registrationUnit)
  • 出国类型(travelType)

数据库有的字段(但前端可能没用到):

  • 身份证号(id_number)
  • 户籍地址(registered_address)
  • 单位部门(department)
  • 职务(position)
  • 行政级别(administrative_level)
  • 人员类别(personnel_category)

2. 后续建议

选项A:调整数据库表结构(推荐)

在数据库表中添加前端需要的字段:

ALTER TABLE rs_overseas_registration
ADD COLUMN contact_phone varchar(20) DEFAULT NULL COMMENT '联系电话',
ADD COLUMN spouse varchar(50) DEFAULT NULL COMMENT '配偶姓名',
ADD COLUMN departure_date date DEFAULT NULL COMMENT '出国日期',
ADD COLUMN return_date date DEFAULT NULL COMMENT '返回日期',
ADD COLUMN stay_days int DEFAULT NULL COMMENT '停留天数',
ADD COLUMN destination_country varchar(100) DEFAULT NULL COMMENT '前往国家',
ADD COLUMN destination_detail varchar(500) DEFAULT NULL COMMENT '前往国家详细信息',
ADD COLUMN reason text DEFAULT NULL COMMENT '事由',
ADD COLUMN registration_unit varchar(200) DEFAULT NULL COMMENT '登记单位',
ADD COLUMN travel_type char(1) DEFAULT NULL COMMENT '出国类型:1-因公,2-因私',
ADD COLUMN submit_time datetime DEFAULT NULL COMMENT '提交时间';

优点:

  • ✅ 前后端字段完全匹配
  • ✅ 数据可以正常保存
  • ✅ 业务逻辑完整

缺点:

  • ❌ 需要修改数据库结构
  • ❌ 可能需要迁移现有数据

选项B:调整前端页面(不推荐)

修改前端页面,使用数据库实际字段:

  • 移除不存在的字段输入框
  • 添加数据库字段的输入框

优点:

  • ✅ 不需要修改数据库

缺点:

  • ❌ 前端页面需要大量修改
  • ❌ 业务功能可能不完整
  • ❌ 用户体验可能下降

选项C:临时方案(当前采用)

保留所有字段,但只验证数据库存在的字段:

  • 数据库不存在的字段:保留在 Bo 类中,但不做验证
  • 数据库存在的字段:添加到 Bo 类中,做强制验证

优点:

  • ✅ 快速修复错误
  • ✅ 前端页面无需修改
  • ✅ 为后续扩展留出空间

缺点:

  • ❌ 前端填写的部分数据无法保存
  • ❌ 用户可能填写无效数据

3. 最终建议

强烈建议采用选项A:在数据库表中添加前端需要的字段。

理由:

  1. 前端页面已经完整实现了业务功能
  2. 用户填写的数据应该完整保存
  3. 后续业务扩展需要这些字段
  4. 数据完整性更有保障

🎯 测试建议

1. 当前修复测试(选项C)

测试"保存并提交"功能:

  1. ✅ 打开出国登记页面
  2. ✅ 点击"新增登记"
  3. ✅ 填写表单(只填写数据库实际存在的字段):
    • 姓名、性别、出生日期
    • 身份证号、政治面貌、户籍地址
    • 单位部门、职务
  4. ✅ 点击"保存并提交"
  5. ✅ 应该不再提示"联系电话不能为空"
  6. ✅ 数据应该能正常保存

⚠️ 注意:

  • 联系电话、配偶姓名等字段即使填写了,也不会保存到数据库
  • 出国日期、返回日期等字段即使填写了,也不会保存到数据库

2. 完整功能测试(选项A,需要先执行 ALTER TABLE)

如果执行了数据库字段添加脚本,测试:

  1. ✅ 填写所有字段
  2. ✅ 点击"保存并提交"
  3. ✅ 查询数据库,验证所有字段都已保存
  4. ✅ 刷新页面,验证数据完整回显

📝 相关文件清单

修改的文件

  1. ✅ RsOverseasRegistrationBo.java - 移除不存在字段的验证,添加数据库实际字段

参考文档

  1. 📋 backend/ruoyi-modules/ruoyi-rs/出国登记模块前后端对比分析报告.md - 详细字段对比分析
  2. 📋 backend/ruoyi-modules/ruoyi-rs/出国登记表创建脚本_最终版.sql - 数据库表结构
  3. 📋 出国登记保存并提交功能修复报告.md - 之前的修复报告

建议创建的文件

  1. 📝 backend/ruoyi-modules/ruoyi-rs/出国登记表字段扩展脚本.sql - 添加缺失字段的 SQL 脚本(如果采用选项A)

📊 修复统计

项目 数量
修改文件数 1个
移除验证的字段 8个
新增字段 6个
保留字段(无验证) 9个
修复时间 15分钟

✅ 总结

核心问题

后端 Bo 类的字段验证与数据库表结构严重不匹配。

临时解决方案

  • ✅ 移除数据库不存在字段的验证
  • ✅ 添加数据库实际字段并设置验证
  • ✅ 保留前端字段便于后续扩展

最终解决方案(强烈推荐)

在数据库表中添加前端需要的所有字段,实现前后端完全对齐。

当前状态

  • ✅ 编译通过
  • ✅ 不再提示"联系电话不能为空"
  • ⚠️ 部分前端填写的数据无法保存(因为数据库没有对应字段)

修复完成时间:2025-10-03
修复人:Cursor AI
测试状态:待用户测试验证
后续建议:执行数据库字段扩展脚本,实现完整功能