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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. -- =============================================
  2. -- 智慧水务管理系统 - 在线监测列表 DDL
  3. -- 版本: V3
  4. -- 功能: 在线监测设备 + 实时数据 + 多维筛选
  5. -- =============================================
  6. -- ==================== 在线监测设备 ====================
  7. CREATE TABLE IF NOT EXISTS prod_monitor_device (
  8. id BIGSERIAL PRIMARY KEY,
  9. device_code VARCHAR(50) NOT NULL UNIQUE, -- 设备编号
  10. device_name VARCHAR(200) NOT NULL, -- 设备名称
  11. device_type VARCHAR(30) NOT NULL, -- 设备类型: flow/pressure/level/quality
  12. area VARCHAR(50) NOT NULL, -- 所属区域
  13. location VARCHAR(300), -- 安装位置描述
  14. lng DECIMAL(12, 8), -- 经度
  15. lat DECIMAL(12, 8), -- 纬度
  16. status VARCHAR(20) NOT NULL DEFAULT 'offline', -- 设备状态: online/offline/fault/abnormal
  17. last_report_time TIMESTAMP, -- 最后上报时间
  18. brand VARCHAR(100), -- 品牌/型号
  19. install_time TIMESTAMP, -- 安装时间
  20. remark VARCHAR(500), -- 备注
  21. created_time TIMESTAMP DEFAULT NOW(),
  22. updated_time TIMESTAMP DEFAULT NOW()
  23. );
  24. COMMENT ON TABLE prod_monitor_device IS '在线监测设备表';
  25. COMMENT ON COLUMN prod_monitor_device.device_type IS '设备类型: flow(流量计)/pressure(压力计)/level(液位计)/quality(水质仪)';
  26. COMMENT ON COLUMN prod_monitor_device.status IS '设备状态: online(在线)/offline(离线)/fault(故障)/abnormal(数据异常)';
  27. CREATE INDEX IF NOT EXISTS idx_monitor_device_area ON prod_monitor_device(area);
  28. CREATE INDEX IF NOT EXISTS idx_monitor_device_type ON prod_monitor_device(device_type);
  29. CREATE INDEX IF NOT EXISTS idx_monitor_device_status ON prod_monitor_device(status);
  30. CREATE INDEX IF NOT EXISTS idx_monitor_device_report ON prod_monitor_device(last_report_time DESC);
  31. CREATE INDEX IF NOT EXISTS idx_monitor_device_code_name ON prod_monitor_device(device_code, device_name);
  32. -- ==================== 监测实时数据 ====================
  33. CREATE TABLE IF NOT EXISTS prod_monitor_realtime_data (
  34. id BIGSERIAL PRIMARY KEY,
  35. device_id BIGINT NOT NULL REFERENCES prod_monitor_device(id), -- 关联设备
  36. device_code VARCHAR(50) NOT NULL, -- 设备编号(冗余)
  37. metric_key VARCHAR(50) NOT NULL, -- 参数类型: flow/pressure/level/turbidity/ph/residual_chlorine/temperature
  38. metric_value DECIMAL(14, 4) NOT NULL, -- 实时值
  39. unit VARCHAR(20), -- 单位
  40. threshold_high DECIMAL(14, 4), -- 阈值上限
  41. threshold_low DECIMAL(14, 4), -- 阈值下限
  42. is_abnormal SMALLINT DEFAULT 0, -- 是否异常: 0正常 1异常
  43. collect_time TIMESTAMP NOT NULL, -- 采集时间
  44. created_time TIMESTAMP DEFAULT NOW()
  45. );
  46. COMMENT ON TABLE prod_monitor_realtime_data IS '监测实时数据表';
  47. COMMENT ON COLUMN prod_monitor_realtime_data.metric_key IS '参数类型: flow(流量)/pressure(压力)/level(液位)/turbidity(浊度)/ph(pH值)/residual_chlorine(余氯)/temperature(温度)';
  48. CREATE INDEX IF NOT EXISTS idx_realtime_device_id ON prod_monitor_realtime_data(device_id);
  49. CREATE INDEX IF NOT EXISTS idx_realtime_device_code ON prod_monitor_realtime_data(device_code);
  50. CREATE INDEX IF NOT EXISTS idx_realtime_metric_key ON prod_monitor_realtime_data(metric_key);
  51. CREATE INDEX IF NOT EXISTS idx_realtime_collect_time ON prod_monitor_realtime_data(collect_time DESC);
  52. CREATE INDEX IF NOT EXISTS idx_realtime_device_metric ON prod_monitor_realtime_data(device_id, metric_key, collect_time DESC);
  53. -- ==================== 初始化数据(示例) ====================
  54. INSERT INTO prod_monitor_device (device_code, device_name, device_type, area, location, lng, lat, status, last_report_time, brand)
  55. VALUES
  56. ('MON-FLOW-001', '一号泵站出口流量计', 'flow', '一体化水厂', '一号泵站出口', 82.07123456, 44.84567890, 'online', NOW(), 'E+H Promag 50'),
  57. ('MON-FLOW-002', '二号泵站出口流量计', 'flow', '一体化水厂', '二号泵站出口', 82.07234567, 44.84678901, 'online', NOW(), 'E+H Promag 50'),
  58. ('MON-PRES-001', '管网压力监测点A', 'pressure', '管网一区', '人民路DN300', 82.06890123, 44.84234567, 'online', NOW(), 'WIKA S-20'),
  59. ('MON-PRES-002', '管网压力监测点B', 'pressure', '管网一区', '建设路DN200', 82.06901234, 44.84345678, 'offline', NOW() - INTERVAL '2 hours', 'WIKA S-20'),
  60. ('MON-LEV-001', '清水池液位计', 'level', '一体化水厂', '清水池', 82.07156789, 44.84501234, 'online', NOW(), 'VEGA VEGAPULS 64'),
  61. ('MON-LEV-002', '沉淀池液位计', 'level', '一体化水厂', '沉淀池', 82.07167890, 44.84512345, 'fault', NOW() - INTERVAL '30 minutes', 'VEGA VEGAPULS 64'),
  62. ('MON-QUAL-001', '出厂水质监测仪', 'quality', '一体化水厂', '出厂水口', 82.07178901, 44.84523456, 'online', NOW(), 'HACH sc200'),
  63. ('MON-QUAL-002', '管网末梢水质仪', 'quality', '管网二区', '末梢检测点', 82.06543210, 44.83987654, 'abnormal',NOW(), 'HACH sc200'),
  64. ('MON-FLOW-003', '三号泵站流量计', 'flow', '管网二区', '三号泵站', 82.06654321, 44.84098765, 'online', NOW(), 'E+H Promag 10'),
  65. ('MON-PRES-003', '高位水池压力计', 'pressure', '管网三区', '高位水池出口', 82.07345678, 44.84789012, 'online', NOW(), 'WIKA S-20')
  66. ON CONFLICT (device_code) DO NOTHING;
  67. INSERT INTO prod_monitor_realtime_data (device_id, device_code, metric_key, metric_value, unit, threshold_high, threshold_low, is_abnormal, collect_time)
  68. SELECT d.id, d.device_code, m.metric_key, m.metric_value, m.unit, m.threshold_high, m.threshold_low, m.is_abnormal, NOW()
  69. FROM prod_monitor_device d
  70. CROSS JOIN (VALUES
  71. ('flow', 125.50, 'm³/h', 200.0, 10.0, 0),
  72. ('pressure', 0.35, 'MPa', 0.6, 0.15, 0),
  73. ('level', 3.80, 'm', 5.0, 0.5, 0),
  74. ('turbidity', 0.45, 'NTU', 1.0, NULL, 0),
  75. ('ph', 7.20, '', 8.5, 6.5, 0),
  76. ('residual_chlorine', 0.35, 'mg/L', 0.8, 0.05, 0)
  77. ) AS m(metric_key, metric_value, unit, threshold_high, threshold_low, is_abnormal)
  78. WHERE d.status = 'online'
  79. ON CONFLICT DO NOTHING;