Files
hzdyjs/党籍保留亲属姓名字段补充完成报告.md
T
2025-10-14 16:41:19 +08:00

11 KiB
Raw Blame History

党籍保留亲属姓名字段补充完成报告

📋 问题背景

问题描述

在党籍保留申请功能中,前端表单有 relativeName(亲属姓名)字段并设置为必填项,但数据库表 rs_party_membership_retention 中缺失对应字段,导致:

  1. ❌ 前端填写的亲属姓名无法保存到数据库
  2. ❌ 后端实体类、Bo类、Vo类都缺失该字段
  3. ❌ 查看详情时,亲属姓名永远显示"无"
  4. ❌ 数据完整性受损,业务逻辑不完整

问题来源

  • 前端表单优化时新增了 relativeName 字段(参考:党籍保留表单优化说明.md)
  • 但未同步更新数据库表结构和后端代码
  • 导致前后端字段不一致

✅ 解决方案

完整修复流程(5层架构)

1️⃣ 数据库层 - 添加字段

文件: backend/ruoyi-modules/ruoyi-rs/党籍保留补充亲属姓名字段脚本.sql

-- 增加亲属姓名字段(放在 spouse 字段之后)
ALTER TABLE `rs_party_membership_retention`
ADD COLUMN `relative_name` varchar(50) NULL DEFAULT NULL COMMENT '亲属姓名(探望对象)' 
AFTER `spouse`;

-- 为亲属姓名添加索引(支持模糊查询)
ALTER TABLE `rs_party_membership_retention`
ADD INDEX `idx_relative_name` (`relative_name`) USING BTREE COMMENT '亲属姓名索引(模糊查询)';

字段说明:

  • 字段名: relative_name
  • 类型: varchar(50)
  • 位置: 在 spouse(配偶姓名)字段之后
  • 可为空: 是(NULL)
  • 默认值: NULL
  • 索引: 添加 idx_relative_name 索引,支持模糊查询

2️⃣ 后端实体类 - 补充属性

文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsPartyMembershipRetention.java

修改位置: 第73-79行(在 spouse 字段后)

/**
 * 亲属姓名(探望对象)
 */
@TableField("relative_name")
@ExcelProperty(value = "亲属姓名")
private String relativeName;

注解说明:

  • @TableField("relative_name"): 映射到数据库字段 relative_name
  • @ExcelProperty(value = "亲属姓名"): 导出Excel时的列名

3️⃣ 后端Bo类 - 补充属性和验证

文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsPartyMembershipRetentionBo.java

修改位置: 第68-72行(在 spouse 字段后)

/**
 * 亲属姓名(探望对象)
 */
@NotBlank(message = "亲属姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String relativeName;

验证规则:

  • @NotBlank: 必填字段,不能为空或空白字符串
  • groups = { AddGroup.class, EditGroup.class }: 新增和编辑时都需要验证

4️⃣ 后端Vo类 - 补充属性

文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsPartyMembershipRetentionVo.java

修改位置: 第60-63行(在 spouse 字段后)

/**
 * 亲属姓名(探望对象)
 */
private String relativeName;

5️⃣ 前端API类型定义 - 补充字段

文件: web/src/api/rs/party-membership-retention.ts

修改位置1: PartyRetentionVO 接口(第45-46行)

/** 亲属姓名(探望对象) */
relativeName?: string

修改位置2: PartyRetentionForm 接口(第105-106行)

/** 亲属姓名(探望对象) */
relativeName?: string

📊 字段映射关系表

层级 字段名 类型 必填 说明
数据库 relative_name varchar(50) 否 亲属姓名(探望对象)
实体类 relativeName String - 映射到 relative_name
Bo类 relativeName String ✅ 是 新增/编辑时必填
Vo类 relativeName String - 返回给前端
前端VO relativeName string 否 可选字段
前端Form relativeName string 否 可选字段

🔍 完整字段对比(补充后)

基本信息字段组

前端字段 后端Bo字段 数据库字段 状态
name name name ✅ 一致
idCard idCard id_card ✅ 一致
position position position ✅ 一致
spouse spouse spouse ✅ 一致
relativeName relativeName relative_name ✅ 已补充

出国时间字段组

前端字段 后端Bo字段 数据库字段 状态
travelStartDate travelStartDate travel_start_date ✅ 一致
travelEndDate travelEndDate travel_end_date ✅ 一致
stayDays stayDays stay_days ✅ 一致

出国目的字段组

前端字段 后端Bo字段 数据库字段 状态
destination destination destination ✅ 一致
purpose purpose purpose ✅ 一致
travelReason travelReason travel_reason ✅ 一致

党支部信息字段组

前端字段 后端Bo字段 数据库字段 状态
partyBranch partyBranch party_branch ✅ 一致
applicationDate applicationDate application_date ✅ 一致

📝 数据库执行步骤

1. 备份数据(重要!)

-- 备份现有数据
CREATE TABLE rs_party_membership_retention_backup_20251010 
AS SELECT * FROM rs_party_membership_retention;

2. 执行字段添加脚本

# 在数据库中执行
mysql -u root -p hzdyjs_xg < backend/ruoyi-modules/ruoyi-rs/党籍保留补充亲属姓名字段脚本.sql

3. 验证字段添加成功

-- 验证字段是否存在
SELECT 
    COLUMN_NAME AS '字段名',
    COLUMN_TYPE AS '字段类型',
    IS_NULLABLE AS '是否可空',
    COLUMN_DEFAULT AS '默认值',
    COLUMN_COMMENT AS '字段注释'
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'hzdyjs_xg' 
  AND TABLE_NAME = 'rs_party_membership_retention'
  AND COLUMN_NAME = 'relative_name';

-- 验证索引是否添加
SHOW INDEX FROM `rs_party_membership_retention` 
WHERE Key_name = 'idx_relative_name';

🚀 后端部署步骤

1. 编译后端代码

cd backend
mvn clean package -DskipTests

2. 重启后端服务

# 停止旧服务
./stop-main.sh

# 启动新服务
./start-main.sh

3. 验证后端接口

# 测试获取详情接口,检查是否返回 relativeName 字段
curl -X GET "http://localhost:8080/rs/party/retention/1" \
  -H "Authorization: Bearer YOUR_TOKEN"

🎨 前端验证步骤

1. 清除缓存并重新编译

cd web
npm run build

2. 测试功能

  1. 新增申请: 填写亲属姓名,保存后查看是否成功保存
  2. 查看详情: 打开已有申请,检查亲属姓名是否正确显示
  3. 编辑申请: 修改亲属姓名,保存后验证是否更新成功
  4. 列表导出: 导出Excel,检查是否包含"亲属姓名"列

✅ 修复效果对比

修复前 ❌

前端表单: relativeName = "张三"
  ↓ 提交
后端Bo类: 无 relativeName 字段 → 数据丢失
  ↓ 保存
数据库: 无 relative_name 字段 → 无法存储
  ↓ 查询
前端显示: 亲属姓名 = "无"

修复后 ✅

前端表单: relativeName = "张三"
  ↓ 提交
后端Bo类: relativeName = "张三" → 数据接收成功
  ↓ 保存
数据库: relative_name = "张三" → 成功存储
  ↓ 查询
前端显示: 亲属姓名 = "张三" → 正确显示

📋 修改文件清单

后端文件(4个)

  1. ✅ backend/ruoyi-modules/ruoyi-rs/党籍保留补充亲属姓名字段脚本.sql - 新建
  2. ✅ backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsPartyMembershipRetention.java - 修改
  3. ✅ backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsPartyMembershipRetentionBo.java - 修改
  4. ✅ backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsPartyMembershipRetentionVo.java - 修改

前端文件(1个)

  1. ✅ web/src/api/rs/party-membership-retention.ts - 修改

文档文件(1个)

  1. ✅ 党籍保留亲属姓名字段补充完成报告.md - 新建

🔄 相关文档更新

需要更新的文档

  1. API文档: 如果有党籍保留API文档,需要补充 relativeName 字段说明
  2. 数据库设计文档: 更新表结构说明,添加 relative_name 字段
  3. 字段映射文档: 更新前后端字段映射关系表

⚠️ 注意事项

1. 数据库执行注意

  • ✅ 执行前务必备份数据
  • ✅ 确认数据库连接正确(hzdyjs_xg)
  • ✅ 如果字段已存在,ALTER TABLE 会报错(可忽略)

2. 后端部署注意

  • ✅ 确保数据库字段添加成功后再部署后端
  • ✅ 重启后端服务使新代码生效
  • ✅ 检查日志是否有MyBatis映射错误

3. 前端测试注意

  • ✅ 清除浏览器缓存,确保使用最新代码
  • ✅ 测试新增、编辑、查看详情等完整流程
  • ✅ 验证必填项验证是否正常工作

🎯 测试用例

测试用例1:新增申请

步骤:

  1. 打开党籍保留申请页面
  2. 填写所有必填字段,包括"亲属姓名"为"张三"
  3. 点击"保存"按钮

预期结果:

  • ✅ 保存成功
  • ✅ 数据库 relative_name 字段值为"张三"

测试用例2:查看详情

步骤:

  1. 在列表中点击"查看"按钮
  2. 查看详情弹窗中的"亲属姓名"字段

预期结果:

  • ✅ 正确显示"张三"
  • ✅ 不再显示"无"

测试用例3:编辑申请

步骤:

  1. 在列表中点击"编辑"按钮
  2. 修改"亲属姓名"为"李四"
  3. 点击"保存"按钮

预期结果:

  • ✅ 保存成功
  • ✅ 数据库 relative_name 字段更新为"李四"
  • ✅ 再次查看详情显示"李四"

测试用例4:必填验证

步骤:

  1. 打开新增申请表单
  2. 不填写"亲属姓名"
  3. 点击"保存"按钮

预期结果:

  • ✅ 前端显示验证错误:"请输入亲属姓名"
  • ✅ 后端返回验证错误:"亲属姓名不能为空"

📊 问题解决总结

问题根源

前端表单优化时新增字段,但未同步更新数据库和后端代码,导致数据层面不一致。

解决方案

按照标准的5层架构(数据库 → 实体类 → Bo类 → Vo类 → 前端API),完整补充 relativeName 字段。

修复范围

  • ✅ 数据库表结构(添加字段和索引)
  • ✅ 后端实体类(添加属性和注解)
  • ✅ 后端Bo类(添加属性和验证)
  • ✅ 后端Vo类(添加属性)
  • ✅ 前端API类型定义(补充字段)

预防措施

  1. 强制性文档同步: 字段变更必须同步更新所有层级
  2. 完整性检查: 新增字段时检查5层架构是否都已补充
  3. 测试验证: 完整测试新增、编辑、查看等所有流程

🎉 完成状态

  • ✅ 数据库字段添加脚本已创建
  • ✅ 后端实体类已补充 relativeName 属性
  • ✅ 后端Bo类已补充 relativeName 属性和验证
  • ✅ 后端Vo类已补充 relativeName 属性
  • ✅ 前端API类型定义已补充 relativeName 字段
  • ✅ 字段映射关系已验证完整
  • ✅ 修复报告已编写

状态: 🎉 代码修改完成!请按照部署步骤执行数据库脚本和重启后端服务!


修复完成时间: 2025-10-10
修复人员: Cursor AI
版本: v1.0
相关文档:

  • 党籍保留表单优化说明.md(问题来源)
  • 党籍保留字段验证修正完成报告.md(历史问题记录)