Files
lingniu-vehicle-ingest/vehicle-data-platform/deploy/migrations/002_alert_center.sql

117 lines
4.6 KiB
SQL

-- Durable alert center. Apply before switching API/evaluator binaries.
CREATE TABLE IF NOT EXISTS vehicle_alert_rule (
id VARCHAR(64) NOT NULL PRIMARY KEY,
name VARCHAR(80) NOT NULL,
description VARCHAR(500) NOT NULL DEFAULT '',
severity ENUM('critical','major','minor') NOT NULL,
value_type ENUM('numeric','boolean') NOT NULL,
metric VARCHAR(64) NOT NULL,
operator VARCHAR(8) NOT NULL,
threshold_value DOUBLE NOT NULL DEFAULT 0,
boolean_threshold TINYINT NULL,
duration_sec INT NOT NULL DEFAULT 0,
recovery_operator VARCHAR(8) NOT NULL DEFAULT '',
recovery_threshold DOUBLE NOT NULL DEFAULT 0,
repeat_interval_sec INT NOT NULL DEFAULT 0,
scope_protocols_json TEXT NOT NULL,
scope_vins_json LONGTEXT NOT NULL,
notification_channels_json TEXT NOT NULL,
enabled TINYINT(1) NOT NULL DEFAULT 1,
version INT NOT NULL DEFAULT 1,
created_by VARCHAR(128) NOT NULL,
updated_by VARCHAR(128) NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
KEY idx_alert_rule_enabled (enabled, severity),
KEY idx_alert_rule_metric (metric)
);
CREATE TABLE IF NOT EXISTS vehicle_alert_rule_audit (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
rule_id VARCHAR(64) NOT NULL,
rule_version INT NOT NULL,
actor VARCHAR(128) NOT NULL,
action VARCHAR(32) NOT NULL,
snapshot_json LONGTEXT NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_alert_rule_audit_rule (rule_id, rule_version),
KEY idx_alert_rule_audit_created (created_at)
);
CREATE TABLE IF NOT EXISTS vehicle_alert_candidate (
rule_id VARCHAR(64) NOT NULL,
vin VARCHAR(64) NOT NULL,
protocol VARCHAR(32) NOT NULL,
first_matched_at DATETIME(3) NOT NULL,
last_matched_at DATETIME(3) NOT NULL,
latest_value DOUBLE NOT NULL,
source_event_id VARCHAR(128) NOT NULL DEFAULT '',
PRIMARY KEY (rule_id, vin, protocol),
KEY idx_alert_candidate_duration (first_matched_at, last_matched_at)
);
CREATE TABLE IF NOT EXISTS vehicle_alert_event (
id VARCHAR(64) NOT NULL PRIMARY KEY,
fingerprint VARCHAR(255) NOT NULL,
rule_id VARCHAR(64) NOT NULL,
rule_name VARCHAR(80) NOT NULL,
rule_version INT NOT NULL,
severity ENUM('critical','major','minor') NOT NULL,
status ENUM('unprocessed','processing','recovered','closed','ignored') NOT NULL,
vin VARCHAR(64) NOT NULL,
plate VARCHAR(64) NOT NULL DEFAULT '',
protocol VARCHAR(32) NOT NULL DEFAULT '',
metric VARCHAR(64) NOT NULL,
operator VARCHAR(8) NOT NULL,
trigger_value DOUBLE NOT NULL,
threshold_value DOUBLE NOT NULL,
unit VARCHAR(24) NOT NULL DEFAULT '',
duration_sec INT NOT NULL DEFAULT 0,
location_text VARCHAR(255) NOT NULL DEFAULT '',
longitude DOUBLE NULL,
latitude DOUBLE NULL,
source_event_id VARCHAR(128) NOT NULL DEFAULT '',
event_at DATETIME(3) NULL,
received_at DATETIME(3) NULL,
triggered_at DATETIME(3) NOT NULL,
recovered_at DATETIME(3) NULL,
handler VARCHAR(128) NOT NULL DEFAULT '',
version INT NOT NULL DEFAULT 1,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
KEY idx_alert_event_list (triggered_at, id),
KEY idx_alert_event_status (status, severity, triggered_at),
KEY idx_alert_event_vehicle (vin, triggered_at),
KEY idx_alert_event_rule (rule_id, triggered_at),
KEY idx_alert_event_fingerprint (fingerprint, status)
);
CREATE TABLE IF NOT EXISTS vehicle_alert_event_action (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
event_id VARCHAR(64) NOT NULL,
action VARCHAR(32) NOT NULL,
from_status VARCHAR(32) NOT NULL DEFAULT '',
to_status VARCHAR(32) NOT NULL,
actor VARCHAR(128) NOT NULL,
note VARCHAR(200) NOT NULL DEFAULT '',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_alert_action_event (event_id, created_at),
KEY idx_alert_action_actor (actor, created_at)
);
CREATE TABLE IF NOT EXISTS vehicle_alert_notification (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
event_id VARCHAR(64) NOT NULL,
title VARCHAR(120) NOT NULL,
content VARCHAR(500) NOT NULL,
severity ENUM('critical','major','minor') NOT NULL,
channel ENUM('in_app','sms','email','wecom') NOT NULL DEFAULT 'in_app',
delivery_status ENUM('created','reserved','sent','failed') NOT NULL DEFAULT 'created',
is_read TINYINT(1) NOT NULL DEFAULT 0,
read_by VARCHAR(128) NOT NULL DEFAULT '',
read_at DATETIME(3) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_alert_notification_unread (channel, is_read, created_at),
KEY idx_alert_notification_event (event_id)
);