修复批量任务记录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:
parent
72fbdbbd66
commit
20c7a2100e
|
|
@ -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>, // 商品图片路径列表
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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[]; // 商品图片路径列表
|
||||
|
|
|
|||
Loading…
Reference in New Issue