feat: 添加触发器脚本以实时监听房间状态变化并发送通知

This commit is contained in:
2026-04-09 12:00:07 +08:00
parent 8ad417365e
commit d3ece5f0ca

View File

@@ -0,0 +1,54 @@
-- ==========================================
-- 80portal 数据库 (log_platform) 触发器脚本
-- ==========================================
-- 1. 创建触发器函数
CREATE OR REPLACE FUNCTION room_status.notify_g5_change()
RETURNS trigger AS $$
DECLARE
payload JSON;
BEGIN
-- 仅当目标字段发生实际变化时才发送通知
IF NEW.dev_loops IS DISTINCT FROM OLD.dev_loops
OR NEW.bright_g IS DISTINCT FROM OLD.bright_g
OR NEW.elec_voltage IS DISTINCT FROM OLD.elec_voltage
OR NEW.elec_ampere IS DISTINCT FROM OLD.elec_ampere
OR NEW.elec_power IS DISTINCT FROM OLD.elec_power
OR NEW.elec_energy IS DISTINCT FROM OLD.elec_energy
OR NEW.elec_phase IS DISTINCT FROM OLD.elec_phase
OR NEW.elec_sum_energy IS DISTINCT FROM OLD.elec_sum_energy
OR NEW.ts_ms IS DISTINCT FROM OLD.ts_ms THEN
-- 组装我们需要向外发送的数据
payload = json_build_object(
'hotel_id', NEW.hotel_id,
'room_id', NEW.room_id,
'device_id', NEW.device_id,
'dev_loops', NEW.dev_loops,
'bright_g', NEW.bright_g,
'elec_voltage', NEW.elec_voltage,
'elec_ampere', NEW.elec_ampere,
'elec_power', NEW.elec_power,
'elec_energy', NEW.elec_energy,
'elec_phase', NEW.elec_phase,
'elec_sum_energy', NEW.elec_sum_energy,
'ts_ms', NEW.ts_ms
);
-- 通过信道发送通知 (载荷大小限制为8000字节)
PERFORM pg_notify('g5_realtime_channel', payload::text);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 2. 绑定触发器到目标表
-- 先清理旧版本的触发器
DROP TRIGGER IF EXISTS trg_g5_dev_loops_update ON room_status.room_status_moment_g5;
DROP TRIGGER IF EXISTS trg_g5_update ON room_status.room_status_moment_g5;
-- 监听更新操作 (对需要实时推流与同步的字段集进行变动监听)
CREATE TRIGGER trg_g5_update
AFTER UPDATE OF dev_loops, bright_g, elec_voltage, elec_ampere, elec_power, elec_energy, elec_phase, elec_sum_energy, ts_ms ON room_status.room_status_moment_g5
FOR EACH ROW
EXECUTE PROCEDURE room_status.notify_g5_change();