From 9f37802ba7f2592961ee49342ae77339c1ec941b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=90=A6?= Date: Fri, 7 Aug 2026 09:48:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=AD=E8=8D=AF=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BF=AE=E5=A4=8D=E3=80=81=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E7=9A=84=E4=BC=98=E5=8C=96=E3=80=81=E9=98=9F?= =?UTF-8?q?=E5=88=97=E7=9A=84=E4=BC=98=E5=8C=96=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/log/queue-job-business/index.vue | 16 ++ .../src/views/log/queue-job-infra/index.vue | 16 ++ .../views/log/queue-job-monitor/api/index.ts | 85 ++++++ .../components/CategoryPieChart.vue | 48 ++++ .../components/ProbeModal.vue | 99 +++++++ .../components/StatusTrendChart.vue | 66 +++++ .../src/views/log/queue-job-monitor/index.vue | 272 ++++++++++++++++++ .../src/views/log/queue-job/api/index.ts | 48 ++++ .../log/queue-job/components/QueueJobList.vue | 240 ++++++++++++++++ .../log/queue-job/components/detail-modal.vue | 157 ++++++++++ .../log/queue-job/components/op-log-modal.vue | 89 ++++++ .../views/log/queue-job/config/constants.ts | 54 ++++ .../src/views/log/queue-job/config/search.ts | 106 +++++++ .../src/views/log/queue-job/config/table.ts | 84 ++++++ 14 files changed, 1380 insertions(+) create mode 100644 apps/web-antd/src/views/log/queue-job-business/index.vue create mode 100644 apps/web-antd/src/views/log/queue-job-infra/index.vue create mode 100644 apps/web-antd/src/views/log/queue-job-monitor/api/index.ts create mode 100644 apps/web-antd/src/views/log/queue-job-monitor/components/CategoryPieChart.vue create mode 100644 apps/web-antd/src/views/log/queue-job-monitor/components/ProbeModal.vue create mode 100644 apps/web-antd/src/views/log/queue-job-monitor/components/StatusTrendChart.vue create mode 100644 apps/web-antd/src/views/log/queue-job-monitor/index.vue create mode 100644 apps/web-antd/src/views/log/queue-job/api/index.ts create mode 100644 apps/web-antd/src/views/log/queue-job/components/QueueJobList.vue create mode 100644 apps/web-antd/src/views/log/queue-job/components/detail-modal.vue create mode 100644 apps/web-antd/src/views/log/queue-job/components/op-log-modal.vue create mode 100644 apps/web-antd/src/views/log/queue-job/config/constants.ts create mode 100644 apps/web-antd/src/views/log/queue-job/config/search.ts create mode 100644 apps/web-antd/src/views/log/queue-job/config/table.ts diff --git a/apps/web-antd/src/views/log/queue-job-business/index.vue b/apps/web-antd/src/views/log/queue-job-business/index.vue new file mode 100644 index 00000000..7e5d0cf9 --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job-business/index.vue @@ -0,0 +1,16 @@ + + + diff --git a/apps/web-antd/src/views/log/queue-job-infra/index.vue b/apps/web-antd/src/views/log/queue-job-infra/index.vue new file mode 100644 index 00000000..cd0251fc --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job-infra/index.vue @@ -0,0 +1,16 @@ + + + diff --git a/apps/web-antd/src/views/log/queue-job-monitor/api/index.ts b/apps/web-antd/src/views/log/queue-job-monitor/api/index.ts new file mode 100644 index 00000000..03de4237 --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job-monitor/api/index.ts @@ -0,0 +1,85 @@ +/** + * 队列任务监控大屏 API + */ +import { requestClient } from '#/api/request'; + +const prefix = 'queue-job/'; + +export type QueueJobMonitorSummary = { + total: number; + pending: number; + pending_total: number; + delayed: number; + running: number; + success: number; + failed: number; + cancelled: number; + fail_rate: number | null; +}; + +export type QueueJobMonitorTrendItem = { + label: string; + start_at: number; + created: number; + success: number; + failed: number; +}; + +export type QueueJobMonitorResult = { + now: number; + hours: number; + summary: QueueJobMonitorSummary; + by_category: Array<{ + category: number; + category_txt: string; + total: number; + pending: number; + running: number; + success: number; + failed: number; + }>; + trend: QueueJobMonitorTrendItem[]; + top_failed_jobs: Array<{ + job_name: string; + label: string; + count: number; + }>; + recent_failures: Array<{ + id: number; + title: string; + job_name: string; + job_name_txt: string; + category: number; + category_txt: string; + error_message: string; + updated_at: string | number; + created_at: string | number; + }>; +}; + +/** + * 拉取监控统计;hours 为趋势窗口(默认 24) + */ +export async function getQueueJobStats(hours = 24) { + return requestClient.get(`${prefix}stats`, { + params: { hours }, + }); +} + +export type QueueJobProbeResult = { + normal_id: number; + delayed_id: number; + fail_id: number; + delay_seconds: number; + available_at: number; +}; + +/** + * 超管测试探针:普通 / 延迟 / 失败 各投一条 + */ +export async function createQueueJobProbe(data: { + delay_amount: number; + delay_unit: 'second' | 'minute' | 'hour' | 'day'; +}) { + return requestClient.post(`${prefix}create-probe`, data); +} diff --git a/apps/web-antd/src/views/log/queue-job-monitor/components/CategoryPieChart.vue b/apps/web-antd/src/views/log/queue-job-monitor/components/CategoryPieChart.vue new file mode 100644 index 00000000..b6514567 --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job-monitor/components/CategoryPieChart.vue @@ -0,0 +1,48 @@ + + + diff --git a/apps/web-antd/src/views/log/queue-job-monitor/components/ProbeModal.vue b/apps/web-antd/src/views/log/queue-job-monitor/components/ProbeModal.vue new file mode 100644 index 00000000..0235e396 --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job-monitor/components/ProbeModal.vue @@ -0,0 +1,99 @@ + + + diff --git a/apps/web-antd/src/views/log/queue-job-monitor/components/StatusTrendChart.vue b/apps/web-antd/src/views/log/queue-job-monitor/components/StatusTrendChart.vue new file mode 100644 index 00000000..4a78a4ce --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job-monitor/components/StatusTrendChart.vue @@ -0,0 +1,66 @@ + + + diff --git a/apps/web-antd/src/views/log/queue-job-monitor/index.vue b/apps/web-antd/src/views/log/queue-job-monitor/index.vue new file mode 100644 index 00000000..235767e6 --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job-monitor/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/apps/web-antd/src/views/log/queue-job/api/index.ts b/apps/web-antd/src/views/log/queue-job/api/index.ts new file mode 100644 index 00000000..0ea30e87 --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job/api/index.ts @@ -0,0 +1,48 @@ +/** + * 队列任务管理 API(业务/基础设施共用,靠 category 区分) + */ +import { requestClient } from '#/api/request'; + +const prefix = 'queue-job/'; + +export async function getQueueJobList(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +export async function getQueueJobDetail(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 某任务的取消/重跑操作记录 + */ +export async function getQueueJobOpLogList(id: number) { + return requestClient.get(`${prefix}op-log-list`, { params: { id } }); +} + +export async function getQueueJobStatusOption() { + return requestClient.get<{ value: number; label: string }[]>( + `${prefix}status-option`, + ); +} + +export async function getQueueJobNameOption(category: number) { + return requestClient.get<{ value: string; label: string }[]>( + `${prefix}job-name-option`, + { params: { category } }, + ); +} + +/** + * 取消排队中任务 + */ +export async function cancelQueueJob(id: number) { + return requestClient.post(`${prefix}cancel`, { id }); +} + +/** + * 失败/取消后重跑 + */ +export async function retryQueueJob(id: number) { + return requestClient.post(`${prefix}retry`, { id }); +} diff --git a/apps/web-antd/src/views/log/queue-job/components/QueueJobList.vue b/apps/web-antd/src/views/log/queue-job/components/QueueJobList.vue new file mode 100644 index 00000000..9c02c91c --- /dev/null +++ b/apps/web-antd/src/views/log/queue-job/components/QueueJobList.vue @@ -0,0 +1,240 @@ + + +