202406020000_heater_usage_procedure.sql 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. DELIMITER $$
  2. CREATE PROCEDURE ProcessHeaterUsage(
  3. IN p_device_id VARCHAR(255),
  4. IN p_event_time DATETIME,
  5. IN p_raw_id INT
  6. )
  7. BEGIN
  8. DECLARE v_room_id INT;
  9. DECLARE v_room_name VARCHAR(255);
  10. DECLARE v_device_status ENUM('online','offline');
  11. DECLARE v_switch_status ENUM('on','off');
  12. DECLARE v_temperature DECIMAL(5,2);
  13. -- 唯一的异常处理器声明
  14. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  15. BEGIN
  16. INSERT INTO error_logs (error_message, error_time)
  17. VALUES (CONCAT('Heater usage processing failed for ', p_device_id), NOW());
  18. END;
  19. -- 获取设备最新状态
  20. SELECT
  21. d.room_id,
  22. d.room_name,
  23. d.status,
  24. d.switch_status,
  25. d.temperature
  26. INTO
  27. v_room_id,
  28. v_room_name,
  29. v_device_status,
  30. v_switch_status,
  31. v_temperature
  32. FROM devices d
  33. WHERE d.device_id = p_device_id
  34. LIMIT 1;
  35. -- 开启条件:在线、开关开启、温度>14
  36. IF v_device_status = 'online'
  37. AND v_switch_status = 'on'
  38. AND v_temperature > 14 THEN
  39. -- 检查是否存在未关闭记录
  40. IF NOT EXISTS (
  41. SELECT 1 FROM heater_usage
  42. WHERE device_id = p_device_id
  43. AND end_time IS NULL
  44. ) THEN
  45. INSERT INTO heater_usage (
  46. device_id,
  47. room_id,
  48. room_name,
  49. start_time,
  50. end_time,
  51. duration,
  52. date
  53. ) VALUES (
  54. p_device_id,
  55. v_room_id,
  56. v_room_name,
  57. p_event_time,
  58. NULL,
  59. 0,
  60. DATE(p_event_time - INTERVAL IF(HOUR(p_event_time) < 12, 1, 0) DAY)
  61. );
  62. END IF;
  63. -- 关闭条件:任意条件不满足时更新结束时间
  64. ELSE
  65. UPDATE heater_usage
  66. SET end_time = p_event_time,
  67. duration = TIMESTAMPDIFF(SECOND, start_time, p_event_time),
  68. -- 同步更新房间信息(设备可能更换房间)
  69. room_id = v_room_id,
  70. room_name = v_room_name
  71. WHERE device_id = p_device_id
  72. AND end_time IS NULL
  73. ORDER BY start_time DESC
  74. LIMIT 1;
  75. END IF;
  76. END$$
  77. DELIMITER ;