| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- -- =============================================
- -- 智慧水务管理系统 - 报警规则引擎 + 报警管理中心 DDL
- -- 版本: V2
- -- =============================================
-
- -- ==================== 报警规则定义 ====================
- CREATE TABLE IF NOT EXISTS prod_alert_rule (
- id BIGSERIAL PRIMARY KEY,
- rule_name VARCHAR(100) NOT NULL,
- rule_code VARCHAR(50) UNIQUE,
- description TEXT,
- device_type VARCHAR(30),
- metric_key VARCHAR(50) NOT NULL,
- alert_level VARCHAR(10) NOT NULL DEFAULT 'general', -- general/important/urgent
- condition_expr TEXT NOT NULL, -- JSON: {"op":"AND","conditions":[{"metric":"pressure","operator":">","threshold":0.8},...]}
- threshold_value DECIMAL(12,4), -- 简单阈值(向后兼容)
- debounce_sec INT DEFAULT 300,
- notify_channels VARCHAR(200), -- 逗号分隔: sms,wechat,app,email
- notify_template VARCHAR(500), -- 通知模板
- enabled SMALLINT DEFAULT 1,
- priority INT DEFAULT 0, -- 规则优先级
- effective_start TIME, -- 生效开始时间
- effective_end TIME, -- 生效结束时间
- created_by BIGINT,
- updated_by BIGINT,
- deleted SMALLINT DEFAULT 0,
- created_time TIMESTAMP DEFAULT NOW(),
- updated_time TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE prod_alert_rule IS '报警规则定义表';
- COMMENT ON COLUMN prod_alert_rule.alert_level IS '报警等级: general(一般)/important(重要)/urgent(紧急)';
- COMMENT ON COLUMN prod_alert_rule.condition_expr IS '条件表达式JSON: 支持AND/OR组合条件';
-
- -- ==================== 报警记录(全生命周期) ====================
- CREATE TABLE IF NOT EXISTS prod_alert_record (
- id BIGSERIAL PRIMARY KEY,
- rule_id BIGINT REFERENCES prod_alert_rule(id),
- rule_name VARCHAR(100),
- device_id BIGINT,
- device_sn VARCHAR(100),
- device_name VARCHAR(200),
- area VARCHAR(50),
- metric_key VARCHAR(50) NOT NULL,
- metric_value DECIMAL(12,4),
- threshold_value VARCHAR(50),
- alert_level VARCHAR(10) NOT NULL DEFAULT 'general',
- title VARCHAR(200),
- message TEXT,
- -- 生命周期状态: 0=活跃 1=已确认 2=已派单 3=处理中 4=已处理 5=已归档
- status INT DEFAULT 0,
- confirmed_by BIGINT,
- confirmed_time TIMESTAMP,
- dispatch_time TIMESTAMP,
- assignee_id BIGINT,
- assignee_name VARCHAR(50),
- handler_id BIGINT,
- handler_name VARCHAR(50),
- handle_result TEXT,
- handle_time TIMESTAMP,
- archive_time TIMESTAMP,
- archive_reason VARCHAR(500),
- resolved_at TIMESTAMP,
- created_time TIMESTAMP DEFAULT NOW(),
- updated_time TIMESTAMP DEFAULT NOW(),
- deleted SMALLINT DEFAULT 0
- );
- COMMENT ON TABLE prod_alert_record IS '报警记录表(全生命周期)';
- CREATE INDEX IF NOT EXISTS idx_alert_record_time ON prod_alert_record(created_time DESC);
- CREATE INDEX IF NOT EXISTS idx_alert_record_device ON prod_alert_record(device_sn, created_time DESC);
- CREATE INDEX IF NOT EXISTS idx_alert_record_status ON prod_alert_record(status);
- CREATE INDEX IF NOT EXISTS idx_alert_record_level ON prod_alert_record(alert_level);
- CREATE INDEX IF NOT EXISTS idx_alert_record_area ON prod_alert_record(area);
-
- -- ==================== 报警通知记录 ====================
- CREATE TABLE IF NOT EXISTS prod_alert_notification (
- id BIGSERIAL PRIMARY KEY,
- alert_record_id BIGINT REFERENCES prod_alert_record(id),
- rule_id BIGINT,
- channel VARCHAR(30) NOT NULL, -- sms/wechat/app/email
- recipient VARCHAR(100) NOT NULL, -- 接收人标识
- recipient_name VARCHAR(50),
- title VARCHAR(200),
- content TEXT,
- status INT DEFAULT 0, -- 0=待发送 1=已发送 2=发送失败 3=已读
- send_time TIMESTAMP,
- read_time TIMESTAMP,
- retry_count INT DEFAULT 0,
- error_msg VARCHAR(500),
- created_time TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE prod_alert_notification IS '报警通知记录表';
- CREATE INDEX IF NOT EXISTS idx_alert_notif_record ON prod_alert_notification(alert_record_id);
- CREATE INDEX IF NOT EXISTS idx_alert_notif_status ON prod_alert_notification(status);
-
- -- ==================== 报警规则-设备关联(可选) ====================
- CREATE TABLE IF NOT EXISTS prod_alert_rule_device (
- id BIGSERIAL PRIMARY KEY,
- rule_id BIGINT REFERENCES prod_alert_rule(id),
- device_id BIGINT,
- device_sn VARCHAR(100),
- area VARCHAR(50),
- created_time TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE prod_alert_rule_device IS '报警规则-设备/区域关联表';
-
- -- ==================== 初始规则数据 ====================
- INSERT INTO prod_alert_rule (rule_name, rule_code, metric_key, alert_level, condition_expr, threshold_value, debounce_sec, description, enabled) VALUES
- ('管网压力过高报警', 'RULE_PRESSURE_HIGH', 'pressure', 'urgent',
- '{"op":"AND","conditions":[{"metric":"pressure","operator":">","threshold":0.8}]}',
- 0.8000, 300, '管网压力超过0.8MPa时触发紧急报警', 1),
- ('管网压力过低报警', 'RULE_PRESSURE_LOW', 'pressure', 'important',
- '{"op":"OR","conditions":[{"metric":"pressure","operator":"<","threshold":0.2}]}',
- 0.2000, 300, '管网压力低于0.2MPa时触发重要报警', 1),
- ('水质浊度超标', 'RULE_TURBIDITY_HIGH', 'turbidity', 'urgent',
- '{"op":"AND","conditions":[{"metric":"turbidity","operator":">","threshold":1.0}]}',
- 1.0000, 600, '水质浊度超过1.0NTU触发紧急报警', 1),
- ('余氯偏低报警', 'RULE_CHLORINE_LOW', 'residual_chlorine', 'general',
- '{"op":"AND","conditions":[{"metric":"residual_chlorine","operator":"<","threshold":0.1}]}',
- 0.1000, 600, '余氯低于0.1mg/L触发一般报警', 1),
- ('流量异常波动', 'RULE_FLOW_ANOMALY', 'flow', 'important',
- '{"op":"OR","conditions":[{"metric":"flow","operator":">","threshold":100},{"metric":"flow","operator":"<","threshold":5}]}',
- NULL, 120, '流量异常偏高或偏低时触发报警', 1);
|