智慧水务管理系统 - 精河县供水工程综合管理平台

V28__iot_device_migration.sql 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. -- =============================================
  2. -- 智慧水务管理系统 - Issue #28: MQTT协议适配器 + 设备注册/发现API
  3. -- 版本: V28
  4. -- =============================================
  5. -- 更新 iot_device 表结构以匹配新的 Device 实体
  6. -- 添加 JSON 位置字段和 WKT 几何字段,保留原有字段用于兼容性
  7. -- 添加新的字段来统一设备模型
  8. ALTER TABLE iot_device
  9. ADD COLUMN IF NOT EXISTS position JSONB,
  10. ADD COLUMN IF NOT EXISTS geom GEOMETRY(Point, 4326),
  11. ADD COLUMN IF NOT EXISTS remark TEXT;
  12. -- 更新现有字段的备注
  13. COMMENT ON COLUMN iot_device.position IS '设备位置信息 (JSON格式: {lng, lat, address})';
  14. COMMENT ON COLUMN iot_device.geom IS '设备几何位置 (WKT格式)';
  15. COMMENT ON COLUMN iot_device.remark IS '设备备注信息';
  16. -- 如果 position 和 geom 为空,从原有字段迁移数据
  17. -- 注意:这是一个可选的迁移步骤,根据实际需求决定是否执行
  18. -- UPDATE iot_device
  19. -- SET position = json_build_object('lng', loc_lng, 'lat', loc_lat, 'address', address)
  20. -- WHERE loc_lng IS NOT NULL OR loc_lat IS NOT NULL;
  21. -- 添加索引
  22. CREATE INDEX IF NOT EXISTS idx_iot_device_position ON iot_device USING GIST(geom);
  23. CREATE INDEX IF NOT EXISTS idx_iot_device_area ON iot_device(area);
  24. CREATE INDEX IF NOT EXISTS idx_iot_device_type ON iot_device(device_type);
  25. CREATE INDEX IF NOT EXISTS idx_iot_device_status ON iot_device(status);
  26. -- 创建设备状态变更触发器函数
  27. CREATE OR REPLACE FUNCTION iot_device_update_status()
  28. RETURNS TRIGGER AS $$
  29. BEGIN
  30. IF NEW.status <> OLD.status THEN
  31. -- 记录设备状态变更事件
  32. INSERT INTO iot_device_event (device_id, device_sn, event_type, event_data)
  33. VALUES (NEW.id, NEW.device_sn, NEW.status, json_build_object('old_status', OLD.status));
  34. END IF;
  35. RETURN NEW;
  36. END;
  37. $$ LANGUAGE plpgsql;
  38. -- 创建设备状态变更触发器
  39. CREATE TRIGGER tr_iot_device_status_change
  40. BEFORE UPDATE ON iot_device
  41. FOR EACH ROW
  42. WHEN (NEW.status <> OLD.status)
  43. EXECUTE FUNCTION iot_device_update_status();
  44. -- 插入示例数据
  45. INSERT INTO iot_device (device_sn, device_name, device_type, area, position, geom, status, remark) VALUES
  46. ('SN001', '流量计-1号', 'flow_meter', '东部片区',
  47. '{"lng": 116.1234, "lat": 39.5678, "address": "水厂主入口"}',
  48. ST_GeomFromText('POINT(116.1234 39.5678)', 4326),
  49. 'online', '主要流量监测设备'),
  50. ('SN002', '压力传感器-1号', 'pressure_sensor', '西部片区',
  51. '{"lng": 116.5678, "lat": 39.8765, "address": "调压站入口"}',
  52. ST_GeomFromText('POINT(116.5678 39.8765)', 4326),
  53. 'offline', '备用压力监测设备')
  54. ON CONFLICT (device_sn) DO NOTHING;