Files
smart-project-pricing/后端服务/app/schemas/equipment.py
2026-01-31 21:33:06 +08:00

55 lines
2.2 KiB
Python

"""设备 Schema"""
from typing import Optional
from datetime import datetime, date
from pydantic import BaseModel, Field, field_validator
class EquipmentBase(BaseModel):
"""设备基础字段"""
equipment_code: str = Field(..., min_length=1, max_length=50, description="设备编码")
equipment_name: str = Field(..., min_length=1, max_length=100, description="设备名称")
original_value: float = Field(..., gt=0, description="设备原值")
residual_rate: float = Field(5.00, ge=0, le=100, description="残值率(%)")
service_years: int = Field(..., gt=0, description="预计使用年限")
estimated_uses: int = Field(..., gt=0, description="预计使用次数")
purchase_date: Optional[date] = Field(None, description="购入日期")
is_active: bool = Field(True, description="是否启用")
class EquipmentCreate(EquipmentBase):
"""创建设备请求"""
@property
def depreciation_per_use(self) -> float:
"""计算单次折旧成本"""
residual_value = self.original_value * self.residual_rate / 100
return (self.original_value - residual_value) / self.estimated_uses
class EquipmentUpdate(BaseModel):
"""更新设备请求"""
equipment_code: Optional[str] = Field(None, min_length=1, max_length=50, description="设备编码")
equipment_name: Optional[str] = Field(None, min_length=1, max_length=100, description="设备名称")
original_value: Optional[float] = Field(None, gt=0, description="设备原值")
residual_rate: Optional[float] = Field(None, ge=0, le=100, description="残值率(%)")
service_years: Optional[int] = Field(None, gt=0, description="预计使用年限")
estimated_uses: Optional[int] = Field(None, gt=0, description="预计使用次数")
purchase_date: Optional[date] = Field(None, description="购入日期")
is_active: Optional[bool] = Field(None, description="是否启用")
class EquipmentResponse(EquipmentBase):
"""设备响应"""
id: int
depreciation_per_use: float = Field(..., description="单次折旧成本")
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True