diff --git a/apps/desktop/src-tauri/src/app_state.rs b/apps/desktop/src-tauri/src/app_state.rs index 39f8a77..fb8af61 100644 --- a/apps/desktop/src-tauri/src/app_state.rs +++ b/apps/desktop/src-tauri/src/app_state.rs @@ -1,4 +1,5 @@ use std::sync::{Arc, Mutex}; +use tracing::info; use crate::data::repositories::project_repository::ProjectRepository; use crate::data::repositories::material_repository::MaterialRepository; use crate::data::repositories::model_repository::ModelRepository; @@ -374,12 +375,31 @@ impl AppState { /// 初始化通用工作流服务 pub fn initialize_universal_workflow_service(&self) -> anyhow::Result<()> { + // 首先尝试初始化 ComfyUI 服务(如果还没有初始化) + { + let comfyui_service_guard = self.comfyui_infrastructure_service.lock() + .map_err(|e| anyhow::anyhow!("Failed to acquire lock for ComfyUI service: {}", e))?; + + if comfyui_service_guard.is_none() { + drop(comfyui_service_guard); // 释放锁 + info!("ComfyUI服务未初始化,正在初始化..."); + + // 使用默认配置初始化 ComfyUI 服务 + let default_config = crate::data::models::comfyui::ComfyuiConfig::default(); + let comfyui_service = ComfyuiInfrastructureService::new(default_config) + .map_err(|e| anyhow::anyhow!("创建ComfyUI服务失败: {}", e))?; + + *self.comfyui_infrastructure_service.lock().unwrap() = Some(comfyui_service); + info!("ComfyUI服务初始化成功"); + } + } + // 检查依赖服务是否已初始化 let comfyui_service = self.comfyui_infrastructure_service.lock() .map_err(|e| anyhow::anyhow!("Failed to acquire lock for ComfyUI service: {}", e))?; let comfyui_service = comfyui_service.as_ref() - .ok_or_else(|| anyhow::anyhow!("ComfyUI服务未初始化,无法创建通用工作流服务"))?; + .ok_or_else(|| anyhow::anyhow!("ComfyUI服务初始化失败"))?; // 检查工作流仓库是否已初始化 let workflow_template_repo = self.workflow_template_repository.lock().unwrap(); diff --git a/apps/desktop/src-tauri/src/presentation/commands/workflow_commands.rs b/apps/desktop/src-tauri/src/presentation/commands/workflow_commands.rs index 7211e1c..1017b54 100644 --- a/apps/desktop/src-tauri/src/presentation/commands/workflow_commands.rs +++ b/apps/desktop/src-tauri/src/presentation/commands/workflow_commands.rs @@ -153,9 +153,23 @@ pub async fn execute_workflow_with_mapping( let service_guard = state.get_universal_workflow_service() .map_err(|e| format!("获取通用工作流服务失败: {}", e))?; - service_guard.as_ref() - .ok_or_else(|| "通用工作流服务未初始化,请先配置执行环境".to_string())? - .clone() + if service_guard.as_ref().is_none() { + // 尝试初始化通用工作流服务 + drop(service_guard); // 释放锁 + if let Err(e) = state.initialize_universal_workflow_service() { + return Err(format!("初始化通用工作流服务失败: {}", e)); + } + + // 重新获取服务 + let service_guard = state.get_universal_workflow_service() + .map_err(|e| format!("重新获取通用工作流服务失败: {}", e))?; + + service_guard.as_ref() + .ok_or_else(|| "通用工作流服务初始化后仍然为空".to_string())? + .clone() + } else { + service_guard.as_ref().unwrap().clone() + } }; // 转换请求格式到新的统一格式 diff --git a/apps/desktop/src/components/workflow/WorkflowFormGenerator.tsx b/apps/desktop/src/components/workflow/WorkflowFormGenerator.tsx index 0ba0ef3..d2a26ad 100644 --- a/apps/desktop/src/components/workflow/WorkflowFormGenerator.tsx +++ b/apps/desktop/src/components/workflow/WorkflowFormGenerator.tsx @@ -110,12 +110,19 @@ export const WorkflowFormGenerator: React.FC = ({ }); setFormData(initializedData); + }, [uiConfig, initialData]); - // 通知父组件 - if (onFormDataChange) { - onFormDataChange(initializedData); + // 单独的 useEffect 来通知父组件数据变化,避免渲染时调用 + useEffect(() => { + if (onFormDataChange && Object.keys(formData).length > 0) { + // 使用 setTimeout 确保在下一个事件循环中执行,避免渲染时状态更新 + const timeoutId = setTimeout(() => { + onFormDataChange(formData); + }, 0); + + return () => clearTimeout(timeoutId); } - }, [uiConfig]); // 只依赖uiConfig,由于useMemo的缓存,不会无限循环 + }, [formData, onFormDataChange]); // 更新表单数据 const updateFormData = useCallback((fieldName: string, value: any) => {