"""企业相关 Pydantic schema。""" from datetime import datetime from pydantic import BaseModel, Field class CompanyCreate(BaseModel): """创建企业请求。""" name: str = Field(..., min_length=1, max_length=200) industry: str | None = Field(default=None, max_length=100) stage: str | None = Field(default=None, max_length=50) logo_url: str | None = Field(default=None, max_length=500) description: str | None = None total_funding: str | None = Field(default=None, max_length=50) website: str | None = Field(default=None, max_length=500) class CompanyUpdate(BaseModel): """更新企业请求。""" name: str | None = Field(default=None, min_length=1, max_length=200) industry: str | None = Field(default=None, max_length=100) stage: str | None = Field(default=None, max_length=50) logo_url: str | None = Field(default=None, max_length=500) description: str | None = None total_funding: str | None = Field(default=None, max_length=50) website: str | None = Field(default=None, max_length=500) class CompanyResponse(BaseModel): """企业信息响应。""" id: str tenant_id: str name: str industry: str | None = None stage: str | None = None logo_url: str | None = None description: str | None = None founded_at: datetime | None = None total_funding: str | None = None website: str | None = None created_at: datetime updated_at: datetime class CompanyListResponse(BaseModel): """企业列表响应。""" items: list[CompanyResponse] total: int page: int page_size: int class HealthScoreBrief(BaseModel): """健康度评分摘要。""" total_score: float financial_score: float | None = None operational_score: float | None = None ai_commercial_score: float | None = None ai_cost_score: float | None # T2.9 扩展维度 org_talent_score: float | None = None product_tech_score: float | None = None market_compete_score: float | None = None governance_score: float | None = None financing_score: float | None = None # T3.11 扩展维度 synergy_score: float | None = None ai_model_product_score: float | None = None data_compliance_score: float | None = None team_tech_score: float | None = None customer_success_score: float | None = None trend: str | None = None calculated_at: datetime class ReportBrief(BaseModel): """月报摘要。""" id: str period_year: int period_month: int status: str ai_summary: str | None = None submitted_at: datetime | None = None class RiskBrief(BaseModel): """风险摘要。""" id: str type: str severity: str status: str title: str identified_at: datetime class WeakSignalBrief(BaseModel): """弱信号摘要。""" id: str signal_type: str content: str confidence: float risk_probability: float | None = None status: str detected_at: datetime class AgreementBrief(BaseModel): """协议摘要。""" id: str title: str status: str signed_at: datetime | None = None class BoardMeetingBrief(BaseModel): """董事会会议摘要。""" id: str title: str status: str meeting_at: datetime | None = None class MajorEventBrief(BaseModel): """重大事项摘要。""" id: str event_type: str title: str description: str | None = None severity: str = "medium" status: str = "identified" occurred_at: datetime | None = None class MilestoneBrief(BaseModel): """里程碑摘要。""" id: str name: str status: str = "planned" is_current: bool = False target_date: datetime | None = None actual_date: datetime | None = None description: str | None = None class TeamMemberBrief(BaseModel): """团队成员摘要。""" id: str name: str role: str | None = None is_key_person: bool = False stability_score: float | None = None joined_at: datetime | None = None class SynergyBrief(BaseModel): """协同机会摘要。""" id: str type: str title: str description: str | None = None status: str = "discovered" match_reason: str | None = None class HealthScoreHistoryPoint(BaseModel): """健康度历史数据点。""" period: str total_score: float calculated_at: datetime class CompanyDetailResponse(BaseModel): """企业详情聚合响应 — 工作台使用。""" company: CompanyResponse health_score: HealthScoreBrief | None = None health_score_history: list[HealthScoreHistoryPoint] = [] recent_reports: list[ReportBrief] = [] open_risks: list[RiskBrief] = [] recent_weak_signals: list[WeakSignalBrief] = [] active_agreements: list[AgreementBrief] = [] recent_board_meetings: list[BoardMeetingBrief] = [] major_events: list[MajorEventBrief] = [] milestones: list[MilestoneBrief] = [] team_members: list[TeamMemberBrief] = [] synergy_opportunities: list[SynergyBrief] = [] financial_data_count: int = 0 latest_financial: dict | None = None