From 0dc0e4ecdcae2b357a991913e9d3c78c55ec8896 Mon Sep 17 00:00:00 2001 From: yexb <553699424@qq.com> Date: Thu, 30 Apr 2026 09:04:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(tools):=20=E6=96=B0=E5=A2=9E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A1=A5=E6=95=B0=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现补数任务面板组件,支持监测点ID输入、时间范围选择和时间步长设置 - 添加任务状态卡片组件,实时展示任务执行进度和结果统计 - 集成参数规则表格组件,显示后端配置的模板规则信息 - 实现补数API接口服务,包括预估写入量、创建任务和查询状态功能 - 添加磁盘监控策略对话框组件,支持全局监控配置管理 - 完成补数功能页面布局设计,集成左右双栏界面结构 - 实现任务轮询机制,自动更新任务执行状态直到完成 - 添加表单验证逻辑,确保输入参数符合业务规则要求 --- frontend/src/api/tools/addData/index.ts | 98 ++++ .../src/api/tools/addData/interface/index.ts | 109 ++++ .../components/DiskMonitorPolicyDialog.vue | 149 +++++ .../addData/components/AddDataTaskPanel.vue | 526 ++++++++++++++++++ .../components/AddDataTaskStatusCard.vue | 193 +++++++ .../components/AddDataTemplateTable.vue | 109 ++++ frontend/src/views/tools/addData/index.vue | 465 ++++++++++++++++ 7 files changed, 1649 insertions(+) create mode 100644 frontend/src/api/tools/addData/index.ts create mode 100644 frontend/src/api/tools/addData/interface/index.ts create mode 100644 frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorPolicyDialog.vue create mode 100644 frontend/src/views/tools/addData/components/AddDataTaskPanel.vue create mode 100644 frontend/src/views/tools/addData/components/AddDataTaskStatusCard.vue create mode 100644 frontend/src/views/tools/addData/components/AddDataTemplateTable.vue create mode 100644 frontend/src/views/tools/addData/index.vue diff --git a/frontend/src/api/tools/addData/index.ts b/frontend/src/api/tools/addData/index.ts new file mode 100644 index 0000000..250e8ce --- /dev/null +++ b/frontend/src/api/tools/addData/index.ts @@ -0,0 +1,98 @@ +import http from '@/api' +import type { ResultData } from '@/api/interface' +import type { AddData } from './interface' + +type AddDataRequestMethod = 'get' | 'post' + +const ADD_DATA_ROUTE_PATHS = ['/addData', '/api/addData'] as const +const ADD_DATA_BASE_URL = String(import.meta.env.VITE_API_URL || '').trim() + +const resolveDevProxyTarget = () => { + const proxyConfig = import.meta.env.VITE_PROXY + if (!Array.isArray(proxyConfig)) return '' + + const matchedProxy = proxyConfig.find(item => Array.isArray(item) && item[0] === '/api') + if (!matchedProxy?.[1]) return '' + + return String(matchedProxy[1]).replace(/\/+$/, '') +} + +const buildAddDataRequestPaths = (path: string) => { + const requestPaths = new Set() + const devProxyTarget = resolveDevProxyTarget() + + for (const routePath of ADD_DATA_ROUTE_PATHS) { + if (ADD_DATA_BASE_URL === '/api' && routePath.startsWith('/api/')) { + if (devProxyTarget) { + requestPaths.add(`${devProxyTarget}${routePath}${path}`) + } + + requestPaths.add(`${window.location.origin}${routePath}${path}`) + continue + } + + requestPaths.add(`${routePath}${path}`) + } + + return Array.from(requestPaths) +} + +const isFallbackableAddDataError = (error: unknown) => { + const responseCode = typeof error === 'object' && error !== null && 'code' in error ? String(error.code) : '' + const responseMessage = typeof error === 'object' && error !== null && 'message' in error ? String(error.message) : '' + const normalizedMessage = responseMessage.toLowerCase() + + // 部分部署环境会把未命中的 addData 路由转到旧的操作分发入口, + // 前端在识别到“unknown operate”或典型路由错误时回退到备用前缀重试一次。 + return ( + responseCode === '404' || + normalizedMessage.includes('unknown operate') || + normalizedMessage.includes('not found') || + normalizedMessage.includes('no handler found') + ) +} + +const requestAddData = async ( + method: AddDataRequestMethod, + path: string, + params?: object +): Promise> => { + let lastError: unknown + const requestPaths = buildAddDataRequestPaths(path) + + for (let index = 0; index < requestPaths.length; index += 1) { + const requestPath = requestPaths[index] + + try { + if (method === 'get') { + return await http.get(requestPath) + } + + return await http.post(requestPath, params) + } catch (error) { + lastError = error + + if (index === requestPaths.length - 1 || !isFallbackableAddDataError(error)) { + throw error + } + } + } + + throw lastError +} + +export const getAddDataPreview = (params: AddData.TaskRequestParams) => { + return requestAddData('post', '/task/preview', params) +} + +export const createAddDataTask = (params: AddData.TaskRequestParams) => { + return requestAddData('post', '/task/create', params) +} + +export const getAddDataTaskStatus = (taskId: string | number) => { + return requestAddData('get', `/task/status/${taskId}`) +} + +export const getAddDataTemplateList = () => { + return requestAddData('get', '/template/list') +} diff --git a/frontend/src/api/tools/addData/interface/index.ts b/frontend/src/api/tools/addData/interface/index.ts new file mode 100644 index 0000000..c626e9a --- /dev/null +++ b/frontend/src/api/tools/addData/interface/index.ts @@ -0,0 +1,109 @@ +export namespace AddData { + export type LineMode = 'single' | 'multiple' + export type IntervalMinutes = 1 | 3 | 5 | 10 + export type TaskStatus = 'WAITING' | 'RUNNING' | 'SUCCESS' | 'FAILED' | (string & {}) + + export interface TaskRequestParams { + lineIds: string[] + startTime: string + endTime: string + intervalMinutes: IntervalMinutes + } + + export interface TaskFormModel { + lineMode: LineMode + lineIds: string[] + startTime: string + endTime: string + intervalMinutes: IntervalMinutes + } + + export interface PreviewTableStat { + tableName?: string + timePointCount?: number | string + phaseCount?: number | string + rowCount?: number | string + } + + export interface PreviewResponse { + lineCount?: number | string + intervalMinutes?: number | string + totalRowCount?: number | string + tableStats?: PreviewTableStat[] + } + + export interface CreateTaskResponse { + taskId?: string | number + status?: TaskStatus + } + + export interface TaskStatusResponse { + taskId?: string + status?: TaskStatus + currentTableName?: string + currentBatchInfo?: string + insertedCount?: number | string + skippedCount?: number | string + failedCount?: number | string + failureReason?: string + startTime?: string + endTime?: string + hourlyTimeResults?: string[] + } + + export interface TemplateItem { + parameterName?: string + tableName?: string + phaseDisplay?: string + phaseCodes?: string[] + display?: boolean + showQualified?: boolean + maxValueRule?: string + minValueRule?: string + averageValueRule?: string + cp95ValueRule?: string + decimalScale?: number | string + } + + export interface PreviewTableSummary { + tableName: string + timePointCount: number + phaseCount: number + rowCount: number + } + + export interface NormalizedPreview { + lineCount: number + intervalMinutes: number + totalRowCount: number + tableStats: PreviewTableSummary[] + } + + export interface NormalizedTaskStatus { + taskId: string + status: TaskStatus + currentTableName: string + currentBatchInfo: string + insertedCount: number + skippedCount: number + failedCount: number + failureReason: string + hourlyTimeResults: string[] + startTime: string + endTime: string + } + + export interface NormalizedTemplateItem { + parameterName: string + tableName: string + phaseDisplay: string + phaseCodesText: string + displayText: string + showQualifiedText: string + maxValueRule: string + minValueRule: string + averageValueRule: string + cp95ValueRule: string + decimalScaleText: string + } +} diff --git a/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorPolicyDialog.vue b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorPolicyDialog.vue new file mode 100644 index 0000000..8f82627 --- /dev/null +++ b/frontend/src/views/systemMonitor/diskMonitor/components/DiskMonitorPolicyDialog.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/frontend/src/views/tools/addData/components/AddDataTaskPanel.vue b/frontend/src/views/tools/addData/components/AddDataTaskPanel.vue new file mode 100644 index 0000000..b5c25a4 --- /dev/null +++ b/frontend/src/views/tools/addData/components/AddDataTaskPanel.vue @@ -0,0 +1,526 @@ + + + + + diff --git a/frontend/src/views/tools/addData/components/AddDataTaskStatusCard.vue b/frontend/src/views/tools/addData/components/AddDataTaskStatusCard.vue new file mode 100644 index 0000000..c587e7a --- /dev/null +++ b/frontend/src/views/tools/addData/components/AddDataTaskStatusCard.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/frontend/src/views/tools/addData/components/AddDataTemplateTable.vue b/frontend/src/views/tools/addData/components/AddDataTemplateTable.vue new file mode 100644 index 0000000..791a711 --- /dev/null +++ b/frontend/src/views/tools/addData/components/AddDataTemplateTable.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/frontend/src/views/tools/addData/index.vue b/frontend/src/views/tools/addData/index.vue new file mode 100644 index 0000000..05487a5 --- /dev/null +++ b/frontend/src/views/tools/addData/index.vue @@ -0,0 +1,465 @@ + + + + +