东丽网口版透析机 socket- server 通讯
chenyc
2025-12-09 7cfe3332f016d7def7ca8ad25ed8bbdc33d23ed2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// 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();