2026-10-15 13:53:04 +08:00
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 巡检模块主进程存储适配器
|
|
|
|
|
|
*
|
|
|
|
|
|
* 使用 userData 目录下的 JSON 文件存储巡检相关数据(设备配置、告警规则、巡检结果等)。
|
|
|
|
|
|
* 提供与 localStorage 类似的 key-value 接口,方便注入到 store 模块。
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
const fs = require("node:fs");
|
|
|
|
|
|
const path = require("node:path");
|
|
|
|
|
|
|
|
|
|
|
|
const STORAGE_FILENAME = "inspection-data.json";
|
|
|
|
|
|
let _storageCache = null;
|
|
|
|
|
|
let _filePath = null;
|
|
|
|
|
|
let _dirty = false;
|
|
|
|
|
|
let _saveTimer = null;
|
|
|
|
|
|
|
|
|
|
|
|
function init(userDataDir) {
|
|
|
|
|
|
_filePath = path.join(userDataDir, STORAGE_FILENAME);
|
|
|
|
|
|
_loadFromDisk();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function _loadFromDisk() {
|
|
|
|
|
|
if (!_filePath) {
|
|
|
|
|
|
_storageCache = {};
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
|
|
|
if (fs.existsSync(_filePath)) {
|
|
|
|
|
|
const raw = fs.readFileSync(_filePath, "utf-8");
|
|
|
|
|
|
_storageCache = JSON.parse(raw);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
_storageCache = {};
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("[Inspection Storage] 加载失败:", e?.message);
|
|
|
|
|
|
_storageCache = {};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function _scheduleSave() {
|
|
|
|
|
|
if (_saveTimer) return;
|
|
|
|
|
|
_saveTimer = setTimeout(() => {
|
|
|
|
|
|
_saveTimer = null;
|
|
|
|
|
|
_flushToDisk();
|
|
|
|
|
|
}, 200);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function _flushToDisk() {
|
|
|
|
|
|
if (!_filePath || !_dirty) return;
|
|
|
|
|
|
try {
|
|
|
|
|
|
const dir = path.dirname(_filePath);
|
|
|
|
|
|
if (!fs.existsSync(dir)) {
|
|
|
|
|
|
fs.mkdirSync(dir, { recursive: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
fs.writeFileSync(_filePath, JSON.stringify(_storageCache, null, 2), "utf-8");
|
|
|
|
|
|
_dirty = false;
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.error("[Inspection Storage] 保存失败:", e?.message);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function readStorage(key) {
|
|
|
|
|
|
if (!_storageCache) _loadFromDisk();
|
|
|
|
|
|
return _storageCache[key] ?? null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function writeStorage(key, value) {
|
|
|
|
|
|
if (!_storageCache) _loadFromDisk();
|
|
|
|
|
|
if (value === null || value === undefined) {
|
|
|
|
|
|
delete _storageCache[key];
|
|
|
|
|
|
} else {
|
|
|
|
|
|
_storageCache[key] = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
_dirty = true;
|
|
|
|
|
|
_scheduleSave();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function flushSync() {
|
|
|
|
|
|
_flushToDisk();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-19 21:11:57 +08:00
|
|
|
|
function resetCache() {
|
|
|
|
|
|
// 先确保内存中的修改已写到磁盘(200ms 异步保存可能还没触发)
|
|
|
|
|
|
_flushToDisk();
|
|
|
|
|
|
_storageCache = null;
|
|
|
|
|
|
_loadFromDisk();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-15 13:53:04 +08:00
|
|
|
|
module.exports = {
|
|
|
|
|
|
init,
|
|
|
|
|
|
readStorage,
|
|
|
|
|
|
writeStorage,
|
|
|
|
|
|
flushSync,
|
2026-10-19 21:11:57 +08:00
|
|
|
|
resetCache,
|
2026-10-15 13:53:04 +08:00
|
|
|
|
};
|