4.3 KiB
4.3 KiB
AI分类统计数值溢出问题修复
问题描述
用户报告AI分析日志显示异常数据:
- 总记录数:214(正常)
- 成功分类:18446744073709552(异常,接近u64最大值)
问题分析
根本原因
在 ai_analysis_log_service.rs 中,计算成功分类数的逻辑有误:
// 错误的计算方式
successful_classifications: (classification_stats.total_classifications - classification_stats.failed_tasks) as u64,
问题详解
total_classifications是分类记录总数(来自video_classification_records表)failed_tasks是失败的任务数(来自video_classification_tasks表)- 这两个数据来源不同,不应该直接相减
- 当
failed_tasks>total_classifications时,减法结果为负数 - 负数转换为
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,
// ...
})
修改文件列表
后端文件
-
apps/desktop/src-tauri/src/data/models/video_classification.rs- 扩展
ClassificationStats结构体
- 扩展
-
apps/desktop/src-tauri/src/data/repositories/video_classification_repository.rs- 添加分类记录状态统计查询
- 更新返回的统计数据
-
apps/desktop/src-tauri/src/business/services/ai_analysis_log_service.rs- 修正成功分类数的计算逻辑
- 添加数值安全检查
前端文件
-
apps/desktop/src/types/videoClassification.ts- 更新
ClassificationStats接口
- 更新
-
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. 类型安全
明确区分有符号和无符号整数的使用场景。
测试建议
- 边界测试:测试没有分类记录的项目
- 数据一致性测试:验证各项统计数据的逻辑关系
- 大数据测试:测试大量分类记录的性能和准确性
- 异常数据测试:测试数据库中存在异常状态的记录
预期结果
修复后,AI分析统计应该显示:
- 总记录数:214
- 成功分类:实际成功分类的记录数(≤ 214)
- 失败分类:实际失败分类的记录数
- 需要审核:需要人工审核的记录数
所有数值应该在合理范围内,且满足逻辑关系:
成功分类 + 失败分类 + 需要审核 = 总记录数
后续优化
- 添加数据一致性检查
- 实现24小时活动统计
- 添加更详细的错误日志
- 考虑添加数据库索引优化查询性能