"""多主体画像模型。 投资机构、基金、投资经理画像。 """ import uuid from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base from app.core.types import JSONBType class FirmProfile(Base): """投资机构画像。""" __tablename__ = "firm_profiles" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) tenant_id: Mapped[str] = mapped_column(String(36), ForeignKey("tenants.id"), nullable=False, index=True) name: Mapped[str] = mapped_column(String(200), nullable=False, comment="机构名称") focus_areas: Mapped[dict | None] = mapped_column(JSONBType, nullable=True, comment="投资领域") stage_preference: Mapped[str | None] = mapped_column(String(200), nullable=True, comment="阶段偏好") description: Mapped[str | None] = mapped_column(Text, nullable=True) extra_json: Mapped[dict | None] = mapped_column(JSONBType, nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), ) class FundProfile(Base): """基金画像。""" __tablename__ = "fund_profiles" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) firm_id: Mapped[str] = mapped_column(String(36), ForeignKey("firm_profiles.id"), nullable=False, index=True) name: Mapped[str] = mapped_column(String(200), nullable=False, comment="基金名称") fund_size: Mapped[str | None] = mapped_column(String(100), nullable=True, comment="基金规模") vintage_year: Mapped[int | None] = mapped_column(nullable=True, comment="成立年份") strategy: Mapped[str | None] = mapped_column(Text, nullable=True, comment="投资策略") extra_json: Mapped[dict | None] = mapped_column(JSONBType, nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), ) class ManagerProfile(Base): """投资经理画像。""" __tablename__ = "manager_profiles" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) firm_id: Mapped[str] = mapped_column(String(36), ForeignKey("firm_profiles.id"), nullable=False, index=True) user_id: Mapped[str | None] = mapped_column(String(36), ForeignKey("users.id"), nullable=True) name: Mapped[str] = mapped_column(String(100), nullable=False, comment="投资经理姓名") focus_areas: Mapped[dict | None] = mapped_column(JSONBType, nullable=True, comment="关注领域") portfolio_count: Mapped[int | None] = mapped_column(nullable=True, comment="在管企业数") extra_json: Mapped[dict | None] = mapped_column(JSONBType, nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), )