from sqlalchemy import Column, Integer, String, Boolean, DateTime, Numeric, func from sqlalchemy.orm import declarative_base Base = declarative_base() class SuperAdmin(Base): """超级管理员表""" __tablename__ = "super_admin" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String, nullable=False) nickname = Column(String) remark = Column(String) # 域名备注,作为超管显示名称 created_at = Column(DateTime(timezone=True), server_default=func.now()) class SuperAdminTenant(Base): """超级管理员-租户关联表""" __tablename__ = "super_admin_tenant" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) super_admin_id = Column(Integer, nullable=False, index=True) tenant_id = Column(Integer, nullable=False, index=True) class Tenant(Base): """租户(企业)表""" __tablename__ = "tenant" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) company_name = Column(String) subdomain = Column(String, unique=True, nullable=False, index=True) balance = Column(Numeric(20, 4), server_default="0") created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) class Model(Base): """模型信息参考表""" __tablename__ = "models" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) model_code = Column(String, unique=True, nullable=False, index=True) model_name = Column(String, nullable=False) original_price = Column(Numeric(20, 4)) class SuperAdminModelDiscount(Base): """超级管理员模型折扣表(从 crawler 同步)""" __tablename__ = "super_admin_model_discount" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) model_code = Column(String, unique=True, nullable=False, index=True) discount_rate = Column(Numeric(10, 4), server_default="1.0000", nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) class UserConsumptionDetail(Base): """用户模型消费明细表(每次调用的记录)""" __tablename__ = "user_consumption_detail" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(String, nullable=False, index=True) username = Column(String) tenant_id = Column(Integer, nullable=False, index=True) model_code = Column(String, nullable=False, index=True) call_count = Column(Integer, server_default="0") # 用户侧:用户实际支付 user_actual_total = Column(Numeric(20, 4), server_default="0") user_discount = Column(Numeric(10, 4), server_default="1.0000") user_actual_price = Column(Numeric(20, 4)) # 租户侧:平台向企业收取 tenant_actual_total = Column(Numeric(20, 4), server_default="0") tenant_discount = Column(Numeric(10, 4), server_default="1.0000") tenant_actual_price = Column(Numeric(20, 4)) # 超管侧:平台向超管收取 super_admin_discount = Column(Numeric(10, 4), server_default="1.0000") super_admin_actual_price = Column(Numeric(20, 4)) original_price = Column(Numeric(20, 4)) consumption_date = Column(DateTime(timezone=True), nullable=False, index=True) order_no = Column(String) invoiced = Column(Boolean, server_default="false") created_at = Column(DateTime(timezone=True), server_default=func.now())