feat: extend boxing module to support accessory items
- Add PendingAccessory schema and pending_accessories to BoxInfoResponse - Add item_type field to BoxItemDetail, CurrentZongpaiBox, BoxSaveRequest, BoxSaveResponse - Query pending (unboxed) accessories in get_box_info - Branch save_box_record to skip ERP validation for accessory items Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -5,45 +5,64 @@ from pydantic import BaseModel, Field, field_validator
|
||||
ZONGPAI_PATTERN = re.compile(r"^(\d{2}(B|C|T)\d+|\d{2}(BW|CW)\d{4})$")
|
||||
|
||||
|
||||
class PendingAccessory(BaseModel):
|
||||
"""待装箱的配件"""
|
||||
|
||||
accessory_id: int
|
||||
accessory_type: str
|
||||
quantity: int
|
||||
location_code: str | None = None
|
||||
|
||||
|
||||
class BoxItemDetail(BaseModel):
|
||||
"""箱号下某个总排号的明细"""
|
||||
|
||||
box_item_id: int | None = None
|
||||
zongpai_no: str
|
||||
work_order_no: str | None = None
|
||||
quantity: int
|
||||
total_quantity: int | None = None
|
||||
item_type: str = "product"
|
||||
|
||||
|
||||
class CurrentZongpaiBox(BaseModel):
|
||||
"""当前总排号已经分配的箱号明细"""
|
||||
|
||||
box_item_id: int
|
||||
box_no: int
|
||||
quantity: int
|
||||
item_type: str = "product"
|
||||
|
||||
|
||||
class BoxDetail(BaseModel):
|
||||
"""一个箱号的完整信息"""
|
||||
|
||||
box_no: int
|
||||
items: list[BoxItemDetail]
|
||||
|
||||
|
||||
class BoxInfoResponse(BaseModel):
|
||||
"""GET /box/info 响应"""
|
||||
|
||||
zongpai_no: str
|
||||
paichan_no: str
|
||||
work_order_no: str | None = None
|
||||
quantity: int
|
||||
current_zongpai_boxes: list[CurrentZongpaiBox] = Field(default_factory=list)
|
||||
existing_boxes: list[BoxDetail]
|
||||
pending_accessories: list[PendingAccessory] = Field(default_factory=list)
|
||||
max_box_no: int
|
||||
suggested_box_no: int
|
||||
|
||||
|
||||
class BoxSaveRequest(BaseModel):
|
||||
"""POST /box 请求"""
|
||||
|
||||
zongpai_no: str
|
||||
box_no: int
|
||||
quantity: int
|
||||
item_type: str = "product"
|
||||
accessory_id: int | None = None
|
||||
|
||||
@field_validator("zongpai_no")
|
||||
@classmethod
|
||||
@@ -70,16 +89,19 @@ class BoxSaveRequest(BaseModel):
|
||||
|
||||
class BoxSaveResponse(BaseModel):
|
||||
"""POST /box 响应"""
|
||||
|
||||
box_item_id: int
|
||||
paichan_no: str
|
||||
box_no: int
|
||||
zongpai_no: str
|
||||
quantity: int
|
||||
item_type: str = "product"
|
||||
created_at: str
|
||||
|
||||
|
||||
class BoxUpdateRequest(BaseModel):
|
||||
"""PATCH /box/{box_item_id} 请求"""
|
||||
|
||||
box_no: int
|
||||
quantity: int
|
||||
|
||||
@@ -100,6 +122,7 @@ class BoxUpdateRequest(BaseModel):
|
||||
|
||||
class BoxUpdateResponse(BaseModel):
|
||||
"""PATCH /box/{box_item_id} 响应"""
|
||||
|
||||
box_item_id: int
|
||||
paichan_no: str
|
||||
box_no: int
|
||||
@@ -110,5 +133,6 @@ class BoxUpdateResponse(BaseModel):
|
||||
|
||||
class BoxDeleteResponse(BaseModel):
|
||||
"""DELETE /box/{box_item_id} 响应"""
|
||||
|
||||
box_item_id: int
|
||||
deleted: bool
|
||||
|
||||
Reference in New Issue
Block a user