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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. -- =============================================
  2. -- 智慧水务管理系统 - 报警规则引擎 + 报警管理中心 DDL
  3. -- 版本: V2
  4. -- =============================================
  5. -- ==================== 报警规则定义 ====================
  6. CREATE TABLE IF NOT EXISTS prod_alert_rule (
  7. id BIGSERIAL PRIMARY KEY,
  8. rule_name VARCHAR(100) NOT NULL,
  9. rule_code VARCHAR(50) UNIQUE,
  10. description TEXT,
  11. device_type VARCHAR(30),
  12. metric_key VARCHAR(50) NOT NULL,
  13. alert_level VARCHAR(10) NOT NULL DEFAULT 'general', -- general/important/urgent
  14. condition_expr TEXT NOT NULL, -- JSON: {"op":"AND","conditions":[{"metric":"pressure","operator":">","threshold":0.8},...]}
  15. threshold_value DECIMAL(12,4), -- 简单阈值(向后兼容)
  16. debounce_sec INT DEFAULT 300,
  17. notify_channels VARCHAR(200), -- 逗号分隔: sms,wechat,app,email
  18. notify_template VARCHAR(500), -- 通知模板
  19. enabled SMALLINT DEFAULT 1,
  20. priority INT DEFAULT 0, -- 规则优先级
  21. effective_start TIME, -- 生效开始时间
  22. effective_end TIME, -- 生效结束时间
  23. created_by BIGINT,
  24. updated_by BIGINT,
  25. deleted SMALLINT DEFAULT 0,
  26. created_time TIMESTAMP DEFAULT NOW(),
  27. updated_time TIMESTAMP DEFAULT NOW()
  28. );
  29. COMMENT ON TABLE prod_alert_rule IS '报警规则定义表';
  30. COMMENT ON COLUMN prod_alert_rule.alert_level IS '报警等级: general(一般)/important(重要)/urgent(紧急)';
  31. COMMENT ON COLUMN prod_alert_rule.condition_expr IS '条件表达式JSON: 支持AND/OR组合条件';
  32. -- ==================== 报警记录(全生命周期) ====================
  33. CREATE TABLE IF NOT EXISTS prod_alert_record (
  34. id BIGSERIAL PRIMARY KEY,
  35. rule_id BIGINT REFERENCES prod_alert_rule(id),
  36. rule_name VARCHAR(100),
  37. device_id BIGINT,
  38. device_sn VARCHAR(100),
  39. device_name VARCHAR(200),
  40. area VARCHAR(50),
  41. metric_key VARCHAR(50) NOT NULL,
  42. metric_value DECIMAL(12,4),
  43. threshold_value VARCHAR(50),
  44. alert_level VARCHAR(10) NOT NULL DEFAULT 'general',
  45. title VARCHAR(200),
  46. message TEXT,
  47. -- 生命周期状态: 0=活跃 1=已确认 2=已派单 3=处理中 4=已处理 5=已归档
  48. status INT DEFAULT 0,
  49. confirmed_by BIGINT,
  50. confirmed_time TIMESTAMP,
  51. dispatch_time TIMESTAMP,
  52. assignee_id BIGINT,
  53. assignee_name VARCHAR(50),
  54. handler_id BIGINT,
  55. handler_name VARCHAR(50),
  56. handle_result TEXT,
  57. handle_time TIMESTAMP,
  58. archive_time TIMESTAMP,
  59. archive_reason VARCHAR(500),
  60. resolved_at TIMESTAMP,
  61. created_time TIMESTAMP DEFAULT NOW(),
  62. updated_time TIMESTAMP DEFAULT NOW(),
  63. deleted SMALLINT DEFAULT 0
  64. );
  65. COMMENT ON TABLE prod_alert_record IS '报警记录表(全生命周期)';
  66. CREATE INDEX IF NOT EXISTS idx_alert_record_time ON prod_alert_record(created_time DESC);
  67. CREATE INDEX IF NOT EXISTS idx_alert_record_device ON prod_alert_record(device_sn, created_time DESC);
  68. CREATE INDEX IF NOT EXISTS idx_alert_record_status ON prod_alert_record(status);
  69. CREATE INDEX IF NOT EXISTS idx_alert_record_level ON prod_alert_record(alert_level);
  70. CREATE INDEX IF NOT EXISTS idx_alert_record_area ON prod_alert_record(area);
  71. -- ==================== 报警通知记录 ====================
  72. CREATE TABLE IF NOT EXISTS prod_alert_notification (
  73. id BIGSERIAL PRIMARY KEY,
  74. alert_record_id BIGINT REFERENCES prod_alert_record(id),
  75. rule_id BIGINT,
  76. channel VARCHAR(30) NOT NULL, -- sms/wechat/app/email
  77. recipient VARCHAR(100) NOT NULL, -- 接收人标识
  78. recipient_name VARCHAR(50),
  79. title VARCHAR(200),
  80. content TEXT,
  81. status INT DEFAULT 0, -- 0=待发送 1=已发送 2=发送失败 3=已读
  82. send_time TIMESTAMP,
  83. read_time TIMESTAMP,
  84. retry_count INT DEFAULT 0,
  85. error_msg VARCHAR(500),
  86. created_time TIMESTAMP DEFAULT NOW()
  87. );
  88. COMMENT ON TABLE prod_alert_notification IS '报警通知记录表';
  89. CREATE INDEX IF NOT EXISTS idx_alert_notif_record ON prod_alert_notification(alert_record_id);
  90. CREATE INDEX IF NOT EXISTS idx_alert_notif_status ON prod_alert_notification(status);
  91. -- ==================== 报警规则-设备关联(可选) ====================
  92. CREATE TABLE IF NOT EXISTS prod_alert_rule_device (
  93. id BIGSERIAL PRIMARY KEY,
  94. rule_id BIGINT REFERENCES prod_alert_rule(id),
  95. device_id BIGINT,
  96. device_sn VARCHAR(100),
  97. area VARCHAR(50),
  98. created_time TIMESTAMP DEFAULT NOW()
  99. );
  100. COMMENT ON TABLE prod_alert_rule_device IS '报警规则-设备/区域关联表';
  101. -- ==================== 初始规则数据 ====================
  102. INSERT INTO prod_alert_rule (rule_name, rule_code, metric_key, alert_level, condition_expr, threshold_value, debounce_sec, description, enabled) VALUES
  103. ('管网压力过高报警', 'RULE_PRESSURE_HIGH', 'pressure', 'urgent',
  104. '{"op":"AND","conditions":[{"metric":"pressure","operator":">","threshold":0.8}]}',
  105. 0.8000, 300, '管网压力超过0.8MPa时触发紧急报警', 1),
  106. ('管网压力过低报警', 'RULE_PRESSURE_LOW', 'pressure', 'important',
  107. '{"op":"OR","conditions":[{"metric":"pressure","operator":"<","threshold":0.2}]}',
  108. 0.2000, 300, '管网压力低于0.2MPa时触发重要报警', 1),
  109. ('水质浊度超标', 'RULE_TURBIDITY_HIGH', 'turbidity', 'urgent',
  110. '{"op":"AND","conditions":[{"metric":"turbidity","operator":">","threshold":1.0}]}',
  111. 1.0000, 600, '水质浊度超过1.0NTU触发紧急报警', 1),
  112. ('余氯偏低报警', 'RULE_CHLORINE_LOW', 'residual_chlorine', 'general',
  113. '{"op":"AND","conditions":[{"metric":"residual_chlorine","operator":"<","threshold":0.1}]}',
  114. 0.1000, 600, '余氯低于0.1mg/L触发一般报警', 1),
  115. ('流量异常波动', 'RULE_FLOW_ANOMALY', 'flow', 'important',
  116. '{"op":"OR","conditions":[{"metric":"flow","operator":">","threshold":100},{"metric":"flow","operator":"<","threshold":5}]}',
  117. NULL, 120, '流量异常偏高或偏低时触发报警', 1);