# AI分类统计数值溢出问题修复 ## 问题描述 用户报告AI分析日志显示异常数据: - 总记录数:214(正常) - 成功分类:18446744073709552(异常,接近u64最大值) ## 问题分析 ### 根本原因 在 `ai_analysis_log_service.rs` 中,计算成功分类数的逻辑有误: ```rust // 错误的计算方式 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 结构体 添加分类记录状态的详细统计: ```rust pub struct ClassificationStats { // 原有字段... pub successful_classifications: i32, // 新增:成功分类记录数 pub failed_classifications: i32, // 新增:失败分类记录数 pub needs_review_classifications: i32, // 新增:需要审核记录数 } ``` ### 2. 改进数据库查询 在 `video_classification_repository.rs` 中添加分类记录状态统计: ```rust // 获取分类记录状态统计 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. 修正统计计算逻辑 使用正确的数据源计算各项统计: ```rust 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)` 确保不会有负数转换为无符号整数: ```rust 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. 考虑添加数据库索引优化查询性能