支持设备定时定位上报与OTA通道选择
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -128,6 +128,11 @@ class DeviceFirmwareUpdate(Base):
|
||||
serial_number = Column(String(64), nullable=False, default="")
|
||||
mac_address = Column(String(512), nullable=True)
|
||||
firmware_version = Column(String(64), nullable=False)
|
||||
ota_channel = Column(String(32), nullable=True)
|
||||
target_version = Column(String(64), nullable=True)
|
||||
firmware_url = Column(Text, nullable=True)
|
||||
firmware_id = Column(Integer, nullable=True)
|
||||
source = Column(String(32), nullable=True)
|
||||
update_status = Column(String(32), nullable=False, default="success") # 更新状态,如 updating/success/failed
|
||||
created_at = Column(DateTime, nullable=False, server_default=func.now())
|
||||
updated_at = Column(DateTime, nullable=False, server_default=func.now(), onupdate=func.now())
|
||||
@@ -137,6 +142,44 @@ class DeviceFirmwareUpdate(Base):
|
||||
{'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
|
||||
)
|
||||
|
||||
|
||||
class DeviceOtaChannel(Base):
|
||||
__tablename__ = "device_ota_channels"
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
channel_key = Column(String(32), unique=True, nullable=False, index=True)
|
||||
name = Column(String(64), nullable=False)
|
||||
device_type = Column(Integer, nullable=True, index=True)
|
||||
enabled = Column(Boolean, nullable=False, default=True)
|
||||
created_at = Column(DateTime, nullable=False, server_default=func.now())
|
||||
updated_at = Column(DateTime, nullable=False, server_default=func.now(), onupdate=func.now())
|
||||
|
||||
__table_args__ = (
|
||||
{'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
|
||||
)
|
||||
|
||||
|
||||
class DeviceOtaFirmware(Base):
|
||||
__tablename__ = "device_ota_firmwares"
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
channel_key = Column(String(32), nullable=False, index=True)
|
||||
version = Column(String(64), nullable=False)
|
||||
firmware_url = Column(Text, nullable=False)
|
||||
checksum = Column(String(128), nullable=True)
|
||||
file_size = Column(BigInteger, nullable=True)
|
||||
release_status = Column(String(32), nullable=False, default="draft", index=True)
|
||||
release_channel = Column(String(32), nullable=False, default="stable")
|
||||
is_latest = Column(Boolean, nullable=False, default=False, index=True)
|
||||
notes = Column(Text, nullable=True)
|
||||
created_at = Column(DateTime, nullable=False, server_default=func.now())
|
||||
published_at = Column(DateTime, nullable=True)
|
||||
updated_at = Column(DateTime, nullable=False, server_default=func.now(), onupdate=func.now())
|
||||
|
||||
__table_args__ = (
|
||||
UniqueConstraint("channel_key", "version", name="uq_device_ota_firmware_channel_version"),
|
||||
Index("idx_device_ota_firmware_latest", "channel_key", "release_status", "is_latest"),
|
||||
{'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
|
||||
)
|
||||
|
||||
class SystemConfig(Base):
|
||||
__tablename__ = "system_config"
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
@@ -325,6 +368,9 @@ class DeviceSetting(Base):
|
||||
power: Mapped[Optional[int]] = mapped_column(Integer)
|
||||
signal: Mapped[Optional[int]] = mapped_column("signal", Integer)
|
||||
version: Mapped[Optional[str]] = mapped_column("version", String(64))
|
||||
imei: Mapped[Optional[str]] = mapped_column(String(64))
|
||||
device_type: Mapped[Optional[int]] = mapped_column(Integer)
|
||||
ota_channel: Mapped[Optional[str]] = mapped_column(String(32))
|
||||
disable_weekdays: Mapped[Optional[str]] = mapped_column(String(32))
|
||||
created_at: Mapped[Optional[datetime]] = mapped_column(DateTime, server_default=text("CURRENT_TIMESTAMP"))
|
||||
updated_at: Mapped[Optional[datetime]] = mapped_column(
|
||||
|
||||
Reference in New Issue
Block a user