import re from pydantic import BaseModel, field_validator ZONGPAI_PATTERN = re.compile(r"^(\d{2}(B|C|T)\d+|\d{2}(BW|CW)\d{4})$") LOCATION_NORMAL_PATTERN = re.compile(r"^[A-Z]+\d+-\d+-\d+$") LOCATION_TRANS_PATTERN = re.compile(r"^TRANS-\d+") class LocationRequest(BaseModel): zongpai_no: str location_code: str @field_validator("zongpai_no") @classmethod def validate_zongpai_no(cls, v: str) -> str: v = v.strip().upper() if not ZONGPAI_PATTERN.match(v): raise ValueError("INVALID_ZONGPAI") return v @field_validator("location_code") @classmethod def validate_location_code(cls, v: str) -> str: v = v.strip().upper() if not LOCATION_NORMAL_PATTERN.match(v) and not LOCATION_TRANS_PATTERN.match(v): raise ValueError("INVALID_LOCATION") return v class LocationResponse(BaseModel): zongpai_no: str location_code: str created_at: str previous_location: str | None = None class PaichaOverviewItem(BaseModel): zongpai_no: str work_order_no: str | None = None quantity: int location_code: str | None = None status: str class PaichaOverviewResponse(BaseModel): paicha_no: str total_count: int items: list[PaichaOverviewItem] class DuplicateLocationDetail(BaseModel): existing_location: str created_at: str