from sqlalchemy import Column, Integer, String, Boolean, DateTime, Numeric, func, Text from app.models import Base class FetchLog(Base): """域名爬取日志表(每次尝试记录一条)""" __tablename__ = "fetch_logs" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) domain = Column(String, nullable=False, index=True) status = Column(String, nullable=False) # success / failed / skipped message = Column(Text) # 成功/失败详情 created_at = Column(DateTime(timezone=True), server_default=func.now()) class FetchScheduleConfig(Base): """定时爬取配置表""" __tablename__ = "fetch_schedule_config" __table_args__ = {"schema": "domain_monitor"} id = Column(Integer, primary_key=True, autoincrement=True) enabled = Column(Boolean, server_default="false", default=False) schedule_time = Column(String(5), server_default="02:00") # HH:MM last_fetch_date = Column(String(10)) # YYYY-MM-DD,记录当天是否已爬取 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())