import { useMemo, useState } from "react"; import type { ImportHistoryItem } from "../types"; import { formatSystemTime } from "../utils/time"; type Props = { isImportingAlarm: boolean; alarmImportStatus: string; isImportingLogs: boolean; logsImportStatus: string; history: ImportHistoryItem[]; onImportAlarmExcel: (file: File | null) => void; onImportLogs: (file: File | null) => void; onOpenBatch: (batchId: string) => void; }; export function IngestPage({ isImportingAlarm, alarmImportStatus, isImportingLogs, logsImportStatus, history, onImportAlarmExcel, onImportLogs, onOpenBatch, }: Props) { const [alarmFileName, setAlarmFileName] = useState(""); const [logFileName, setLogFileName] = useState(""); const items = useMemo(() => history.slice().sort((a, b) => b.ts_ms - a.ts_ms).slice(0, 10), [history]); return ( <>

数据接入中心

这里是 netx 的主页入口:导入告警 / 日志 / 配置等数据,后续扩展作业化能力。

告警导入(Excel)

{ const f = e.target.files?.[0] || null; setAlarmFileName(f?.name || ""); onImportAlarmExcel(f); }} />
{alarmFileName ? `已选择:${alarmFileName}` : "选择 Excel 后自动上传导入"}
{alarmImportStatus}

日志导入(预留)

{ const f = e.target.files?.[0] || null; setLogFileName(f?.name || ""); onImportLogs(f); }} />
{logFileName ? `已选择:${logFileName}` : "选择日志文件后上传(当前仅占位接口)"}
{logsImportStatus}

配置导入(预留)

后续接入:配置采集/割接对比/配置诊断。

最近导入

{items.map((x) => ( ))} {items.length === 0 && ( )}
time kind file result batch
{formatSystemTime(x.ts_ms)} {x.kind} {x.file_name} {x.ok ? "ok" : "error"} {x.batch_id ? ( ) : ( "-" )}
暂无导入记录
); }