支持设备定时定位上报与OTA通道选择

This commit is contained in:
stu2not
2026-06-15 08:52:30 +08:00
parent 9d1537bd5d
commit 2b04a2fca8
15 changed files with 893 additions and 24 deletions

View File

@@ -94,6 +94,89 @@ async def _ensure_device_alarm_location_columns(conn) -> None:
)
async def _ensure_device_settings_metadata_columns(conn) -> None:
await _ensure_columns(
conn,
table_name="device_settings",
columns=[
("imei", "imei VARCHAR(64) NULL AFTER `version`"),
("device_type", "device_type TINYINT NULL AFTER imei"),
("ota_channel", "ota_channel VARCHAR(32) NULL AFTER device_type"),
],
)
async def _ensure_device_firmware_update_ota_columns(conn) -> None:
await _ensure_columns(
conn,
table_name="device_firmware_update",
columns=[
("ota_channel", "ota_channel VARCHAR(32) NULL AFTER firmware_version"),
("target_version", "target_version VARCHAR(64) NULL AFTER ota_channel"),
("firmware_url", "firmware_url TEXT NULL AFTER target_version"),
("firmware_id", "firmware_id INT NULL AFTER firmware_url"),
("source", "source VARCHAR(32) NULL AFTER firmware_id"),
],
)
async def _ensure_device_ota_tables(conn) -> None:
await conn.execute(
text(
"""
CREATE TABLE IF NOT EXISTS device_ota_channels (
id INT NOT NULL AUTO_INCREMENT,
channel_key VARCHAR(32) NOT NULL,
name VARCHAR(64) NOT NULL,
device_type TINYINT NULL,
enabled TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_device_ota_channels_key (channel_key),
KEY idx_device_ota_channels_device_type (device_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
"""
)
)
await conn.execute(
text(
"""
CREATE TABLE IF NOT EXISTS device_ota_firmwares (
id INT NOT NULL AUTO_INCREMENT,
channel_key VARCHAR(32) NOT NULL,
version VARCHAR(64) NOT NULL,
firmware_url TEXT NOT NULL,
checksum VARCHAR(128) NULL,
file_size BIGINT NULL,
release_status VARCHAR(32) NOT NULL DEFAULT 'draft',
release_channel VARCHAR(32) NOT NULL DEFAULT 'stable',
is_latest TINYINT(1) NOT NULL DEFAULT 0,
notes TEXT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
published_at DATETIME NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uq_device_ota_firmware_channel_version (channel_key, version),
KEY idx_device_ota_firmware_latest (channel_key, release_status, is_latest)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
"""
)
)
await conn.execute(
text(
"""
INSERT INTO device_ota_channels (channel_key, name, device_type, enabled)
VALUES
('legacy', 'Legacy devices', NULL, 1),
('no_gps', 'NFC without GPS', 1, 1),
('gps', 'NFC with GPS', 2, 1)
ON DUPLICATE KEY UPDATE channel_key = channel_key
"""
)
)
async def _ensure_child_location_address_columns(conn) -> None:
await _ensure_columns(
conn,
@@ -283,6 +366,9 @@ async def init_db():
await conn.run_sync(Base.metadata.create_all)
await _ensure_manual_sleep_mode_column(conn)
await _ensure_schedule_suppressed_until_column(conn)
await _ensure_device_settings_metadata_columns(conn)
await _ensure_device_firmware_update_ota_columns(conn)
await _ensure_device_ota_tables(conn)
await _ensure_device_alarm_location_columns(conn)
await _ensure_child_location_address_columns(conn)
await _ensure_bind_session_card_columns(conn)