9.2 KiB
9.2 KiB
【紧急修复】出国申请OSS ID数据库问题
🔴 问题确认
现象:重启后端后,仍然提示"文件OSS ID不存在,无法下载"
根本原因:
数据库中的
stamped_file_oss_id和party_retention_file_oss_id字段本身就是NULL!
🔍 问题诊断
已完成的修复(正确)
| 修复项 | 状态 | 说明 |
|---|---|---|
| 后端VO字段 | ✅ | RsOverseasApplicationVo.java |
| Mapper XML | ✅ | RsOverseasApplicationMapper.xml |
| 前端接口 | ✅ | overseas.ts |
| 前端下载功能 | ✅ | index.vue |
| 调试日志 | ✅ | 输出OSS ID字段 |
新发现的问题
❌ 数据库中OSS ID字段为NULL
可能原因:
- 文件上传时没有保存OSS ID - 上传接口没有正确保存OSS ID到数据库
- sys_oss表有记录,但rs_overseas_application表没有关联 - 上传成功但没有更新关联
- 文件根本没有上传到OSS系统 - 只保存了文件名,没有实际上传
🚀 立即执行的排查步骤
Step 1: 检查数据库当前状态
请在数据库中执行以下SQL(我已经创建了 检查并修复出国申请OSS_ID.sql 文件):
-- 检查出国申请表中的OSS ID状态
SELECT
application_id AS '申请ID',
applicant_name AS '申请人',
stamped_registration_file_name AS '盖章文件名',
stamped_file_upload_status AS '上传状态',
stamped_file_oss_id AS '盖章OSS_ID',
party_retention_file_name AS '党籍文件名',
party_retention_upload_status AS '党籍上传状态',
party_retention_file_oss_id AS '党籍OSS_ID',
CASE
WHEN stamped_file_upload_status = '1' AND stamped_file_oss_id IS NULL THEN '❌ 需要修复'
WHEN stamped_file_upload_status = '1' AND stamped_file_oss_id IS NOT NULL THEN '✅ 正常'
ELSE '未上传'
END AS '盖章文件状态',
CASE
WHEN party_retention_upload_status = '1' AND party_retention_file_oss_id IS NULL THEN '❌ 需要修复'
WHEN party_retention_upload_status = '1' AND party_retention_file_oss_id IS NOT NULL THEN '✅ 正常'
ELSE '未上传'
END AS '党籍文件状态'
FROM rs_overseas_application
WHERE deleted = 0
ORDER BY create_time DESC
LIMIT 20;
期望结果分析:
| 情况 | 盖章OSS_ID | 上传状态 | 诊断 |
|---|---|---|---|
| ✅ 正常 | 1933084077... | 1 | 数据正常,前端应该能下载 |
| ❌ 问题1 | NULL | 1 | 已上传但OSS ID丢失 → 执行Step 2 |
| ❌ 问题2 | NULL | 0 | 未上传 → 需要重新上传 |
Step 2: 检查sys_oss表中是否有对应文件
-- 检查OSS文件表
SELECT
o.oss_id,
o.file_name,
o.original_name,
o.file_suffix,
o.url,
o.create_time,
o.create_by
FROM sys_oss o
WHERE o.file_name LIKE '%出国%'
OR o.file_name LIKE '%登记表%'
OR o.file_name LIKE '%党籍%'
OR o.original_name LIKE '%出国%'
OR o.original_name LIKE '%登记表%'
OR o.original_name LIKE '%党籍%'
ORDER BY o.create_time DESC
LIMIT 20;
期望结果分析:
| 情况 | sys_oss记录 | 诊断 | 解决方案 |
|---|---|---|---|
| ✅ 有记录 | 找到匹配的文件 | 文件已上传,需要关联 | 执行Step 3修复SQL |
| ❌ 无记录 | 没有找到文件 | 文件未上传或已删除 | 需要重新上传文件 |
Step 3: 修复OSS ID关联(如果Step 2找到了文件)
⚠️ 重要:只有在Step 2中确认sys_oss表有对应文件记录后,才执行这个SQL!
-- 修复盖章文件的OSS ID
UPDATE rs_overseas_application oa
SET oa.stamped_file_oss_id = (
SELECT o.oss_id
FROM sys_oss o
WHERE o.file_name = oa.stamped_registration_file_name
OR o.original_name = oa.stamped_registration_file_name
ORDER BY o.create_time DESC
LIMIT 1
)
WHERE oa.stamped_file_upload_status = '1'
AND oa.stamped_file_oss_id IS NULL
AND oa.deleted = 0;
-- 修复党籍保留文件的OSS ID
UPDATE rs_overseas_application oa
SET oa.party_retention_file_oss_id = (
SELECT o.oss_id
FROM sys_oss o
WHERE o.file_name = oa.party_retention_file_name
OR o.original_name = oa.party_retention_file_name
ORDER BY o.create_time DESC
LIMIT 1
)
WHERE oa.party_retention_upload_status = '1'
AND oa.party_retention_file_oss_id IS NULL
AND oa.deleted = 0;
Step 4: 验证修复结果
-- 验证修复后的状态
SELECT
application_id AS '申请ID',
applicant_name AS '申请人',
stamped_registration_file_name AS '盖章文件名',
stamped_file_oss_id AS '盖章OSS_ID',
party_retention_file_name AS '党籍文件名',
party_retention_file_oss_id AS '党籍OSS_ID',
CASE
WHEN stamped_file_upload_status = '1' AND stamped_file_oss_id IS NOT NULL THEN '✅'
WHEN stamped_file_upload_status = '1' AND stamped_file_oss_id IS NULL THEN '❌'
ELSE '-'
END AS '盖章状态',
CASE
WHEN party_retention_upload_status = '1' AND party_retention_file_oss_id IS NOT NULL THEN '✅'
WHEN party_retention_upload_status = '1' AND party_retention_file_oss_id IS NULL THEN '❌'
ELSE '-'
END AS '党籍状态'
FROM rs_overseas_application
WHERE deleted = 0
AND (stamped_file_upload_status = '1' OR party_retention_upload_status = '1')
ORDER BY create_time DESC;
期望结果:
- ✅ 盖章状态:✅
- ✅ 党籍状态:✅(如果是党员且已上传)
Step 5: 刷新浏览器并测试
如果Step 4验证成功:
- 硬刷新浏览器:
Ctrl+Shift+R(Windows) 或Cmd+Shift+R(Mac) - 打开开发者工具:
F12→ Console - 查看详情:点击"查看详情"按钮
- 检查控制台:应该看到OSS ID有数字值
📊 控制台日志验证
修复前(当前状态)
🔍 [盖章文件] 检查盖章文件字段:
- stampedFileUploadStatus: "1"
- stampedRegistrationFileName: "出国登记表-盖章.pdf"
- stampedFileOssId: null ← ❌ 这里是null!
- stampedFileUploadTime: "2025-10-11 11:47:03"
修复后(期望状态)
🔍 [盖章文件] 检查盖章文件字段:
- stampedFileUploadStatus: "1"
- stampedRegistrationFileName: "出国登记表-盖章.pdf"
- stampedFileOssId: 1933084077469929470 ← ✅ 有数字了!
- stampedFileUploadTime: "2025-10-11 11:47:03"
🔧 如果sys_oss表中没有文件记录
诊断:文件根本没有上传成功
可能原因:
- 上传接口有问题 - 文件没有保存到OSS
- 文件被删除了 - sys_oss记录已删除
- 上传状态误标记 - 实际没上传但标记为已上传
解决方案:重新上传文件
方式1:通过前端重新上传
- 编辑出国申请
- 重新上传盖章文件和党籍保留附件
- 保存申请
方式2:检查上传接口逻辑
需要检查以下代码:
- 上传接口是否正确保存OSS ID
- 是否有事务回滚导致OSS ID丢失
- 上传成功后是否正确更新数据库
🎯 根本原因分析
问题链路
1. 文件上传
↓
2. sys_oss表创建记录(oss_id自动生成)
↓
3. 【❌ 问题所在】上传接口没有保存oss_id到rs_overseas_application表
↓
4. stamped_file_oss_id字段为NULL
↓
5. 前端下载时提示"文件OSS ID不存在"
需要检查的上传接口
后端文件:
RsOverseasApplicationController.java- 上传接口RsOverseasApplicationServiceImpl.java- 上传逻辑- 检查上传文件时是否正确保存了
stampedFileOssId和partyRetentionFileOssId
关键点:
// 上传文件后,需要保存OSS ID
if (ossFile != null) {
application.setStampedFileOssId(ossFile.getOssId()); // ← 检查是否有这行
application.setStampedFileUploadStatus("1");
application.setStampedFileUploadTime(new Date());
}
📝 执行清单
请按以下顺序执行:
- Step 1:执行第一个SQL,检查当前数据状态
- Step 2:执行第二个SQL,检查sys_oss表
- 判断:
- 如果sys_oss有记录 → 执行Step 3修复SQL
- 如果sys_oss无记录 → 需要重新上传文件或检查上传接口
- Step 4:执行验证SQL,确认修复成功
- Step 5:刷新浏览器并测试下载功能
💡 临时解决方案
如果现在需要立即让某个申请的下载功能工作:
-- 假设申请ID是123456,盖章文件的OSS ID是987654321
UPDATE rs_overseas_application
SET stamped_file_oss_id = 987654321
WHERE application_id = 123456;
⚠️ 注意:
- 需要先从sys_oss表中找到正确的oss_id
- 确保oss_id对应的是正确的文件
- 这只是临时修复,需要排查上传接口的问题
📞 反馈信息
请执行Step 1的SQL后,告诉我:
- 盖章OSS_ID列的值:是NULL还是有数字?
- 上传状态列的值:是"1"还是"0"?
- 盖章文件状态列的值:是"❌ 需要修复"还是"✅ 正常"?
根据这些信息,我可以给出更精确的修复方案。
诊断时间:2025-10-11
问题类型:数据库OSS ID字段为NULL
排查文件:检查并修复出国申请OSS_ID.sql
预计修复时间:5-10分钟(如果sys_oss有记录)