SET NAMES utf8mb4; CREATE TABLE t_battery_group ( group_id BIGINT NOT NULL AUTO_INCREMENT, group_name VARCHAR(100) NOT NULL, model VARCHAR(100) NOT NULL, purpose VARCHAR(500) NULL, z VARCHAR(100) NULL, h VARCHAR(100) NULL, f VARCHAR(100) NULL, a VARCHAR(100) NULL, b VARCHAR(100) NULL, status CHAR(1) NOT NULL DEFAULT '0', del_flag VARCHAR(20) NOT NULL DEFAULT '0', create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NULL, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, remark VARCHAR(500) NULL, PRIMARY KEY (group_id), UNIQUE KEY uk_battery_group_name_del (group_name, del_flag), KEY idx_battery_group_status_time (status, del_flag, create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组'; CREATE TABLE t_battery_group_battery ( relation_id BIGINT NOT NULL AUTO_INCREMENT, group_id BIGINT NOT NULL, battery_no VARCHAR(100) NOT NULL, sort_order INT NOT NULL DEFAULT 0, del_flag VARCHAR(20) NOT NULL DEFAULT '0', PRIMARY KEY (relation_id), UNIQUE KEY uk_battery_no_del (battery_no, del_flag), KEY idx_group_battery (group_id, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组电池号'; CREATE TABLE t_battery_group_field ( field_id BIGINT NOT NULL AUTO_INCREMENT, field_name VARCHAR(100) NOT NULL, field_type VARCHAR(20) NOT NULL, status CHAR(1) NOT NULL DEFAULT '0', del_flag BIGINT NOT NULL DEFAULT 0, create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NULL, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, remark VARCHAR(500) NULL, PRIMARY KEY (field_id), UNIQUE KEY uk_battery_group_field_name_del (field_name, del_flag), KEY idx_battery_group_field_status (status, create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组字段'; CREATE TABLE t_battery_group_template ( template_id BIGINT NOT NULL AUTO_INCREMENT, template_name VARCHAR(100) NOT NULL, create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NULL, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, PRIMARY KEY (template_id), UNIQUE KEY uk_battery_group_template_name (template_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组字段模板'; CREATE TABLE t_battery_group_template_field ( relation_id BIGINT NOT NULL AUTO_INCREMENT, template_id BIGINT NOT NULL, field_id BIGINT NOT NULL, sort_order INT NOT NULL DEFAULT 0, create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NULL, del_flag BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (relation_id), UNIQUE KEY uk_template_field_del (template_id, field_id, del_flag), KEY idx_template_field_order (template_id, del_flag, sort_order) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='模板字段关系'; CREATE TABLE t_battery_group_relation_field ( relation_id BIGINT NOT NULL AUTO_INCREMENT, group_id BIGINT NOT NULL, template_id BIGINT NOT NULL, battery_group_field_id BIGINT NOT NULL, del_flag VARCHAR(20) NOT NULL DEFAULT '0', PRIMARY KEY (relation_id), UNIQUE KEY uk_group_field_del (group_id, battery_group_field_id, del_flag), KEY idx_group_relation_field (group_id, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组启用字段'; CREATE TABLE t_device_adapter ( adapter_id BIGINT NOT NULL AUTO_INCREMENT, adapter_code VARCHAR(64) NOT NULL, adapter_name VARCHAR(100) NOT NULL, adapter_type VARCHAR(32) NOT NULL, host VARCHAR(255) NOT NULL, port INT NOT NULL, poll_interval_ms INT NOT NULL DEFAULT 5000, timezone_id VARCHAR(64) NOT NULL DEFAULT 'Asia/Hong_Kong', capabilities JSON NOT NULL, status CHAR(1) NOT NULL DEFAULT '0', lease_owner VARCHAR(128) NULL, lease_until_utc DATETIME(3) NULL, create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, remark VARCHAR(500) NULL, del_flag BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (adapter_id), UNIQUE KEY uk_adapter_code_del (adapter_code, del_flag), KEY idx_adapter_enabled (status, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='设备适配器实例'; CREATE TABLE t_detection_cabinet ( cabinet_id BIGINT NOT NULL AUTO_INCREMENT, adapter_id BIGINT NOT NULL, cabinet_code VARCHAR(64) NOT NULL, cabinet_name VARCHAR(100) NOT NULL, manufacturer VARCHAR(100) NULL, model VARCHAR(100) NULL, capacity INT NOT NULL DEFAULT 1, channel_count INT NOT NULL DEFAULT 1, vendor_device_type INT NOT NULL, vendor_device_id INT NOT NULL, ip_address VARCHAR(45) NULL, mac_address VARCHAR(64) NULL, online_status VARCHAR(32) NOT NULL DEFAULT 'OFFLINE', last_seen_at_utc DATETIME(3) NULL, status CHAR(1) NOT NULL DEFAULT '0', create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NULL, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, remark VARCHAR(500) NULL, del_flag BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (cabinet_id), UNIQUE KEY uk_cabinet_code_del (cabinet_code, del_flag), UNIQUE KEY uk_cabinet_vendor_identity (adapter_id, vendor_device_type, vendor_device_id, del_flag), KEY idx_cabinet_status (status, online_status, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='新威检测柜'; CREATE TABLE t_detection_channel ( channel_id BIGINT NOT NULL AUTO_INCREMENT, adapter_id BIGINT NOT NULL, cabinet_id BIGINT NOT NULL, devtype INT NOT NULL, devid INT NOT NULL, subdevid INT NOT NULL, chlid INT NOT NULL, display_no VARCHAR(64) NULL, online_status VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN', work_status VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN', last_seen_at_utc DATETIME(3) NULL, status CHAR(1) NOT NULL DEFAULT '0', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NULL, del_flag BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (channel_id), UNIQUE KEY uk_channel_identity (adapter_id, devtype, devid, subdevid, chlid, del_flag), KEY idx_channel_cabinet (cabinet_id, status, del_flag), KEY idx_channel_observed (online_status, work_status, last_seen_at_utc) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='检测柜物理通道'; CREATE TABLE t_collector ( collector_id BIGINT NOT NULL AUTO_INCREMENT, collector_code VARCHAR(64) NOT NULL, collector_name VARCHAR(100) NOT NULL, adapter_id BIGINT NULL, ip_address VARCHAR(45) NULL, mac_address VARCHAR(64) NULL, manufacturer VARCHAR(100) NULL, model VARCHAR(100) NULL, channel_count INT NOT NULL DEFAULT 0, online_status VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN', status CHAR(1) NOT NULL DEFAULT '0', del_flag BIGINT NOT NULL DEFAULT 0, create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, remark VARCHAR(500) NULL, PRIMARY KEY (collector_id), UNIQUE KEY uk_collector_code_del (collector_code, del_flag), KEY idx_collector_status (status, online_status, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='可选辅助采集器'; CREATE TABLE t_test_type ( test_type_id BIGINT NOT NULL AUTO_INCREMENT, test_type_name VARCHAR(100) NOT NULL, status CHAR(1) NOT NULL DEFAULT '0', del_flag BIGINT NOT NULL DEFAULT 0, create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NULL, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, remark VARCHAR(500) NULL, PRIMARY KEY (test_type_id), UNIQUE KEY uk_test_type_name_del (test_type_name, del_flag), KEY idx_test_type_status (status, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试类型'; CREATE TABLE t_test ( test_id BIGINT NOT NULL AUTO_INCREMENT, test_name VARCHAR(100) NOT NULL, principal_id BIGINT NOT NULL, test_type_id BIGINT NOT NULL, test_purpose TEXT NOT NULL, test_status VARCHAR(32) NOT NULL DEFAULT 'WAITING', monitoring_status VARCHAR(32) NOT NULL DEFAULT 'NOT_MONITORED', monitor_timeout_minutes INT NOT NULL DEFAULT 30, started_at_utc DATETIME(3) NULL, ended_at_utc DATETIME(3) NULL, del_flag BIGINT NOT NULL DEFAULT 0, create_by VARCHAR(64) NOT NULL DEFAULT '', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64) NOT NULL DEFAULT '', update_time DATETIME NULL, remark VARCHAR(500) NULL, PRIMARY KEY (test_id), UNIQUE KEY uk_test_name_del (test_name, del_flag), KEY idx_test_status_time (test_status, monitoring_status, create_time), KEY idx_test_principal (principal_id, test_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试'; CREATE TABLE t_test_plan_step ( plan_step_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NOT NULL, cycle_no INT NOT NULL, step_no INT NOT NULL, step_type VARCHAR(64) NOT NULL, step_name VARCHAR(100) NOT NULL, parameters_json JSON NOT NULL, sort_order INT NOT NULL, PRIMARY KEY (plan_step_id), UNIQUE KEY uk_test_plan_step (test_id, cycle_no, step_no), KEY idx_test_plan_order (test_id, sort_order) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='计划工步'; CREATE TABLE t_test_battery ( relation_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NOT NULL, group_id BIGINT NOT NULL, battery_no VARCHAR(100) NOT NULL, del_flag BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (relation_id), UNIQUE KEY uk_test_battery_del (test_id, battery_no, del_flag), KEY idx_test_battery_group (group_id, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试电池号'; CREATE TABLE t_test_battery_field ( field_id BIGINT NOT NULL AUTO_INCREMENT, relation_id BIGINT NOT NULL, field_name VARCHAR(100) NOT NULL, field_value VARCHAR(500) NULL, del_flag BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (field_id), UNIQUE KEY uk_test_battery_field (relation_id, field_name, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试电池属性快照'; CREATE TABLE t_test_warning_threshold ( threshold_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NOT NULL, metric_code VARCHAR(100) NOT NULL, min_value DECIMAL(20,9) NULL, max_value DECIMAL(20,9) NULL, unit VARCHAR(32) NOT NULL, severity VARCHAR(32) NOT NULL DEFAULT 'WARNING', del_flag BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (threshold_id), UNIQUE KEY uk_test_threshold (test_id, metric_code, del_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试告警阈值'; CREATE TABLE t_test_channel_binding ( binding_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NOT NULL, battery_relation_id BIGINT NOT NULL, channel_id BIGINT NOT NULL, expected_barcode VARCHAR(100) NULL, observed_barcode VARCHAR(100) NULL, bts_test_id VARCHAR(64) NULL, claim_status VARCHAR(32) NOT NULL DEFAULT 'PENDING', claimed_at_utc DATETIME(3) NULL, released_at_utc DATETIME(3) NULL, PRIMARY KEY (binding_id), UNIQUE KEY uk_test_binding_battery (test_id, battery_relation_id), UNIQUE KEY uk_test_binding_channel (test_id, channel_id), KEY idx_binding_claim (channel_id, claim_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试与检测柜通道绑定'; CREATE TABLE t_channel_lease ( channel_id BIGINT NOT NULL, test_id BIGINT NOT NULL, binding_id BIGINT NOT NULL, acquired_by BIGINT NOT NULL, acquired_at_utc DATETIME(3) NOT NULL, PRIMARY KEY (channel_id), UNIQUE KEY uk_channel_lease_binding (binding_id), KEY idx_channel_lease_test (test_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='活动通道独占锁'; CREATE TABLE t_channel_snapshot ( channel_id BIGINT NOT NULL, test_id BIGINT NULL, binding_id BIGINT NULL, work_status VARCHAR(32) NOT NULL, cycle_no INT NULL, step_no INT NULL, step_type VARCHAR(64) NULL, voltage_v DECIMAL(20,9) NULL, current_a DECIMAL(20,9) NULL, capacity_ah DECIMAL(20,9) NULL, energy_wh DECIMAL(20,9) NULL, device_time_utc DATETIME(3) NULL, received_at_utc DATETIME(3) NOT NULL, raw_log_code VARCHAR(64) NULL, PRIMARY KEY (channel_id), KEY idx_snapshot_test (test_id, received_at_utc) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='通道最新实时快照'; CREATE TABLE t_test_sample ( sample_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NOT NULL, binding_id BIGINT NOT NULL, channel_id BIGINT NOT NULL, bts_test_id VARCHAR(64) NOT NULL, seq_id BIGINT UNSIGNED NOT NULL, device_time_utc DATETIME(3) NOT NULL, device_time_raw VARCHAR(64) NOT NULL, received_at_utc DATETIME(3) NOT NULL, cycle_no INT NOT NULL, step_no INT NOT NULL, step_type VARCHAR(64) NOT NULL, test_time_ms BIGINT UNSIGNED NULL, voltage_v DECIMAL(20,9) NULL, current_a DECIMAL(20,9) NULL, capacity_ah DECIMAL(20,9) NULL, energy_wh DECIMAL(20,9) NULL, content_sha256 BINARY(32) NOT NULL, PRIMARY KEY (sample_id), UNIQUE KEY uk_bts_history_sample (channel_id, bts_test_id, seq_id), KEY idx_sample_test_channel_time (test_id, channel_id, device_time_utc), KEY idx_sample_binding_step (binding_id, cycle_no, step_no, seq_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='BTS核心历史采样'; CREATE TABLE t_test_sample_measurement ( measurement_id BIGINT NOT NULL AUTO_INCREMENT, sample_id BIGINT NOT NULL, metric_code VARCHAR(191) NOT NULL, metric_value DECIMAL(30,12) NULL, text_value VARCHAR(500) NULL, unit VARCHAR(32) NOT NULL DEFAULT '', source_type VARCHAR(32) NOT NULL, PRIMARY KEY (measurement_id), UNIQUE KEY uk_sample_metric (sample_id, metric_code), KEY idx_measurement_metric (metric_code, sample_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='动态辅助与DBC测量'; CREATE TABLE t_history_sync_cursor ( binding_id BIGINT NOT NULL, bts_test_id VARCHAR(64) NOT NULL, next_seq_id BIGINT UNSIGNED NOT NULL DEFAULT 1, highest_saved_seq_id BIGINT UNSIGNED NULL, sync_status VARCHAR(32) NOT NULL DEFAULT 'PENDING', retry_count INT NOT NULL DEFAULT 0, last_error VARCHAR(1000) NULL, updated_at_utc DATETIME(3) NOT NULL, PRIMARY KEY (binding_id), KEY idx_history_sync_work (sync_status, updated_at_utc) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='历史补采持久化游标'; CREATE TABLE t_data_gap ( gap_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NOT NULL, binding_id BIGINT NOT NULL, bts_test_id VARCHAR(64) NOT NULL, missing_from_seq BIGINT UNSIGNED NOT NULL, missing_to_seq BIGINT UNSIGNED NOT NULL, gap_status VARCHAR(32) NOT NULL DEFAULT 'OPEN', retry_count INT NOT NULL DEFAULT 0, first_seen_at_utc DATETIME(3) NOT NULL, resolved_at_utc DATETIME(3) NULL, resolution_note VARCHAR(1000) NULL, PRIMARY KEY (gap_id), UNIQUE KEY uk_open_data_gap (binding_id, bts_test_id, missing_from_seq, missing_to_seq), KEY idx_gap_test_status (test_id, gap_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='历史数据序号缺口'; CREATE TABLE t_device_run_event ( run_event_id BIGINT NOT NULL AUTO_INCREMENT, channel_id BIGINT NOT NULL, bts_test_id VARCHAR(64) NULL, observed_barcode VARCHAR(100) NULL, first_seen_at_utc DATETIME(3) NOT NULL, last_seen_at_utc DATETIME(3) NOT NULL, event_status VARCHAR(32) NOT NULL DEFAULT 'UNCLAIMED', claimed_test_id BIGINT NULL, claimed_binding_id BIGINT NULL, claimed_by BIGINT NULL, claimed_at_utc DATETIME(3) NULL, PRIMARY KEY (run_event_id), KEY idx_run_event_status (event_status, first_seen_at_utc), KEY idx_run_event_channel (channel_id, last_seen_at_utc) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='未认领及已认领设备运行'; CREATE TABLE t_test_exception ( exception_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NULL, channel_id BIGINT NULL, exception_type VARCHAR(64) NOT NULL, exception_status VARCHAR(32) NOT NULL DEFAULT 'OPEN', severity VARCHAR(32) NOT NULL DEFAULT 'WARNING', first_occurred_at_utc DATETIME(3) NOT NULL, last_occurred_at_utc DATETIME(3) NOT NULL, occurrence_count BIGINT NOT NULL DEFAULT 1, detail VARCHAR(2000) NULL, handled_by BIGINT NULL, handled_at_utc DATETIME(3) NULL, handling_note VARCHAR(1000) NULL, PRIMARY KEY (exception_id), KEY idx_exception_open (test_id, channel_id, exception_type, exception_status), KEY idx_exception_time (exception_status, last_occurred_at_utc) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='去重异常事件'; CREATE TABLE t_test_audit ( audit_id BIGINT NOT NULL AUTO_INCREMENT, test_id BIGINT NOT NULL, event_type VARCHAR(64) NOT NULL, actor_id BIGINT NULL, actor_name VARCHAR(64) NOT NULL, occurred_at_utc DATETIME(3) NOT NULL, previous_value JSON NULL, new_value JSON NULL, reason VARCHAR(1000) NULL, correlation_id VARCHAR(64) NULL, PRIMARY KEY (audit_id), KEY idx_test_audit_time (test_id, occurred_at_utc, audit_id), KEY idx_test_audit_type (event_type, occurred_at_utc) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='只追加测试流程审计'; CREATE TABLE t_protocol_message ( message_id BIGINT NOT NULL AUTO_INCREMENT, adapter_id BIGINT NOT NULL, test_id BIGINT NULL, direction VARCHAR(16) NOT NULL, command_name VARCHAR(64) NOT NULL, occurred_at_utc DATETIME(3) NOT NULL, parse_status VARCHAR(32) NOT NULL, file_path VARCHAR(500) NOT NULL, content_sha256 CHAR(64) NOT NULL, retention_until_utc DATETIME(3) NOT NULL, error_detail VARCHAR(1000) NULL, PRIMARY KEY (message_id), KEY idx_protocol_retention (retention_until_utc), KEY idx_protocol_adapter_time (adapter_id, occurred_at_utc), KEY idx_protocol_test_time (test_id, occurred_at_utc) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='协议报文文件元数据';