monitoring.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. balance = Column(Numeric(20, 4), server_default="0")
  29. phone = Column(String(20))
  30. balance_warning_sent = Column(Boolean, server_default="false", default=False)
  31. balance_depleted_sent = Column(Boolean, server_default="false", default=False)
  32. created_at = Column(DateTime(timezone=True), server_default=func.now())
  33. class SuperAdminBalanceLog(Base):
  34. """超级管理员余额变动日志表"""
  35. __tablename__ = "super_admin_balance_log"
  36. __table_args__ = {"schema": "domain_monitor"}
  37. id = Column(Integer, primary_key=True, autoincrement=True)
  38. super_admin_id = Column(Integer, nullable=False, index=True)
  39. change_amount = Column(Numeric(20, 4), nullable=False)
  40. balance_after = Column(Numeric(20, 4), nullable=False)
  41. biz_type = Column(String(50), nullable=False) # recharge / consume / adjust
  42. biz_order_no = Column(String(100))
  43. remark = Column(Text)
  44. created_at = Column(DateTime(timezone=True), server_default=func.now())
  45. class SuperAdminTenant(Base):
  46. """超级管理员-租户关联表"""
  47. __tablename__ = "super_admin_tenant"
  48. __table_args__ = {"schema": "domain_monitor"}
  49. id = Column(Integer, primary_key=True, autoincrement=True)
  50. super_admin_id = Column(Integer, nullable=False, index=True)
  51. tenant_id = Column(Integer, nullable=False, index=True)
  52. class Tenant(Base):
  53. """租户(企业)表"""
  54. __tablename__ = "tenant"
  55. __table_args__ = {"schema": "domain_monitor"}
  56. id = Column(Integer, primary_key=True, autoincrement=True)
  57. company_name = Column(String)
  58. subdomain = Column(String, unique=True, nullable=False, index=True)
  59. balance = Column(Numeric(20, 4), server_default="0")
  60. created_at = Column(DateTime(timezone=True), server_default=func.now())
  61. updated_at = Column(DateTime(timezone=True), onupdate=func.now())
  62. class Model(Base):
  63. """模型信息参考表"""
  64. __tablename__ = "models"
  65. __table_args__ = {"schema": "domain_monitor"}
  66. id = Column(Integer, primary_key=True, autoincrement=True)
  67. model_code = Column(String, unique=True, nullable=False, index=True)
  68. model_name = Column(String, nullable=False)
  69. original_price = Column(Numeric(20, 4))
  70. class SuperAdminModelDiscount(Base):
  71. """超级管理员模型折扣表(从 crawler 同步)"""
  72. __tablename__ = "super_admin_model_discount"
  73. __table_args__ = {"schema": "domain_monitor"}
  74. id = Column(Integer, primary_key=True, autoincrement=True)
  75. model_code = Column(String, unique=True, nullable=False, index=True)
  76. discount_rate = Column(Numeric(10, 4), server_default="1.0000", nullable=False)
  77. created_at = Column(DateTime(timezone=True), server_default=func.now())
  78. updated_at = Column(DateTime(timezone=True), onupdate=func.now())
  79. class UserConsumptionDetail(Base):
  80. """用户模型消费明细表(每次调用的记录)"""
  81. __tablename__ = "user_consumption_detail"
  82. __table_args__ = {"schema": "domain_monitor"}
  83. id = Column(Integer, primary_key=True, autoincrement=True)
  84. user_id = Column(String, nullable=False, index=True)
  85. username = Column(String)
  86. tenant_id = Column(Integer, nullable=False, index=True)
  87. model_code = Column(String, nullable=False, index=True)
  88. call_count = Column(Integer, server_default="0")
  89. # 用户侧:用户实际支付
  90. user_actual_total = Column(Numeric(20, 4), server_default="0")
  91. user_discount = Column(Numeric(10, 4), server_default="1.0000")
  92. user_actual_price = Column(Numeric(20, 4))
  93. # 租户侧:平台向企业收取
  94. tenant_actual_total = Column(Numeric(20, 4), server_default="0")
  95. tenant_discount = Column(Numeric(10, 4), server_default="1.0000")
  96. tenant_actual_price = Column(Numeric(20, 4))
  97. # 超管侧:平台向超管收取
  98. super_admin_discount = Column(Numeric(10, 4), server_default="1.0000")
  99. super_admin_actual_price = Column(Numeric(20, 4))
  100. original_price = Column(Numeric(20, 4))
  101. consumption_date = Column(DateTime(timezone=True), nullable=False, index=True)
  102. order_no = Column(String)
  103. invoiced = Column(Boolean, server_default="false")
  104. created_at = Column(DateTime(timezone=True), server_default=func.now())