Files
ecm_sync_system/schemas/construction/construction_detail.py
T
strepsiades 4a9c444b10 first commit
2026-03-09 16:31:42 +08:00

133 lines
5.5 KiB
Python

from pydantic import BaseModel, Field,field_validator
from ..common.datetime import get_current_date
from fastapi import HTTPException
from typing import List, Optional, Literal
from ..common.validators import DateStr
from ..common.base import BaseResponseWithID
from ..common.enums import ApprovalStatus
from datetime import datetime
class ConstructionDetailResponse(BaseResponseWithID):
"""
物资明细返回值
"""
id: str = Field(..., description="施工任务明细ID")
project_id: str = Field(..., description="所属项目ID", examples=["project123"])
parent_id: str = Field(..., description="所属施工任务ID", examples=["task789"])
rate: Optional[float] = Field(None, description="实际完成率", examples=[0.0])
quantity: float = Field(0.0, ge=0, description="实际完成量累计", examples=[0.0])
date: DateStr = Field(..., description="节点日期", examples=["2024-05-31"])
status: Optional[int] = Field(None, description="进度状态", examples=[0])
change_count: int = Field(0, description="变更次数", examples=[0])
remark: Optional[str] = Field(None, description="备注")
is_complete: Optional[bool] = Field(
None, description="是否为全部完成", examples=[False]
)
class ConstructionDetailCreate(BaseModel):
"""
施工明细创建模型
CONSTRUCTION_DETAIL = "construction.detail"
"""
project_id: str = Field(..., description="所属项目ID", examples=["project123"])
parent_id: str = Field(..., description="所属施工任务ID", examples=["task789"])
quantity: float = Field(0.0, ge=0, description="实际完成量累计", examples=[0.0])
date: DateStr = Field(..., description="节点日期", examples=["2024-05-31"])
remark: Optional[str] = Field(None, description="备注")
is_complete: Optional[bool] = Field(
False, description="是否为全部完成", examples=[False]
)
confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"])
approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"])
approval_status: ApprovalStatus = Field("registered", description="审批状态", examples=["registered"])
@field_validator("approval_status")
def validate_approval_status(cls, v):
"""验证审批字段"""
try:
return ApprovalStatus(v) # 尝试转换
except ValueError:
raise HTTPException(400, f"审批状态 '{v}' 无效")
@field_validator("confirmation_time", "approval_time")
def validate_time(cls, v):
"""验证时间"""
if v is None:
return v
try:
datetime.strptime(v, "%Y-%m-%d %H:%M:%S")
except ValueError:
raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400)
return v
@field_validator("quantity")
def validate_quantity(cls, v):
"""验证实际完成量累计必须为非负数"""
if v < 0:
raise HTTPException(status_code=400, detail='实际完成量累计不能小于0')
return v
@field_validator("date")
def validate_date(cls, v):
if v > get_current_date():
raise HTTPException(detail='节点日期不能大于今天', status_code=400)
return v
class ConstructionDetailUpdate(BaseModel):
"""
施工明细更新模型
CONSTRUCTION_DETAIL = "construction.detail"
"""
id: str = Field(..., description="施工任务明细ID")
quantity: Optional[float] = Field(None, ge=0, description="实际完成量累计", examples=[0.0])
date: Optional[DateStr] = Field(None, description="节点日期", examples=["2024-05-31"])
remark: Optional[str] = Field(None, description="备注")
is_complete: Optional[bool] = Field(
None, description="是否为全部完成", examples=[False]
)
confirmation_time: str | None = Field(None, description="确认时间", examples=["2025-12-17 11:13:49"])
approval_time: str | None = Field(None, description="审批时间", examples=["2025-12-17 11:13:49"])
approval_status: ApprovalStatus | None = Field("registered", description="审批状态", examples=["registered"])
@field_validator("approval_status")
def validate_approval_status(cls, v):
"""验证审批字段"""
if v is None:
return v
try:
return ApprovalStatus(v) # 尝试转换
except ValueError:
raise HTTPException(400, f"审批状态 '{v}' 无效")
@field_validator("confirmation_time", "approval_time")
def validate_time(cls, v):
"""验证时间"""
if v is None:
return v
try:
datetime.strptime(v, "%Y-%m-%d %H:%M:%S")
except ValueError:
raise HTTPException(detail=f'{v}时间格式错误,应为:2025-12-17 11:13:49', status_code=400)
return v
@field_validator("quantity")
def validate_quantity(cls, v):
"""验证实际完成量累计必须为非负数"""
if v is None:
return None
if v < 0:
raise HTTPException(status_code=400, detail='实际完成量累计不能小于0')
return v
@field_validator("date")
def validate_date(cls, v):
if v is None:
return None
if v > get_current_date():
raise HTTPException(detail='节点日期不能大于今天', status_code=400)
return v
class ConstructionDetailBulkUpdate(BaseModel):
detail_list: List[ConstructionDetailUpdate]