"""设备数据模型""" from sqlalchemy import Column, BigInteger, String, Integer, Text, TIMESTAMP, ForeignKey, JSON from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.core.database import Base class OLTDevice(Base): __tablename__ = "olt_devices" id = Column(BigInteger, primary_key=True, index=True) ip_address = Column(String(45), nullable=False) username = Column(String(100), nullable=False) password = Column(Text, nullable=False) slot_command = Column(String(50), nullable=False) location = Column(String(200)) description = Column(Text) created_at = Column(TIMESTAMP, server_default=func.now()) updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now()) class ONUDevice(Base): __tablename__ = "onu_devices" id = Column(BigInteger, primary_key=True, index=True) mac_address = Column(String(17), nullable=False, index=True) olt_id = Column(BigInteger, ForeignKey("olt_devices.id")) slot_number = Column(Integer) port_number = Column(Integer) port_id = Column(String(20)) # 完整端口标识,如 "1/0/2:4" # OLT 返回的额外信息 loid = Column(String(50)) # LOID model = Column(String(100)) # 设备型号 distance_m = Column(Integer) # 距离(米) region = Column(String(100), index=True) school_name = Column(String(200), index=True) building = Column(String(100)) place_type = Column(String(50)) # 场所类型 room_number = Column(String(50)) notes = Column(Text) # 备注 created_at = Column(TIMESTAMP, server_default=func.now()) updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now()) # 关联状态历史 status_history = relationship("DeviceStatusHistory", back_populates="device", lazy="selectin") class DeviceStatusHistory(Base): __tablename__ = "device_status_history" id = Column(BigInteger, primary_key=True, index=True) onu_device_id = Column(BigInteger, ForeignKey("onu_devices.id")) status = Column(String(20), nullable=False) # online, offline distance_m = Column(Integer) # 距离(米) checked_at = Column(TIMESTAMP, nullable=False) response_data = Column(Text) created_at = Column(TIMESTAMP, server_default=func.now()) device = relationship("ONUDevice", back_populates="status_history") class DuplicateMac(Base): """重复 MAC 地址记录(同一 MAC 出现在多个端口)""" __tablename__ = "duplicate_macs" id = Column(BigInteger, primary_key=True, index=True) olt_id = Column(BigInteger, ForeignKey("olt_devices.id"), nullable=False) mac_address = Column(String(17), nullable=False, index=True) # 所有出现的端口列表,JSON 格式: [{"port_id": "1/0/1:1", "status": "online"}, ...] ports = Column(JSON, nullable=False) first_seen_at = Column(TIMESTAMP, server_default=func.now()) last_seen_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now()) class NewDevice(Base): """新发现设备(OLT 扫描到但尚未补全信息的设备)""" __tablename__ = "new_devices" id = Column(BigInteger, primary_key=True, index=True) onu_device_id = Column(BigInteger, ForeignKey("onu_devices.id"), nullable=False, unique=True) olt_id = Column(BigInteger, ForeignKey("olt_devices.id"), nullable=False) discovered_at = Column(TIMESTAMP, server_default=func.now())