mixvideo-v2/apps/desktop/AI_CLASSIFICATION_STATS_FIX.md

4.3 KiB
Raw Permalink Blame History

AI分类统计数值溢出问题修复

问题描述

用户报告AI分析日志显示异常数据

  • 总记录数214正常
  • 成功分类18446744073709552异常接近u64最大值

问题分析

根本原因

ai_analysis_log_service.rs 中,计算成功分类数的逻辑有误:

// 错误的计算方式
successful_classifications: (classification_stats.total_classifications - classification_stats.failed_tasks) as u64,

问题详解

  1. total_classifications 是分类记录总数(来自 video_classification_records 表)
  2. failed_tasks 是失败的任务数(来自 video_classification_tasks 表)
  3. 这两个数据来源不同,不应该直接相减
  4. failed_tasks > total_classifications 时,减法结果为负数
  5. 负数转换为 u64 时会发生溢出,变成接近 u64::MAX 的大数

数值分析

  • u64::MAX = 18446744073709551615
  • 异常值 = 18446744073709552
  • 差值 = 18446744073709551615 - 18446744073709552 = 63

这表明原始计算结果是 -63转换为 u64 后变成了这个大数。

修复方案

1. 扩展 ClassificationStats 结构体

添加分类记录状态的详细统计:

pub struct ClassificationStats {
    // 原有字段...
    pub successful_classifications: i32,    // 新增:成功分类记录数
    pub failed_classifications: i32,        // 新增:失败分类记录数
    pub needs_review_classifications: i32,  // 新增:需要审核记录数
}

2. 改进数据库查询

video_classification_repository.rs 中添加分类记录状态统计:

// 获取分类记录状态统计
let mut stmt = conn.prepare(&format!(
    "SELECT 
        SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as classified,
        SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as failed,
        SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as needs_review
     FROM video_classification_records{}", record_where_clause
))?;

3. 修正统计计算逻辑

使用正确的数据源计算各项统计:

Ok(AiAnalysisLogStats {
    total_records: classification_stats.total_classifications.max(0) as u64,
    successful_classifications: classification_stats.successful_classifications.max(0) as u64,
    failed_classifications: classification_stats.failed_classifications.max(0) as u64,
    needs_review: classification_stats.needs_review_classifications.max(0) as u64,
    // ...
})

修改文件列表

后端文件

  1. apps/desktop/src-tauri/src/data/models/video_classification.rs

    • 扩展 ClassificationStats 结构体
  2. apps/desktop/src-tauri/src/data/repositories/video_classification_repository.rs

    • 添加分类记录状态统计查询
    • 更新返回的统计数据
  3. apps/desktop/src-tauri/src/business/services/ai_analysis_log_service.rs

    • 修正成功分类数的计算逻辑
    • 添加数值安全检查

前端文件

  1. apps/desktop/src/types/videoClassification.ts

    • 更新 ClassificationStats 接口
  2. apps/desktop/src/store/videoClassificationStore.ts

    • 更新 ClassificationStats 接口

安全改进

1. 数值溢出防护

使用 .max(0) 确保不会有负数转换为无符号整数:

classification_stats.successful_classifications.max(0) as u64

2. 数据一致性

确保统计数据来源一致:

  • 任务相关统计来自 video_classification_tasks
  • 分类记录相关统计来自 video_classification_records

3. 类型安全

明确区分有符号和无符号整数的使用场景。

测试建议

  1. 边界测试:测试没有分类记录的项目
  2. 数据一致性测试:验证各项统计数据的逻辑关系
  3. 大数据测试:测试大量分类记录的性能和准确性
  4. 异常数据测试:测试数据库中存在异常状态的记录

预期结果

修复后AI分析统计应该显示

  • 总记录数214
  • 成功分类:实际成功分类的记录数(≤ 214
  • 失败分类:实际失败分类的记录数
  • 需要审核:需要人工审核的记录数

所有数值应该在合理范围内,且满足逻辑关系: 成功分类 + 失败分类 + 需要审核 = 总记录数

后续优化

  1. 添加数据一致性检查
  2. 实现24小时活动统计
  3. 添加更详细的错误日志
  4. 考虑添加数据库索引优化查询性能