monitoring.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from sqlalchemy import Column, Integer, String, Boolean, DateTime, Numeric, func, Text
  2. from app.models import Base
  3. class FetchLog(Base):
  4. """域名爬取日志表(每次尝试记录一条)"""
  5. __tablename__ = "fetch_logs"
  6. __table_args__ = {"schema": "domain_monitor"}
  7. id = Column(Integer, primary_key=True, autoincrement=True)
  8. domain = Column(String, nullable=False, index=True)
  9. status = Column(String, nullable=False) # success / failed / skipped
  10. message = Column(Text) # 成功/失败详情
  11. created_at = Column(DateTime(timezone=True), server_default=func.now())
  12. class FetchScheduleConfig(Base):
  13. """定时爬取配置表"""
  14. __tablename__ = "fetch_schedule_config"
  15. __table_args__ = {"schema": "domain_monitor"}
  16. id = Column(Integer, primary_key=True, autoincrement=True)
  17. enabled = Column(Boolean, server_default="false", default=False)
  18. schedule_time = Column(String(5), server_default="02:00") # HH:MM
  19. last_fetch_date = Column(String(10)) # YYYY-MM-DD,记录当天是否已爬取
  20. class SuperAdmin(Base):
  21. """超级管理员表"""
  22. __tablename__ = "super_admin"
  23. __table_args__ = {"schema": "domain_monitor"}
  24. id = Column(Integer, primary_key=True, autoincrement=True)
  25. username = Column(String, nullable=False)
  26. nickname = Column(String)
  27. remark = Column(String) # 域名备注,作为超管显示名称
  28. created_at = Column(DateTime(timezone=True), server_default=func.now())
  29. class SuperAdminTenant(Base):
  30. """超级管理员-租户关联表"""
  31. __tablename__ = "super_admin_tenant"
  32. __table_args__ = {"schema": "domain_monitor"}
  33. id = Column(Integer, primary_key=True, autoincrement=True)
  34. super_admin_id = Column(Integer, nullable=False, index=True)
  35. tenant_id = Column(Integer, nullable=False, index=True)
  36. class Tenant(Base):
  37. """租户(企业)表"""
  38. __tablename__ = "tenant"
  39. __table_args__ = {"schema": "domain_monitor"}
  40. id = Column(Integer, primary_key=True, autoincrement=True)
  41. company_name = Column(String)
  42. subdomain = Column(String, unique=True, nullable=False, index=True)
  43. balance = Column(Numeric(20, 4), server_default="0")
  44. created_at = Column(DateTime(timezone=True), server_default=func.now())
  45. updated_at = Column(DateTime(timezone=True), onupdate=func.now())
  46. class Model(Base):
  47. """模型信息参考表"""
  48. __tablename__ = "models"
  49. __table_args__ = {"schema": "domain_monitor"}
  50. id = Column(Integer, primary_key=True, autoincrement=True)
  51. model_code = Column(String, unique=True, nullable=False, index=True)
  52. model_name = Column(String, nullable=False)
  53. original_price = Column(Numeric(20, 4))
  54. class SuperAdminModelDiscount(Base):
  55. """超级管理员模型折扣表(从 crawler 同步)"""
  56. __tablename__ = "super_admin_model_discount"
  57. __table_args__ = {"schema": "domain_monitor"}
  58. id = Column(Integer, primary_key=True, autoincrement=True)
  59. model_code = Column(String, unique=True, nullable=False, index=True)
  60. discount_rate = Column(Numeric(10, 4), server_default="1.0000", nullable=False)
  61. created_at = Column(DateTime(timezone=True), server_default=func.now())
  62. updated_at = Column(DateTime(timezone=True), onupdate=func.now())
  63. class UserConsumptionDetail(Base):
  64. """用户模型消费明细表(每次调用的记录)"""
  65. __tablename__ = "user_consumption_detail"
  66. __table_args__ = {"schema": "domain_monitor"}
  67. id = Column(Integer, primary_key=True, autoincrement=True)
  68. user_id = Column(String, nullable=False, index=True)
  69. username = Column(String)
  70. tenant_id = Column(Integer, nullable=False, index=True)
  71. model_code = Column(String, nullable=False, index=True)
  72. call_count = Column(Integer, server_default="0")
  73. # 用户侧:用户实际支付
  74. user_actual_total = Column(Numeric(20, 4), server_default="0")
  75. user_discount = Column(Numeric(10, 4), server_default="1.0000")
  76. user_actual_price = Column(Numeric(20, 4))
  77. # 租户侧:平台向企业收取
  78. tenant_actual_total = Column(Numeric(20, 4), server_default="0")
  79. tenant_discount = Column(Numeric(10, 4), server_default="1.0000")
  80. tenant_actual_price = Column(Numeric(20, 4))
  81. # 超管侧:平台向超管收取
  82. super_admin_discount = Column(Numeric(10, 4), server_default="1.0000")
  83. super_admin_actual_price = Column(Numeric(20, 4))
  84. original_price = Column(Numeric(20, 4))
  85. consumption_date = Column(DateTime(timezone=True), nullable=False, index=True)
  86. order_no = Column(String)
  87. invoiced = Column(Boolean, server_default="false")
  88. created_at = Column(DateTime(timezone=True), server_default=func.now())