88 lines
3.5 KiB
Python
88 lines
3.5 KiB
Python
# 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,
|
||
}
|