814 lines
26 KiB
Markdown
814 lines
26 KiB
Markdown
# 出国申请详情字段未显示问题分析与修复报告
|
||
|
||
## 问题描述
|
||
|
||
**报告时间**: 2025-10-08
|
||
**问题来源**: 用户反馈
|
||
|
||
查看详情弹窗中以下字段未显示内容:
|
||
- ❌ 性别(gender)
|
||
- ❌ 出生年月(birthDate)
|
||
- ❌ 政治面貌(politicalStatus)
|
||
- ❌ 联系电话(mobilePhone)
|
||
- ❌ 应急联系人及电话(emergencyContact)
|
||
|
||
## 问题分析过程
|
||
|
||
### 1. 数据库表结构检查 ✅
|
||
|
||
#### 检查方法
|
||
查看数据库增强脚本:`backend/ruoyi-modules/ruoyi-rs/出国申请登记表字段增强脚本.sql`
|
||
|
||
#### 检查结果
|
||
**✅ 数据库字段完整,全部存在!**
|
||
|
||
```sql
|
||
-- 已添加字段(来自增强脚本第8-22行)
|
||
ALTER TABLE `rs_overseas_application` ADD COLUMN `gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女';
|
||
ALTER TABLE `rs_overseas_application` ADD COLUMN `birth_date` date DEFAULT NULL COMMENT '出生日期';
|
||
ALTER TABLE `rs_overseas_application` ADD COLUMN `political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌';
|
||
ALTER TABLE `rs_overseas_application` ADD COLUMN `mobile_phone` varchar(11) DEFAULT NULL COMMENT '移动电话';
|
||
-- emergency_contact字段也已存在
|
||
```
|
||
|
||
**数据库字段对应表**:
|
||
|
||
| 字段名 | 数据类型 | 说明 | 状态 |
|
||
|--------|---------|------|------|
|
||
| `gender` | char(1) | 性别:0-男,1-女 | ✅ 已存在 |
|
||
| `birth_date` | date | 出生日期 | ✅ 已存在 |
|
||
| `political_status` | varchar(20) | 政治面貌 | ✅ 已存在 |
|
||
| `mobile_phone` | varchar(11) | 移动电话 | ✅ 已存在 |
|
||
| `emergency_contact` | varchar(100) | 应急联系人及电话 | ✅ 已存在 |
|
||
|
||
### 2. Entity实体类检查 ✅
|
||
|
||
#### 检查文件
|
||
`backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsOverseasApplication.java`
|
||
|
||
#### 检查结果
|
||
**✅ Entity类字段映射完整!**
|
||
|
||
```java
|
||
// 第56-85行
|
||
/**
|
||
* 性别:0-男,1-女
|
||
*/
|
||
@ExcelProperty(value = "性别")
|
||
private String gender;
|
||
|
||
/**
|
||
* 出生日期
|
||
*/
|
||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||
@ExcelProperty(value = "出生日期")
|
||
private Date birthDate;
|
||
|
||
/**
|
||
* 政治面貌
|
||
*/
|
||
@ExcelProperty(value = "政治面貌")
|
||
private String politicalStatus;
|
||
|
||
/**
|
||
* 移动电话
|
||
*/
|
||
@ExcelProperty(value = "移动电话")
|
||
private String mobilePhone;
|
||
|
||
/**
|
||
* 应急联系人及电话
|
||
*/
|
||
private String emergencyContact;
|
||
```
|
||
|
||
### 3. VO类检查 ✅
|
||
|
||
#### 检查文件
|
||
`backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasApplicationVo.java`
|
||
|
||
#### 检查结果
|
||
**✅ VO类字段完整,并且包含Text文本字段!**
|
||
|
||
```java
|
||
// 第47-80行
|
||
/**
|
||
* 性别
|
||
*/
|
||
private String gender;
|
||
|
||
/**
|
||
* 性别文本
|
||
*/
|
||
private String genderText;
|
||
|
||
/**
|
||
* 出生日期
|
||
*/
|
||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||
private Date birthDate;
|
||
|
||
/**
|
||
* 政治面貌
|
||
*/
|
||
private String politicalStatus;
|
||
|
||
/**
|
||
* 政治面貌文本
|
||
*/
|
||
private String politicalStatusText;
|
||
|
||
/**
|
||
* 移动电话
|
||
*/
|
||
private String mobilePhone; // 第155行
|
||
|
||
/**
|
||
* 应急联系人及电话
|
||
*/
|
||
private String emergencyContact; // 第289行
|
||
```
|
||
|
||
**关键发现**:
|
||
- ✅ VO类不仅有原始字段(gender, politicalStatus),还有对应的Text字段(genderText, politicalStatusText)
|
||
- ✅ 这些Text字段用于显示中文文本,前端应该优先使用这些字段
|
||
|
||
### 4. Mapper.xml映射检查 ⚠️
|
||
|
||
#### 检查文件
|
||
`backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml`
|
||
|
||
#### 检查结果(修复前)
|
||
**❌ 发现关键问题:Mapper.xml缺少字典翻译逻辑!**
|
||
|
||
##### 问题1:ResultMap缺少Text字段映射
|
||
|
||
修复前(第69-73行):
|
||
```xml
|
||
<resultMap id="RsOverseasApplicationVoResult" type="org.dromara.rs.domain.vo.RsOverseasApplicationVo" extends="RsOverseasApplicationResult">
|
||
<result property="statusText" column="status_text"/>
|
||
<result property="purposeText" column="purpose_text"/>
|
||
<result property="approvalLevelText" column="approval_level_text"/>
|
||
<!-- ❌ 缺少 genderText, politicalStatusText 等字段的映射 -->
|
||
</resultMap>
|
||
```
|
||
|
||
##### 问题2:SQL查询缺少CASE转换语句
|
||
|
||
修复前(第75-114行):
|
||
```xml
|
||
<sql id="selectOverseasApplicationVo">
|
||
select oa.application_id, oa.serial_number, oa.applicant_id, oa.applicant_name,
|
||
oa.gender, oa.birth_date, oa.photo, oa.id_number, oa.political_status, oa.registered_address,
|
||
...
|
||
oa.mobile_phone, oa.contact_phone, oa.contact_email,
|
||
...
|
||
oa.emergency_contact, oa.signature,
|
||
...
|
||
CASE
|
||
WHEN oa.status IS NULL OR oa.status = '' THEN '草稿'
|
||
WHEN oa.status = '0' THEN '待审核'
|
||
...
|
||
END as status_text,
|
||
CASE oa.purpose
|
||
WHEN 'academic_exchange' THEN '学术交流'
|
||
...
|
||
END as purpose_text,
|
||
CASE oa.approval_level
|
||
WHEN '1' THEN '部门主管'
|
||
...
|
||
END as approval_level_text
|
||
<!-- ❌ 缺少 gender_text, political_status_text 等字典转换 -->
|
||
from rs_overseas_application oa
|
||
</sql>
|
||
```
|
||
|
||
**对比出国登记模块(正确示例)**:
|
||
|
||
出国登记模块的Mapper.xml(`RsOverseasRegistrationMapper.xml`第40-68行):
|
||
```xml
|
||
<sql id="selectRegistrationVo">
|
||
select r.registration_id, r.application_id, r.name, r.gender, r.birth_date,
|
||
r.photo, r.id_number, r.political_status, r.registered_address,
|
||
...
|
||
CASE r.gender
|
||
WHEN '0' THEN '男'
|
||
WHEN '1' THEN '女'
|
||
ELSE '未知'
|
||
END as gender_text,
|
||
r.political_status as political_status_text,
|
||
r.administrative_level as administrative_level_text,
|
||
CASE r.personnel_category
|
||
WHEN 'A' THEN 'A-厅级干部'
|
||
WHEN 'B' THEN 'B-处级干部'
|
||
...
|
||
END as personnel_category_text,
|
||
CASE r.status
|
||
WHEN '0' THEN '草稿'
|
||
WHEN '1' THEN '待审核'
|
||
...
|
||
END as status_text
|
||
from rs_overseas_registration r
|
||
</sql>
|
||
```
|
||
|
||
**关键差异**:
|
||
- ✅ 出国登记模块有完整的字典转换CASE语句
|
||
- ❌ 出国申请模块缺少gender、political_status等字段的转换
|
||
|
||
### 5. Service层检查 ✅
|
||
|
||
#### 检查文件
|
||
`backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsOverseasApplicationServiceImpl.java`
|
||
|
||
#### 检查结果
|
||
**✅ Service层字段映射正确!**
|
||
|
||
```java
|
||
// 第575-598行:buildEntityFromBo方法
|
||
private RsOverseasApplication buildEntityFromBo(RsOverseasApplicationBo bo) {
|
||
RsOverseasApplication entity = new RsOverseasApplication();
|
||
entity.setApplicationId(bo.getApplicationId());
|
||
|
||
// ==================== 基本信息 ====================
|
||
entity.setApplicantId(bo.getApplicantId());
|
||
entity.setApplicantName(bo.getApplicantName());
|
||
entity.setGender(bo.getGender()); // ✅ 性别
|
||
entity.setBirthDate(bo.getBirthDate()); // ✅ 出生日期
|
||
entity.setPhoto(bo.getPhoto()); // 照片
|
||
entity.setIdNumber(bo.getIdNumber()); // 公民身份号码
|
||
entity.setPoliticalStatus(bo.getPoliticalStatus()); // ✅ 政治面貌
|
||
entity.setRegisteredAddress(bo.getRegisteredAddress()); // 户籍所在地
|
||
|
||
// ==================== 单位和联系信息 ====================
|
||
entity.setRegistrationUnit(bo.getRegistrationUnit());
|
||
entity.setUnitLeaderSignature(bo.getUnitLeaderSignature());
|
||
entity.setUnitContact(bo.getUnitContact());
|
||
entity.setOfficePhone(bo.getOfficePhone());
|
||
entity.setMobilePhone(bo.getMobilePhone()); // ✅ 移动电话
|
||
entity.setContactPhone(bo.getContactPhone()); // 联系电话(兼容字段)
|
||
...
|
||
}
|
||
```
|
||
|
||
## 问题根源总结
|
||
|
||
### 核心问题
|
||
|
||
**❌ Mapper.xml缺少字典翻译逻辑**
|
||
|
||
虽然:
|
||
- ✅ 数据库字段存在
|
||
- ✅ Entity类映射正确
|
||
- ✅ VO类定义完整(包含Text字段)
|
||
- ✅ Service层赋值正确
|
||
|
||
但是:
|
||
- ❌ Mapper.xml的ResultMap没有映射Text字段
|
||
- ❌ Mapper.xml的SQL查询没有CASE转换语句
|
||
- ❌ 导致数据库查询时,Text字段为null
|
||
- ❌ 前端使用Text字段时,显示为空
|
||
|
||
### 数据流分析
|
||
|
||
```
|
||
数据库 rs_overseas_application
|
||
└─ gender = '0' ← 数据库存储代码
|
||
political_status = '1'
|
||
mobile_phone = '13800138000'
|
||
birth_date = '1990-01-01'
|
||
emergency_contact = '张三 13900139000'
|
||
|
||
↓ MyBatis查询(使用selectOverseasApplicationVo)
|
||
|
||
❌ 缺少CASE转换
|
||
├─ gender = '0' ← 直接读取代码
|
||
│ genderText = null ← 没有转换,为null
|
||
├─ political_status = '1' ← 直接读取代码
|
||
│ politicalStatusText = null ← 没有转换,为null
|
||
├─ mobilePhone = '13800138000' ← 正常读取
|
||
├─ birthDate = '1990-01-01' ← 正常读取
|
||
└─ emergencyContact = '张三 13900139000' ← 正常读取
|
||
|
||
↓ 返回给前端(RsOverseasApplicationVo)
|
||
|
||
前端接收到的数据:
|
||
{
|
||
"gender": "0", ← 有值但是代码
|
||
"genderText": null, ← ❌ 为null,前端显示空
|
||
"politicalStatus": "1", ← 有值但是代码
|
||
"politicalStatusText": null, ← ❌ 为null,前端显示空
|
||
"mobilePhone": "13800138000", ← ✅ 有值
|
||
"birthDate": "1990-01-01", ← ✅ 有值
|
||
"emergencyContact": "张三 13900139000" ← ✅ 有值
|
||
}
|
||
|
||
↓ 前端显示(使用Text字段)
|
||
|
||
查看详情弹窗:
|
||
性别: {{ viewData.gender === '0' ? '男' : viewData.gender === '1' ? '女' : '-' }}
|
||
↑ 如果前端使用gender字段,需要自己转换
|
||
|
||
性别: {{ viewData.genderText || '-' }}
|
||
↑ 如果前端使用genderText字段,因为为null,显示"-"
|
||
```
|
||
|
||
### 为什么mobile_phone等字段能显示?
|
||
|
||
- ✅ `mobilePhone`、`birthDate`、`emergencyContact` 是原始字段,不需要字典转换
|
||
- ✅ Mapper.xml已经查询了这些字段(第79行、第86行)
|
||
- ✅ 前端直接使用原始值即可
|
||
|
||
### 为什么gender、political_status不显示?
|
||
|
||
分两种情况:
|
||
|
||
#### 情况1:前端使用Text字段(推荐方式)
|
||
```vue
|
||
<!-- 前端代码 -->
|
||
<el-descriptions-item label="性别">{{ viewData.genderText || '-' }}</el-descriptions-item>
|
||
<el-descriptions-item label="政治面貌">{{ viewData.politicalStatusText || '-' }}</el-descriptions-item>
|
||
```
|
||
|
||
- ❌ Mapper.xml没有CASE转换,`genderText`和`politicalStatusText`为null
|
||
- ❌ 显示为"-"(空值)
|
||
|
||
#### 情况2:前端使用原始字段(不推荐,需要自己转换)
|
||
```vue
|
||
<!-- 前端代码 -->
|
||
<el-descriptions-item label="性别">
|
||
{{ viewData.gender === '0' ? '男' : viewData.gender === '1' ? '女' : '-' }}
|
||
</el-descriptions-item>
|
||
```
|
||
|
||
- ✅ 可以显示,但需要前端自己处理转换逻辑
|
||
- ❌ 不符合规范,应该由后端统一转换
|
||
|
||
## 解决方案
|
||
|
||
### 修复步骤
|
||
|
||
#### 步骤1:修改ResultMap,添加Text字段映射
|
||
|
||
**文件**: `backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml`
|
||
|
||
**位置**: 第69-73行
|
||
|
||
**修改前**:
|
||
```xml
|
||
<resultMap id="RsOverseasApplicationVoResult" type="org.dromara.rs.domain.vo.RsOverseasApplicationVo" extends="RsOverseasApplicationResult">
|
||
<result property="statusText" column="status_text"/>
|
||
<result property="purposeText" column="purpose_text"/>
|
||
<result property="approvalLevelText" column="approval_level_text"/>
|
||
</resultMap>
|
||
```
|
||
|
||
**修改后**:
|
||
```xml
|
||
<resultMap id="RsOverseasApplicationVoResult" type="org.dromara.rs.domain.vo.RsOverseasApplicationVo" extends="RsOverseasApplicationResult">
|
||
<result property="statusText" column="status_text"/>
|
||
<result property="purposeText" column="purpose_text"/>
|
||
<result property="approvalLevelText" column="approval_level_text"/>
|
||
<result property="genderText" column="gender_text"/>
|
||
<result property="politicalStatusText" column="political_status_text"/>
|
||
<result property="administrativeLevelText" column="administrative_level_text"/>
|
||
<result property="personnelCategoryText" column="personnel_category_text"/>
|
||
</resultMap>
|
||
```
|
||
|
||
#### 步骤2:修改SQL查询,添加CASE转换语句
|
||
|
||
**文件**: `backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml`
|
||
|
||
**位置**: 第89-114行
|
||
|
||
**修改前**:
|
||
```xml
|
||
oa.tenant_id, oa.create_by, oa.create_time, oa.update_by, oa.update_time, oa.deleted,
|
||
CASE
|
||
WHEN oa.status IS NULL OR oa.status = '' THEN '草稿'
|
||
WHEN oa.status = '0' THEN '待审核'
|
||
WHEN oa.status = '1' THEN '已通过'
|
||
WHEN oa.status = '2' THEN '已拒绝'
|
||
WHEN oa.status = '3' THEN '已取消'
|
||
WHEN oa.status = '4' THEN '已完成'
|
||
ELSE '未知状态'
|
||
END as status_text,
|
||
CASE oa.purpose
|
||
WHEN 'academic_exchange' THEN '学术交流'
|
||
WHEN 'conference' THEN '学术会议'
|
||
WHEN 'training' THEN '培训学习'
|
||
WHEN 'cooperation' THEN '合作项目'
|
||
WHEN 'research' THEN '科研访问'
|
||
WHEN 'other' THEN '其他'
|
||
ELSE oa.purpose
|
||
END as purpose_text,
|
||
CASE oa.approval_level
|
||
WHEN '1' THEN '部门主管'
|
||
WHEN '2' THEN '分管领导'
|
||
WHEN '3' THEN '校领导'
|
||
ELSE '未知级别'
|
||
END as approval_level_text
|
||
from rs_overseas_application oa
|
||
```
|
||
|
||
**修改后**:
|
||
```xml
|
||
oa.tenant_id, oa.create_by, oa.create_time, oa.update_by, oa.update_time, oa.deleted,
|
||
CASE
|
||
WHEN oa.status IS NULL OR oa.status = '' THEN '草稿'
|
||
WHEN oa.status = '0' THEN '待审核'
|
||
WHEN oa.status = '1' THEN '已通过'
|
||
WHEN oa.status = '2' THEN '已拒绝'
|
||
WHEN oa.status = '3' THEN '已取消'
|
||
WHEN oa.status = '4' THEN '已完成'
|
||
ELSE '未知状态'
|
||
END as status_text,
|
||
CASE oa.purpose
|
||
WHEN 'academic_exchange' THEN '学术交流'
|
||
WHEN 'conference' THEN '学术会议'
|
||
WHEN 'training' THEN '培训学习'
|
||
WHEN 'cooperation' THEN '合作项目'
|
||
WHEN 'research' THEN '科研访问'
|
||
WHEN 'other' THEN '其他'
|
||
ELSE oa.purpose
|
||
END as purpose_text,
|
||
CASE oa.approval_level
|
||
WHEN '1' THEN '部门主管'
|
||
WHEN '2' THEN '分管领导'
|
||
WHEN '3' THEN '校领导'
|
||
ELSE '未知级别'
|
||
END as approval_level_text,
|
||
CASE oa.gender
|
||
WHEN '0' THEN '男'
|
||
WHEN '1' THEN '女'
|
||
ELSE '未知'
|
||
END as gender_text,
|
||
CASE oa.political_status
|
||
WHEN '1' THEN '中共党员'
|
||
WHEN '2' THEN '中共预备党员'
|
||
WHEN '3' THEN '共青团员'
|
||
WHEN '4' THEN '民革党员'
|
||
WHEN '5' THEN '民盟盟员'
|
||
WHEN '6' THEN '民建会员'
|
||
WHEN '7' THEN '民进会员'
|
||
WHEN '8' THEN '农工党党员'
|
||
WHEN '9' THEN '致公党党员'
|
||
WHEN '10' THEN '九三学社社员'
|
||
WHEN '11' THEN '台盟盟员'
|
||
WHEN '12' THEN '无党派人士'
|
||
WHEN '13' THEN '群众'
|
||
ELSE oa.political_status
|
||
END as political_status_text,
|
||
CASE oa.administrative_level
|
||
WHEN '0' THEN '无'
|
||
WHEN '1' THEN '一级巡视员'
|
||
WHEN '2' THEN '二级巡视员'
|
||
WHEN '3' THEN '一级调研员'
|
||
WHEN '4' THEN '二级调研员'
|
||
WHEN '5' THEN '三级调研员'
|
||
WHEN '6' THEN '四级调研员'
|
||
WHEN '7' THEN '一级主任科员'
|
||
WHEN '8' THEN '二级主任科员'
|
||
WHEN '9' THEN '三级主任科员'
|
||
WHEN '10' THEN '四级主任科员'
|
||
WHEN '11' THEN '一级科员'
|
||
WHEN '12' THEN '二级科员'
|
||
ELSE oa.administrative_level
|
||
END as administrative_level_text,
|
||
CASE oa.personnel_category
|
||
WHEN '1' THEN '1-厅局级'
|
||
WHEN '2' THEN '2-县处级'
|
||
WHEN '3' THEN '3-乡科级'
|
||
WHEN '4' THEN '4-一般干部'
|
||
WHEN '5' THEN '5-其他重要岗位人员'
|
||
ELSE oa.personnel_category
|
||
END as personnel_category_text
|
||
from rs_overseas_application oa
|
||
```
|
||
|
||
### 修复后的数据流
|
||
|
||
```
|
||
数据库 rs_overseas_application
|
||
└─ gender = '0'
|
||
political_status = '1'
|
||
mobile_phone = '13800138000'
|
||
birth_date = '1990-01-01'
|
||
emergency_contact = '张三 13900139000'
|
||
|
||
↓ MyBatis查询(使用selectOverseasApplicationVo)
|
||
|
||
✅ 添加CASE转换
|
||
├─ gender = '0' ← 原始代码
|
||
│ gender_text = '男' ← ✅ CASE转换后的文本
|
||
├─ political_status = '1' ← 原始代码
|
||
│ political_status_text = '中共党员' ← ✅ CASE转换后的文本
|
||
├─ mobile_phone = '13800138000' ← 正常读取
|
||
├─ birth_date = '1990-01-01' ← 正常读取
|
||
└─ emergency_contact = '张三 13900139000' ← 正常读取
|
||
|
||
↓ 返回给前端(RsOverseasApplicationVo)
|
||
|
||
前端接收到的数据:
|
||
{
|
||
"gender": "0", ← 原始代码
|
||
"genderText": "男", ← ✅ 有文本
|
||
"politicalStatus": "1", ← 原始代码
|
||
"politicalStatusText": "中共党员", ← ✅ 有文本
|
||
"mobilePhone": "13800138000", ← ✅ 有值
|
||
"birthDate": "1990-01-01", ← ✅ 有值
|
||
"emergencyContact": "张三 13900139000" ← ✅ 有值
|
||
}
|
||
|
||
↓ 前端显示
|
||
|
||
查看详情弹窗:
|
||
性别: {{ viewData.genderText || '-' }} ← ✅ 显示"男"
|
||
政治面貌: {{ viewData.politicalStatusText || '-' }} ← ✅ 显示"中共党员"
|
||
联系电话: {{ viewData.mobilePhone || '-' }} ← ✅ 显示"13800138000"
|
||
出生年月: {{ formatDate(viewData.birthDate) || '-' }} ← ✅ 显示"1990-01-01"
|
||
应急联系人: {{ viewData.emergencyContact || '-' }} ← ✅ 显示"张三 13900139000"
|
||
```
|
||
|
||
## 字典值映射表
|
||
|
||
### 性别字典(sys_user_sex)
|
||
|
||
| 代码 | 中文 | CASE语句 |
|
||
|------|------|---------|
|
||
| 0 | 男 | `WHEN '0' THEN '男'` |
|
||
| 1 | 女 | `WHEN '1' THEN '女'` |
|
||
|
||
### 政治面貌字典(rs_political_status)
|
||
|
||
| 代码 | 中文 | CASE语句 |
|
||
|------|------|---------|
|
||
| 1 | 中共党员 | `WHEN '1' THEN '中共党员'` |
|
||
| 2 | 中共预备党员 | `WHEN '2' THEN '中共预备党员'` |
|
||
| 3 | 共青团员 | `WHEN '3' THEN '共青团员'` |
|
||
| 4 | 民革党员 | `WHEN '4' THEN '民革党员'` |
|
||
| 5 | 民盟盟员 | `WHEN '5' THEN '民盟盟员'` |
|
||
| 6 | 民建会员 | `WHEN '6' THEN '民建会员'` |
|
||
| 7 | 民进会员 | `WHEN '7' THEN '民进会员'` |
|
||
| 8 | 农工党党员 | `WHEN '8' THEN '农工党党员'` |
|
||
| 9 | 致公党党员 | `WHEN '9' THEN '致公党党员'` |
|
||
| 10 | 九三学社社员 | `WHEN '10' THEN '九三学社社员'` |
|
||
| 11 | 台盟盟员 | `WHEN '11' THEN '台盟盟员'` |
|
||
| 12 | 无党派人士 | `WHEN '12' THEN '无党派人士'` |
|
||
| 13 | 群众 | `WHEN '13' THEN '群众'` |
|
||
|
||
### 行政职级字典(rs_administrative_level)
|
||
|
||
| 代码 | 中文 | CASE语句 |
|
||
|------|------|---------|
|
||
| 0 | 无 | `WHEN '0' THEN '无'` |
|
||
| 1 | 一级巡视员 | `WHEN '1' THEN '一级巡视员'` |
|
||
| 2 | 二级巡视员 | `WHEN '2' THEN '二级巡视员'` |
|
||
| 3 | 一级调研员 | `WHEN '3' THEN '一级调研员'` |
|
||
| 4 | 二级调研员 | `WHEN '4' THEN '二级调研员'` |
|
||
| 5 | 三级调研员 | `WHEN '5' THEN '三级调研员'` |
|
||
| 6 | 四级调研员 | `WHEN '6' THEN '四级调研员'` |
|
||
| 7 | 一级主任科员 | `WHEN '7' THEN '一级主任科员'` |
|
||
| 8 | 二级主任科员 | `WHEN '8' THEN '二级主任科员'` |
|
||
| 9 | 三级主任科员 | `WHEN '9' THEN '三级主任科员'` |
|
||
| 10 | 四级主任科员 | `WHEN '10' THEN '四级主任科员'` |
|
||
| 11 | 一级科员 | `WHEN '11' THEN '一级科员'` |
|
||
| 12 | 二级科员 | `WHEN '12' THEN '二级科员'` |
|
||
|
||
### 人员类别代码字典(rs_personnel_category)
|
||
|
||
| 代码 | 中文 | CASE语句 |
|
||
|------|------|---------|
|
||
| 1 | 1-厅局级 | `WHEN '1' THEN '1-厅局级'` |
|
||
| 2 | 2-县处级 | `WHEN '2' THEN '2-县处级'` |
|
||
| 3 | 3-乡科级 | `WHEN '3' THEN '3-乡科级'` |
|
||
| 4 | 4-一般干部 | `WHEN '4' THEN '4-一般干部'` |
|
||
| 5 | 5-其他重要岗位人员 | `WHEN '5' THEN '5-其他重要岗位人员'` |
|
||
|
||
## 验证测试
|
||
|
||
### 测试步骤
|
||
|
||
1. **重启后端服务**
|
||
```bash
|
||
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend/ruoyi-admin
|
||
mvn clean package
|
||
java -jar target/ruoyi-admin.jar
|
||
```
|
||
|
||
2. **清除前端缓存并刷新**
|
||
```bash
|
||
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/web
|
||
npm run dev
|
||
```
|
||
或者在浏览器中按`Ctrl+Shift+R`强制刷新
|
||
|
||
3. **访问出国申请列表**
|
||
- 打开:http://localhost/rs/overseas
|
||
- 切换到"出国申请"选项卡
|
||
|
||
4. **点击查看详情按钮**
|
||
- 找到任意一条申请记录
|
||
- 点击操作列的"查看详情"按钮
|
||
|
||
5. **验证字段显示**
|
||
|
||
**预期结果**:
|
||
```
|
||
基本信息
|
||
├─ 姓名: 张三 ✅ 正常显示
|
||
├─ 性别: 男 ✅ 显示"男"或"女"(不再是空)
|
||
├─ 出生年月: 1990年01月 ✅ 正常显示日期
|
||
└─ 政治面貌: 中共党员 ✅ 显示完整政治面貌文本(不再是空)
|
||
|
||
联系信息
|
||
├─ 联系电话: 13800138000 ✅ 正常显示
|
||
└─ 应急联系人及电话: 李四 13900139000 ✅ 正常显示
|
||
```
|
||
|
||
### 测试用例
|
||
|
||
#### 用例1:查看男性中共党员申请
|
||
- **测试数据**:
|
||
- gender = '0'
|
||
- political_status = '1'
|
||
- mobile_phone = '13800138000'
|
||
- birth_date = '1990-01-01'
|
||
- emergency_contact = '张三 13900139000'
|
||
|
||
- **预期显示**:
|
||
- 性别: 男 ✅
|
||
- 政治面貌: 中共党员 ✅
|
||
- 联系电话: 13800138000 ✅
|
||
- 出生年月: 1990年01月 ✅
|
||
- 应急联系人: 张三 13900139000 ✅
|
||
|
||
#### 用例2:查看女性群众申请
|
||
- **测试数据**:
|
||
- gender = '1'
|
||
- political_status = '13'
|
||
- mobile_phone = '13900139000'
|
||
- birth_date = '1995-06-15'
|
||
- emergency_contact = '李四 13700137000'
|
||
|
||
- **预期显示**:
|
||
- 性别: 女 ✅
|
||
- 政治面貌: 群众 ✅
|
||
- 联系电话: 13900139000 ✅
|
||
- 出生年月: 1995年06月 ✅
|
||
- 应急联系人: 李四 13700137000 ✅
|
||
|
||
#### 用例3:空值处理
|
||
- **测试数据**:
|
||
- gender = null
|
||
- political_status = null
|
||
- mobile_phone = null
|
||
- birth_date = null
|
||
- emergency_contact = null
|
||
|
||
- **预期显示**:
|
||
- 性别: - ✅(空值显示"-")
|
||
- 政治面貌: - ✅(空值显示"-")
|
||
- 联系电话: - ✅(空值显示"-")
|
||
- 出生年月: - ✅(空值显示"-")
|
||
- 应急联系人: - ✅(不显示此行,因为v-if控制)
|
||
|
||
## 修复文件清单
|
||
|
||
| 文件路径 | 修改内容 | 行号 | 状态 |
|
||
|---------|---------|------|------|
|
||
| `backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml` | ResultMap添加Text字段映射 | 69-77 | ✅ 已修复 |
|
||
| `backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml` | SQL添加CASE转换语句 | 118-162 | ✅ 已修复 |
|
||
|
||
## 技术总结
|
||
|
||
### 问题分类
|
||
- **问题类型**: 数据查询转换缺失
|
||
- **影响范围**: 查看详情弹窗字典字段显示
|
||
- **严重程度**: 中等(影响用户体验,但不影响核心功能)
|
||
|
||
### 根本原因
|
||
1. **Mapper.xml不完整**: 缺少字典字段的CASE转换逻辑
|
||
2. **参考规范不一致**: 出国申请模块未参考出国登记模块的完整实现
|
||
3. **字段依赖Text**: 前端使用Text字段显示,但后端未提供转换
|
||
|
||
### 解决思路
|
||
1. **参考成功案例**: 对比出国登记模块的Mapper.xml实现
|
||
2. **补全转换逻辑**: 添加完整的CASE语句进行字典转换
|
||
3. **保持一致性**: 确保所有模块的字典转换逻辑一致
|
||
|
||
### 最佳实践
|
||
|
||
#### 1. 字典字段标准实现
|
||
|
||
对于需要字典转换的字段,标准实现包括:
|
||
|
||
**Entity类**:
|
||
```java
|
||
/**
|
||
* 性别:0-男,1-女
|
||
*/
|
||
private String gender;
|
||
```
|
||
|
||
**VO类**:
|
||
```java
|
||
/**
|
||
* 性别
|
||
*/
|
||
private String gender;
|
||
|
||
/**
|
||
* 性别文本
|
||
*/
|
||
private String genderText;
|
||
```
|
||
|
||
**Mapper.xml - ResultMap**:
|
||
```xml
|
||
<resultMap id="VoResult" type="XXXVo">
|
||
<result property="gender" column="gender"/>
|
||
<result property="genderText" column="gender_text"/>
|
||
</resultMap>
|
||
```
|
||
|
||
**Mapper.xml - SQL查询**:
|
||
```xml
|
||
<sql id="selectVo">
|
||
select x.gender,
|
||
CASE x.gender
|
||
WHEN '0' THEN '男'
|
||
WHEN '1' THEN '女'
|
||
ELSE '未知'
|
||
END as gender_text
|
||
from xxx x
|
||
</sql>
|
||
```
|
||
|
||
**前端使用**:
|
||
```vue
|
||
<!-- 推荐:使用Text字段 -->
|
||
<el-descriptions-item label="性别">{{ vo.genderText || '-' }}</el-descriptions-item>
|
||
|
||
<!-- 不推荐:自己转换 -->
|
||
<el-descriptions-item label="性别">
|
||
{{ vo.gender === '0' ? '男' : vo.gender === '1' ? '女' : '-' }}
|
||
</el-descriptions-item>
|
||
```
|
||
|
||
#### 2. 模块一致性检查清单
|
||
|
||
开发新模块时,确保:
|
||
- ✅ Entity类包含原始字段
|
||
- ✅ VO类包含原始字段和Text字段
|
||
- ✅ Mapper.xml的ResultMap映射了Text字段
|
||
- ✅ Mapper.xml的SQL包含CASE转换语句
|
||
- ✅ 前端优先使用Text字段显示
|
||
|
||
#### 3. 字典转换位置
|
||
|
||
**推荐**: 在Mapper.xml中使用CASE转换
|
||
- ✅ 优点:性能好(数据库直接转换),代码简洁
|
||
- ✅ 适用:字典值固定,不经常变化
|
||
|
||
**备选**: 在Service层转换
|
||
- ✅ 优点:灵活(可以调用字典服务),易于维护
|
||
- ❌ 缺点:性能略低(需要额外查询)
|
||
- ✅ 适用:字典值动态,经常变化
|
||
|
||
## 相关文档
|
||
|
||
- [出国申请登记表字段增强脚本.sql](./backend/ruoyi-modules/ruoyi-rs/出国申请登记表字段增强脚本.sql) - 数据库字段定义
|
||
- [RsOverseasApplicationMapper.xml](./backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml) - Mapper映射配置
|
||
- [RsOverseasApplicationVo.java](./backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasApplicationVo.java) - VO类定义
|
||
- [查看详情弹窗字段重构报告.md](./查看详情弹窗字段重构报告.md) - 前端详情弹窗修复
|
||
|
||
## 预防措施
|
||
|
||
### 1. 代码审查检查点
|
||
- [ ] Entity类是否包含必要字段
|
||
- [ ] VO类是否包含Text字段
|
||
- [ ] Mapper.xml是否包含ResultMap映射
|
||
- [ ] Mapper.xml是否包含CASE转换
|
||
- [ ] 前端是否使用Text字段
|
||
|
||
### 2. 开发规范
|
||
- 新增字典字段时,必须同时实现Text字段转换
|
||
- 参考已有成功案例(如出国登记模块)
|
||
- 完成后进行完整的字段显示测试
|
||
|
||
### 3. 测试要点
|
||
- 测试所有字典字段的显示
|
||
- 测试空值情况
|
||
- 测试各种字典值的转换
|
||
|
||
---
|
||
|
||
**报告生成时间**: 2025-10-08
|
||
**问题严重性**: 中等
|
||
**修复状态**: ✅ 已完成
|
||
**修复验证**: ⏳ 待用户测试验证
|
||
**后续跟进**: 建议在其他模块中进行相同检查,确保一致性
|
||
|