修复批量任务记录ID冲突问题 - 实施方案1

问题分析:
- 批量生成时创建了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冲突问题。
This commit is contained in:
imeepos 2025-07-31 15:54:39 +08:00
parent 72fbdbbd66
commit 20c7a2100e
4 changed files with 23 additions and 11 deletions

View File

@ -205,6 +205,7 @@ impl OutfitImage {
/// 穿搭图片生成请求
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutfitImageGenerationRequest {
pub record_id: Option<String>, // 指定要操作的记录ID用于批量任务精确匹配
pub model_id: String,
pub model_image_id: String, // 选择的模特形象图片ID
pub product_image_paths: Vec<String>, // 商品图片路径列表

View File

@ -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) => {

View File

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

View File

@ -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[]; // 商品图片路径列表