Files
water-management-system/db/postgresql/V1__iot.sql
T
bot_pm f337ebedfd Phase 1 #18: PostgreSQL + TDengine 完整 DDL 建表脚本
- 15+张核心表: sys_*(部门/用户/角色/菜单/日志/字典/通知/文件)
- iot_*: 设备模型/设备实例/设备影子/设备事件/站点(PostGIS空间坐标)
- rev_*: 用水户/水价阶梯/水表档案/水表操作日志/抄表/账单/缴费/报装
- production: alert_rule(报警规则)/alert_event(报警事件)/dispatch_command(调度)/duty(值班)/patrol(巡检)/water_quality(水质)
- TDengine: iot_telemetry超级表(6类设备子表)+事件表+小时聚合
- 种子数据: admin管理员/5个角色/6个片区/基础字典
2026-06-14 13:15:38 +08:00

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);