import { useState } from 'react' import { useQuery, useQueryClient } from '@tanstack/react-query' import { Table, Tag, Button, Typography, App, Space, Badge } from 'antd' import { ReloadOutlined, RetweetOutlined, CloudServerOutlined } from '@ant-design/icons' import { getQueueOverview, getFailedJobs, retryJob } from '@/services/events-api' const { Title, Text } = Typography function EventsPage() { const { message } = App.useApp() const qc = useQueryClient() const [selectedQueue, setSelectedQueue] = useState(null) const { data: overview } = useQuery({ queryKey: ['events', 'overview'], queryFn: getQueueOverview, staleTime: 10_000 }) const { data: failed } = useQuery({ queryKey: ['events', 'failed', selectedQueue], queryFn: () => selectedQueue ? getFailedJobs(selectedQueue) : null, enabled: !!selectedQueue, }) const handleRetry = async (queue: string, jobId: string) => { await retryJob(queue, jobId) message.success('已重试') qc.invalidateQueries({ queryKey: ['events'] }) } const overviewColumns = [ { title: '队列', dataIndex: 'name', width: 160 }, { title: '总计', dataIndex: 'total', width: 60, align: 'center' as const }, { title: '等待', dataIndex: 'waiting', width: 60, align: 'center' as const, render: (v: number) => }, { title: '进行中', dataIndex: 'active', width: 70, align: 'center' as const, render: (v: number) => }, { title: '完成', dataIndex: 'completed', width: 60, align: 'center' as const, render: (v: number) => {v} }, { title: '失败', dataIndex: 'failed', width: 60, align: 'center' as const, render: (v: number, r: any) => ( v > 0 ? : 0 )}, { title: '延迟', dataIndex: 'delayed', width: 60, align: 'center' as const }, ] const failedColumns = [ { title: 'Job ID', dataIndex: 'id', width: 160, ellipsis: true }, { title: '名称', dataIndex: 'name', width: 150 }, { title: '重试', dataIndex: 'attemptsMade', width: 60, align: 'center' as const }, { title: '失败原因', dataIndex: 'failedReason', ellipsis: true }, { title: '操作', width: 80, render: (_: any, r: any) => ( )}, ] return (
<CloudServerOutlined /> 事件队列
{selectedQueue && ( <>
失败任务 · {selectedQueue}
)} ) } export default EventsPage