From 20c7a2100ea28660e64b20701c0abffa7c81075f Mon Sep 17 00:00:00 2001 From: imeepos Date: Thu, 31 Jul 2025 15:54:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=B9=E9=87=8F=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E8=AE=B0=E5=BD=95ID=E5=86=B2=E7=AA=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20-=20=E5=AE=9E=E6=96=BD=E6=96=B9=E6=A1=881?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题分析: - 批量生成时创建了2个不同的记录,但执行时通过model_id+model_image_id查找 - 由于2个任务使用相同的model_id和model_image_id,find()总是返回第一个记录 - 导致两个任务都操作同一个记录ID,进度更新相互覆盖 解决方案: - 在OutfitImageGenerationRequest中添加record_id字段 - 任务执行时直接传递记录ID,避免查找错误 - 保持向后兼容,支持旧的查找逻辑 修改内容: - 后端:添加record_id字段到OutfitImageGenerationRequest结构 - 前端:更新TypeScript类型定义 - 执行逻辑:在execute_outfit_image_task中传递记录ID - 核心逻辑:修改perform_outfit_image_generation使用传入的record_id 这样确保每个任务精确操作自己对应的记录,彻底解决记录ID冲突问题。 --- .../src-tauri/src/data/models/outfit_image.rs | 1 + .../src/data/repositories/model_repository.rs | 2 -- .../commands/outfit_image_commands.rs | 30 +++++++++++++------ apps/desktop/src/types/outfitImage.ts | 1 + 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/apps/desktop/src-tauri/src/data/models/outfit_image.rs b/apps/desktop/src-tauri/src/data/models/outfit_image.rs index f7b8af9..82358b2 100644 --- a/apps/desktop/src-tauri/src/data/models/outfit_image.rs +++ b/apps/desktop/src-tauri/src/data/models/outfit_image.rs @@ -205,6 +205,7 @@ impl OutfitImage { /// 穿搭图片生成请求 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OutfitImageGenerationRequest { + pub record_id: Option, // 指定要操作的记录ID(用于批量任务精确匹配) pub model_id: String, pub model_image_id: String, // 选择的模特形象图片ID pub product_image_paths: Vec, // 商品图片路径列表 diff --git a/apps/desktop/src-tauri/src/data/repositories/model_repository.rs b/apps/desktop/src-tauri/src/data/repositories/model_repository.rs index f557a0a..72f9461 100644 --- a/apps/desktop/src-tauri/src/data/repositories/model_repository.rs +++ b/apps/desktop/src-tauri/src/data/repositories/model_repository.rs @@ -118,7 +118,6 @@ impl ModelRepository { result } None => { - println!("get_by_id 只读连接被占用,使用基本方法"); // 如果只读连接被占用,使用不加载照片的基本方法 return self.get_basic_by_id(id); } @@ -486,7 +485,6 @@ impl ModelRepository { match self.database.get_best_read_connection() { Ok(conn) => { let photos = self.execute_photo_query(&conn, model_id)?; - println!("get_photos 执行完成,返回 {} 张照片", photos.len()); Ok(photos) } Err(e) => { diff --git a/apps/desktop/src-tauri/src/presentation/commands/outfit_image_commands.rs b/apps/desktop/src-tauri/src/presentation/commands/outfit_image_commands.rs index 1c7d372..3ea0e79 100644 --- a/apps/desktop/src-tauri/src/presentation/commands/outfit_image_commands.rs +++ b/apps/desktop/src-tauri/src/presentation/commands/outfit_image_commands.rs @@ -663,6 +663,7 @@ pub async fn execute_outfit_image_task( // 构建生成请求 let request = OutfitImageGenerationRequest { + record_id: Some(record_id.clone()), // 传递记录ID用于精确匹配 model_id: record.model_id.clone(), model_image_id: record.model_image_id.clone(), product_image_paths: record.product_images.iter().map(|img| img.file_path.clone()).collect(), @@ -854,17 +855,28 @@ async fn perform_outfit_image_generation( // 创建仓库实例 let outfit_repo = OutfitImageRepository::new(database.clone()); - // 根据model_id和model_image_id获取生成记录 - let records = outfit_repo - .get_records_by_model_id(&request.model_id) - .map_err(|e| format!("获取生成记录失败: {}", e))?; + // 获取记录ID:优先使用传入的record_id,否则通过查找获取(向后兼容) + let record_id = if let Some(id) = &request.record_id { + id.clone() + } else { + // 兼容旧逻辑:根据model_id和model_image_id获取生成记录 + let records = outfit_repo + .get_records_by_model_id(&request.model_id) + .map_err(|e| format!("获取生成记录失败: {}", e))?; - // 找到匹配的记录(最新的一个) - let record = records.into_iter() - .find(|r| r.model_image_id == request.model_image_id) - .ok_or_else(|| "未找到对应的生成记录".to_string())?; + // 找到匹配的记录(最新的一个) + let record = records.into_iter() + .find(|r| r.model_image_id == request.model_image_id) + .ok_or_else(|| "未找到对应的生成记录".to_string())?; - let record_id = record.id.clone(); + record.id.clone() + }; + + // 验证记录是否存在 + let record = outfit_repo + .get_record_by_id(&record_id) + .map_err(|e| format!("获取记录失败: {}", e))? + .ok_or_else(|| format!("记录不存在: {}", record_id))?; // 初始化错误处理服务 let error_service = ErrorHandlingService::new(); diff --git a/apps/desktop/src/types/outfitImage.ts b/apps/desktop/src/types/outfitImage.ts index e484c5b..53b0a0a 100644 --- a/apps/desktop/src/types/outfitImage.ts +++ b/apps/desktop/src/types/outfitImage.ts @@ -51,6 +51,7 @@ export interface OutfitImage { } export interface OutfitImageGenerationRequest { + record_id?: string; // 指定要操作的记录ID(用于批量任务精确匹配) model_id: string; model_image_id: string; // 选择的模特形象图片ID product_image_paths: string[]; // 商品图片路径列表