// dataCache.js - 透析机数据缓存管理 const logger = require('./logger'); class DataCache { constructor() { // 使用 Map 存储,key 是设备序号 (masData.n),value 是最新数据 this.cache = new Map(); // 记录每个设备的更新时间,用于监控 this.updateTimes = new Map(); } /** * 存储或更新设备数据 * @param {string} deviceNumber - 设备序号 (masData.n) * @param {object} data - 完整的设备数据对象 */ setDeviceData(deviceNumber, data) { if (!deviceNumber) { logger.warn('设备序号为空,无法缓存数据'); return false; } try { this.cache.set(deviceNumber, { ...data, _cachedAt: new Date().toISOString() }); this.updateTimes.set(deviceNumber, Date.now()); logger.info(`✅ 数据缓存更新: 设备 ${deviceNumber}`); return true; } catch (err) { logger.error(`缓存数据失败 (${deviceNumber}):`, err.message); return false; } } /** * 获取指定设备的最新数据 * @param {string} deviceNumber - 设备序号 * @returns {object|null} 设备数据或 null */ getDeviceData(deviceNumber) { const data = this.cache.get(deviceNumber); if (!data) { logger.warn(`未找到设备 ${deviceNumber} 的缓存数据`); return null; } logger.info(`📖 读取缓存数据: 设备 ${deviceNumber}`); return data; } /** * 获取所有设备的数据 * @returns {object} 所有设备的数据字典 */ getAllDeviceData() { const result = {}; for (const [key, value] of this.cache.entries()) { result[key] = value; } return result; } /** * 获取所有设备的列表(仅包含设备号和最后更新时间) * @returns {array} 设备列表 */ getDeviceList() { const list = []; for (const [deviceNumber, data] of this.cache.entries()) { list.push({ deviceNumber: deviceNumber, lastUpdate: data._cachedAt, }); } return list; } /** * 检查设备是否存在 * @param {string} deviceNumber - 设备序号 * @returns {boolean} */ hasDevice(deviceNumber) { return this.cache.has(deviceNumber); } /** * 删除指定设备的缓存 * @param {string} deviceNumber - 设备序号 * @returns {boolean} */ deleteDeviceData(deviceNumber) { const result = this.cache.delete(deviceNumber); this.updateTimes.delete(deviceNumber); if (result) { logger.info(`🗑️ 删除缓存数据: 设备 ${deviceNumber}`); } return result; } /** * 清空所有缓存 */ clearAll() { const count = this.cache.size; this.cache.clear(); this.updateTimes.clear(); logger.info(`🗑️ 已清空所有缓存数据 (共 ${count} 个设备)`); } /** * 获取缓存统计信息 * @returns {object} */ getStats() { const deviceCount = this.cache.size; const memoryUsage = JSON.stringify(this.getAllDeviceData()).length; return { deviceCount: deviceCount, memoryUsage: `${(memoryUsage / 1024).toFixed(2)} KB`, devices: this.getDeviceList() }; } /** * 获取指定时间范围内未更新的设备列表 * @param {number} timeoutMs - 超时时间(毫秒) * @returns {array} 超时的设备列表 */ getIdleDevices(timeoutMs = 300000) { // 默认 5 分钟 const now = Date.now(); const idleDevices = []; for (const [deviceNumber, updateTime] of this.updateTimes.entries()) { if (now - updateTime > timeoutMs) { idleDevices.push({ deviceNumber: deviceNumber, idleTime: now - updateTime }); } } return idleDevices; } } // 导出单例 module.exports = new DataCache();