"""人才模型。 核心人才画像 + 团队成员 + 9-Box 矩阵 + 流动预测。 """ import uuid from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base from app.core.types import JSONBType class TalentProfile(Base): """人才画像。""" __tablename__ = "talent_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(100), nullable=False) current_role: Mapped[str | None] = mapped_column(String(200), nullable=True, comment="当前职位") current_company: Mapped[str | None] = mapped_column(String(200), nullable=True) skills: Mapped[dict | None] = mapped_column(JSONBType, nullable=True, comment="技能标签") experience_years: Mapped[int | None] = mapped_column(Integer, nullable=True) performance_rating: Mapped[float | None] = mapped_column(nullable=True, comment="绩效评分(1-5)") potential_rating: Mapped[float | None] = mapped_column(nullable=True, comment="潜力评分(1-5)") nine_box: Mapped[str | None] = mapped_column(String(50), nullable=True, comment="9-Box 象限") flow_prediction: Mapped[dict | None] = mapped_column(JSONBType, nullable=True, comment="流动预测") status: Mapped[str] = mapped_column(String(20), nullable=False, default="active", comment="active/flowed/inactive") 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 TeamMember(Base): """团队成员。""" __tablename__ = "team_members" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) company_id: Mapped[str] = mapped_column(String(36), ForeignKey("companies.id"), nullable=False, index=True) name: Mapped[str] = mapped_column(String(100), nullable=False) role: Mapped[str | None] = mapped_column(String(200), nullable=True, comment="职位") is_key_person: Mapped[bool] = mapped_column(default=False, comment="是否核心人员") joined_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) left_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) stability_score: Mapped[float | None] = mapped_column(nullable=True, comment="稳定性评分(0-1)") 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) )