"""角色关系和组织管理数据模型""" from sqlalchemy import Column, String, Integer, Text, DateTime, ForeignKey, Boolean from sqlalchemy.sql import func from app.database import Base import uuid class RelationshipType(Base): """关系类型定义表""" __tablename__ = "relationship_types" id = Column(Integer, primary_key=True, index=True, autoincrement=True) name = Column(String(50), nullable=False, comment="关系名称") category = Column(String(20), nullable=False, comment="分类:family/social/hostile/professional") reverse_name = Column(String(50), comment="反向关系名称") intimacy_range = Column(String(20), comment="亲密度范围:high/medium/low") icon = Column(String(50), comment="图标标识") description = Column(Text, comment="关系描述") created_at = Column(DateTime, server_default=func.now(), comment="创建时间") def __repr__(self): return f"" class CharacterRelationship(Base): """角色关系表""" __tablename__ = "character_relationships" id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()), comment="关系ID") project_id = Column(String(36), ForeignKey("projects.id", ondelete="CASCADE"), nullable=False, index=True, comment="项目ID") # 关系双方 character_from_id = Column(String(36), ForeignKey("characters.id", ondelete="CASCADE"), nullable=False, index=True, comment="角色A的ID") character_to_id = Column(String(36), ForeignKey("characters.id", ondelete="CASCADE"), nullable=False, index=True, comment="角色B的ID") # 关系类型 relationship_type_id = Column(Integer, ForeignKey("relationship_types.id"), index=True, comment="关系类型ID") relationship_name = Column(String(100), comment="自定义关系名称") # 关系属性 intimacy_level = Column(Integer, default=50, comment="亲密度:0-100") status = Column(String(20), default="active", comment="状态:active/broken/past/complicated") description = Column(Text, comment="关系详细描述") # 故事时间线 started_at = Column(String(100), comment="关系开始时间(故事时间)") ended_at = Column(String(100), comment="关系结束时间(故事时间)") # 来源标识 source = Column(String(20), default="ai", comment="来源:ai/manual/imported") created_at = Column(DateTime, server_default=func.now(), comment="创建时间") updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间") def __repr__(self): return f"" class Organization(Base): """组织详情表""" __tablename__ = "organizations" id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()), comment="组织ID") character_id = Column(String(36), ForeignKey("characters.id", ondelete="CASCADE"), nullable=False, unique=True, comment="关联的角色ID") project_id = Column(String(36), ForeignKey("projects.id", ondelete="CASCADE"), nullable=False, index=True, comment="项目ID") # 组织层级 parent_org_id = Column(String(36), ForeignKey("organizations.id", ondelete="SET NULL"), comment="父组织ID") level = Column(Integer, default=0, comment="组织层级") # 组织属性 power_level = Column(Integer, default=50, comment="势力等级:0-100") member_count = Column(Integer, default=0, comment="成员数量") location = Column(Text, comment="所在地") # 组织特色 motto = Column(String(200), comment="宗旨/口号") color = Column(String(20), comment="代表颜色") created_at = Column(DateTime, server_default=func.now(), comment="创建时间") updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间") def __repr__(self): return f"" class OrganizationMember(Base): """组织成员关系表""" __tablename__ = "organization_members" id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()), comment="成员关系ID") organization_id = Column(String(36), ForeignKey("organizations.id", ondelete="CASCADE"), nullable=False, index=True, comment="组织ID") character_id = Column(String(36), ForeignKey("characters.id", ondelete="CASCADE"), nullable=False, index=True, comment="角色ID") # 职位信息 position = Column(String(100), nullable=False, comment="职位名称") rank = Column(Integer, default=0, comment="职位等级") # 成员状态 status = Column(String(20), default="active", comment="状态:active/retired/expelled/deceased") joined_at = Column(String(100), comment="加入时间(故事时间)") left_at = Column(String(100), comment="离开时间(故事时间)") # 成员属性 loyalty = Column(Integer, default=50, comment="忠诚度:0-100") contribution = Column(Integer, default=0, comment="贡献度:0-100") # 来源标识 source = Column(String(20), default="ai", comment="来源:ai/manual") notes = Column(Text, comment="备注") created_at = Column(DateTime, server_default=func.now(), comment="创建时间") updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间") def __repr__(self): return f""