fix: 修复素材匹配时未加载片段信息的关键问题

## 问题根因
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秒)而不是原始素材时长
- 时长匹配评分将更加准确

这是一个关键修复,解决了匹配逻辑的根本问题。
This commit is contained in:
imeepos 2025-07-18 13:48:34 +08:00
parent 7909a62e64
commit 92ff1ee962
1 changed files with 15 additions and 6 deletions

View File

@ -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();