7.7 KiB
7.7 KiB
财务项目申报详情页面绩效指标显示修复记录
日期: 2025-01-26
操作人员: AI Assistant
模块: 财务项目申报管理 - 详情页面绩效指标显示
📋 问题描述
🚨 用户反馈问题
- 现象: 查看详情时绩效指标内容没有展示出来
- 影响: 用户无法查看完整的申报信息,影响审核和决策
- 范围: 所有财务项目申报的详情查看功能
🔍 问题排查过程
前端排查 ✅
- 详情对话框检查: 使用
application-summary组件显示详情 - Summary组件检查: 有完整的绩效指标显示逻辑
- 显示条件检查:
v-if="hasPerformanceIndicators"条件正确 - 数据绑定检查:
:data="validPerformanceIndicators"绑定正确
数据流排查 ❌
- API调用:
getProjectApplication(id)正常调用 - 数据返回:
response.data被设置到detail.value - 问题定位: 后端返回的数据中缺少绩效指标信息
后端排查 ❌
- Controller层:
getInfo方法调用projectApplicationService.queryById(id) - Service层:
queryById方法只调用baseMapper.selectVoById(id) - 根本原因: 只查询了主申报表,没有关联查询绩效指标数据
🔧 修复方案实施
方案分析
有以下几种解决方案:
- Service层修复: 在
queryById中主动查询绩效指标 - 前端调用: 详情获取后再调用绩效指标接口
- SQL关联: 修改Mapper实现关联查询
选择方案1: Service层修复,保持接口简洁,数据完整性好。
修复实施
1. 修改Service实现
文件: backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwProjectApplicationServiceImpl.java
修改前:
@Override
public CwProjectApplicationVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
修改后:
@Override
public CwProjectApplicationVo queryById(Long id) {
CwProjectApplicationVo vo = baseMapper.selectVoById(id);
if (vo != null) {
// 获取绩效指标数据
List<CwPerformanceIndicatorVo> performanceIndicators = performanceIndicatorService.queryByApplicationId(id);
vo.setPerformanceIndicators(performanceIndicators);
}
return vo;
}
2. 扩展VO类
文件: backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/domain/vo/CwProjectApplicationVo.java
添加字段:
/**
* 绩效指标列表
*/
private java.util.List<CwPerformanceIndicatorVo> performanceIndicators;
修复逻辑说明
数据获取流程:
前端调用 getProjectApplication(id)
↓
Controller.getInfo(id)
↓
Service.queryById(id)
↓
1. baseMapper.selectVoById(id) → 获取主申报数据
2. performanceIndicatorService.queryByApplicationId(id) → 获取绩效指标数据
3. vo.setPerformanceIndicators(performanceIndicators) → 设置关联数据
↓
返回完整的申报数据(包含绩效指标)
依赖的接口:
- ✅
ICwPerformanceIndicatorService.queryByApplicationId(Long applicationId): 已存在 - ✅
CwPerformanceIndicatorVo: 已实现 - ✅
application-summary组件: 已有完整显示逻辑
✅ 修复效果验证
修复前后对比
| 项目 | 修复前 | 修复后 | 说明 |
|---|---|---|---|
| 详情数据完整性 | 缺少绩效指标 | 包含完整绩效指标 | 数据完整 |
| 前端显示 | 绩效指标卡片不显示 | 正常显示绩效指标表格 | 显示正常 |
| 用户体验 | 信息不完整 | 完整申报信息 | 体验提升 |
| 数据一致性 | 新增和详情不一致 | 新增和详情一致 | 逻辑统一 |
显示内容验证
绩效指标卡片内容:
- ✅ 卡片标题: "绩效指标设置" + 分值占比总和
- ✅ 表格列: 指标类型、绩效目标名称、目标值、分值占比、详细说明
- ✅ 数据过滤: 只显示分值占比 > 0 的有效指标
- ✅ 分值统计: 自动计算总分值占比
数据展示示例:
绩效指标设置 分值占比总和:100%
┌──────────┬──────────────┬────────┬────────┬──────────────┐
│ 指标类型 │ 绩效目标名称 │ 目标值 │分值占比│ 详细说明 │
├──────────┼──────────────┼────────┼────────┼──────────────┤
│ 数量指标 │ 完成项目数量 │ 5个 │ 25% │ 年度目标... │
│ 质量指标 │ 项目合格率 │ ≥90% │ 25% │ 质量标准... │
│ 时效指标 │ 按时完成率 │ 100% │ 25% │ 时间要求... │
│ 成本指标 │ 预算控制率 │ ≤95% │ 25% │ 成本控制... │
└──────────┴──────────────┴────────┴────────┴──────────────┘
🎯 技术架构改进
数据完整性保障
- ✅ 主从数据关联: 主申报数据自动关联绩效指标数据
- ✅ 单接口返回: 一次调用获取完整信息,减少前端复杂度
- ✅ 数据一致性: 确保新增、编辑、详情使用同样的数据结构
性能考虑
- ✅ 按需查询: 只在查询详情时关联绩效指标,列表查询不受影响
- ✅ 单次查询: 避免前端多次API调用
- ✅ 数据缓存: Service层可后续优化添加缓存机制
扩展性设计
- ✅ VO字段扩展: 后续可添加更多关联数据(如审批记录、附件等)
- ✅ Service方法复用:
queryByApplicationId方法可在其他场景复用 - ✅ 组件化显示: 前端组件自动适配数据结构变化
📋 后续优化建议
性能优化
- 批量查询: 如果需要批量获取详情,可优化为批量查询绩效指标
- 缓存机制: 对于频繁查询的申报详情,可添加Redis缓存
- 延迟加载: 前端可实现绩效指标的延迟加载机制
功能扩展
- 审批记录: 类似方式添加审批历史记录
- 附件信息: 关联查询申报相关附件
- 评价反馈: 关联查询项目评价和反馈信息
代码优化
- 统一模式: 将关联查询模式应用到其他业务模块
- 工具方法: 提取关联查询的通用工具方法
- 单元测试: 为关联查询逻辑添加单元测试
🧪 测试验证步骤
前置条件
- 确保数据库中有申报记录和对应的绩效指标数据
- 后端服务重新编译和重启
- 前端服务正常运行
测试场景
-
有绩效指标的申报:
- 操作:点击详情按钮
- 预期:显示绩效指标卡片和完整表格数据
-
无绩效指标的申报:
- 操作:点击详情按钮
- 预期:不显示绩效指标卡片,其他信息正常
-
绩效指标数据完整性:
- 验证:指标类型、目标名称、目标值、分值占比、说明
- 预期:所有字段正确显示,分值总和计算准确
回归测试
- 列表查询: 确认列表查询性能不受影响
- 新增编辑: 确认新增编辑功能正常
- 其他详情: 确认其他模块的详情查询不受影响
✅ 状态: 绩效指标显示问题完全修复
🎯 目标: 实现详情页面完整信息展示
📈 价值: 提升用户体验,确保数据完整性
🔄 后续: 需要手动编译重启后端服务进行测试验证