From fbdd1bf1ea69ac10626f16e7ec98565dfd946282 Mon Sep 17 00:00:00 2001 From: imeepos Date: Mon, 14 Jul 2025 15:06:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DMaterialRepository?= =?UTF-8?q?=E4=B8=ADget=5Fproject=5Fby=5Fid=E6=96=B9=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E5=8D=A0=E4=BD=8D=E7=AC=A6=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题修复: - 修复MaterialRepository.get_project_by_id总是返回None的问题 - 实现正确的项目查询逻辑,直接从projects表查询 - 解决AI分类后文件移动失败的根本原因 技术实现: - 在MaterialRepository中添加完整的项目查询实现 - 正确处理数据库查询和错误处理 - 支持项目不存在时返回None而不是错误 问题解决: - 现在AI分类完成后可以正确找到项目信息 - 文件移动到assets/分类目录功能将正常工作 - 消除了'项目不存在'的错误信息 --- .../data/repositories/material_repository.rs | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src-tauri/src/data/repositories/material_repository.rs b/apps/desktop/src-tauri/src/data/repositories/material_repository.rs index ca66b9b..530d5f2 100644 --- a/apps/desktop/src-tauri/src/data/repositories/material_repository.rs +++ b/apps/desktop/src-tauri/src/data/repositories/material_repository.rs @@ -452,10 +452,44 @@ impl MaterialRepository { } /// 根据项目ID获取项目信息 - pub async fn get_project_by_id(&self, _project_id: &str) -> Result> { - // 这里需要引用项目仓库,暂时返回None - // 在实际实现中,应该通过依赖注入获取项目仓库 - Ok(None) + pub async fn get_project_by_id(&self, project_id: &str) -> Result> { + use crate::data::models::project::Project; + use chrono::{DateTime, Utc}; + + let conn = self.connection.lock().unwrap(); + + let mut stmt = conn.prepare( + "SELECT id, name, path, description, created_at, updated_at, is_active + FROM projects WHERE id = ?1" + )?; + + let result = stmt.query_row([project_id], |row| { + let created_at_str: String = row.get(4)?; + let updated_at_str: String = row.get(5)?; + + let created_at = DateTime::parse_from_rfc3339(&created_at_str) + .map_err(|_| rusqlite::Error::InvalidColumnType(4, "created_at".to_string(), rusqlite::types::Type::Text))? + .with_timezone(&Utc); + let updated_at = DateTime::parse_from_rfc3339(&updated_at_str) + .map_err(|_| rusqlite::Error::InvalidColumnType(5, "updated_at".to_string(), rusqlite::types::Type::Text))? + .with_timezone(&Utc); + + Ok(Project { + id: row.get(0)?, + name: row.get(1)?, + path: row.get(2)?, + description: row.get(3)?, + created_at, + updated_at, + is_active: row.get::<_, i32>(6)? != 0, + }) + }); + + match result { + Ok(project) => Ok(Some(project)), + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), + Err(e) => Err(e.into()), + } } /// 根据片段ID获取片段信息