feat: expand vehicle data platform capabilities
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_app (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(96) NOT NULL,
|
||||
app_key_hash BINARY(32) NOT NULL,
|
||||
app_key_prefix CHAR(8) NOT NULL,
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'enabled',
|
||||
valid_from DATETIME(3) NOT NULL,
|
||||
valid_to DATETIME(3) NULL,
|
||||
created_by VARCHAR(96) NOT NULL,
|
||||
updated_by VARCHAR(96) 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),
|
||||
UNIQUE KEY uk_vehicle_open_app_key_hash (app_key_hash),
|
||||
INDEX idx_vehicle_open_app_validity (status, valid_from, valid_to),
|
||||
CONSTRAINT chk_vehicle_open_app_status CHECK (status IN ('enabled', 'disabled')),
|
||||
CONSTRAINT chk_vehicle_open_app_validity CHECK (valid_to IS NULL OR valid_to > valid_from)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_app_vehicle (
|
||||
app_id BIGINT UNSIGNED NOT NULL,
|
||||
vin VARCHAR(64) NOT NULL,
|
||||
valid_from DATETIME(3) NOT NULL,
|
||||
valid_to DATETIME(3) NULL,
|
||||
granted_by VARCHAR(96) 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),
|
||||
PRIMARY KEY (app_id, vin),
|
||||
INDEX idx_vehicle_open_grant_vin_time (vin, valid_from, valid_to),
|
||||
INDEX idx_vehicle_open_grant_app_time (app_id, valid_from, valid_to, vin),
|
||||
CONSTRAINT fk_vehicle_open_grant_app FOREIGN KEY (app_id) REFERENCES vehicle_open_app(id) ON DELETE CASCADE,
|
||||
CONSTRAINT chk_vehicle_open_grant_validity CHECK (valid_to IS NULL OR valid_to > valid_from)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_daily_energy (
|
||||
vin VARCHAR(64) NOT NULL,
|
||||
stat_date DATE NOT NULL,
|
||||
energy_type VARCHAR(24) NOT NULL,
|
||||
source_endpoint VARCHAR(128) NOT NULL DEFAULT '',
|
||||
consumption_kg DECIMAL(18,3) NOT NULL DEFAULT 0,
|
||||
unit VARCHAR(16) NOT NULL,
|
||||
first_mass_kg DECIMAL(18,3) NULL,
|
||||
last_mass_kg DECIMAL(18,3) NULL,
|
||||
sample_count BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
refuel_count INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
quality_status VARCHAR(24) NOT NULL,
|
||||
quality_reason VARCHAR(255) NOT NULL DEFAULT '',
|
||||
calculated_at DATETIME(3) 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),
|
||||
PRIMARY KEY (vin, stat_date, energy_type),
|
||||
INDEX idx_vehicle_open_energy_date_type (stat_date, energy_type, quality_status, vin),
|
||||
CONSTRAINT chk_vehicle_open_energy_type CHECK (energy_type IN ('HYDROGEN')),
|
||||
CONSTRAINT chk_vehicle_open_energy_quality CHECK (quality_status IN ('OK', 'NO_DATA', 'SUSPECT'))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_api_audit (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
trace_id VARCHAR(64) NOT NULL,
|
||||
app_id BIGINT UNSIGNED NULL,
|
||||
endpoint VARCHAR(64) NOT NULL,
|
||||
result VARCHAR(24) NOT NULL,
|
||||
requested_vehicle_count INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
detail VARCHAR(512) NOT NULL DEFAULT '',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
INDEX idx_vehicle_open_api_audit_app_time (app_id, created_at),
|
||||
INDEX idx_vehicle_open_api_audit_trace (trace_id),
|
||||
INDEX idx_vehicle_open_api_audit_result_time (result, created_at),
|
||||
CONSTRAINT fk_vehicle_open_api_audit_app FOREIGN KEY (app_id) REFERENCES vehicle_open_app(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_admin_audit (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
app_id BIGINT UNSIGNED NULL,
|
||||
actor VARCHAR(96) NOT NULL,
|
||||
action VARCHAR(64) NOT NULL,
|
||||
detail_json JSON NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
INDEX idx_vehicle_open_admin_audit_app_time (app_id, created_at),
|
||||
INDEX idx_vehicle_open_admin_audit_actor_time (actor, created_at),
|
||||
CONSTRAINT fk_vehicle_open_admin_audit_app FOREIGN KEY (app_id) REFERENCES vehicle_open_app(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,65 @@
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_user (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(64) NOT NULL,
|
||||
display_name VARCHAR(96) NOT NULL,
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'enabled',
|
||||
valid_from DATETIME(3) NOT NULL,
|
||||
valid_to DATETIME(3) NULL,
|
||||
failed_login_count INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
locked_until DATETIME(3) NULL,
|
||||
password_changed_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
last_login_at DATETIME(3) NULL,
|
||||
created_by VARCHAR(96) NOT NULL,
|
||||
updated_by VARCHAR(96) 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),
|
||||
UNIQUE KEY uk_vehicle_open_user_username (username),
|
||||
INDEX idx_vehicle_open_user_status_validity (status, valid_from, valid_to),
|
||||
CONSTRAINT chk_vehicle_open_user_status CHECK (status IN ('enabled', 'disabled')),
|
||||
CONSTRAINT chk_vehicle_open_user_validity CHECK (valid_to IS NULL OR valid_to > valid_from)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_user_app (
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
app_id BIGINT UNSIGNED NOT NULL,
|
||||
role VARCHAR(16) NOT NULL,
|
||||
granted_by VARCHAR(96) 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),
|
||||
PRIMARY KEY (user_id, app_id),
|
||||
INDEX idx_vehicle_open_user_app_app (app_id, role, user_id),
|
||||
CONSTRAINT fk_vehicle_open_user_app_user FOREIGN KEY (user_id) REFERENCES vehicle_open_user(id) ON DELETE CASCADE,
|
||||
CONSTRAINT fk_vehicle_open_user_app_app FOREIGN KEY (app_id) REFERENCES vehicle_open_app(id) ON DELETE CASCADE,
|
||||
CONSTRAINT chk_vehicle_open_user_app_role CHECK (role IN ('owner', 'developer', 'viewer'))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_user_session (
|
||||
id CHAR(32) NOT NULL PRIMARY KEY,
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
token_hash BINARY(32) NOT NULL,
|
||||
issued_at DATETIME(3) NOT NULL,
|
||||
expires_at DATETIME(3) NOT NULL,
|
||||
last_seen_at DATETIME(3) NOT NULL,
|
||||
revoked_at DATETIME(3) NULL,
|
||||
remote_addr VARCHAR(96) NOT NULL DEFAULT '',
|
||||
user_agent VARCHAR(255) NOT NULL DEFAULT '',
|
||||
UNIQUE KEY uk_vehicle_open_user_session_token (token_hash),
|
||||
INDEX idx_vehicle_open_user_session_user (user_id, expires_at),
|
||||
INDEX idx_vehicle_open_user_session_expiry (expires_at, revoked_at),
|
||||
CONSTRAINT fk_vehicle_open_user_session_user FOREIGN KEY (user_id) REFERENCES vehicle_open_user(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_user_audit (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
user_id BIGINT UNSIGNED NULL,
|
||||
actor VARCHAR(96) NOT NULL,
|
||||
action VARCHAR(64) NOT NULL,
|
||||
result VARCHAR(24) NOT NULL,
|
||||
detail_json JSON NULL,
|
||||
remote_addr VARCHAR(96) NOT NULL DEFAULT '',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
INDEX idx_vehicle_open_user_audit_user_time (user_id, created_at),
|
||||
INDEX idx_vehicle_open_user_audit_action_time (action, created_at),
|
||||
CONSTRAINT fk_vehicle_open_user_audit_user FOREIGN KEY (user_id) REFERENCES vehicle_open_user(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,14 @@
|
||||
ALTER TABLE vehicle_open_user_session
|
||||
DROP FOREIGN KEY fk_vehicle_open_user_session_user;
|
||||
|
||||
ALTER TABLE vehicle_open_user_session
|
||||
MODIFY COLUMN user_id BIGINT UNSIGNED NULL,
|
||||
ADD COLUMN platform_user_id BIGINT UNSIGNED NULL AFTER user_id,
|
||||
ADD INDEX idx_vehicle_open_user_session_platform_user (platform_user_id, expires_at),
|
||||
ADD CONSTRAINT fk_vehicle_open_user_session_user
|
||||
FOREIGN KEY (user_id) REFERENCES vehicle_open_user(id) ON DELETE CASCADE,
|
||||
ADD CONSTRAINT fk_vehicle_open_user_session_platform_user
|
||||
FOREIGN KEY (platform_user_id) REFERENCES platform_user(id) ON DELETE CASCADE,
|
||||
ADD CONSTRAINT chk_vehicle_open_user_session_identity
|
||||
CHECK ((user_id IS NOT NULL AND platform_user_id IS NULL)
|
||||
OR (user_id IS NULL AND platform_user_id IS NOT NULL));
|
||||
@@ -0,0 +1,21 @@
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_hydrogen_stream_state (
|
||||
vin VARCHAR(64) NOT NULL,
|
||||
stat_date DATE NOT NULL,
|
||||
source_endpoint VARCHAR(128) NOT NULL DEFAULT '',
|
||||
first_mass_kg DECIMAL(18,3) NOT NULL,
|
||||
last_mass_kg DECIMAL(18,3) NOT NULL,
|
||||
consumption_kg DECIMAL(18,3) NOT NULL DEFAULT 0,
|
||||
sample_count BIGINT UNSIGNED NOT NULL DEFAULT 1,
|
||||
refuel_count INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
abnormal_drop_count INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
first_event_time DATETIME(3) NOT NULL,
|
||||
last_event_time DATETIME(3) NOT NULL,
|
||||
last_event_id VARCHAR(128) NOT NULL DEFAULT '',
|
||||
quality_status VARCHAR(24) NOT NULL DEFAULT 'NO_DATA',
|
||||
quality_reason VARCHAR(255) NOT NULL DEFAULT '有效车载氢量样本不足2条',
|
||||
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),
|
||||
PRIMARY KEY (vin, stat_date, source_endpoint),
|
||||
INDEX idx_hydrogen_stream_date_quality (stat_date, quality_status, vin),
|
||||
CONSTRAINT chk_hydrogen_stream_quality CHECK (quality_status IN ('OK', 'NO_DATA', 'SUSPECT'))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,18 @@
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_hydrogen_rate_stream_state (
|
||||
vin VARCHAR(64) NOT NULL,
|
||||
stat_date DATE NOT NULL,
|
||||
source_endpoint VARCHAR(128) NOT NULL DEFAULT '',
|
||||
first_rate_kg_per_100km DECIMAL(18,3) NOT NULL,
|
||||
last_rate_kg_per_100km DECIMAL(18,3) NOT NULL,
|
||||
sample_count BIGINT UNSIGNED NOT NULL DEFAULT 1,
|
||||
first_event_time DATETIME(3) NOT NULL,
|
||||
last_event_time DATETIME(3) NOT NULL,
|
||||
last_event_id VARCHAR(128) NOT NULL DEFAULT '',
|
||||
quality_status VARCHAR(24) NOT NULL DEFAULT 'NO_DATA',
|
||||
quality_reason VARCHAR(255) NOT NULL DEFAULT '有效百公里氢耗样本不足2条',
|
||||
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),
|
||||
PRIMARY KEY (vin, stat_date, source_endpoint),
|
||||
INDEX idx_hydrogen_rate_stream_date_quality (stat_date, quality_status, vin),
|
||||
CONSTRAINT chk_hydrogen_rate_stream_quality CHECK (quality_status IN ('OK', 'NO_DATA'))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,26 @@
|
||||
CREATE TABLE IF NOT EXISTS vehicle_hydrogen_tank_capacity (
|
||||
vin VARCHAR(64) NOT NULL,
|
||||
source_vehicle_id BIGINT NOT NULL,
|
||||
source_model_id BIGINT NULL,
|
||||
plate_number VARCHAR(50) NOT NULL DEFAULT '',
|
||||
brand_name VARCHAR(500) NOT NULL DEFAULT '',
|
||||
model_name VARCHAR(500) NOT NULL DEFAULT '',
|
||||
tank_capacity_l DECIMAL(12,2) NOT NULL,
|
||||
active TINYINT(1) NOT NULL DEFAULT 1,
|
||||
source_updated_at DATETIME NULL,
|
||||
synced_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
PRIMARY KEY (vin),
|
||||
INDEX idx_hydrogen_capacity_model (source_model_id),
|
||||
INDEX idx_hydrogen_capacity_active (active,vin)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
ALTER TABLE vehicle_open_hydrogen_stream_state
|
||||
ADD COLUMN tank_capacity_l DECIMAL(12,2) NULL AFTER abnormal_drop_count,
|
||||
ADD COLUMN first_pressure_mpa DECIMAL(10,3) NULL AFTER tank_capacity_l,
|
||||
ADD COLUMN last_pressure_mpa DECIMAL(10,3) NULL AFTER first_pressure_mpa,
|
||||
ADD COLUMN first_temperature_c DECIMAL(10,3) NULL AFTER last_pressure_mpa,
|
||||
ADD COLUMN last_temperature_c DECIMAL(10,3) NULL AFTER first_temperature_c,
|
||||
ADD COLUMN calculation_method VARCHAR(32) NOT NULL DEFAULT 'PRESSURE_NIST' AFTER last_temperature_c;
|
||||
|
||||
CREATE INDEX idx_hydrogen_capacity_sync
|
||||
ON vehicle_hydrogen_tank_capacity (synced_at,active);
|
||||
@@ -0,0 +1,6 @@
|
||||
ALTER TABLE vehicle_open_hydrogen_stream_state
|
||||
ADD COLUMN cycle_min_mass_kg DECIMAL(18,3) NULL AFTER last_mass_kg;
|
||||
|
||||
UPDATE vehicle_open_hydrogen_stream_state
|
||||
SET cycle_min_mass_kg=last_mass_kg
|
||||
WHERE cycle_min_mass_kg IS NULL;
|
||||
@@ -0,0 +1,22 @@
|
||||
-- Add first-class automation trigger semantics without breaking existing metric rules.
|
||||
ALTER TABLE vehicle_alert_rule
|
||||
ADD COLUMN trigger_type VARCHAR(24) NOT NULL DEFAULT 'metric' AFTER description,
|
||||
ADD COLUMN fence_name VARCHAR(80) NOT NULL DEFAULT '' AFTER trigger_type,
|
||||
ADD COLUMN fence_longitude DOUBLE NOT NULL DEFAULT 0 AFTER fence_name,
|
||||
ADD COLUMN fence_latitude DOUBLE NOT NULL DEFAULT 0 AFTER fence_longitude,
|
||||
ADD COLUMN fence_radius_m DOUBLE NOT NULL DEFAULT 0 AFTER fence_latitude;
|
||||
|
||||
ALTER TABLE vehicle_alert_event
|
||||
ADD COLUMN trigger_type VARCHAR(24) NOT NULL DEFAULT 'metric' AFTER severity;
|
||||
|
||||
CREATE INDEX idx_alert_rule_trigger_type ON vehicle_alert_rule(trigger_type, enabled);
|
||||
CREATE INDEX idx_alert_event_trigger_type ON vehicle_alert_event(trigger_type, triggered_at);
|
||||
|
||||
-- Preserve the business meaning of rules that existed before trigger_type.
|
||||
UPDATE vehicle_alert_rule
|
||||
SET trigger_type = CASE
|
||||
WHEN metric = 'freshness_sec' THEN 'offline'
|
||||
WHEN metric = 'speed_kmh' AND operator IN ('lt','lte') AND duration_sec >= 300 THEN 'stationary'
|
||||
ELSE 'metric'
|
||||
END
|
||||
WHERE trigger_type = 'metric';
|
||||
@@ -0,0 +1,7 @@
|
||||
ALTER TABLE vehicle_reconciliation_issue
|
||||
ADD COLUMN assignee VARCHAR(128) NOT NULL DEFAULT '' AFTER resolved_by,
|
||||
ADD COLUMN assigned_by VARCHAR(128) NOT NULL DEFAULT '' AFTER assignee,
|
||||
ADD COLUMN assigned_at DATETIME(3) NULL AFTER assigned_by,
|
||||
ADD COLUMN due_at DATETIME(3) NULL AFTER assigned_at,
|
||||
ADD INDEX idx_reconciliation_owner (assignee, status, due_at),
|
||||
ADD INDEX idx_reconciliation_due (due_at, status);
|
||||
@@ -0,0 +1,29 @@
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_mileage_snapshot (
|
||||
snapshot_id CHAR(32) CHARACTER SET ascii COLLATE ascii_bin NOT NULL PRIMARY KEY,
|
||||
app_id BIGINT UNSIGNED NOT NULL,
|
||||
request_hash BINARY(32) NOT NULL,
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE NOT NULL,
|
||||
vehicle_count INT UNSIGNED NOT NULL,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
expires_at DATETIME(3) NOT NULL,
|
||||
INDEX idx_open_mileage_snapshot_expiry (expires_at),
|
||||
INDEX idx_open_mileage_snapshot_app (app_id, created_at),
|
||||
CONSTRAINT fk_open_mileage_snapshot_app
|
||||
FOREIGN KEY (app_id) REFERENCES vehicle_open_app(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_open_mileage_snapshot_vehicle (
|
||||
snapshot_id CHAR(32) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
ordinal INT UNSIGNED NOT NULL,
|
||||
vin VARCHAR(64) NOT NULL,
|
||||
plate VARCHAR(64) NOT NULL,
|
||||
PRIMARY KEY (snapshot_id, ordinal),
|
||||
UNIQUE KEY uk_open_mileage_snapshot_plate (snapshot_id, plate),
|
||||
INDEX idx_open_mileage_snapshot_vin (snapshot_id, vin),
|
||||
CONSTRAINT fk_open_mileage_snapshot_vehicle
|
||||
FOREIGN KEY (snapshot_id) REFERENCES vehicle_open_mileage_snapshot(snapshot_id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE INDEX idx_daily_mileage_source_open_selected
|
||||
ON vehicle_daily_mileage_source(vin, stat_date, protocol, is_selected, latest_event_time);
|
||||
@@ -0,0 +1,28 @@
|
||||
ALTER TABLE vehicle_alert_notification
|
||||
ADD COLUMN recipient VARCHAR(160) NOT NULL DEFAULT '',
|
||||
ADD COLUMN attempt_count INT NOT NULL DEFAULT 1,
|
||||
ADD COLUMN provider_message_id VARCHAR(160) NOT NULL DEFAULT '',
|
||||
ADD COLUMN delivered_at DATETIME(3) NULL,
|
||||
ADD COLUMN last_error VARCHAR(500) NOT NULL DEFAULT '',
|
||||
ADD COLUMN last_attempt_at DATETIME(3) NULL,
|
||||
ADD COLUMN retry_requested_by VARCHAR(128) NOT NULL DEFAULT '',
|
||||
ADD COLUMN retry_requested_at DATETIME(3) NULL,
|
||||
ADD KEY idx_alert_notification_delivery (delivery_status, created_at),
|
||||
ADD KEY idx_alert_notification_retry (retry_requested_at, id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS vehicle_alert_notification_retry_audit (
|
||||
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
notification_id BIGINT NOT NULL,
|
||||
idempotency_key VARCHAR(96) NOT NULL,
|
||||
actor VARCHAR(128) NOT NULL,
|
||||
reason VARCHAR(200) NOT NULL,
|
||||
previous_status VARCHAR(32) NOT NULL,
|
||||
next_status VARCHAR(32) NOT NULL,
|
||||
attempt_count INT NOT NULL,
|
||||
requested_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
UNIQUE KEY uk_alert_notification_retry_key (idempotency_key),
|
||||
KEY idx_alert_notification_retry_notification (notification_id, requested_at),
|
||||
CONSTRAINT fk_alert_notification_retry_notification
|
||||
FOREIGN KEY (notification_id) REFERENCES vehicle_alert_notification(id)
|
||||
ON DELETE CASCADE
|
||||
);
|
||||
@@ -0,0 +1,19 @@
|
||||
ALTER TABLE vehicle_alert_rule
|
||||
ADD COLUMN notification_targets_json TEXT NULL AFTER notification_channels_json;
|
||||
|
||||
UPDATE vehicle_alert_rule
|
||||
SET notification_targets_json = CASE
|
||||
WHEN JSON_CONTAINS(notification_channels_json, '"in_app"') THEN
|
||||
'[{"channel":"in_app","recipientId":"platform-operators","label":"平台值班组"}]'
|
||||
ELSE '[]'
|
||||
END
|
||||
WHERE notification_targets_json IS NULL;
|
||||
|
||||
ALTER TABLE vehicle_alert_rule
|
||||
MODIFY COLUMN notification_targets_json TEXT NOT NULL;
|
||||
|
||||
ALTER TABLE vehicle_alert_notification
|
||||
ADD COLUMN recipient_ref VARCHAR(96) NOT NULL DEFAULT '' AFTER recipient,
|
||||
ADD COLUMN lease_token VARCHAR(96) NOT NULL DEFAULT '',
|
||||
ADD COLUMN lease_expires_at DATETIME(3) NULL,
|
||||
ADD KEY idx_alert_notification_dispatch (channel, delivery_status, lease_expires_at, id);
|
||||
@@ -0,0 +1,9 @@
|
||||
-- Reversible lifecycle for large automation-rule libraries.
|
||||
ALTER TABLE vehicle_alert_rule
|
||||
ADD COLUMN archived_by VARCHAR(128) NOT NULL DEFAULT '' AFTER updated_by,
|
||||
ADD COLUMN archived_at DATETIME(3) NULL AFTER archived_by,
|
||||
ADD COLUMN archive_reason VARCHAR(200) NOT NULL DEFAULT '' AFTER archived_at,
|
||||
ADD KEY idx_alert_rule_lifecycle (archived_at, enabled, updated_at);
|
||||
|
||||
ALTER TABLE vehicle_alert_rule_audit
|
||||
ADD COLUMN reason VARCHAR(200) NOT NULL DEFAULT '' AFTER action;
|
||||
@@ -0,0 +1,6 @@
|
||||
ALTER TABLE vehicle_reconciliation_issue
|
||||
ADD COLUMN archived_at DATETIME(3) NULL AFTER due_at,
|
||||
ADD COLUMN archived_by VARCHAR(128) NOT NULL DEFAULT '' AFTER archived_at,
|
||||
ADD COLUMN archive_reason VARCHAR(500) NOT NULL DEFAULT '' AFTER archived_by,
|
||||
ADD INDEX idx_reconciliation_archive (archived_at, severity, last_seen_at),
|
||||
ADD INDEX idx_reconciliation_archive_actor (archived_by, archived_at);
|
||||
@@ -0,0 +1,8 @@
|
||||
ALTER TABLE vehicle_daily_mileage
|
||||
ADD COLUMN pure_hydrogen_mileage_km DECIMAL(18,3) NOT NULL DEFAULT 0 AFTER daily_mileage_km;
|
||||
|
||||
ALTER TABLE vehicle_daily_mileage_source
|
||||
ADD COLUMN pure_hydrogen_mileage_km DECIMAL(18,3) NOT NULL DEFAULT 0 AFTER daily_mileage_km,
|
||||
ADD COLUMN pure_hydrogen_sample_count BIGINT NOT NULL DEFAULT 0 AFTER sample_count,
|
||||
ADD COLUMN latest_pure_hydrogen_active TINYINT(1) NOT NULL DEFAULT 0 AFTER latest_event_time,
|
||||
ADD COLUMN latest_pure_hydrogen_mode_known TINYINT(1) NOT NULL DEFAULT 0 AFTER latest_pure_hydrogen_active;
|
||||
@@ -0,0 +1,15 @@
|
||||
CREATE TABLE IF NOT EXISTS platform_user_business_scope (
|
||||
user_id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
|
||||
scope_level VARCHAR(24) NOT NULL,
|
||||
department_ids VARCHAR(1024) NOT NULL DEFAULT '',
|
||||
responsible_user_id VARCHAR(96) NOT NULL DEFAULT '',
|
||||
enabled TINYINT(1) NOT NULL DEFAULT 1,
|
||||
source_system VARCHAR(32) NOT NULL DEFAULT 'oneos',
|
||||
source_updated_at DATETIME(3) 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),
|
||||
CONSTRAINT fk_platform_user_business_scope_user FOREIGN KEY (user_id) REFERENCES platform_user(id) ON DELETE CASCADE,
|
||||
CONSTRAINT chk_platform_user_business_scope_level CHECK (scope_level IN ('department', 'responsible')),
|
||||
INDEX idx_platform_user_business_scope_level (scope_level, enabled),
|
||||
INDEX idx_platform_user_business_scope_responsible (responsible_user_id, enabled)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,2 @@
|
||||
CREATE INDEX idx_daily_mileage_open_latest
|
||||
ON vehicle_daily_mileage(vin, protocol, stat_date);
|
||||
Reference in New Issue
Block a user