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

V1__iot.sql 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. -- =============================================
  2. -- 智慧水务管理系统 - 物联网设备相关 DDL
  3. -- 版本: V1
  4. -- =============================================
  5. -- 扩展
  6. CREATE EXTENSION IF NOT EXISTS postgis;
  7. -- 设备模型定义
  8. CREATE TABLE IF NOT EXISTS iot_device_model (
  9. id BIGSERIAL PRIMARY KEY,
  10. model_key VARCHAR(50) UNIQUE NOT NULL,
  11. model_name VARCHAR(100) NOT NULL,
  12. vendor VARCHAR(100),
  13. protocol VARCHAR(20) NOT NULL, -- MQTT/Modbus/CoAP/HTTP
  14. properties JSONB, -- [{key, name, unit, data_type, range_min, range_max}]
  15. commands JSONB, -- [{key, name, params: [{key, name, type}]}]
  16. status SMALLINT DEFAULT 1,
  17. created_at TIMESTAMP DEFAULT NOW(),
  18. updated_at TIMESTAMP DEFAULT NOW()
  19. );
  20. COMMENT ON TABLE iot_device_model IS '设备模型定义表';
  21. COMMENT ON COLUMN iot_device_model.properties IS '属性定义JSON数组';
  22. COMMENT ON COLUMN iot_device_model.commands IS '支持指令JSON数组';
  23. -- 设备实例
  24. CREATE TABLE IF NOT EXISTS iot_device (
  25. id BIGSERIAL PRIMARY KEY,
  26. device_sn VARCHAR(100) UNIQUE NOT NULL,
  27. device_name VARCHAR(200) NOT NULL,
  28. model_id BIGINT REFERENCES iot_device_model(id),
  29. device_type VARCHAR(30) NOT NULL, -- flow_meter/pressure_sensor/valve/water_quality/level_sensor/pump
  30. position_type VARCHAR(20), -- water_plant/pressure_station/pipe_network/village
  31. label VARCHAR(50), -- 设备标签(便于搜索)
  32. loc_lng DOUBLE PRECISION,
  33. loc_lat DOUBLE PRECISION,
  34. geom GEOMETRY(Point, 4326),
  35. area VARCHAR(50) NOT NULL, -- 所属片区
  36. station_id BIGINT, -- 所属站点
  37. address VARCHAR(300),
  38. install_date DATE,
  39. warranty_until DATE,
  40. status VARCHAR(20) DEFAULT 'offline', -- online/offline/maintenance/fault
  41. firmware_version VARCHAR(20),
  42. last_report_time TIMESTAMP,
  43. metadata JSONB,
  44. created_at TIMESTAMP DEFAULT NOW(),
  45. updated_at TIMESTAMP DEFAULT NOW()
  46. );
  47. COMMENT ON TABLE iot_device IS '设备实例表';
  48. COMMENT ON COLUMN iot_device.geom IS 'PostGIS空间坐标点';
  49. COMMENT ON COLUMN iot_device.metadata IS '扩展元数据';
  50. -- 空间索引
  51. CREATE INDEX IF NOT EXISTS idx_iot_device_geom ON iot_device USING GIST(geom);
  52. CREATE INDEX IF NOT EXISTS idx_iot_device_area ON iot_device(area);
  53. CREATE INDEX IF NOT EXISTS idx_iot_device_type ON iot_device(device_type);
  54. CREATE INDEX IF NOT EXISTS idx_iot_device_status ON iot_device(status);
  55. -- 设备影子
  56. CREATE TABLE IF NOT EXISTS iot_device_shadow (
  57. id BIGSERIAL PRIMARY KEY,
  58. device_id BIGINT UNIQUE REFERENCES iot_device(id),
  59. reported_state JSONB, -- 设备上报的最新状态
  60. desired_state JSONB, -- 期望状态(云端下发)
  61. delta_state JSONB, -- 差异状态
  62. version BIGINT DEFAULT 1,
  63. updated_at TIMESTAMP DEFAULT NOW()
  64. );
  65. COMMENT ON TABLE iot_device_shadow IS '设备影子表';
  66. -- 设备事件
  67. CREATE TABLE IF NOT EXISTS iot_device_event (
  68. id BIGSERIAL PRIMARY KEY,
  69. device_id BIGINT REFERENCES iot_device(id),
  70. device_sn VARCHAR(100) NOT NULL,
  71. event_type VARCHAR(30) NOT NULL, -- online/offline/fault/recovery/ota
  72. event_data JSONB,
  73. created_at TIMESTAMP DEFAULT NOW()
  74. );
  75. COMMENT ON TABLE iot_device_event IS '设备事件表';
  76. CREATE INDEX IF NOT EXISTS idx_iot_device_event_sn ON iot_device_event(device_sn, created_at DESC);
  77. -- 站点管理(水厂/调压站等)
  78. CREATE TABLE IF NOT EXISTS iot_station (
  79. id BIGSERIAL PRIMARY KEY,
  80. station_name VARCHAR(100) NOT NULL,
  81. station_type VARCHAR(30) NOT NULL, -- water_plant/pressure_station/pump_station
  82. area VARCHAR(50) NOT NULL,
  83. loc_lng DOUBLE PRECISION,
  84. loc_lat DOUBLE PRECISION,
  85. geom GEOMETRY(Point, 4326),
  86. address VARCHAR(300),
  87. manager VARCHAR(50),
  88. manager_phone VARCHAR(20),
  89. status SMALLINT DEFAULT 1,
  90. created_at TIMESTAMP DEFAULT NOW(),
  91. updated_at TIMESTAMP DEFAULT NOW()
  92. );
  93. COMMENT ON TABLE iot_station IS '站点管理表';
  94. CREATE INDEX IF NOT EXISTS idx_iot_station_geom ON iot_station USING GIST(geom);