fix: 修复素材查询

This commit is contained in:
imeepos 2025-07-15 19:00:58 +08:00
parent 0ea1b2cd38
commit bc5d9d1054
4 changed files with 127 additions and 13 deletions

View File

@ -33,27 +33,44 @@ impl MaterialSegmentViewService {
/// 获取项目的MaterialSegment聚合视图
pub async fn get_project_segment_view(&self, project_id: &str) -> Result<MaterialSegmentView> {
println!("🔍 开始获取项目片段视图project_id: {}", project_id);
// 获取项目的所有素材
let materials = self.material_repository.get_by_project_id(project_id)?;
println!("📁 获取到 {} 个素材", materials.len());
// 为每个素材加载片段信息
let mut materials_with_segments = Vec::new();
for mut material in materials {
let segments = self.material_repository.get_segments(&material.id)?;
println!("📄 素材 {} ({}) 有 {} 个片段", material.name, material.id, segments.len());
material.segments = segments;
materials_with_segments.push(material);
}
// 获取所有模特信息
let models = self.get_project_models(&materials).await?;
let models = self.get_project_models(&materials_with_segments).await?;
println!("👤 获取到 {} 个模特", models.len());
// 构建MaterialSegment聚合视图
let mut view = MaterialSegmentView::new(project_id.to_string());
// 收集所有片段和相关信息
let segments_with_details = self.collect_segments_with_details(&materials, &models).await?;
let segments_with_details = self.collect_segments_with_details(&materials_with_segments, &models).await?;
println!("🎬 收集到 {} 个片段详情", segments_with_details.len());
// 按AI分类聚合
view.by_classification = self.group_by_classification(&segments_with_details);
println!("🏷️ 按分类聚合:{} 个分类组", view.by_classification.len());
// 按模特聚合
view.by_model = self.group_by_model(&segments_with_details);
println!("👥 按模特聚合:{} 个模特组", view.by_model.len());
// 计算统计信息
view.stats = self.calculate_stats(&segments_with_details);
println!("📊 统计信息:总片段数 {}", view.stats.total_segments);
Ok(view)
}

View File

@ -87,6 +87,8 @@ impl MaterialRepository {
/// 根据项目ID获取所有素材
pub fn get_by_project_id(&self, project_id: &str) -> Result<Vec<Material>> {
println!("🔍 查询项目素材project_id: {}", project_id);
let conn = self.database.get_connection();
let conn = conn.lock().unwrap();
@ -103,9 +105,12 @@ impl MaterialRepository {
let mut materials = Vec::new();
for material in material_iter {
materials.push(material?);
let material = material?;
println!("📄 找到素材: {} ({})", material.name, material.id);
materials.push(material);
}
println!("📁 项目 {} 共找到 {} 个素材", project_id, materials.len());
Ok(materials)
}
@ -216,9 +221,11 @@ impl MaterialRepository {
/// 获取素材的所有片段
pub fn get_segments(&self, material_id: &str) -> Result<Vec<MaterialSegment>> {
println!("🔍 查询素材片段material_id: {}", material_id);
let conn = self.database.get_connection();
let conn = conn.lock().unwrap();
let mut stmt = conn.prepare(
"SELECT id, material_id, segment_index, start_time, end_time,
duration, file_path, file_size, created_at
@ -230,10 +237,13 @@ impl MaterialRepository {
})?;
let mut segments = Vec::new();
for segment in segment_iter {
segments.push(segment?);
for (index, segment) in segment_iter.enumerate() {
let segment = segment?;
println!("🎬 找到片段 {}: {} (时长: {:.2}s)", index + 1, segment.id, segment.duration);
segments.push(segment);
}
println!("📊 素材 {} 共找到 {} 个片段", material_id, segments.len());
Ok(segments)
}

View File

@ -51,6 +51,7 @@ pub fn run() {
commands::database_commands::force_release_database_connection,
commands::database_commands::get_connection_pool_stats,
commands::database_commands::test_connection_pool_init,
commands::database_commands::debug_database_data,
commands::material_commands::import_materials,
commands::material_commands::import_materials_async,
commands::material_commands::select_material_folders,

View File

@ -70,3 +70,89 @@ pub fn test_connection_pool_init(_state: State<AppState>) -> Result<String, Stri
}
}
}
/// 调试数据库数据
#[tauri::command]
pub fn debug_database_data(state: State<AppState>, project_id: String) -> Result<String, String> {
let database_guard = state.database.lock().map_err(|e| format!("获取数据库失败: {}", e))?;
let database = database_guard.as_ref().ok_or("数据库未初始化")?;
let conn = database.get_connection();
let conn = conn.lock().map_err(|e| format!("获取连接失败: {}", e))?;
let mut result = String::new();
// 检查项目表
match conn.prepare("SELECT COUNT(*) FROM projects WHERE id = ?1") {
Ok(mut stmt) => {
match stmt.query_row([&project_id], |row| row.get::<_, i64>(0)) {
Ok(count) => result.push_str(&format!("项目记录数: {}\n", count)),
Err(e) => result.push_str(&format!("查询项目失败: {}\n", e)),
}
},
Err(e) => result.push_str(&format!("准备项目查询失败: {}\n", e)),
}
// 检查素材表
match conn.prepare("SELECT COUNT(*) FROM materials WHERE project_id = ?1") {
Ok(mut stmt) => {
match stmt.query_row([&project_id], |row| row.get::<_, i64>(0)) {
Ok(count) => result.push_str(&format!("素材记录数: {}\n", count)),
Err(e) => result.push_str(&format!("查询素材失败: {}\n", e)),
}
},
Err(e) => result.push_str(&format!("准备素材查询失败: {}\n", e)),
}
// 检查片段表
match conn.prepare("SELECT COUNT(*) FROM material_segments ms JOIN materials m ON ms.material_id = m.id WHERE m.project_id = ?1") {
Ok(mut stmt) => {
match stmt.query_row([&project_id], |row| row.get::<_, i64>(0)) {
Ok(count) => result.push_str(&format!("片段记录数: {}\n", count)),
Err(e) => result.push_str(&format!("查询片段失败: {}\n", e)),
}
},
Err(e) => result.push_str(&format!("准备片段查询失败: {}\n", e)),
}
// 列出素材详情
match conn.prepare("SELECT id, name, processing_status, material_type FROM materials WHERE project_id = ?1 LIMIT 5") {
Ok(mut stmt) => {
result.push_str("\n素材详情前5个:\n");
match stmt.query_map([&project_id], |row| {
Ok((
row.get::<_, String>(0)?,
row.get::<_, String>(1)?,
row.get::<_, String>(2)?,
row.get::<_, String>(3)?,
))
}) {
Ok(rows) => {
for (i, row) in rows.enumerate() {
match row {
Ok((id, name, status, material_type)) => {
result.push_str(&format!(" {}. {} ({}) - 状态: {} - 类型: {}\n", i + 1, name, id, status, material_type));
// 查询每个素材的片段数量
match conn.prepare("SELECT COUNT(*) FROM material_segments WHERE material_id = ?1") {
Ok(mut seg_stmt) => {
match seg_stmt.query_row([&id], |row| row.get::<_, i64>(0)) {
Ok(seg_count) => result.push_str(&format!(" 片段数: {}\n", seg_count)),
Err(e) => result.push_str(&format!(" 查询片段数失败: {}\n", e)),
}
},
Err(e) => result.push_str(&format!(" 准备片段查询失败: {}\n", e)),
}
},
Err(e) => result.push_str(&format!(" 解析素材行失败: {}\n", e)),
}
}
},
Err(e) => result.push_str(&format!("查询素材详情失败: {}\n", e)),
}
},
Err(e) => result.push_str(&format!("准备素材详情查询失败: {}\n", e)),
}
Ok(result)
}