102 lines
4.0 KiB
SQL
102 lines
4.0 KiB
SQL
-- =============================================
|
|||
|
|
-- 智慧水务管理系统 - 物联网设备相关 DDL
|
||
|
|
-- 版本: V1
|
||
|
|
-- =============================================
|
||
|
|
|
||
|
|
-- 扩展
|
||
|
|
CREATE EXTENSION IF NOT EXISTS postgis;
|
||
|
|
|
||
|
|
-- 设备模型定义
|
||
|
|
CREATE TABLE IF NOT EXISTS iot_device_model (
|
||
|
|
id BIGSERIAL PRIMARY KEY,
|
||
|
|
model_key VARCHAR(50) UNIQUE NOT NULL,
|
||
|
|
model_name VARCHAR(100) NOT NULL,
|
||
|
|
vendor VARCHAR(100),
|
||
|
|
protocol VARCHAR(20) NOT NULL, -- MQTT/Modbus/CoAP/HTTP
|
||
|
|
properties JSONB, -- [{key, name, unit, data_type, range_min, range_max}]
|
||
|
|
commands JSONB, -- [{key, name, params: [{key, name, type}]}]
|
||
|
|
status SMALLINT DEFAULT 1,
|
||
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
||
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
||
|
|
);
|
||
|
|
COMMENT ON TABLE iot_device_model IS '设备模型定义表';
|
||
|
|
COMMENT ON COLUMN iot_device_model.properties IS '属性定义JSON数组';
|
||
|
|
COMMENT ON COLUMN iot_device_model.commands IS '支持指令JSON数组';
|
||
|
|
|
||
|
|
-- 设备实例
|
||
|
|
CREATE TABLE IF NOT EXISTS iot_device (
|
||
|
|
id BIGSERIAL PRIMARY KEY,
|
||
|
|
device_sn VARCHAR(100) UNIQUE NOT NULL,
|
||
|
|
device_name VARCHAR(200) NOT NULL,
|
||
|
|
model_id BIGINT REFERENCES iot_device_model(id),
|
||
|
|
device_type VARCHAR(30) NOT NULL, -- flow_meter/pressure_sensor/valve/water_quality/level_sensor/pump
|
||
|
|
position_type VARCHAR(20), -- water_plant/pressure_station/pipe_network/village
|
||
|
|
label VARCHAR(50), -- 设备标签(便于搜索)
|
||
|
|
loc_lng DOUBLE PRECISION,
|
||
|
|
loc_lat DOUBLE PRECISION,
|
||
|
|
geom GEOMETRY(Point, 4326),
|
||
|
|
area VARCHAR(50) NOT NULL, -- 所属片区
|
||
|
|
station_id BIGINT, -- 所属站点
|
||
|
|
address VARCHAR(300),
|
||
|
|
install_date DATE,
|
||
|
|
warranty_until DATE,
|
||
|
|
status VARCHAR(20) DEFAULT 'offline', -- online/offline/maintenance/fault
|
||
|
|
firmware_version VARCHAR(20),
|
||
|
|
last_report_time TIMESTAMP,
|
||
|
|
metadata JSONB,
|
||
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
||
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
||
|
|
);
|
||
|
|
COMMENT ON TABLE iot_device IS '设备实例表';
|
||
|
|
COMMENT ON COLUMN iot_device.geom IS 'PostGIS空间坐标点';
|
||
|
|
COMMENT ON COLUMN iot_device.metadata IS '扩展元数据';
|
||
|
|
|
||
|
|
-- 空间索引
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_iot_device_geom 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 TABLE IF NOT EXISTS iot_device_shadow (
|
||
|
|
id BIGSERIAL PRIMARY KEY,
|
||
|
|
device_id BIGINT UNIQUE REFERENCES iot_device(id),
|
||
|
|
reported_state JSONB, -- 设备上报的最新状态
|
||
|
|
desired_state JSONB, -- 期望状态(云端下发)
|
||
|
|
delta_state JSONB, -- 差异状态
|
||
|
|
version BIGINT DEFAULT 1,
|
||
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
||
|
|
);
|
||
|
|
COMMENT ON TABLE iot_device_shadow IS '设备影子表';
|
||
|
|
|
||
|
|
-- 设备事件
|
||
|
|
CREATE TABLE IF NOT EXISTS iot_device_event (
|
||
|
|
id BIGSERIAL PRIMARY KEY,
|
||
|
|
device_id BIGINT REFERENCES iot_device(id),
|
||
|
|
device_sn VARCHAR(100) NOT NULL,
|
||
|
|
event_type VARCHAR(30) NOT NULL, -- online/offline/fault/recovery/ota
|
||
|
|
event_data JSONB,
|
||
|
|
created_at TIMESTAMP DEFAULT NOW()
|
||
|
|
);
|
||
|
|
COMMENT ON TABLE iot_device_event IS '设备事件表';
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_iot_device_event_sn ON iot_device_event(device_sn, created_at DESC);
|
||
|
|
|
||
|
|
-- 站点管理(水厂/调压站等)
|
||
|
|
CREATE TABLE IF NOT EXISTS iot_station (
|
||
|
|
id BIGSERIAL PRIMARY KEY,
|
||
|
|
station_name VARCHAR(100) NOT NULL,
|
||
|
|
station_type VARCHAR(30) NOT NULL, -- water_plant/pressure_station/pump_station
|
||
|
|
area VARCHAR(50) NOT NULL,
|
||
|
|
loc_lng DOUBLE PRECISION,
|
||
|
|
loc_lat DOUBLE PRECISION,
|
||
|
|
geom GEOMETRY(Point, 4326),
|
||
|
|
address VARCHAR(300),
|
||
|
|
manager VARCHAR(50),
|
||
|
|
manager_phone VARCHAR(20),
|
||
|
|
status SMALLINT DEFAULT 1,
|
||
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
||
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
||
|
|
);
|
||
|
|
COMMENT ON TABLE iot_station IS '站点管理表';
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_iot_station_geom ON iot_station USING GIST(geom);
|