# coding=utf-8 """基地信息表(仅总服务器 MySQL;本地 SQLite 可不使用)。""" from datetime import datetime from sqlalchemy import Column, DateTime, Float, Index, Integer, String from sqlalchemy.orm import relationship from sqlalchemy.sql import func from dao.db import Base class BaseInfo(Base): __tablename__ = 'bases' id = Column(Integer, primary_key=True, autoincrement=True, comment='主键ID(本地)') # 管理系统返回的 id,不作为本地主键,避免与自增 ID / FK 冲突 external_id = Column(Integer, nullable=True, unique=True, comment='管理系统基地ID') base_code = Column(String(128), nullable=False, unique=True, comment='基地唯一编码(=管理系统 code)') base_name = Column(String(100), nullable=False, comment='基地名称') branch_name = Column(String(100), nullable=True, comment='分部名称') region = Column(String(100), nullable=True, comment='区域(省/市/区拼接)') province = Column(String(50), nullable=True, comment='省') city = Column(String(50), nullable=True, comment='市') district = Column(String(50), nullable=True, comment='区') address = Column(String(255), nullable=True, comment='地址') contact = Column(String(50), nullable=True, comment='联系人') phone = Column(String(50), nullable=True, comment='电话') description = Column(String(255), nullable=True, comment='描述') longitude = Column(Float, nullable=True, comment='经度') latitude = Column(Float, nullable=True, comment='纬度') sort_order = Column(Integer, nullable=False, default=0, server_default='0', comment='排序') register_time = Column( DateTime, nullable=False, default=datetime.now, server_default=func.now(), comment='注册时间', ) last_heartbeat = Column( DateTime, nullable=False, default=datetime.now, server_default=func.now(), onupdate=datetime.now, comment='最后心跳时间', ) is_active = Column(Integer, nullable=False, default=1, server_default='1', comment='是否启用') templates = relationship( 'GlobalTemplate', back_populates='source_base', foreign_keys='GlobalTemplate.source_base_id', ) sync_logs = relationship('SyncLog', back_populates='base') pending_approvals = relationship( 'PendingApproval', back_populates='source_base', foreign_keys='PendingApproval.source_base_id', ) __table_args__ = ( Index('idx_bases_active', 'is_active'), Index('idx_bases_sort', 'sort_order'), ) def to_dict(self): return { 'id': self.id, 'external_id': self.external_id, 'base_code': self.base_code, 'base_name': self.base_name, 'branch_name': self.branch_name, 'region': self.region, 'province': self.province, 'city': self.city, 'district': self.district, 'address': self.address, 'contact': self.contact, 'phone': self.phone, 'description': self.description, 'longitude': self.longitude, 'latitude': self.latitude, 'sort_order': self.sort_order, 'is_active': self.is_active, 'register_time': self.register_time.strftime('%Y-%m-%d %H:%M:%S') if self.register_time else None, 'last_heartbeat': self.last_heartbeat.strftime('%Y-%m-%d %H:%M:%S') if self.last_heartbeat else None, }