| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """手工派车日历输入,只接收可写业务字段。"""
- import re
- from datetime import date
- from typing import Optional
- from pydantic import BaseModel, ConfigDict, Field, field_validator
- class CreateBody(BaseModel):
- model_config = ConfigDict(populate_by_name=True, extra="forbid", str_strip_whitespace=True)
- dispatch_date: date = Field(..., alias="dispatchDate", description="派车日期,范围 1900-01-01 至 2100-12-31")
- vehicle_id: str = Field(..., alias="vehicleId", min_length=1, max_length=64)
- product_id: str = Field(..., alias="productId", min_length=1, max_length=64)
- origin: str = Field(..., min_length=1, max_length=255)
- destination: str = Field(..., min_length=1, max_length=255)
- quantity: Optional[str] = Field(default=None, max_length=16, description="数量文本,单位吨,最多两位小数;不参与汇总")
- calendar_kind: str = Field(default="acid", alias="calendarKind", min_length=1, max_length=16)
- remark: Optional[str] = Field(default=None, max_length=500)
- @field_validator("dispatch_date", mode="before")
- @classmethod
- def validate_date_format(cls, value):
- if not isinstance(value, str) or not re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}", value):
- raise ValueError("派车日期须为 YYYY-MM-DD")
- return value
- @field_validator("dispatch_date")
- @classmethod
- def validate_date_range(cls, value: date) -> date:
- # Pydantic 2.5 的 date ge/le 会生成不合法的 OpenAPI 数字范围约束。
- if not date(1900, 1, 1) <= value <= date(2100, 12, 31):
- raise ValueError("派车日期须在 1900-01-01 至 2100-12-31 范围内")
- return value
- @field_validator("quantity", mode="before")
- @classmethod
- def validate_quantity(cls, value):
- if value is None:
- return None
- if not isinstance(value, str):
- raise ValueError("数量须为文本")
- text = value.strip()
- if not text:
- return None
- if not re.fullmatch(r"\d{1,12}(\.\d{1,2})?", text):
- raise ValueError("数量须为数字,最多两位小数")
- return text
- @field_validator("calendar_kind")
- @classmethod
- def validate_calendar_kind(cls, value: str) -> str:
- if value not in ("acid", "alkali", "other"):
- raise ValueError("日历类型须为 acid、alkali 或 other")
- return value
- class UpdateBody(CreateBody):
- """PUT 提交完整表单。"""
|