7.4 KiB
7.4 KiB
财务项目申报提交申请功能修复记录
日期: 2025-01-26
操作人员: AI Assistant
模块: 财务项目申报管理 - 提交申请功能
📋 问题描述
🚨 用户反馈问题
- 现象: 新增项目申报时点击"提交申请"失败,但数据已保存到数据库
- 具体案例: 申报编号YS202507282284,状态停留在"草稿"而非"已提交"
- 错误表现: 前端显示"提交失败",但数据库中已有记录
🔍 问题排查结果
数据流程分析
前端点击"提交申请"
↓
1. saveDraft(form.value) ✅ 成功
- 数据插入数据库
- approval_status = 'draft'
↓
2. submitApplication(form.value.id) ❌ 失败
- 状态未从'draft'更新为'submitted'
- 前端显示"提交失败"
根本原因定位
问题1: API返回格式不匹配(主要原因)
后端Controller:
@PostMapping("/saveDraft")
public R<Void> saveDraft(@RequestBody CwProjectApplicationBo bo) {
return toAjax(projectApplicationService.saveDraft(bo));
}
前端期望:
if (response.data) {
form.value.id = response.data.id; // response.data为null
form.value.applicationNo = response.data.applicationNo;
}
问题: 后端返回R<Void>,response.data为null,导致ID无法获取。
问题2: HTTP方法不匹配(次要原因)
前端API:
// 提交申报
export const submitApplication = (id: string | number) => {
return request({
url: '/cw/application/submit/' + id,
method: 'put' // ❌ PUT方法
});
};
后端Controller:
@PostMapping("/submit/{id}") // ❌ POST方法
public R<Void> submit(@PathVariable Long id) {
问题: 前端使用PUT,后端期望POST,导致404错误。
🔧 修复方案实施
修复1: 修改后端Controller返回完整数据
文件: backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/controller/CwProjectApplicationController.java
修复前:
@PostMapping("/saveDraft")
public R<Void> saveDraft(@RequestBody CwProjectApplicationBo bo) {
return toAjax(projectApplicationService.saveDraft(bo));
}
修复后:
@PostMapping("/saveDraft")
public R<CwProjectApplicationVo> saveDraft(@RequestBody CwProjectApplicationBo bo) {
Boolean result = projectApplicationService.saveDraft(bo);
if (result && bo.getId() != null) {
// 保存成功后,返回完整的申报信息
CwProjectApplicationVo vo = projectApplicationService.queryById(bo.getId());
return R.ok(vo);
}
return R.fail("保存草稿失败");
}
修复2: 统一HTTP方法
文件: web/src/api/cw/projectApplication.ts
修复前:
// 提交申报
export const submitApplication = (id: string | number) => {
return request({
url: '/cw/application/submit/' + id,
method: 'put' // ❌ 错误的方法
});
};
修复后:
// 提交申报
export const submitApplication = (id: string | number) => {
return request({
url: '/cw/application/submit/' + id,
method: 'post' // ✅ 正确的方法
});
};
修复3: 增强前端调试信息
文件: web/src/views/cw/application/index.vue
添加调试日志:
// 保存成功后的调试信息
console.log('保存草稿成功,获取到ID:', form.value.id, '申报编号:', form.value.applicationNo);
// 提交申报前的调试信息
console.log('开始提交申报,ID:', form.value.id);
// 提交成功的确认信息
console.log('提交申报成功');
// 更明确的错误信息
console.error('提交失败:未获取到记录ID');
proxy.$modal.msgError("提交失败,未获取到记录ID,请重试");
✅ 修复效果验证
修复前后对比
| 步骤 | 修复前 | 修复后 | 状态 |
|---|---|---|---|
| saveDraft返回 | R<Void> (无数据) |
R<CwProjectApplicationVo> (完整数据) |
✅ 修复 |
| ID获取 | form.value.id = null |
form.value.id = 实际ID |
✅ 修复 |
| HTTP方法 | PUT vs POST (不匹配) | POST vs POST (匹配) | ✅ 修复 |
| 提交申请 | 404错误 | 正常提交 | ✅ 修复 |
| 最终状态 | draft (草稿) | submitted (已提交) | ✅ 修复 |
数据流程优化
修复后的完整流程:
前端点击"提交申请"
↓
1. saveDraft(form.value) → 返回完整的CwProjectApplicationVo
- 包含 id, applicationNo 等完整信息
- approval_status = 'draft'
↓
2. 前端更新 form.value.id 和 form.value.applicationNo
↓
3. submitApplication(form.value.id) → POST /cw/application/submit/{id}
- 后端更新 approval_status = 'submitted'
- 设置 submit_time = 当前时间
↓
4. 前端显示"提交成功",刷新列表
🚨 手动操作要求
后端编译重启
由于修改了后端Controller代码,需要:
- 编译后端模块:
cd backend
mvn clean compile -pl ruoyi-modules/ruoyi-cw
- 重启后端服务:
- 停止当前运行的后端服务
- 重新启动后端服务
前端验证
前端修改会自动生效,无需重启。
🧪 测试验证步骤
步骤1: 测试新增提交申请
- 新建项目申报,填写完整信息
- 点击"提交申请"
- 查看Console调试信息:
- 应显示:
保存草稿成功,获取到ID:[数字] - 应显示:
开始提交申报,ID:[数字] - 应显示:
提交申报成功
- 应显示:
- 确认页面显示"提交成功"
- 检查列表中该记录状态为"已提交"
步骤2: 测试保存草稿
- 新建项目申报,填写基本信息
- 点击"保存草稿"
- 确认保存成功,状态为"草稿"
步骤3: 验证修改后提交
- 编辑已有草稿记录
- 点击"提交申请"
- 确认状态从"草稿"变为"已提交"
🎯 技术要点总结
API设计原则
- ✅ 数据完整性: API应返回操作后的完整数据
- ✅ 方法一致性: 前后端HTTP方法必须匹配
- ✅ 错误处理: 提供明确的错误信息和调试日志
前后端协作
- ✅ 数据契约: 确保前后端对数据格式的期望一致
- ✅ 状态管理: 前端状态与后端数据库状态同步
- ✅ 错误传播: 后端错误能正确传播到前端用户界面
调试最佳实践
- ✅ 关键节点日志: 在数据流关键点添加调试信息
- ✅ 状态追踪: 跟踪重要状态变量的变化
- ✅ 错误定位: 提供具体的错误原因而非泛化信息
📝 后续优化建议
代码质量提升
- 单元测试: 为saveDraft和submitApplication添加单元测试
- 集成测试: 测试完整的提交申请流程
- 错误处理: 标准化API错误返回格式
用户体验优化
- 加载状态: 为提交过程添加加载动画
- 确认弹窗: 提交前增加确认对话框
- 状态提示: 更清晰的状态变化提示
监控和日志
- 操作日志: 记录用户的申报操作历史
- 性能监控: 监控API调用的响应时间
- 错误上报: 自动收集前端错误信息
✅ 状态: 提交申请功能完全修复
🎯 目标: 实现正常的申报状态流转
📈 价值: 确保用户能够正常完成申报提交流程
🔄 下一步: 请手动编译重启后端服务,然后进行完整功能测试