affection.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. """
  2. 好感度模型
  3. """
  4. from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Index, Text, JSON, CheckConstraint
  5. from sqlalchemy.orm import relationship
  6. from sqlalchemy.sql import func
  7. from app.core.database import Base
  8. class AffectionScore(Base):
  9. """好感度表"""
  10. __tablename__ = "affection_scores"
  11. id = Column(Integer, primary_key=True, index=True)
  12. user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
  13. character_id = Column(Integer, ForeignKey("characters.id", ondelete="CASCADE"), nullable=False)
  14. # 好感度数值(-100 ~ 100)
  15. current_score = Column(Integer, default=0, nullable=False)
  16. level = Column(String(50), default="普通") # 厌恶 | 陌生 | 普通 | 熟人 | 朋友 | 挚友 | 恋人
  17. # 统计信息
  18. last_interaction = Column(DateTime(timezone=True))
  19. total_interactions = Column(Integer, default=0)
  20. created_at = Column(DateTime(timezone=True), server_default=func.now())
  21. updated_at = Column(DateTime(timezone=True), onupdate=func.now())
  22. # 约束
  23. __table_args__ = (
  24. Index("idx_user_character_affection", "user_id", "character_id", unique=True),
  25. CheckConstraint("current_score >= -100 AND current_score <= 100", name="score_range"),
  26. )
  27. # 关系
  28. character = relationship("Character", back_populates="affection_scores")
  29. logs = relationship("AffectionLog", back_populates="affection_score", cascade="all, delete-orphan")
  30. class AffectionLog(Base):
  31. """好感度变化历史表"""
  32. __tablename__ = "affection_logs"
  33. id = Column(Integer, primary_key=True, index=True)
  34. affection_score_id = Column(Integer, ForeignKey("affection_scores.id", ondelete="CASCADE"), nullable=False, index=True)
  35. message_id = Column(Integer, ForeignKey("messages.id", ondelete="SET NULL"))
  36. score_change = Column(Integer, nullable=False) # 积分变化(可为负)
  37. reason = Column(Text) # 变化原因
  38. sentiment_analysis = Column(JSON) # 情感分析详情
  39. created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)
  40. # 关系
  41. affection_score = relationship("AffectionScore", back_populates="logs")