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