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

9.9 KiB
Raw Blame History

党籍保留亲属姓名字段修复完成报告

🎯 问题描述

问题现象:前端页面查看党籍保留申请详情时,"亲属姓名"字段始终显示"无",即使数据库中有数据。

影响范围:党籍保留申请管理模块的详情查看功能

报告时间:2025-10-10


🔍 问题根源分析

经过深入排查,发现了真正的问题根源:

❌ 核心问题:Mapper XML文件缺少字段映射

问题文件:backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsPartyMembershipRetentionMapper.xml

问题1:ResultMap缺少relativeName映射

<!-- 修复前:缺少 relativeName 字段映射 -->
<resultMap type="RsPartyMembershipRetention" id="RsPartyMembershipRetentionResult">
    <result property="spouse" column="spouse"/>
    <!-- ❌ 缺少 relativeName 映射 -->
    <result property="travelStartDate" column="travel_start_date"/>
</resultMap>

问题2:SQL查询语句缺少relative_name字段

<!-- 修复前:SQL查询没有包含 relative_name 字段 -->
<sql id="selectRetentionVo">
    select r.retention_id, r.application_id, r.registration_id, r.name, r.id_card, r.position, r.spouse,
    <!-- ❌ 缺少 r.relative_name -->
    r.travel_start_date, r.travel_end_date, ...
</sql>

📊 数据流程分析

数据库表 rs_party_membership_retention (有 relative_name 字段)
    ↓
❌ Mapper XML SQL查询 (没有查询 relative_name 字段)
    ↓
❌ ResultMap映射 (没有映射 relativeName 属性)
    ↓
后端实体类 RsPartyMembershipRetention (有 relativeName 属性)
    ↓
后端Vo类 RsPartyMembershipRetentionVo (有 relativeName 属性)
    ↓
前端API响应 (relativeName 为 null)
    ↓
前端页面显示 "无"

结论:即使数据库有数据,由于Mapper XML没有查询和映射该字段,导致后端返回的数据中 relativeName 始终为 null。


✅ 修复方案

修复1:在ResultMap中添加relativeName映射

文件:RsPartyMembershipRetentionMapper.xml

修改位置:第7-36行

<!-- 修复后:添加 relativeName 字段映射 -->
<resultMap type="RsPartyMembershipRetention" id="RsPartyMembershipRetentionResult">
    <id property="retentionId" column="retention_id"/>
    <result property="applicationId" column="application_id"/>
    <result property="registrationId" column="registration_id"/>
    <result property="name" column="name"/>
    <result property="idCard" column="id_card"/>
    <result property="position" column="position"/>
    <result property="spouse" column="spouse"/>
    <result property="relativeName" column="relative_name"/>  <!-- ✅ 新增 -->
    <result property="travelStartDate" column="travel_start_date"/>
    <!-- ... 其他字段 ... -->
</resultMap>

修复2:在SQL查询中添加relative_name字段

文件:RsPartyMembershipRetentionMapper.xml

修改位置:第43-63行

<!-- 修复后:SQL查询包含 relative_name 字段 -->
<sql id="selectRetentionVo">
    select r.retention_id, r.application_id, r.registration_id, r.name, r.id_card, r.position, r.spouse, r.relative_name,  <!-- ✅ 新增 -->
    r.travel_start_date, r.travel_end_date, r.stay_days, r.destination, r.purpose,
    r.travel_reason, r.self_funded, r.request_approval, r.final_approval,
    r.party_branch, r.application_date, r.status, r.application_time, r.remarks,
    r.tenant_id, r.create_by, r.create_time, r.update_by, r.update_time, r.deleted,
    CASE r.self_funded 
        WHEN '1' THEN '是'
        WHEN '0' THEN '否'
        ELSE '未知'
    END as self_funded_text,
    CASE r.status 
        WHEN '0' THEN '草稿'
        WHEN '1' THEN '待审核'
        WHEN '2' THEN '已通过'
        WHEN '3' THEN '已拒绝'
        WHEN '4' THEN '已撤回'
        ELSE '未知状态'
    END as status_text
    from rs_party_membership_retention r
</sql>

📝 修复后的完整数据流程

数据库表 rs_party_membership_retention (有 relative_name 字段)
    ↓
✅ Mapper XML SQL查询 (查询 r.relative_name 字段)
    ↓
✅ ResultMap映射 (映射 relativeName 属性)
    ↓
后端实体类 RsPartyMembershipRetention (relativeName 有值)
    ↓
后端Vo类 RsPartyMembershipRetentionVo (relativeName 有值)
    ↓
前端API响应 (relativeName 有正确的值)
    ↓
前端页面显示 "实际的亲属姓名"

🚀 部署步骤

1. 重新编译后端代码

cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend/ruoyi-admin
mvn clean compile -DskipTests

状态:✅ 已完成(2025-10-10 10:22:13)

2. 重启后端服务

方法1:在终端中重启(推荐)

# 在运行后端服务的终端窗口中按 Ctrl + C 停止服务
# 然后执行:
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend
./start-main.sh

方法2:使用kill命令重启

# 停止后端服务
kill 87027

# 等待几秒钟
sleep 3

# 重新启动服务
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend
./start-main.sh

状态:⏳ 待执行(需要用户手动重启)

3. 清除浏览器缓存

  • 建议使用无痕模式测试
  • 或者按 Ctrl + Shift + R 强制刷新页面

🧪 验证步骤

1. 测试API接口

使用Postman或浏览器测试:

GET http://localhost:8080/rs/party/retention/3

预期返回:

{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "retentionId": 3,
    "name": "张三",
    "spouse": "李四",
    "relativeName": "王五",  // ✅ 应该有值,不再是 null
    "destination": "美国",
    "stayDays": 180,
    // ... 其他字段
  }
}

2. 测试前端页面

  1. 打开党籍保留申请管理页面
  2. 点击任意一条记录的"查看"按钮
  3. 在详情对话框中查看"亲属姓名"字段

预期结果:

  • ✅ 如果数据库中有值,应该显示实际的亲属姓名
  • ✅ 如果数据库中为NULL,显示"无"

3. 测试新增/编辑功能

  1. 新增一条党籍保留申请,填写亲属姓名
  2. 保存后查看详情
  3. 确认亲属姓名正确保存和显示

📊 数据库数据检查

-- 检查现有数据
SELECT retention_id, name, spouse, relative_name 
FROM rs_party_membership_retention 
WHERE deleted = '0'
LIMIT 10;

当前数据状态:

  • retention_id=1: relative_name = NULL
  • retention_id=2: relative_name = NULL
  • retention_id=3: relative_name = '王五' ✅
  • retention_id=4: relative_name = '张三' ✅

说明:数据库中部分记录的 relative_name 为 NULL 是正常的,这些记录可能是在添加该字段之前创建的。


📋 相关文件清单

已修改的文件

  1. Mapper XML文件(核心修复)
    • 路径:backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsPartyMembershipRetentionMapper.xml
    • 修改内容:
      • 在 RsPartyMembershipRetentionResult ResultMap中添加 relativeName 映射
      • 在 selectRetentionVo SQL中添加 r.relative_name 字段

之前已完成的文件(无需再修改)

  1. 数据库表结构

    • 表:rs_party_membership_retention
    • 字段:relative_name VARCHAR(100) COMMENT '亲属姓名(探望对象)'
  2. 后端实体类

    • 文件:backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsPartyMembershipRetention.java
    • 已有:private String relativeName; 属性
  3. 后端Bo类

    • 文件:backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsPartyMembershipRetentionBo.java
    • 已有:private String relativeName; 属性
  4. 后端Vo类

    • 文件:backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsPartyMembershipRetentionVo.java
    • 已有:private String relativeName; 属性
  5. 前端API类型定义

    • 文件:web/src/api/rs/party-membership-retention/types.ts
    • 已有:relativeName?: string; 字段
  6. 前端页面

    • 文件:web/src/views/rs/party-membership-retention/index.vue
    • 已有:表单输入、详情显示、验证规则

⚠️ 重要提醒

为什么之前没有发现这个问题?

  1. 数据库字段存在 ✅
  2. 后端实体类有属性 ✅
  3. 前端页面有显示 ✅
  4. 但是Mapper XML没有查询和映射 ❌

这是一个隐蔽的问题,因为:

  • 代码编译不会报错
  • 接口调用不会报错
  • 只是返回的数据中该字段为 null

如何避免类似问题?

  1. 添加新字段的完整流程:

    数据库表 → Mapper XML (SQL + ResultMap) → 实体类 → Bo/Vo类 → 前端类型定义 → 前端页面
    
  2. 检查清单:

    • ✅ 数据库字段是否添加
    • ✅ Mapper XML的SQL是否包含该字段
    • ✅ Mapper XML的ResultMap是否映射该字段
    • ✅ 实体类是否有对应属性
    • ✅ Bo/Vo类是否有对应属性
    • ✅ 前端类型定义是否有该字段
    • ✅ 前端页面是否正确使用
  3. 测试验证:

    • 先测试API接口,确认返回数据正确
    • 再测试前端页面,确认显示正确

🎉 修复完成标志

当你看到以下情况时,说明修复成功:

  • ✅ 后端服务重启成功,无报错
  • ✅ API接口返回的JSON中 relativeName 字段有正确的值(不是null)
  • ✅ 前端详情页面正确显示亲属姓名(不再显示"无")
  • ✅ 新增/编辑申请时,亲属姓名可以正常保存和显示

📞 技术支持

修复人员:Cursor AI
修复时间:2025-10-10
问题级别:中等(数据映射问题)
修复难度:简单(只需修改Mapper XML)


📚 相关文档

  • 党籍保留补充亲属姓名字段脚本.sql - 数据库脚本
  • 重启后端服务说明.md - 服务重启指南
  • 党籍保留亲属姓名字段修复完成报告.md - 本文档

最后更新:2025-10-10 10:22
状态:✅ 代码修复完成,⏳ 等待服务重启验证