Files
hzdyjs/✅问题已修复-请测试.md
T
2025-10-14 16:41:19 +08:00

7.8 KiB
Raw Blame History

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

📋 修复内容总结

🐛 原始问题

新增出国申请时上传盖章文件后,提示"文件OSS ID不存在",无法下载。

⚠️ 第一次修复后的新问题

修复后上传文件时提示:

  • ❌ "登记备案责任单位联系人不能为空"
  • ❌ "保存申请记录失败,请先手动保存"

✅ 最终修复方案

已在上传文件前添加完整的字段映射逻辑,包括:

  1. 日期格式转换 - startDate、endDate、birthDate等
  2. 目的国家映射 - destinationCountry → destination
  3. 身份证号处理 - documentNumber → idNumber
  4. 户籍所在地 - 使用部门名称填充
  5. 行程安排 - 自动生成默认内容
  6. 出国天数 - 默认最少1天
  7. 人员类别代码 - 根据政治面貌判断
  8. 🔴 登记备案责任单位联系人 - 使用申请人姓名(最关键!)
  9. 预算字段 - 设置默认值0

🚀 操作步骤(3步)

第1步:修复ID 39的数据库记录

执行以下SQL查询,找到对应的OSS文件:

SELECT oss_id, file_name, original_name, 
       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%')
ORDER BY create_time DESC LIMIT 20;

然后更新ID 39的记录(替换下面的oss_id值):

UPDATE rs_overseas_application 
SET stamped_file_oss_id = [从上面查询到的oss_id]
WHERE application_id = 39 AND deleted = 0;

-- 验证更新结果
SELECT application_id, applicant_name, stamped_file_oss_id
FROM rs_overseas_application
WHERE application_id = 39;

第2步:重启后端

在IDEA中:

  1. 停止 ruoyi-admin(点击 ⏹️)
  2. 启动 ruoyi-admin(点击 ▶️)
  3. 等待启动完成(看到"Started RuoYiApplication"日志)

第3步:刷新前端

在浏览器中:

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

🧪 测试验证

✅ 测试1:修复已有记录(ID 39)

  1. 进入"出国申请管理" → "我的申请"
  2. 找到ID 39的记录
  3. 点击"查看详情"
  4. 点击下载盖章文件
  5. 预期结果:文件正常下载 ✅

✅ 测试2:新增申请并上传(完整流程)

步骤1:新增申请

进入"出国申请管理" → "出国申请"标签页 → 点击"新增"

步骤2:填写必填字段

填写以下最少字段即可测试:

字段 填写示例
政治面貌 中共党员(或其他)
出国开始日期 选择任意未来日期
出国结束日期 选择任意未来日期
应急联系人及电话 张三 13800138000
目的地国家 美国

💡 提示:其他字段可以留空,系统会自动填充默认值

步骤3:上传盖章文件

  1. 不要先点"确定"按钮,直接点击"上传盖章文件"
  2. 选择文件(支持PDF、JPG、PNG格式)
  3. 观察系统提示:
    • ℹ️ "正在保存申请记录..."
    • ✅ "申请记录已保存,现在可以上传盖章文件了"
    • ✅ "盖章文件上传成功!"

步骤4:提交申请

点击"确定"按钮完成提交

步骤5:验证下载

  1. 进入"我的申请"标签页
  2. 找到刚才新增的记录
  3. 点击"查看详情"
  4. 点击下载盖章文件
  5. 预期结果:文件正常下载 ✅

🔍 数据库验证

执行以下SQL检查新增的记录:

SELECT 
    application_id,
    applicant_name,
    destination,
    stamped_file_oss_id,
    unit_contact,
    CASE 
        WHEN stamped_file_oss_id IS NOT NULL THEN '✅ 有附件' 
        ELSE '❌ 无附件' 
    END AS attachment_status,
    DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS create_time
FROM rs_overseas_application
WHERE deleted = 0
ORDER BY application_id DESC 
LIMIT 5;

预期结果:

  • stamped_file_oss_id 字段不为NULL ✅
  • unit_contact 字段有值(申请人姓名)✅

🐛 问题排查

问题1:上传时提示"登记备案责任单位联系人不能为空"

原因:前端代码未更新

解决:

  1. 确认已刷新页面(Cmd+Shift+R)
  2. 清除浏览器缓存
  3. 重新登录系统

问题2:上传时没有提示"正在保存申请记录..."

原因:浏览器缓存了旧代码

解决:

  1. 按 F12 打开开发者工具
  2. 右键点击浏览器刷新按钮
  3. 选择"清空缓存并硬性重新加载"
  4. 或者使用无痕模式测试

问题3:后端返回404或500错误

原因:后端未更新或启动失败

解决:

  1. 查看IDEA控制台日志
  2. 确认后端已成功启动
  3. 检查是否有编译错误
  4. 重新编译并启动

问题4:OSS_ID仍然为NULL

原因:上传接口调用失败

解决:

  1. 按 F12 打开开发者工具
  2. 切换到 Network 标签
  3. 重新上传文件
  4. 查看 uploadStampedFile 请求:
    • 检查请求参数中的applicationId是否有值
    • 检查响应状态码是否为200
    • 查看响应内容是否有错误信息

📊 代码修改说明

后端修改(1处)

文件:RsOverseasApplicationController.java

// 修改add方法返回类型,返回新创建的applicationId
public R<Map<String, Object>> add(...) {
    boolean result = applicationService.insertByBo(bo);
    if (result) {
        Map<String, Object> data = new HashMap<>();
        data.put("applicationId", bo.getApplicationId());
        return R.ok("操作成功", data);
    }
    return R.fail("新增失败");
}

前端修改(3处)

文件:web/src/views/rs/overseas/index.vue

  1. 导入dayjs(第1217行)
import dayjs from 'dayjs';
  1. 修改beforeStampedFileUpload函数(第2600-2708行)

    • 添加完整的字段映射逻辑
    • 包括日期转换、必填字段填充等
    • 最重要:处理unitContact字段
  2. 修改beforePartyRetentionFileUpload函数(第2921-3029行)

    • 同样的字段映射逻辑
    • 确保党籍保留附件上传时也能正常保存

🎯 核心修复点

问题根源

// ❌ 错误:直接调用API,缺少必填字段
const response = await addOverseasApplication(state.applicationForm);

修复方案

// ✅ 正确:上传前先进行字段映射
// 1. 日期格式转换
if (state.applicationForm.startDate) {
  state.applicationForm.startDate = dayjs(state.applicationForm.startDate).format('YYYY-MM-DD');
}

// 2. 目的国家映射
if (state.applicationForm.destinationCountry) {
  state.applicationForm.destination = state.applicationForm.destinationCountry;
}

// 3. 🔴 最关键:填充后端必填字段
if (!state.applicationForm.unitContact) {
  state.applicationForm.unitContact = state.applicationForm.applicantName;
}

// 4. 其他必填字段处理...

// 5. 然后再调用API
const response = await addOverseasApplication(state.applicationForm);

📝 相关文档

  • 问题分析:出国申请附件下载问题分析与修复方案.md
  • 数据库脚本:修复ID39的OSS_ID.sql
  • 快速指南:README-修复说明.md

✅ 修复验证清单

  • 后端代码已修改(返回applicationId)
  • 前端代码已修改(字段映射)
  • 导入dayjs库
  • 盖章文件上传修复
  • 党籍保留附件上传修复
  • 待执行:修复ID 39的数据库
  • 待执行:重启后端服务
  • 待执行:刷新前端页面
  • 待测试:ID 39文件下载
  • 待测试:新增申请文件上传下载

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

现在请按照上面的3个步骤操作,然后进行测试验证! 🚀