fix: 修复成功率计算超过100%的问题

## 问题分析
成功率计算逻辑有误:
- 之前的计算:matched_segments / matchable_segments (排除固定片段)
- 问题:固定片段不会被添加到matches中,但应该算作成功的片段

## 正确的成功率计算
成功率 = (成功匹配的片段数 + 固定片段数) / 总片段数

### 修复内容
1. **match_materials方法**
   - 成功片段数 = matched_segments + fixed_segments_count
   - 总片段数 = total_segments (包含所有片段)
   - 成功率 = successful_segments / total_segments

2. **match_materials_with_used_segments方法**
   - 使用相同的计算逻辑确保一致性
   - 修复statistics中的total_segments字段

### 逻辑说明
- 固定片段({固定素材})总是被视为成功的,因为它们不需要匹配
- 成功匹配的片段是通过AI分类或随机匹配成功的片段
- 总成功率 = (AI匹配成功 + 固定片段) / 所有片段

## 预期效果
- 成功率将始终在0-100%范围内
- 固定片段会被正确计入成功率
- 不同匹配方法的成功率计算保持一致
This commit is contained in:
imeepos 2025-07-18 13:29:07 +08:00
parent c5b944c4a3
commit 274926182c
1 changed files with 13 additions and 13 deletions

View File

@ -247,22 +247,22 @@ impl MaterialMatchingService {
}
}
// 计算统计信息 - 修正:固定素材不计入总数和失败数
// 计算统计信息
let total_segments = track_segments.len() as u32;
let fixed_segments_count = fixed_segments.len() as u32;
let matchable_segments = total_segments - fixed_segments_count; // 可匹配的片段数
let matched_segments = matches.len() as u32;
let failed_segments_count = failed_segments.len() as u32;
// 成功率基于可匹配的片段计算
let success_rate = if matchable_segments > 0 {
matched_segments as f64 / matchable_segments as f64
// 正确的成功率计算:(成功匹配的片段 + 固定片段) / 总片段数
let successful_segments = matched_segments + fixed_segments_count;
let success_rate = if total_segments > 0 {
successful_segments as f64 / total_segments as f64
} else {
1.0 // 如果没有需要匹配的片段成功率为100%
1.0 // 如果没有片段成功率为100%
};
let statistics = MatchingStatistics {
total_segments: matchable_segments, // 只统计需要匹配的片段
total_segments, // 统计所有片段
matched_segments,
failed_segments: failed_segments_count,
success_rate,
@ -1066,12 +1066,12 @@ impl MaterialMatchingService {
let failed_segments_count = failed_segments.len() as u32;
let fixed_segments_count = fixed_segments.len() as u32;
// 修正成功率计算:只考虑需要匹配的片段
let matchable_segments = total_segments - fixed_segments_count;
let success_rate = if matchable_segments > 0 {
matched_segments as f64 / matchable_segments as f64
// 正确的成功率计算:(成功匹配的片段 + 固定片段) / 总片段数
let successful_segments = matched_segments + fixed_segments_count;
let success_rate = if total_segments > 0 {
successful_segments as f64 / total_segments as f64
} else {
1.0 // 如果没有需要匹配的片段成功率为100%
1.0 // 如果没有片段成功率为100%
};
// 判断匹配是否成功:所有需要匹配的片段都成功匹配
@ -1084,7 +1084,7 @@ impl MaterialMatchingService {
project_id: request.project_id.clone(),
matches,
statistics: MatchingStatistics {
total_segments: matchable_segments, // 只统计需要匹配的片段
total_segments, // 统计所有片段
matched_segments,
failed_segments: failed_segments_count,
success_rate,