86 lines
2.0 KiB
Python
86 lines
2.0 KiB
Python
"""项目相关 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]
|