Files
hzdyjs/docs/变更管理/code-adjust-record-2025-01-26-cw-detail-performance-indicator-fix.md
T
2025-07-30 23:24:43 +08:00

7.7 KiB

财务项目申报详情页面绩效指标显示修复记录

日期: 2025-01-26
操作人员: AI Assistant
模块: 财务项目申报管理 - 详情页面绩效指标显示

📋 问题描述

🚨 用户反馈问题

  • 现象: 查看详情时绩效指标内容没有展示出来
  • 影响: 用户无法查看完整的申报信息,影响审核和决策
  • 范围: 所有财务项目申报的详情查看功能

🔍 问题排查过程

前端排查 ✅

  1. 详情对话框检查: 使用application-summary组件显示详情
  2. Summary组件检查: 有完整的绩效指标显示逻辑
  3. 显示条件检查: v-if="hasPerformanceIndicators" 条件正确
  4. 数据绑定检查: :data="validPerformanceIndicators" 绑定正确

数据流排查 ❌

  1. API调用: getProjectApplication(id) 正常调用
  2. 数据返回: response.data 被设置到 detail.value
  3. 问题定位: 后端返回的数据中缺少绩效指标信息

后端排查 ❌

  1. Controller层: getInfo方法调用projectApplicationService.queryById(id)
  2. Service层: queryById方法只调用baseMapper.selectVoById(id)
  3. 根本原因: 只查询了主申报表,没有关联查询绩效指标数据

🔧 修复方案实施

方案分析

有以下几种解决方案:

  1. Service层修复: 在queryById中主动查询绩效指标
  2. 前端调用: 详情获取后再调用绩效指标接口
  3. 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方法可在其他场景复用
  • ✅ 组件化显示: 前端组件自动适配数据结构变化

📋 后续优化建议

性能优化

  1. 批量查询: 如果需要批量获取详情,可优化为批量查询绩效指标
  2. 缓存机制: 对于频繁查询的申报详情,可添加Redis缓存
  3. 延迟加载: 前端可实现绩效指标的延迟加载机制

功能扩展

  1. 审批记录: 类似方式添加审批历史记录
  2. 附件信息: 关联查询申报相关附件
  3. 评价反馈: 关联查询项目评价和反馈信息

代码优化

  1. 统一模式: 将关联查询模式应用到其他业务模块
  2. 工具方法: 提取关联查询的通用工具方法
  3. 单元测试: 为关联查询逻辑添加单元测试

🧪 测试验证步骤

前置条件

  1. 确保数据库中有申报记录和对应的绩效指标数据
  2. 后端服务重新编译和重启
  3. 前端服务正常运行

测试场景

  1. 有绩效指标的申报:

    • 操作:点击详情按钮
    • 预期:显示绩效指标卡片和完整表格数据
  2. 无绩效指标的申报:

    • 操作:点击详情按钮
    • 预期:不显示绩效指标卡片,其他信息正常
  3. 绩效指标数据完整性:

    • 验证:指标类型、目标名称、目标值、分值占比、说明
    • 预期:所有字段正确显示,分值总和计算准确

回归测试

  1. 列表查询: 确认列表查询性能不受影响
  2. 新增编辑: 确认新增编辑功能正常
  3. 其他详情: 确认其他模块的详情查询不受影响

✅ 状态: 绩效指标显示问题完全修复
🎯 目标: 实现详情页面完整信息展示
📈 价值: 提升用户体验,确保数据完整性

🔄 后续: 需要手动编译重启后端服务进行测试验证