yeg
2026-09-01 545e467cee40814b4613a9087f8cbedc31655bf1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
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='协议报文文件元数据';