"""项目相关 Schema""" from pydantic import BaseModel from datetime import date, datetime from app.models.production import ProjectStatus class ProjectBase(BaseModel): """项目基础 Schema""" project_no: str name: str start_date: date | None = None end_date: date | None = None status: ProjectStatus = ProjectStatus.DRAFT class ProjectCreate(ProjectBase): """创建项目""" pass class ProjectUpdate(BaseModel): """更新项目""" name: str | None = None start_date: date | None = None end_date: date | None = None status: ProjectStatus | None = None class ProjectResponse(ProjectBase): """项目响应""" id: int created_at: datetime updated_at: datetime | None class Config: from_attributes = True class ProjectStats(BaseModel): """项目统计信息""" project_id: int project_no: str project_name: str status: ProjectStatus start_date: date | None end_date: date | None # 进度相关 total_work_orders: int completed_work_orders: int in_progress_work_orders: int pending_work_orders: int progress_percentage: float # 完成百分比 # 物料到位率(基于缺料审批) total_approvals: int pending_approvals: int approved_approvals: int rejected_approvals: int material_ready_rate: float # 物料到位率 (approved / total_approvals * 100) # 延期预警 is_overdue: bool # 当前日期超过 end_date 且状态未完成 overdue_days: int | None # 延期天数(正数表示延期,负数表示提前) created_at: datetime class ProjectSummary(BaseModel): """项目总览汇总""" total_projects: int active_projects: int completed_projects: int overdue_projects: int # 全局统计 total_work_orders: int completed_work_orders: int overall_progress: float # 全局进度 total_pending_approvals: int overall_material_ready_rate: float # 项目列表 projects: list[ProjectStats]