351 lines
9.9 KiB
Markdown
351 lines
9.9 KiB
Markdown
# 党籍保留亲属姓名字段修复完成报告
|
||
|
||
## 🎯 问题描述
|
||
|
||
**问题现象**:前端页面查看党籍保留申请详情时,"亲属姓名"字段始终显示"无",即使数据库中有数据。
|
||
|
||
**影响范围**:党籍保留申请管理模块的详情查看功能
|
||
|
||
**报告时间**:2025-10-10
|
||
|
||
---
|
||
|
||
## 🔍 问题根源分析
|
||
|
||
经过深入排查,发现了**真正的问题根源**:
|
||
|
||
### ❌ 核心问题:Mapper XML文件缺少字段映射
|
||
|
||
**问题文件**:`backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsPartyMembershipRetentionMapper.xml`
|
||
|
||
#### 问题1:ResultMap缺少relativeName映射
|
||
```xml
|
||
<!-- 修复前:缺少 relativeName 字段映射 -->
|
||
<resultMap type="RsPartyMembershipRetention" id="RsPartyMembershipRetentionResult">
|
||
<result property="spouse" column="spouse"/>
|
||
<!-- ❌ 缺少 relativeName 映射 -->
|
||
<result property="travelStartDate" column="travel_start_date"/>
|
||
</resultMap>
|
||
```
|
||
|
||
#### 问题2:SQL查询语句缺少relative_name字段
|
||
```xml
|
||
<!-- 修复前: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行
|
||
|
||
```xml
|
||
<!-- 修复后:添加 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行
|
||
|
||
```xml
|
||
<!-- 修复后: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. 重新编译后端代码
|
||
```bash
|
||
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend/ruoyi-admin
|
||
mvn clean compile -DskipTests
|
||
```
|
||
|
||
**状态**:✅ 已完成(2025-10-10 10:22:13)
|
||
|
||
### 2. 重启后端服务
|
||
|
||
#### 方法1:在终端中重启(推荐)
|
||
```bash
|
||
# 在运行后端服务的终端窗口中按 Ctrl + C 停止服务
|
||
# 然后执行:
|
||
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend
|
||
./start-main.sh
|
||
```
|
||
|
||
#### 方法2:使用kill命令重启
|
||
```bash
|
||
# 停止后端服务
|
||
kill 87027
|
||
|
||
# 等待几秒钟
|
||
sleep 3
|
||
|
||
# 重新启动服务
|
||
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend
|
||
./start-main.sh
|
||
```
|
||
|
||
**状态**:⏳ 待执行(需要用户手动重启)
|
||
|
||
### 3. 清除浏览器缓存
|
||
- 建议使用无痕模式测试
|
||
- 或者按 `Ctrl + Shift + R` 强制刷新页面
|
||
|
||
---
|
||
|
||
## 🧪 验证步骤
|
||
|
||
### 1. 测试API接口
|
||
|
||
使用Postman或浏览器测试:
|
||
|
||
```bash
|
||
GET http://localhost:8080/rs/party/retention/3
|
||
```
|
||
|
||
**预期返回**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"retentionId": 3,
|
||
"name": "张三",
|
||
"spouse": "李四",
|
||
"relativeName": "王五", // ✅ 应该有值,不再是 null
|
||
"destination": "美国",
|
||
"stayDays": 180,
|
||
// ... 其他字段
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 测试前端页面
|
||
|
||
1. 打开党籍保留申请管理页面
|
||
2. 点击任意一条记录的"查看"按钮
|
||
3. 在详情对话框中查看"亲属姓名"字段
|
||
|
||
**预期结果**:
|
||
- ✅ 如果数据库中有值,应该显示实际的亲属姓名
|
||
- ✅ 如果数据库中为NULL,显示"无"
|
||
|
||
### 3. 测试新增/编辑功能
|
||
|
||
1. 新增一条党籍保留申请,填写亲属姓名
|
||
2. 保存后查看详情
|
||
3. 确认亲属姓名正确保存和显示
|
||
|
||
---
|
||
|
||
## 📊 数据库数据检查
|
||
|
||
```sql
|
||
-- 检查现有数据
|
||
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
|
||
**状态**:✅ 代码修复完成,⏳ 等待服务重启验证
|
||
|