fix: cargo check --lib error
This commit is contained in:
BIN
apps/desktop/src-tauri/mixvideo.db
Normal file
BIN
apps/desktop/src-tauri/mixvideo.db
Normal file
Binary file not shown.
@@ -352,10 +352,10 @@ impl WorkflowExecutionRecordRepository {
|
||||
let sql = format!(
|
||||
"SELECT
|
||||
COUNT(*) as total_count,
|
||||
SUM(CASE WHEN status = '\"completed\"' THEN 1 ELSE 0 END) as completed_count,
|
||||
SUM(CASE WHEN status = '\"failed\"' THEN 1 ELSE 0 END) as failed_count,
|
||||
SUM(CASE WHEN status = '\"running\"' THEN 1 ELSE 0 END) as running_count,
|
||||
SUM(CASE WHEN status = '\"pending\"' THEN 1 ELSE 0 END) as pending_count,
|
||||
COALESCE(SUM(CASE WHEN status = '\"completed\"' THEN 1 ELSE 0 END), 0) as completed_count,
|
||||
COALESCE(SUM(CASE WHEN status = '\"failed\"' THEN 1 ELSE 0 END), 0) as failed_count,
|
||||
COALESCE(SUM(CASE WHEN status = '\"running\"' THEN 1 ELSE 0 END), 0) as running_count,
|
||||
COALESCE(SUM(CASE WHEN status = '\"pending\"' THEN 1 ELSE 0 END), 0) as pending_count,
|
||||
AVG(CASE WHEN duration_seconds IS NOT NULL THEN duration_seconds ELSE NULL END) as avg_duration,
|
||||
MIN(created_at) as earliest_execution,
|
||||
MAX(created_at) as latest_execution
|
||||
|
||||
@@ -24,6 +24,22 @@ use crate::data::models::comfyui::{
|
||||
use comfyui_sdk::types::{ComfyUIWorkflow, ComfyUINode};
|
||||
use crate::business::services::comfyui_manager::ComfyUIManager;
|
||||
|
||||
// ==================== 辅助函数 ====================
|
||||
|
||||
/// 将前端的 ComfyUIV2Config 转换为后端的 ComfyUIConfig
|
||||
fn convert_v2_config_to_config(v2_config: ComfyUIV2Config) -> ComfyUIConfig {
|
||||
ComfyUIConfig {
|
||||
base_url: v2_config.base_url,
|
||||
timeout_seconds: v2_config.timeout.unwrap_or(30000) / 1000, // 转换毫秒为秒
|
||||
retry_attempts: v2_config.retry_attempts.unwrap_or(3),
|
||||
retry_delay_ms: 1000, // 默认重试延迟
|
||||
enable_websocket: true, // 默认启用 WebSocket
|
||||
enable_cache: v2_config.enable_cache.unwrap_or(true),
|
||||
max_concurrency: v2_config.max_concurrency.unwrap_or(4),
|
||||
custom_headers: None,
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 请求类型定义 ====================
|
||||
|
||||
/// 创建工作流请求
|
||||
@@ -128,16 +144,30 @@ pub struct HealthCheckResponse {
|
||||
/// 连接到 ComfyUI 服务
|
||||
#[tauri::command]
|
||||
pub async fn comfyui_v2_connect(
|
||||
config: Option<ComfyUIV2Config>,
|
||||
state: State<'_, AppState>,
|
||||
) -> Result<ConnectionStatusResponse, String> {
|
||||
info!("Command: comfyui_v2_connect");
|
||||
|
||||
// 获取配置管理器
|
||||
let config_manager = get_config_manager(&state).await?;
|
||||
let config = config_manager.get_comfyui_config().await;
|
||||
|
||||
// 使用传入的配置或获取现有配置
|
||||
let final_config = if let Some(v2_config) = config {
|
||||
info!("使用传入的配置: {}", v2_config.base_url);
|
||||
// 转换为 ComfyUIConfig
|
||||
let converted_config = convert_v2_config_to_config(v2_config);
|
||||
// 先更新配置到配置管理器
|
||||
config_manager.update_comfyui_config(converted_config.clone()).await
|
||||
.map_err(|e| format!("更新配置失败: {}", e))?;
|
||||
converted_config
|
||||
} else {
|
||||
info!("使用现有配置");
|
||||
config_manager.get_comfyui_config().await
|
||||
};
|
||||
|
||||
// 创建 ComfyUI 管理器
|
||||
let manager = ComfyUIManager::new(config)
|
||||
let manager = ComfyUIManager::new(final_config)
|
||||
.map_err(|e| format!("创建管理器失败: {}", e))?;
|
||||
|
||||
// 尝试连接
|
||||
@@ -145,7 +175,7 @@ pub async fn comfyui_v2_connect(
|
||||
Ok(_) => {
|
||||
let stats = manager.get_connection_stats().await;
|
||||
info!("ComfyUI 连接成功");
|
||||
|
||||
|
||||
Ok(ConnectionStatusResponse {
|
||||
connected: true,
|
||||
status: stats.status.to_string(),
|
||||
@@ -218,8 +248,14 @@ pub async fn comfyui_v2_get_system_info(
|
||||
) -> Result<SystemInfoResponse, String> {
|
||||
info!("Command: comfyui_v2_get_system_info");
|
||||
|
||||
// TODO: 从管理器获取系统信息
|
||||
Err("功能暂未实现".to_string())
|
||||
let manager = state.comfyui_manager.read().await;
|
||||
match manager.get_system_info().await {
|
||||
Ok(stats) => Ok(convert_system_info(stats)),
|
||||
Err(e) => {
|
||||
error!("获取系统信息失败: {}", e);
|
||||
Err(format!("获取系统信息失败: {}", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取队列基本状态
|
||||
@@ -229,15 +265,23 @@ pub async fn comfyui_v2_get_queue_basic_status(
|
||||
) -> Result<QueueStatusResponse, String> {
|
||||
info!("Command: comfyui_v2_get_queue_basic_status");
|
||||
|
||||
// TODO: 从管理器获取队列状态
|
||||
Ok(QueueStatusResponse {
|
||||
running_count: 0,
|
||||
pending_count: 0,
|
||||
running_tasks: Vec::new(),
|
||||
pending_tasks: Vec::new(),
|
||||
})
|
||||
let manager = state.comfyui_manager.read().await;
|
||||
match manager.get_queue_status().await {
|
||||
Ok(status) => Ok(QueueStatusResponse {
|
||||
running_count: status.running_count,
|
||||
pending_count: status.pending_count,
|
||||
running_tasks: Vec::new(), // TODO: 实现详细任务信息
|
||||
pending_tasks: Vec::new(), // TODO: 实现详细任务信息
|
||||
}),
|
||||
Err(e) => {
|
||||
error!("获取队列状态失败: {}", e);
|
||||
Err(format!("获取队列状态失败: {}", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ==================== 配置管理命令 ====================
|
||||
|
||||
/// 获取 ComfyUI 配置
|
||||
@@ -256,14 +300,17 @@ pub async fn comfyui_v2_get_config(
|
||||
/// 更新 ComfyUI 配置
|
||||
#[tauri::command]
|
||||
pub async fn comfyui_v2_update_config(
|
||||
config: ComfyUIConfig,
|
||||
config: ComfyUIV2Config,
|
||||
state: State<'_, AppState>,
|
||||
) -> Result<String, String> {
|
||||
info!("Command: comfyui_v2_update_config");
|
||||
|
||||
let config_manager = get_config_manager(&state).await?;
|
||||
|
||||
match config_manager.update_comfyui_config(config).await {
|
||||
|
||||
// 转换为 ComfyUIConfig
|
||||
let converted_config = convert_v2_config_to_config(config);
|
||||
|
||||
match config_manager.update_comfyui_config(converted_config).await {
|
||||
Ok(_) => {
|
||||
info!("ComfyUI 配置更新成功");
|
||||
Ok("配置更新成功".to_string())
|
||||
@@ -278,12 +325,14 @@ pub async fn comfyui_v2_update_config(
|
||||
/// 验证配置
|
||||
#[tauri::command]
|
||||
pub async fn comfyui_v2_validate_config(
|
||||
config: ComfyUIConfig,
|
||||
config: ComfyUIV2Config,
|
||||
state: State<'_, AppState>,
|
||||
) -> Result<ValidationResult, String> {
|
||||
info!("Command: comfyui_v2_validate_config");
|
||||
|
||||
let validation = config.validate();
|
||||
// 转换为 ComfyUIConfig 进行验证
|
||||
let converted_config = convert_v2_config_to_config(config);
|
||||
let validation = converted_config.validate();
|
||||
Ok(validation)
|
||||
}
|
||||
|
||||
|
||||
@@ -177,26 +177,28 @@ pub async fn comfyui_v2_cancel_queue_task(
|
||||
Ok("任务已取消".to_string())
|
||||
}
|
||||
|
||||
/// 获取队列状态
|
||||
/// 获取队列状态 (简化版本,用于前端)
|
||||
#[tauri::command]
|
||||
pub async fn comfyui_v2_get_queue_status(
|
||||
state: State<'_, AppState>,
|
||||
) -> Result<QueueStatisticsResponse, String> {
|
||||
) -> Result<serde_json::Value, String> {
|
||||
info!("Command: comfyui_v2_get_queue_status");
|
||||
|
||||
// TODO: 从队列管理器获取状态
|
||||
Ok(QueueStatisticsResponse {
|
||||
total_tasks: 0,
|
||||
pending_tasks: 0,
|
||||
running_tasks: 0,
|
||||
completed_tasks: 0,
|
||||
failed_tasks: 0,
|
||||
average_wait_time: 0.0,
|
||||
average_execution_time: 0.0,
|
||||
throughput: 0.0,
|
||||
by_priority: HashMap::new(),
|
||||
by_type: HashMap::new(),
|
||||
})
|
||||
let manager = state.comfyui_manager.read().await;
|
||||
match manager.get_queue_status().await {
|
||||
Ok(status) => {
|
||||
// 返回前端期望的简单格式
|
||||
Ok(serde_json::json!({
|
||||
"running_count": status.running_count,
|
||||
"pending_count": status.pending_count,
|
||||
"history_count": 0 // TODO: 从历史记录获取
|
||||
}))
|
||||
},
|
||||
Err(e) => {
|
||||
error!("获取队列状态失败: {}", e);
|
||||
Err(format!("获取队列状态失败: {}", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取队列中的任务列表
|
||||
|
||||
@@ -35,6 +35,7 @@ export const ComfyUIConnectionPanel: React.FC<ComfyUIConnectionPanelProps> = ({
|
||||
refreshSystemInfo,
|
||||
refreshQueueStatus,
|
||||
updateConfig,
|
||||
loadConfig,
|
||||
startRealtimeMonitor,
|
||||
subscribeRealtimeEvents,
|
||||
realtimeConnected,
|
||||
@@ -52,6 +53,11 @@ export const ComfyUIConnectionPanel: React.FC<ComfyUIConnectionPanelProps> = ({
|
||||
const [isConnecting, setIsConnecting] = useState(false);
|
||||
const [connectionError, setConnectionError] = useState<string | null>(null);
|
||||
|
||||
// 组件挂载时加载配置
|
||||
useEffect(() => {
|
||||
loadConfig();
|
||||
}, [loadConfig]);
|
||||
|
||||
// 初始化配置表单
|
||||
useEffect(() => {
|
||||
if (config) {
|
||||
@@ -68,7 +74,7 @@ export const ComfyUIConnectionPanel: React.FC<ComfyUIConnectionPanelProps> = ({
|
||||
|
||||
return () => clearInterval(interval);
|
||||
}
|
||||
}, [isConnected, refreshQueueStatus]);
|
||||
}, [isConnected]); // 移除 refreshQueueStatus 依赖,因为它是稳定的 Zustand action
|
||||
|
||||
const handleConnect = async () => {
|
||||
setIsConnecting(true);
|
||||
|
||||
@@ -303,7 +303,7 @@ export const QueueStatusMonitor: React.FC<QueueStatusMonitorProps> = ({
|
||||
<div className="space-y-2">
|
||||
{queueEvents.map((event, index) => (
|
||||
<div
|
||||
key={`${event.timestamp}-${index}`}
|
||||
key={`${event.timestamp}-${event.event_type}-${index}`}
|
||||
className="flex items-center space-x-3 text-sm"
|
||||
>
|
||||
<div className="flex-shrink-0">
|
||||
|
||||
@@ -37,7 +37,7 @@ export const ComfyUIV2Dashboard: React.FC = () => {
|
||||
toast.error('连接断开', 'ComfyUI 服务连接已断开');
|
||||
}
|
||||
}
|
||||
}, [connectionStatus?.connected, isConnected, toast]);
|
||||
}, [connectionStatus?.connected, isConnected]); // 移除 toast 依赖
|
||||
|
||||
const tabs = [
|
||||
{
|
||||
|
||||
@@ -173,7 +173,8 @@ export class ComfyUIV2Service {
|
||||
*/
|
||||
static async connect(config: ComfyUIV2Config): Promise<string> {
|
||||
try {
|
||||
return await invoke<string>('comfyui_v2_connect', { config });
|
||||
const result = await invoke<{connected: boolean, status: string, base_url: string}>('comfyui_v2_connect', { config });
|
||||
return result.connected ? '连接成功' : '连接失败';
|
||||
} catch (error) {
|
||||
console.error('Failed to connect to ComfyUI:', error);
|
||||
throw new Error(`连接 ComfyUI 失败: ${error}`);
|
||||
@@ -260,7 +261,29 @@ export class ComfyUIV2Service {
|
||||
*/
|
||||
static async updateConfig(config: Partial<ComfyUIV2Config>): Promise<string> {
|
||||
try {
|
||||
return await invoke<string>('comfyui_v2_update_config', { config });
|
||||
// 获取当前配置,然后合并新配置
|
||||
let currentConfig: ComfyUIV2Config;
|
||||
try {
|
||||
currentConfig = await this.getConfig();
|
||||
} catch {
|
||||
// 如果获取失败,使用默认配置
|
||||
currentConfig = {
|
||||
base_url: 'http://192.168.0.193:8188',
|
||||
timeout: 30000,
|
||||
retry_attempts: 3,
|
||||
enable_cache: true,
|
||||
max_concurrency: 4,
|
||||
websocket_url: 'ws://192.168.0.193:8188/ws',
|
||||
};
|
||||
}
|
||||
|
||||
// 合并配置
|
||||
const fullConfig: ComfyUIV2Config = {
|
||||
...currentConfig,
|
||||
...config,
|
||||
};
|
||||
|
||||
return await invoke<string>('comfyui_v2_update_config', { config: fullConfig });
|
||||
} catch (error) {
|
||||
console.error('Failed to update config:', error);
|
||||
throw new Error(`更新配置失败: ${error}`);
|
||||
|
||||
@@ -80,6 +80,7 @@ interface ComfyUIV2Actions {
|
||||
refreshConnectionStatus: () => Promise<void>;
|
||||
refreshSystemInfo: () => Promise<void>;
|
||||
refreshQueueStatus: () => Promise<void>;
|
||||
loadConfig: () => Promise<void>;
|
||||
updateConfig: (config: Partial<ComfyUIV2Config>) => Promise<void>;
|
||||
|
||||
// ==================== 工作流管理 ====================
|
||||
@@ -189,13 +190,15 @@ export const useComfyUIV2Store = create<ComfyUIV2Store>()(
|
||||
|
||||
connect: async (config: ComfyUIV2Config) => {
|
||||
try {
|
||||
// 先更新配置,然后连接
|
||||
await ComfyUIV2Service.updateConfig(config);
|
||||
await ComfyUIV2Service.connect(config);
|
||||
set({
|
||||
isConnected: true,
|
||||
set({
|
||||
isConnected: true,
|
||||
config,
|
||||
connectionStatus: await ComfyUIV2Service.getConnectionStatus()
|
||||
});
|
||||
|
||||
|
||||
// 连接成功后加载基础数据
|
||||
const { refreshSystemInfo, refreshQueueStatus, loadWorkflows, loadTemplates } = get();
|
||||
await Promise.all([
|
||||
@@ -257,6 +260,25 @@ export const useComfyUIV2Store = create<ComfyUIV2Store>()(
|
||||
}
|
||||
},
|
||||
|
||||
loadConfig: async () => {
|
||||
try {
|
||||
const config = await ComfyUIV2Service.getConfig();
|
||||
set({ config });
|
||||
} catch (error) {
|
||||
console.error('Failed to load config:', error);
|
||||
// 如果加载失败,使用默认配置
|
||||
const defaultConfig: ComfyUIV2Config = {
|
||||
base_url: 'http://192.168.0.193:8188',
|
||||
timeout: 30000,
|
||||
retry_attempts: 3,
|
||||
enable_cache: true,
|
||||
max_concurrency: 4,
|
||||
websocket_url: 'ws://192.168.0.193:8188/ws',
|
||||
};
|
||||
set({ config: defaultConfig });
|
||||
}
|
||||
},
|
||||
|
||||
updateConfig: async (configUpdate: Partial<ComfyUIV2Config>) => {
|
||||
try {
|
||||
await ComfyUIV2Service.updateConfig(configUpdate);
|
||||
|
||||
@@ -80,6 +80,7 @@ pub struct SystemInfo {
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct DeviceInfo {
|
||||
pub name: String,
|
||||
#[serde(default = "default_device_type")]
|
||||
pub device_type: String,
|
||||
pub vram_total: u64,
|
||||
pub vram_free: u64,
|
||||
@@ -87,6 +88,11 @@ pub struct DeviceInfo {
|
||||
pub torch_vram_free: u64,
|
||||
}
|
||||
|
||||
/// Default device type when not provided by ComfyUI
|
||||
fn default_device_type() -> String {
|
||||
"unknown".to_string()
|
||||
}
|
||||
|
||||
/// Object info response
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct ObjectInfo {
|
||||
|
||||
Reference in New Issue
Block a user