From 92ff1ee962843efc95912d46c0a5c7f487c53528 Mon Sep 17 00:00:00 2001 From: imeepos Date: Fri, 18 Jul 2025 13:48:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B4=A0=E6=9D=90?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E6=97=B6=E6=9C=AA=E5=8A=A0=E8=BD=BD=E7=89=87?= =?UTF-8?q?=E6=AE=B5=E4=BF=A1=E6=81=AF=E7=9A=84=E5=85=B3=E9=94=AE=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题根因 MaterialMatchingService中直接调用material_repo.get_by_project_id()方法, 该方法只返回素材基本信息,不包含segments字段,导致: 1. material.segments.is_empty()始终为true 2. 匹配逻辑创建虚拟片段,使用原始素材完整时长 3. 10.042秒的原始素材与1.267秒的模板片段比较,超出692.8% ## 解决方案 将所有调用material_repo.get_by_project_id()的地方改为: MaterialService::get_project_materials() 该方法会: 1. 调用repository.get_by_project_id()获取素材基本信息 2. 为每个素材调用repository.get_segments()加载片段信息 3. 返回包含完整片段信息的素材列表 ## 修改位置 1. match_materials方法 - 主要匹配逻辑 2. can_template_be_fully_matched方法 - 模板匹配检查 3. match_materials_with_used_segments方法 - 批量匹配逻辑 ## 预期效果 - material.segments不再为空 - 匹配逻辑使用真实的切分片段而不是虚拟片段 - 片段时长将是合理的切分后时长(如1-5秒)而不是原始素材时长 - 时长匹配评分将更加准确 这是一个关键修复,解决了匹配逻辑的根本问题。 --- .../services/material_matching_service.rs | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 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 c1115c7..99d6356 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 @@ -186,8 +186,11 @@ impl MaterialMatchingService { .await? .ok_or_else(|| anyhow!("模板不存在: {}", request.template_id))?; - // 获取项目的所有素材 - let project_materials = self.material_repo.get_by_project_id(&request.project_id)?; + // 获取项目的所有素材(包含片段信息) + let project_materials = crate::business::services::material_service::MaterialService::get_project_materials( + &self.material_repo, + &request.project_id + )?; // 获取所有素材的分类记录 let mut classification_records = HashMap::new(); @@ -982,8 +985,11 @@ impl MaterialMatchingService { _ => return false, }; - // 获取项目的所有素材 - let project_materials = match self.material_repo.get_by_project_id(project_id) { + // 获取项目的所有素材(包含片段信息) + let project_materials = match crate::business::services::material_service::MaterialService::get_project_materials( + &self.material_repo, + project_id + ) { Ok(materials) => materials, Err(_) => return false, }; @@ -1048,8 +1054,11 @@ impl MaterialMatchingService { .await? .ok_or_else(|| anyhow!("模板不存在: {}", request.template_id))?; - // 获取项目的所有素材 - let project_materials = self.material_repo.get_by_project_id(&request.project_id)?; + // 获取项目的所有素材(包含片段信息) + let project_materials = crate::business::services::material_service::MaterialService::get_project_materials( + &self.material_repo, + &request.project_id + )?; // 获取所有素材的分类记录 let mut classification_records = HashMap::new();