feat: expand vehicle data platform capabilities

This commit is contained in:
lingniu
2026-07-27 16:46:15 +08:00
parent e3a1f80f86
commit 3c4bece72c
650 changed files with 62155 additions and 2552 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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));

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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';

View File

@@ -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);

View File

@@ -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);

View File

@@ -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
);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -0,0 +1,2 @@
CREATE INDEX idx_daily_mileage_open_latest
ON vehicle_daily_mileage(vin, protocol, stat_date);