2025-10-30 11:14:43 +08:00
|
|
|
"""关系管理相关的Pydantic模型"""
|
2026-01-09 17:13:19 +08:00
|
|
|
from pydantic import BaseModel, Field, ConfigDict
|
2025-10-30 11:14:43 +08:00
|
|
|
from typing import Optional, List
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============ 关系类型相关 ============
|
|
|
|
|
|
|
|
|
|
class RelationshipTypeResponse(BaseModel):
|
|
|
|
|
"""关系类型响应模型"""
|
|
|
|
|
id: int
|
|
|
|
|
name: str
|
|
|
|
|
category: str
|
|
|
|
|
reverse_name: Optional[str] = None
|
|
|
|
|
intimacy_range: Optional[str] = None
|
|
|
|
|
icon: Optional[str] = None
|
|
|
|
|
description: Optional[str] = None
|
|
|
|
|
created_at: datetime
|
|
|
|
|
|
2026-01-09 17:13:19 +08:00
|
|
|
model_config = ConfigDict(from_attributes=True)
|
2025-10-30 11:14:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============ 角色关系相关 ============
|
|
|
|
|
|
|
|
|
|
class CharacterRelationshipBase(BaseModel):
|
|
|
|
|
"""角色关系基础模型"""
|
|
|
|
|
relationship_type_id: Optional[int] = Field(None, description="关系类型ID")
|
|
|
|
|
relationship_name: Optional[str] = Field(None, description="自定义关系名称")
|
2025-11-13 11:58:05 +08:00
|
|
|
intimacy_level: int = Field(50, ge=-100, le=100, description="亲密度:-100到100")
|
2025-10-30 11:14:43 +08:00
|
|
|
status: str = Field("active", description="状态:active/broken/past/complicated")
|
|
|
|
|
description: Optional[str] = Field(None, description="关系描述")
|
|
|
|
|
started_at: Optional[str] = Field(None, description="关系开始时间(故事时间)")
|
|
|
|
|
ended_at: Optional[str] = Field(None, description="关系结束时间")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CharacterRelationshipCreate(CharacterRelationshipBase):
|
|
|
|
|
"""创建角色关系的请求模型"""
|
|
|
|
|
project_id: str = Field(..., description="项目ID")
|
|
|
|
|
character_from_id: str = Field(..., description="角色A的ID")
|
|
|
|
|
character_to_id: str = Field(..., description="角色B的ID")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CharacterRelationshipUpdate(BaseModel):
|
|
|
|
|
"""更新角色关系的请求模型"""
|
|
|
|
|
relationship_type_id: Optional[int] = None
|
|
|
|
|
relationship_name: Optional[str] = None
|
2025-11-13 11:58:05 +08:00
|
|
|
intimacy_level: Optional[int] = Field(None, ge=-100, le=100)
|
2025-10-30 11:14:43 +08:00
|
|
|
status: Optional[str] = None
|
|
|
|
|
description: Optional[str] = None
|
|
|
|
|
started_at: Optional[str] = None
|
|
|
|
|
ended_at: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CharacterRelationshipResponse(CharacterRelationshipBase):
|
|
|
|
|
"""角色关系响应模型"""
|
|
|
|
|
id: str
|
|
|
|
|
project_id: str
|
|
|
|
|
character_from_id: str
|
|
|
|
|
character_to_id: str
|
|
|
|
|
source: str
|
|
|
|
|
created_at: datetime
|
|
|
|
|
updated_at: datetime
|
|
|
|
|
|
2026-01-09 17:13:19 +08:00
|
|
|
model_config = ConfigDict(from_attributes=True)
|
2025-10-30 11:14:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class RelationshipGraphNode(BaseModel):
|
|
|
|
|
"""关系图谱节点"""
|
|
|
|
|
id: str
|
|
|
|
|
name: str
|
|
|
|
|
type: str # character / organization
|
|
|
|
|
role_type: Optional[str] = None
|
|
|
|
|
avatar: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RelationshipGraphLink(BaseModel):
|
|
|
|
|
"""关系图谱连线"""
|
|
|
|
|
source: str
|
|
|
|
|
target: str
|
|
|
|
|
relationship: str
|
|
|
|
|
intimacy: int
|
|
|
|
|
status: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RelationshipGraphData(BaseModel):
|
|
|
|
|
"""关系图谱数据"""
|
|
|
|
|
nodes: List[RelationshipGraphNode]
|
|
|
|
|
links: List[RelationshipGraphLink]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============ 组织相关 ============
|
|
|
|
|
|
|
|
|
|
class OrganizationBase(BaseModel):
|
|
|
|
|
"""组织基础模型"""
|
|
|
|
|
parent_org_id: Optional[str] = Field(None, description="父组织ID")
|
|
|
|
|
level: int = Field(0, description="组织层级")
|
|
|
|
|
power_level: int = Field(50, ge=0, le=100, description="势力等级")
|
|
|
|
|
location: Optional[str] = Field(None, description="所在地")
|
|
|
|
|
motto: Optional[str] = Field(None, description="组织宗旨")
|
|
|
|
|
color: Optional[str] = Field(None, description="代表颜色")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationCreate(OrganizationBase):
|
|
|
|
|
"""创建组织的请求模型"""
|
|
|
|
|
character_id: str = Field(..., description="关联的角色ID(组织记录)")
|
|
|
|
|
project_id: str = Field(..., description="项目ID")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationUpdate(BaseModel):
|
|
|
|
|
"""更新组织的请求模型"""
|
|
|
|
|
parent_org_id: Optional[str] = None
|
|
|
|
|
level: Optional[int] = None
|
|
|
|
|
power_level: Optional[int] = Field(None, ge=0, le=100)
|
|
|
|
|
location: Optional[str] = None
|
|
|
|
|
motto: Optional[str] = None
|
|
|
|
|
color: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationResponse(OrganizationBase):
|
|
|
|
|
"""组织响应模型"""
|
|
|
|
|
id: str
|
|
|
|
|
character_id: str
|
|
|
|
|
project_id: str
|
|
|
|
|
member_count: int
|
|
|
|
|
created_at: datetime
|
|
|
|
|
updated_at: datetime
|
|
|
|
|
|
2026-01-09 17:13:19 +08:00
|
|
|
model_config = ConfigDict(from_attributes=True)
|
2025-10-30 11:14:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationDetailResponse(BaseModel):
|
|
|
|
|
"""组织详情响应(包含基本信息)"""
|
|
|
|
|
id: str
|
|
|
|
|
character_id: str
|
|
|
|
|
name: str
|
|
|
|
|
type: Optional[str] = None
|
|
|
|
|
purpose: Optional[str] = None
|
|
|
|
|
member_count: int
|
|
|
|
|
power_level: int
|
|
|
|
|
location: Optional[str] = None
|
|
|
|
|
motto: Optional[str] = None
|
|
|
|
|
color: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============ 组织成员相关 ============
|
|
|
|
|
|
|
|
|
|
class OrganizationMemberBase(BaseModel):
|
|
|
|
|
"""组织成员基础模型"""
|
|
|
|
|
position: str = Field(..., description="职位名称")
|
|
|
|
|
rank: int = Field(0, description="职位等级")
|
|
|
|
|
status: str = Field("active", description="状态:active/retired/expelled/deceased")
|
|
|
|
|
joined_at: Optional[str] = Field(None, description="加入时间(故事时间)")
|
|
|
|
|
left_at: Optional[str] = Field(None, description="离开时间")
|
|
|
|
|
loyalty: int = Field(50, ge=0, le=100, description="忠诚度")
|
|
|
|
|
contribution: int = Field(0, ge=0, le=100, description="贡献度")
|
|
|
|
|
notes: Optional[str] = Field(None, description="备注")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationMemberCreate(OrganizationMemberBase):
|
|
|
|
|
"""创建组织成员的请求模型"""
|
|
|
|
|
character_id: str = Field(..., description="角色ID")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationMemberUpdate(BaseModel):
|
|
|
|
|
"""更新组织成员的请求模型"""
|
|
|
|
|
position: Optional[str] = None
|
|
|
|
|
rank: Optional[int] = None
|
|
|
|
|
status: Optional[str] = None
|
|
|
|
|
joined_at: Optional[str] = None
|
|
|
|
|
left_at: Optional[str] = None
|
|
|
|
|
loyalty: Optional[int] = Field(None, ge=0, le=100)
|
|
|
|
|
contribution: Optional[int] = Field(None, ge=0, le=100)
|
|
|
|
|
notes: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationMemberResponse(OrganizationMemberBase):
|
|
|
|
|
"""组织成员响应模型"""
|
|
|
|
|
id: str
|
|
|
|
|
organization_id: str
|
|
|
|
|
character_id: str
|
|
|
|
|
source: str
|
|
|
|
|
created_at: datetime
|
|
|
|
|
updated_at: datetime
|
|
|
|
|
|
2026-01-09 17:13:19 +08:00
|
|
|
model_config = ConfigDict(from_attributes=True)
|
2025-10-30 11:14:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class OrganizationMemberDetailResponse(BaseModel):
|
|
|
|
|
"""组织成员详情响应(包含角色信息)"""
|
|
|
|
|
id: str
|
|
|
|
|
character_id: str
|
|
|
|
|
character_name: str
|
|
|
|
|
position: str
|
|
|
|
|
rank: int
|
|
|
|
|
loyalty: int
|
|
|
|
|
contribution: int
|
|
|
|
|
status: str
|
|
|
|
|
joined_at: Optional[str] = None
|
|
|
|
|
left_at: Optional[str] = None
|
|
|
|
|
notes: Optional[str] = None
|