Files
SenMeshNet/electron/bridges/inspection/inspectionResultStore.cjs

130 lines
3.0 KiB
JavaScript
Raw Normal View History

"use strict";
/**
* 巡检结果存储
*
* 保存每次巡检的结果数据,支持按设备查询历史。
* 为避免数据量过大,仅保留最近 N 条记录(默认 1000 条)。
*/
const { STORAGE_KEY_INSPECTION_RESULTS } = require("./storageKeys.cjs");
const { INSPECTION_STATUS } = require("./types.cjs");
const MAX_RESULTS = 10000;
let _results = null;
function _ensureLoaded(readFn) {
if (_results === null) {
const raw = readFn(STORAGE_KEY_INSPECTION_RESULTS);
_results = raw ? _safeParse(raw, []) : [];
}
}
function _safeParse(text, def) {
if (text === null || text === undefined) return def;
if (typeof text === "object") return text;
try { return JSON.parse(text); }
catch { return def; }
}
function _save(writeFn) {
if (_results.length > MAX_RESULTS) {
_results = _results.slice(-MAX_RESULTS);
}
writeFn(STORAGE_KEY_INSPECTION_RESULTS, JSON.stringify(_results));
}
// ---------- 增删改查 ----------
/**
* 新增一条巡检结果
*/
function addResult(readFn, writeFn, result) {
_ensureLoaded(readFn);
const record = {
id: `result_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
job_id: result.job_id || null,
device_id: result.device_id, // host_id
catalog_id: result.catalog_id || null,
timestamp: Date.now(),
online: result.online,
status: result.status || INSPECTION_STATUS.SUCCESS,
duration_ms: result.duration_ms || 0,
metrics: result.metrics || {},
alerts: result.alerts || [],
error_message: result.error_message || null,
};
_results.push(record);
_save(writeFn);
return { ...record };
}
/**
* 获取指定设备的最近巡检结果
*/
function getLatestByDevice(readFn, hostId, limit = 20) {
_ensureLoaded(readFn);
return _results
.filter((r) => r.device_id === hostId)
.sort((a, b) => b.timestamp - a.timestamp)
.slice(0, limit);
}
/**
* 获取所有设备的最新一次巡检结果
*/
function getLatestAll(readFn) {
_ensureLoaded(readFn);
const latest = {};
for (const r of _results) {
if (!latest[r.device_id] || r.timestamp > latest[r.device_id].timestamp) {
latest[r.device_id] = r;
}
}
return Object.values(latest);
}
/**
* 获取最近 N 条结果
*/
function getRecent(readFn, limit = 50) {
_ensureLoaded(readFn);
return [..._results].sort((a, b) => b.timestamp - a.timestamp).slice(0, limit);
}
/**
* 根据时间范围查询
*/
function getByTimeRange(readFn, startTime, endTime) {
_ensureLoaded(readFn);
return _results.filter(
(r) => r.timestamp >= startTime && r.timestamp <= endTime
).sort((a, b) => b.timestamp - a.timestamp);
}
/**
* 清空结果(手动清理)
*/
function clearResults(readFn, writeFn) {
_results = [];
_save(writeFn);
}
// ---------- 重置(测试用) ----------
function _resetForTest() {
_results = null;
}
module.exports = {
addResult,
getLatestByDevice,
getLatestAll,
getRecent,
getByTimeRange,
clearResults,
_resetForTest,
};