Files
hzdyjs/✅修复完成-出国申请附件下载问题.md
T
2025-10-14 16:41:19 +08:00

8.3 KiB
Raw Blame History

✅ 修复完成 - 出国申请附件下载问题

📋 问题描述

现象:

  • ✅ 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

步骤:

  1. 查找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;
    
  2. 更新rs_overseas_application表

    -- 假设找到的oss_id是 1976886772986052610
    UPDATE rs_overseas_application 
    SET stamped_file_oss_id = 1976886772986052610
    WHERE application_id = 39 AND deleted = 0;
    
  3. 验证更新结果

    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中:

  1. 停止 ruoyi-admin 服务(点击红色方块 ⏹️)
  2. 启动 ruoyi-admin 服务(点击绿色三角 ▶️)
  3. 等待启动完成,确认端口8080正常监听

2. 刷新前端页面

在浏览器中:

  • macOS: Cmd + Shift + R
  • Windows: Ctrl + F5

🧪 测试验证

测试1:验证ID 39可以下载(数据库修复)

  1. 进入"出国申请管理" → "我的申请"
  2. 找到ID 39的申请记录
  3. 点击"查看详情"
  4. 点击下载盖章文件

预期结果:文件正常下载,不再提示"OSS ID不存在" ✅

测试2:验证新增申请流程(代码修复)

  1. 点击"新增"按钮

  2. 填写必填字段:

    • 政治面貌:选择任意
    • 出国开始日期:2025-11-01
    • 出国结束日期:2025-11-10
    • 紧急联系人:张三 13800138000
    • 目的国家:美国
  3. 上传盖章文件(不要先点击确定)

    • 选择PDF/JPG/PNG文件
    • 观察提示:"正在保存申请记录..."
    • 观察提示:"申请记录已保存,现在可以上传盖章文件了"
    • 观察提示:"盖章文件上传成功!"
  4. 点击"确定"提交申请

  5. 进入"我的申请",找到刚才新增的记录

  6. 点击"查看详情" → 下载盖章文件

预期结果:文件正常下载 ✅

测试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不存在" ❌ 正常下载 ✅
用户体验 需要手动分步操作 ❌ 自动流程处理 ✅

📝 相关文档

  1. 详细分析报告:出国申请附件下载问题分析与修复方案.md
  2. 操作指南:🚨立即操作-重启后端.md
  3. 数据库修复脚本:修复ID39的OSS_ID.sql

💡 技术要点

问题本质

el-upload组件的auto-upload模式下,文件选择后立即上传,此时表单可能还未保存,applicationId不存在。

解决思路

  1. 在上传前拦截:使用before-upload钩子
  2. 自动保存表单:如果没有ID,先调用新增接口
  3. 获取真实ID:从响应中提取applicationId
  4. 继续上传:使用真实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不存在"的错误提示
  • 用户体验流畅,自动保存申请记录

🔍 如果测试失败

调试步骤

  1. 检查后端日志

    • IDEA控制台查看错误信息
    • 确认uploadStampedFile接口是否被调用
    • 确认applicationId参数是否为0
  2. 检查前端Console

    // 添加调试日志
    console.log('当前applicationId:', state.applicationForm.applicationId);
    
  3. 检查Network请求

    • F12 → Network → 找到uploadStampedFile请求
    • 查看Payload中的applicationId值
    • 查看Response是否包含ossId
  4. 检查数据库

    SELECT * FROM rs_overseas_application 
    WHERE deleted = 0 
    ORDER BY application_id DESC 
    LIMIT 1;
    

修复完成时间:2025-10-11
问题优先级:🔴 高
修复状态:✅ 代码修复完成,待测试验证

下一步操作:

  1. ⏳ 执行数据库修复脚本
  2. ⏳ 重启后端服务
  3. ⏳ 刷新前端页面
  4. ⏳ 测试验证功能

请按照 🚨立即操作-重启后端.md 中的步骤进行测试! 🚀