"""企业相关 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 CompanyDetailResponse(BaseModel): """企业详情聚合响应 — 工作台使用。""" company: CompanyResponse health_score: HealthScoreBrief | None = None recent_reports: list[ReportBrief] = [] open_risks: list[RiskBrief] = [] recent_weak_signals: list[WeakSignalBrief] = [] active_agreements: list[AgreementBrief] = [] recent_board_meetings: list[BoardMeetingBrief] = [] financial_data_count: int = 0 latest_financial: dict | None = None