8.3 KiB
✅ 修复完成 - 出国申请附件下载问题
📋 问题描述
现象:
- ✅ ID 37 的申请可以正常下载盖章附件
- ❌ ID 39 的申请点击下载提示"文件OSS ID不存在"
- ❌ 新增申请上传的附件都无法下载
根本原因:
- 新增申请时,
applicationId为undefined - 前端上传时传递
applicationId=0给后端 - 后端无法找到
applicationId=0的记录更新OSS_ID - 导致数据库中
stamped_file_oss_id字段为NULL
✅ 修复内容
1. 后端修改
文件:backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsOverseasApplicationController.java
修改点:将add方法的返回类型从R<Void>改为R<Map<String, Object>>,返回新创建的applicationId
@PostMapping
public R<Map<String, Object>> add(@Validated(AddGroup.class) @RequestBody RsOverseasApplicationBo bo) {
// ... 现有逻辑 ...
boolean result = applicationService.insertByBo(bo);
if (result) {
// 🔴 返回新创建的applicationId,供前端上传文件时使用
Map<String, Object> data = new HashMap<>();
data.put("applicationId", bo.getApplicationId());
return R.ok("操作成功", data);
} else {
return R.fail("新增失败");
}
}
2. 前端修改
文件:web/src/views/rs/overseas/index.vue
修改点1:修改beforeStampedFileUpload方法,上传前自动保存申请记录
const beforeStampedFileUpload = async (file: File) => {
// 检查文件格式和大小...
// 🔴 关键修复:如果是新增模式(没有applicationId),先保存申请记录
if (!state.applicationForm.applicationId) {
try {
ElMessage.info('正在保存申请记录...');
// 执行日期格式转换...
// 保存申请记录(草稿状态)
const response = await addOverseasApplication(state.applicationForm);
// 🔴 重要:从响应中获取新创建的applicationId
if (response.data && response.data.applicationId) {
state.applicationForm.applicationId = response.data.applicationId;
ElMessage.success('申请记录已保存,现在可以上传盖章文件了');
} else {
ElMessage.error('保存申请记录失败,无法获取申请ID');
return false;
}
return true;
} catch (error) {
console.error('保存申请记录失败:', error);
ElMessage.error('保存申请记录失败,请先手动保存');
return false;
}
}
return true;
};
修改点2:修改beforePartyRetentionFileUpload方法(党籍保留附件上传前验证)
采用相同的修复逻辑,确保党籍保留附件上传时也能正确关联。
🔧 数据库修复
修复ID 39的记录
SQL脚本:修复ID39的OSS_ID.sql
步骤:
-
查找ID 39对应的OSS文件
SELECT oss_id, file_name, original_name, url, DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS create_time FROM sys_oss WHERE DATE(create_time) >= CURDATE() - INTERVAL 2 DAY AND (original_name LIKE '%pdf%' OR original_name LIKE '%jpg%' OR original_name LIKE '%png%') ORDER BY create_time DESC LIMIT 20; -
更新rs_overseas_application表
-- 假设找到的oss_id是 1976886772986052610 UPDATE rs_overseas_application SET stamped_file_oss_id = 1976886772986052610 WHERE application_id = 39 AND deleted = 0; -
验证更新结果
SELECT application_id, applicant_name, stamped_file_oss_id, CASE WHEN stamped_file_oss_id IS NOT NULL THEN '✅ 已修复' ELSE '❌ 仍然为NULL' END AS status FROM rs_overseas_application WHERE application_id = 39 AND deleted = 0;
🚀 部署步骤
1. 重启后端服务
在IDEA中:
- 停止
ruoyi-admin服务(点击红色方块 ⏹️) - 启动
ruoyi-admin服务(点击绿色三角 ▶️) - 等待启动完成,确认端口8080正常监听
2. 刷新前端页面
在浏览器中:
- macOS:
Cmd + Shift + R - Windows:
Ctrl + F5
🧪 测试验证
测试1:验证ID 39可以下载(数据库修复)
- 进入"出国申请管理" → "我的申请"
- 找到ID 39的申请记录
- 点击"查看详情"
- 点击下载盖章文件
预期结果:文件正常下载,不再提示"OSS ID不存在" ✅
测试2:验证新增申请流程(代码修复)
-
点击"新增"按钮
-
填写必填字段:
- 政治面貌:选择任意
- 出国开始日期:2025-11-01
- 出国结束日期:2025-11-10
- 紧急联系人:张三 13800138000
- 目的国家:美国
-
上传盖章文件(不要先点击确定)
- 选择PDF/JPG/PNG文件
- 观察提示:"正在保存申请记录..."
- 观察提示:"申请记录已保存,现在可以上传盖章文件了"
- 观察提示:"盖章文件上传成功!"
-
点击"确定"提交申请
-
进入"我的申请",找到刚才新增的记录
-
点击"查看详情" → 下载盖章文件
预期结果:文件正常下载 ✅
测试3:验证数据库
-- 查询最新申请记录
SELECT
application_id AS '申请ID',
applicant_name AS '申请人',
stamped_registration_file_name AS '盖章文件名',
stamped_file_oss_id AS 'OSS_ID',
CASE
WHEN stamped_file_oss_id IS NOT NULL THEN '✅ 正常'
ELSE '❌ OSS_ID为NULL'
END AS '状态'
FROM rs_overseas_application
WHERE deleted = 0
ORDER BY application_id DESC
LIMIT 5;
预期结果:新增的记录中,OSS_ID列不为NULL ✅
📊 修复效果对比
| 场景 | 修复前 | 修复后 |
|---|---|---|
| 新增申请上传文件 | applicationId=0 ❌ | 自动保存获得真实ID ✅ |
| 数据库OSS_ID字段 | NULL ❌ | 正确保存 ✅ |
| 下载功能 | 提示"OSS ID不存在" ❌ | 正常下载 ✅ |
| 用户体验 | 需要手动分步操作 ❌ | 自动流程处理 ✅ |
📝 相关文档
- 详细分析报告:
出国申请附件下载问题分析与修复方案.md - 操作指南:
🚨立即操作-重启后端.md - 数据库修复脚本:
修复ID39的OSS_ID.sql
💡 技术要点
问题本质
el-upload组件的auto-upload模式下,文件选择后立即上传,此时表单可能还未保存,applicationId不存在。
解决思路
- 在上传前拦截:使用
before-upload钩子 - 自动保存表单:如果没有ID,先调用新增接口
- 获取真实ID:从响应中提取
applicationId - 继续上传:使用真实ID作为参数
关键代码
// before-upload返回Promise<boolean>
const beforeStampedFileUpload = async (file: File) => {
if (!state.applicationForm.applicationId) {
const response = await addOverseasApplication(state.applicationForm);
state.applicationForm.applicationId = response.data.applicationId;
}
return true;
};
✅ 验收标准
- ID 39的申请可以正常下载附件
- 新增申请上传文件后,数据库
stamped_file_oss_id字段正确保存 - 新增申请的附件可以正常下载
- 不再出现"文件OSS ID不存在"的错误提示
- 用户体验流畅,自动保存申请记录
🔍 如果测试失败
调试步骤
-
检查后端日志
- IDEA控制台查看错误信息
- 确认
uploadStampedFile接口是否被调用 - 确认
applicationId参数是否为0
-
检查前端Console
// 添加调试日志 console.log('当前applicationId:', state.applicationForm.applicationId); -
检查Network请求
- F12 → Network → 找到
uploadStampedFile请求 - 查看Payload中的
applicationId值 - 查看Response是否包含
ossId
- F12 → Network → 找到
-
检查数据库
SELECT * FROM rs_overseas_application WHERE deleted = 0 ORDER BY application_id DESC LIMIT 1;
修复完成时间:2025-10-11
问题优先级:🔴 高
修复状态:✅ 代码修复完成,待测试验证
下一步操作:
- ⏳ 执行数据库修复脚本
- ⏳ 重启后端服务
- ⏳ 刷新前端页面
- ⏳ 测试验证功能
请按照 🚨立即操作-重启后端.md 中的步骤进行测试! 🚀