From 274926182c69876c7ead34db650c0b1d299fd112 Mon Sep 17 00:00:00 2001 From: imeepos Date: Fri, 18 Jul 2025 13:29:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E7=8E=87=E8=AE=A1=E7=AE=97=E8=B6=85=E8=BF=87100%=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题分析 成功率计算逻辑有误: - 之前的计算: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%范围内 - 固定片段会被正确计入成功率 - 不同匹配方法的成功率计算保持一致 --- .../services/material_matching_service.rs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/desktop/src-tauri/src/business/services/material_matching_service.rs b/apps/desktop/src-tauri/src/business/services/material_matching_service.rs index 083030b..95ca955 100644 --- a/apps/desktop/src-tauri/src/business/services/material_matching_service.rs +++ b/apps/desktop/src-tauri/src/business/services/material_matching_service.rs @@ -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,