# 出国申请附件显示修复说明
## 问题描述
用户通过"出国申请"菜单新增申请时,上传了以下两个附件:
1. **出国境登记表盖章文件**
2. **党籍保留附件**
但在点击"查看详情"按钮时,弹窗中**未显示这两个附件**。
---
## 问题原因分析
### 根本原因
**后端VO类缺少党籍保留附件相关字段**
#### 数据库表字段(完整)
`rs_overseas_application` 表中包含以下字段:
- `stamped_registration_file_path` - 登记备案表盖章文件路径
- `stamped_registration_file_name` - 登记备案表盖章文件名
- `stamped_file_upload_time` - 盖章文件上传时间
- `stamped_file_upload_status` - 盖章文件上传状态
- `stamped_file_oss_id` - 盖章文件OSS ID
- `party_retention_file_path` - 党籍保留附件文件路径
- `party_retention_file_name` - 党籍保留附件文件名
- `party_retention_upload_time` - 党籍保留附件上传时间
- `party_retention_upload_status` - 党籍保留附件上传状态
- `party_retention_file_oss_id` - 党籍保留附件OSS ID
#### 后端实体类(RsOverseasApplication.java)- ✅ 完整
```java
private String partyRetentionFilePath;
private String partyRetentionFileName;
private Date partyRetentionUploadTime;
private String partyRetentionUploadStatus;
private Long partyRetentionFileOssId;
```
#### 后端VO类(RsOverseasApplicationVo.java)- ❌ 缺失
**修复前**:只有 `partyRetentionFileOssId`,缺少以下字段:
- `partyRetentionFilePath`
- `partyRetentionFileName`
- `partyRetentionUploadTime`
- `partyRetentionUploadStatus`
**导致问题**:
- 前端调用查看详情API时,后端返回的VO数据中没有党籍保留附件的文件名、上传时间等信息
- 前端无法判断是否有党籍保留附件上传(`partyRetentionUploadStatus` 为空)
- 前端详情弹窗的条件渲染失效:`v-if="partyRetentionUploadStatus === '1'"` 始终为false
---
## 修复方案
### 1️⃣ 后端修复:补充VO字段
**文件**:`backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasApplicationVo.java`
**修改位置**:第332-356行
**修改内容**:在 `stampedFileOssId` 之后补充党籍保留附件的完整字段
```java
/**
* 党籍保留附件文件路径
*/
private String partyRetentionFilePath;
/**
* 党籍保留附件文件名
*/
private String partyRetentionFileName;
/**
* 党籍保留附件上传时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date partyRetentionUploadTime;
/**
* 党籍保留附件上传状态:0-未上传,1-已上传
*/
private String partyRetentionUploadStatus;
/**
* 党籍保留附件OSS ID(用于安全下载)
*/
private Long partyRetentionFileOssId;
```
### 2️⃣ 前端修复:补充TypeScript接口字段
**文件**:`web/src/api/rs/overseas.ts`
**修改位置**:第55-64行(OverseasApplicationVO接口)
**修改内容**:补充党籍保留附件和OSS ID字段
```typescript
export interface OverseasApplicationVO {
// ... 其他字段 ...
stampedFileOssId?: number; // 盖章文件OSS ID
partyRetentionFilePath?: string; // 党籍保留附件文件路径
partyRetentionFileName?: string; // 党籍保留附件文件名
partyRetentionUploadTime?: string; // 党籍保留附件上传时间
partyRetentionUploadStatus?: string; // 党籍保留附件上传状态
partyRetentionFileOssId?: number; // 党籍保留附件OSS ID
// ... 其他字段 ...
}
```
---
## 前端详情弹窗显示逻辑
**文件**:`web/src/views/rs/overseas/index.vue`
### 出国境登记表盖章文件显示(第997-1022行)
```vue
出国境登记表盖章文件
{{ (state.viewData as OverseasApplicationVO).stampedRegistrationFileName }}
上传时间: {{ (state.viewData as OverseasApplicationVO).stampedFileUploadTime }}
下载
```
**条件渲染**:
- `v-if="stampedFileUploadStatus === '1'"` - 只有上传状态为"1"(已上传)时才显示
- 显示文件名:`stampedRegistrationFileName`
- 显示上传时间:`stampedFileUploadTime`
### 党籍保留附件显示(第1024-1050行)
```vue
党籍保留附件
{{ (state.viewData as OverseasApplicationVO).partyRetentionFileName }}
上传时间: {{ (state.viewData as OverseasApplicationVO).partyRetentionUploadTime }}
下载
```
**条件渲染**:
- `v-if="partyRetentionUploadStatus === '1'"` - 只有上传状态为"1"(已上传)时才显示
- 显示文件名:`partyRetentionFileName`(✅ **修复后可用**)
- 显示上传时间:`partyRetentionUploadTime`(✅ **修复后可用**)
---
## 修复效果
### 修复前 ❌
- **问题1**:党籍保留附件区域不显示(条件渲染失败)
- **原因**:`partyRetentionUploadStatus` 字段为空/undefined
### 修复后 ✅
- **出国境登记表盖章文件**:
- 显示文件名、上传时间
- 提供下载按钮
- **党籍保留附件**:
- 显示文件名、上传时间(✅ **字段补全后可用**)
- 提供下载按钮
---
## 部署步骤
### 1️⃣ 后端部署
#### Step 1: 编译代码(已完成)
```bash
cd /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/backend
mvn clean compile -DskipTests -pl ruoyi-modules/ruoyi-rs -am
```
**编译结果**:✅ BUILD SUCCESS
#### Step 2: 重启后端服务
**方法1:IDEA重启**
1. 停止当前运行的 RuoYi-Admin 服务
2. 重新运行 RuoYi-Admin 启动类
**方法2:命令行重启**
```bash
# 停止现有进程
ps aux | grep ruoyi-admin
kill -9
# 启动服务
cd ruoyi-admin
mvn spring-boot:run
```
### 2️⃣ 前端部署
#### 前端无需重新编译
- TypeScript 接口更新后,前端代码无需重新编译
- 浏览器刷新即可生效
#### 浏览器刷新
**硬刷新(清除缓存)**:
- **Windows**: `Ctrl + Shift + R`
- **Mac**: `Cmd + Shift + R`
---
## 验证步骤
### 1️⃣ 准备测试数据
#### 新增出国申请(包含附件)
1. 点击"出国申请"菜单
2. 点击"新增申请"按钮
3. 填写表单信息
4. 上传"出国境登记表盖章文件"
5. 上传"党籍保留附件"(如果是党员)
6. 点击"提交"按钮
### 2️⃣ 验证详情弹窗显示
#### 查看详情
1. 在出国申请列表中找到刚才新增的申请
2. 点击"查看详情"按钮
3. **验证点**:
- ✅ 出国境登记表盖章文件区域显示
- ✅ 显示文件名(如:`出国登记表-盖章.pdf`)
- ✅ 显示上传时间(如:`2025-10-11 10:30:15`)
- ✅ 党籍保留附件区域显示(如果是党员且已上传)
- ✅ 显示文件名(如:`党籍保留材料.pdf`)
- ✅ 显示上传时间(如:`2025-10-11 10:31:20`)
### 3️⃣ 验证下载功能
#### 下载附件
1. 点击"出国境登记表盖章文件"的"下载"按钮
- ✅ 文件开始下载
- ✅ 文件名正确
2. 点击"党籍保留附件"的"下载"按钮
- ✅ 文件开始下载
- ✅ 文件名正确
---
## 技术要点
### AutoMapper 自动映射
**注解**:`@AutoMapper(target = RsOverseasApplication.class)`
**作用**:
- 自动将 `RsOverseasApplication` 实体类的字段映射到 `RsOverseasApplicationVo`
- 字段名相同的会自动映射
- **要求**:VO类必须包含对应的字段,否则不会映射
**为什么需要手动补充字段**:
- 虽然有 `@AutoMapper` 注解
- 但VO类中必须**显式声明**所有需要返回的字段
- 缺失的字段不会自动添加,需要手动补充
### JSON序列化
**时间字段格式化**:
```java
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date partyRetentionUploadTime;
```
**作用**:
- 将 `Date` 类型转换为指定格式的字符串
- 前端接收到的数据:`"2025-10-11 10:31:20"` 而不是时间戳
---
## 参考
### 对比:培训申请附件显示实现
**文件**:`web/src/views/rs/training/index.vue`
**相似功能**:
- 培训申请详情弹窗中也显示附件列表
- 实现方式:通过 `attachmentIds` 字段查询附件列表
- 显示逻辑:使用 `el-table` 展示附件列表
**出国申请的差异**:
- 出国申请有两类特殊附件(盖章文件、党籍附件)
- 直接将附件信息存储在主表中(而不是关联附件表)
- 使用条件渲染显示(`v-if`)而不是表格列表
---
## 总结
### 修复内容
1. ✅ **后端VO补充字段**:添加党籍保留附件的4个字段
2. ✅ **前端TS接口补充字段**:添加党籍保留附件和OSS ID字段
3. ✅ **后端编译成功**:无错误
### 待验证
1. ⏳ **重启后端服务**:应用VO字段更改
2. ⏳ **前端刷新验证**:硬刷新浏览器
3. ⏳ **功能验证**:查看详情弹窗显示附件
4. ⏳ **下载验证**:附件下载功能正常
### 修复时间
**修复日期**:2025-10-11
**修复内容**:出国申请查看详情弹窗附件不显示问题
---
## 附录:字段对照表
| 字段用途 | 数据库字段 | 实体类字段 | VO类字段 | 前端TS接口 |
|---------|-----------|-----------|----------|-----------|
| 盖章文件路径 | `stamped_registration_file_path` | `stampedRegistrationFilePath` | `stampedRegistrationFilePath` | `stampedRegistrationFilePath` |
| 盖章文件名 | `stamped_registration_file_name` | `stampedRegistrationFileName` | `stampedRegistrationFileName` | `stampedRegistrationFileName` |
| 盖章上传时间 | `stamped_file_upload_time` | `stampedFileUploadTime` | `stampedFileUploadTime` | `stampedFileUploadTime` |
| 盖章上传状态 | `stamped_file_upload_status` | `stampedFileUploadStatus` | `stampedFileUploadStatus` | `stampedFileUploadStatus` |
| 盖章文件OSS ID | `stamped_file_oss_id` | `stampedFileOssId` | `stampedFileOssId` | `stampedFileOssId` |
| 党籍附件路径 | `party_retention_file_path` | `partyRetentionFilePath` | ✅ `partyRetentionFilePath` | ✅ `partyRetentionFilePath` |
| 党籍附件文件名 | `party_retention_file_name` | `partyRetentionFileName` | ✅ `partyRetentionFileName` | ✅ `partyRetentionFileName` |
| 党籍上传时间 | `party_retention_upload_time` | `partyRetentionUploadTime` | ✅ `partyRetentionUploadTime` | ✅ `partyRetentionUploadTime` |
| 党籍上传状态 | `party_retention_upload_status` | `partyRetentionUploadStatus` | ✅ `partyRetentionUploadStatus` | ✅ `partyRetentionUploadStatus` |
| 党籍文件OSS ID | `party_retention_file_oss_id` | `partyRetentionFileOssId` | `partyRetentionFileOssId` | ✅ `partyRetentionFileOssId` |
✅ = 本次修复补充的字段
---
**修复完成!请重启后端服务并刷新前端验证功能。**