mixvideo-v2/apps/desktop/AI_CLASSIFICATION_STATS_FIX.md

136 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. 考虑添加数据库索引优化查询性能