116 lines
5.6 KiB
Python
116 lines
5.6 KiB
Python
"""角色关系和组织管理数据模型"""
|
|
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"<RelationshipType(id={self.id}, name={self.name}, category={self.category})>"
|
|
|
|
|
|
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="亲密度:-100到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"<CharacterRelationship(id={self.id}, from={self.character_from_id}, to={self.character_to_id})>"
|
|
|
|
|
|
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(100), 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"<Organization(id={self.id}, character_id={self.character_id})>"
|
|
|
|
|
|
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"<OrganizationMember(id={self.id}, org={self.organization_id}, char={self.character_id})>" |