Device.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. const db = require('../config/db');
  2. const logger = require('../logger');
  3. class Device {
  4. // 插入新设备
  5. static insert(device_id, status, last_seen, first_online_time, last_online_time, ip_address, callback) {
  6. const sql = `
  7. INSERT INTO devices (device_id, status, last_seen, first_online_time, last_online_time, ip_address)
  8. VALUES (?, ?, ?, ?, ?, ?)
  9. `;
  10. logger.info(`插入新设备: ${device_id}`);
  11. const devicesSql = `/* 原有SQL语句保持不变 */`;
  12. db.query(devicesSql, [device_id, status, last_seen, first_online_time, last_online_time, ip_address], (err, result) => {
  13. if (err) {
  14. logger.error('插入新设备失败:', err);
  15. return callback(err);
  16. }
  17. // 新增relay_state表插入(初始化默认房间信息)
  18. const relaySql = `
  19. INSERT INTO relay_state
  20. (device_id, state, temperature, timestamp, room_number, room_name)
  21. VALUES (?, 'off', NULL, ?, '默认房间号', '默认房间')
  22. `;
  23. db.query(relaySql, [device_id, last_seen], (relayErr) => {
  24. if (relayErr) logger.error('初始化继电器状态失败:', relayErr);
  25. });
  26. callback(null, result);
  27. });
  28. }
  29. // 更新设备上线状态
  30. static updateOnlineStatus(device_id, status, last_seen, first_online_time, last_online_time, ip_address, callback) {
  31. logger.info(`更新设备 ${device_id} 在线状态`);
  32. const sql = `
  33. UPDATE devices
  34. SET
  35. status = ?,
  36. last_seen = ?,
  37. first_online_time = ?,
  38. last_online_time = ?,
  39. ip_address = ?
  40. WHERE device_id = ?
  41. `;
  42. db.query(sql, [status, last_seen, first_online_time, last_online_time, ip_address, device_id], callback);
  43. }
  44. // 更新设备下线状态
  45. static updateOfflineStatus(device_id, status, last_seen, last_offline_time, callback) {
  46. const sql = `
  47. UPDATE devices
  48. SET
  49. status = ?,
  50. last_seen = ?,
  51. last_offline_time = ?
  52. WHERE device_id = ?
  53. `;
  54. db.query(sql, [status, last_seen, last_offline_time, device_id], callback);
  55. }
  56. // 修改updateTemperature方法参数处理
  57. static updateTemperature(device_id, temperature, upload_time, room_number, room_name, callback = () => {}) {
  58. logger.info(`更新设备温度: 设备ID=${device_id}, 温度=${temperature}`);
  59. const sql = `
  60. UPDATE devices
  61. SET temperature = ?, upload_time = ?
  62. WHERE device_id = ?
  63. `;
  64. db.query(sql, [temperature, upload_time, device_id], (err, results) => {
  65. if (err) {
  66. logger.error(`更新设备温度失败: 设备ID=${device_id}, 错误: ${err}`);
  67. return callback(err);
  68. }
  69. // 新增relay_state插入(添加默认回调)
  70. const relaySql = `
  71. INSERT INTO relay_state
  72. (device_id, temperature, timestamp, room_number, room_name)
  73. VALUES (?, ?, ?, ?, ?)
  74. `;
  75. db.query(relaySql, [device_id, temperature, upload_time, room_number, room_name], (relayErr) => {
  76. if (relayErr) {
  77. logger.error(`温度记录失败: ${device_id}`);
  78. }
  79. callback(null, results); // 确保在此处调用回调
  80. });
  81. });
  82. }
  83. // 只更新开关状态和开关状态时间
  84. static updateSwitchStatus(device_id, switch_status, switch_status_time, callback) {
  85. logger.info(`更新设备开关状态: 设备ID=${device_id}, 状态=${switch_status}`);
  86. const sql = `
  87. UPDATE devices
  88. SET switch_status = ?, switch_status_time = ?
  89. WHERE device_id = ?
  90. `;
  91. db.query(sql, [switch_status, switch_status_time, device_id], (err, results) => {
  92. if (err) {
  93. logger.error(`更新设备开关状态失败: 设备ID=${device_id}, 错误: ${err}`);
  94. return callback(err);
  95. }
  96. // 新增relay_state更新
  97. const relaySql = `
  98. UPDATE relay_state
  99. SET switch_status = ?, update_time = ?
  100. WHERE device_id = ?
  101. `;
  102. db.query(relaySql, [switch_status, switch_status_time, device_id], (relayErr) => {
  103. if (relayErr) {
  104. logger.error(`更新继电器状态失败: ${device_id}`);
  105. }
  106. });
  107. logger.debug(`设备开关状态更新成功: 设备ID=${device_id}`);
  108. callback(null, results);
  109. });
  110. }
  111. static updateTemperature(device_id, temperature, upload_time, callback) {
  112. logger.info(`更新设备温度: 设备ID=${device_id}, 温度=${temperature}`);
  113. const sql = `
  114. UPDATE devices
  115. SET temperature = ?, upload_time = ?
  116. WHERE device_id = ?
  117. `;
  118. db.query(sql, [temperature, upload_time, device_id], (err, results) => {
  119. if (err) {
  120. logger.error(`更新设备温度失败: 设备ID=${device_id}, 错误: ${err}`);
  121. return callback(err);
  122. }
  123. // 新增relay_state更新
  124. const relaySql = `
  125. UPDATE relay_state
  126. SET temperature = ?, update_time = ?
  127. WHERE device_id = ?
  128. `;
  129. db.query(relaySql, [temperature, upload_time, device_id], (relayErr) => {
  130. if (relayErr) {
  131. logger.error(`更新温度记录失败: ${device_id}`);
  132. }
  133. });
  134. logger.debug(`设备温度更新成功: 设备ID=${device_id}`);
  135. callback(null, results);
  136. });
  137. }
  138. // 只更新高低电平状态和高低电平状态时间
  139. static updateLevelStatus(device_id, level_status, level_status_time, callback) {
  140. const sql = `
  141. UPDATE devices
  142. SET level_status = ?, level_status_time = ?
  143. WHERE device_id = ?
  144. `;
  145. db.query(sql, [level_status, level_status_time, device_id], callback);
  146. }
  147. // 例如 getDeviceById 方法
  148. static getDeviceById(device_id, callback) {
  149. const sql = `
  150. SELECT * FROM devices
  151. WHERE device_id = ?
  152. `;
  153. db.query(sql, [device_id], (err, results) => {
  154. if (err) {
  155. console.error('Error fetching device:', err);
  156. return callback(err);
  157. }
  158. const device = results.length > 0? results[0] : null;
  159. callback(null, device);
  160. });
  161. }
  162. // 建议添加数据库连接检查
  163. static getDeviceById(device_id, callback) {
  164. if (!db) {
  165. console.error('Database connection is not initialized');
  166. return callback(new Error('Database connection is not initialized'));
  167. }
  168. const sql = `
  169. SELECT * FROM devices
  170. WHERE device_id = ?
  171. `;
  172. db.query(sql, [device_id], (err, results) => {
  173. if (err) {
  174. console.error('Error fetching device:', err);
  175. return callback(err);
  176. }
  177. const device = results.length > 0? results[0] : null;
  178. callback(null, device);
  179. });
  180. }
  181. static async getDeviceStatus(device_id) {
  182. return new Promise((resolve, reject) => {
  183. this.getDeviceById(device_id, (err, device) => {
  184. if (err) return reject(err);
  185. resolve({
  186. status: device?.status || 'offline',
  187. temperature: device?.temperature || 0,
  188. switch_status: device?.switch_status || 'off'
  189. });
  190. });
  191. });
  192. }
  193. }
  194. module.exports = Device;