55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
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
|