'use client'; import React, { useState } from 'react'; import { MessageQueueStatus } from '@/api/video_flow'; import { cn } from '@/public/lib/utils'; interface MessageQueuePanelProps { queueStatus: MessageQueueStatus[]; onRestartQueue: (queueName: string) => Promise; } export default function MessageQueuePanel({ queueStatus, onRestartQueue }: MessageQueuePanelProps) { const [restartingQueues, setRestartingQueues] = useState>(new Set()); const handleRestart = async (queueName: string) => { if (restartingQueues.has(queueName)) return; setRestartingQueues(prev => new Set(prev).add(queueName)); try { await onRestartQueue(queueName); } finally { setRestartingQueues(prev => { const newSet = new Set(prev); newSet.delete(queueName); return newSet; }); } }; const getStatusColor = (status: MessageQueueStatus['status']) => { switch (status) { case 'healthy': return 'text-emerald-400 bg-emerald-500/10 border-emerald-500/20'; case 'warning': return 'text-yellow-400 bg-yellow-500/10 border-yellow-500/20'; case 'error': return 'text-red-400 bg-red-500/10 border-red-500/20'; default: return 'text-gray-400 bg-gray-500/10 border-gray-500/20'; } }; const getStatusIcon = (status: MessageQueueStatus['status']) => { switch (status) { case 'healthy': return '✅'; case 'warning': return '⚠️'; case 'error': return '❌'; default: return '❓'; } }; const getStatusText = (status: MessageQueueStatus['status']) => { switch (status) { case 'healthy': return '健康'; case 'warning': return '警告'; case 'error': return '错误'; default: return '未知'; } }; // 计算整体健康度 const overallHealth = React.useMemo(() => { if (queueStatus.length === 0) return { status: 'unknown', percentage: 0 }; const healthyCount = queueStatus.filter(q => q.status === 'healthy').length; const warningCount = queueStatus.filter(q => q.status === 'warning').length; const errorCount = queueStatus.filter(q => q.status === 'error').length; const percentage = (healthyCount / queueStatus.length) * 100; if (errorCount > 0) return { status: 'error', percentage }; if (warningCount > 0) return { status: 'warning', percentage }; return { status: 'healthy', percentage }; }, [queueStatus]); return (
{/* 消息队列总览 */}

消息队列监控

{queueStatus.length} 个队列
{/* 整体健康度指示器 */}
系统健康度 {overallHealth.percentage.toFixed(0)}%
{/* 队列列表 */} {queueStatus.length === 0 ? (
🔄
暂无队列数据
) : (
{queueStatus.map((queue, index) => (
{getStatusIcon(queue.status)}
{queue.queue_name}
{getStatusText(queue.status)}
消息数量
{queue.message_count.toLocaleString()}
消费者
{queue.consumer_count}
最后心跳: {new Date(queue.last_heartbeat).toLocaleString()}
{queue.error_message && (
{queue.error_message}
)}
))}
)}
{/* 快速操作面板 */}

快速操作

• 健康队列无需重启
• 重启操作会中断当前处理
• 建议在低峰期执行批量重启
{/* 队列统计 */}

队列统计

{queueStatus.filter(q => q.status === 'healthy').length}
健康队列
{queueStatus.filter(q => q.status === 'error').length}
异常队列
{queueStatus.reduce((sum, q) => sum + q.message_count, 0).toLocaleString()}
总消息数
); }