+
+
事件队列
+ } onClick={() => qc.invalidateQueries({ queryKey: ['events'] })}>刷新
+
+
+
+
+ {selectedQueue && (
+ <>
+
+
失败任务 · {selectedQueue}
+
+
+
+ >
+ )}
+
+ )
+}
+
+export default EventsPage
diff --git a/src/services/events-api.ts b/src/services/events-api.ts
new file mode 100644
index 0000000..43e2152
--- /dev/null
+++ b/src/services/events-api.ts
@@ -0,0 +1,10 @@
+import { api } from './http-client'
+
+export interface QueueInfo { name: string; waiting: number; active: number; completed: number; failed: number; delayed: number; total: number }
+export interface FailedJob { id: string; name: string; timestamp: number; attemptsMade: number; failedReason?: string }
+export interface JobDetail extends FailedJob { state: string; data: any; stacktrace?: string[] }
+
+export function getQueueOverview(): Promise<{ queues: QueueInfo[] }> { return api.get('/admin-api/events') }
+export function getFailedJobs(queue: string): Promise<{ jobs: FailedJob[] }> { return api.get(`/admin-api/events/${queue}/failed`) }
+export function getJobDetail(queue: string, jobId: string): Promise