dingdanquanliucheng/backend/app/schemas/orders.py

383 lines
9.7 KiB
Python
Raw Normal View History

"""
订单模块请求模型
定义订单管理相关的请求体数据模型 orders 路由使用
包含订单查询创建更新取消审批以及供应商对账等操作的请求体
"""
2026-05-14 10:15:51 +08:00
from pydantic import BaseModel, Field
2026-05-14 13:51:06 +08:00
class OrderListQuery(BaseModel):
"""订单列表查询参数模型。被 GET /api/orders 路由使用。"""
order_no: str | None = None
"""订单编号,模糊匹配"""
2026-05-14 13:51:06 +08:00
order_status: str | None = None
"""订单状态筛选"""
2026-05-14 13:51:06 +08:00
customer_name: str | None = None
"""客户名称,模糊匹配"""
2026-05-14 13:51:06 +08:00
customer_mobile: str | None = None
"""客户手机号,模糊匹配"""
2026-05-14 13:51:06 +08:00
salesman_id: int | None = None
"""业务员 ID 筛选"""
2026-05-14 13:51:06 +08:00
factory_id: int | None = None
"""工厂 ID 筛选"""
2026-05-14 13:51:06 +08:00
order_source: str | None = None
"""订单来源筛选"""
2026-06-30 20:54:17 +08:00
order_type: str | None = None
"""订单类型筛选industry/daily"""
need_invoice: int | None = None
"""是否需要发票筛选0=否1=是)"""
2026-05-14 13:51:06 +08:00
start_time: str | None = None
"""查询起始时间ISO 格式)"""
2026-05-14 13:51:06 +08:00
end_time: str | None = None
"""查询截止时间ISO 格式)"""
2026-05-14 13:51:06 +08:00
page_no: int = 1
"""页码,从 1 开始"""
2026-05-14 13:51:06 +08:00
page_size: int = 20
"""每页条数"""
2026-05-14 13:51:06 +08:00
class OrderItemPayload(BaseModel):
"""订单商品明细载荷,用于创建/更新订单时携带商品行项。"""
2026-05-14 10:15:51 +08:00
product_id: int | None = None
"""产品 ID可选新建时可能尚未关联"""
2026-05-14 10:15:51 +08:00
product_name: str
"""产品名称"""
2026-05-14 10:15:51 +08:00
specification: str
"""规格"""
2026-05-14 10:15:51 +08:00
unit: str
"""单位"""
quantity: float = Field(gt=0)
"""数量,必须大于 0"""
sale_price: float = Field(ge=0)
"""销售单价"""
cost_price: float = Field(ge=0)
"""成本单价"""
rebate_amount: float = Field(default=0, ge=0)
"""返利金额"""
freight_amount: float = Field(default=0, ge=0)
"""运费"""
tax_amount: float = Field(default=0, ge=0)
"""税额"""
other_fee_amount: float = Field(default=0, ge=0)
"""其他费用"""
2026-05-14 13:51:06 +08:00
remark: str | None = None
"""备注"""
demand_specification: str | None = None
"""需求规格"""
2026-05-26 15:24:41 +08:00
# 报价引擎快照字段
pricing_type: str | None = None
"""报价类型(创建订单时从报价引擎快照而来)"""
2026-05-26 15:24:41 +08:00
length_m: float | None = None
"""长度(米),报价快照"""
2026-05-26 15:24:41 +08:00
width_m: float | None = None
"""宽度(米),报价快照"""
2026-05-26 15:24:41 +08:00
area_sqm: float | None = None
"""面积(平方米),报价快照"""
2026-05-26 15:24:41 +08:00
surcharge_detail: str | None = None
"""附加费明细JSON 字符串"""
2026-05-26 15:24:41 +08:00
processing_detail: str | None = None
"""加工费明细JSON 字符串"""
2026-05-26 15:24:41 +08:00
supplier_id: int | None = None
"""供应商 ID报价快照"""
2026-05-26 15:24:41 +08:00
supplier_model: str | None = None
"""供应商型号,报价快照"""
2026-05-26 15:24:41 +08:00
price_tier: str | None = None
"""价格档位,报价快照"""
2026-05-14 10:15:51 +08:00
2026-05-14 13:51:06 +08:00
class CreateOrderRequest(BaseModel):
"""创建订单请求体。被 POST /api/orders 路由使用。"""
2026-05-19 17:30:35 +08:00
customer_name: str
"""客户名称"""
2026-05-19 17:30:35 +08:00
customer_mobile: str
"""客户联系电话"""
2026-05-19 17:30:35 +08:00
customer_address: str | None = None
"""配送地址"""
2026-05-19 17:30:35 +08:00
order_source: str | None = None
"""订单来源"""
2026-05-19 17:30:35 +08:00
delivery_type: str | None = None
"""配送方式"""
2026-05-19 17:30:35 +08:00
factory_id: int | None = None
"""生产工厂 ID"""
2026-06-19 23:57:25 +08:00
contract_amount: float = Field(default=0, ge=0)
"""合同金额(客户应付总额)"""
2026-05-19 17:30:35 +08:00
commission_amount: float = Field(default=0, ge=0)
"""佣金金额"""
2026-05-19 17:30:35 +08:00
rebate_total: float = Field(default=0, ge=0)
"""返利合计"""
2026-05-19 17:30:35 +08:00
freight_total: float = Field(default=0, ge=0)
"""运费合计"""
2026-05-19 17:30:35 +08:00
tax_total: float = Field(default=0, ge=0)
"""税额合计"""
2026-05-19 17:30:35 +08:00
other_fee_total: float = Field(default=0, ge=0)
"""其他费用合计"""
2026-06-19 23:03:14 +08:00
payment_method: str | None = None
"""收款渠道"""
tax_amount: float = Field(default=0, ge=0)
"""含税金额"""
2026-06-22 14:59:51 +08:00
need_invoice: int = Field(default=0, ge=0)
"""是否需要发票0=否1=是)"""
order_type: str | None = None
"""订单类型industry=工业订单daily=日用品订单)"""
self_delivery: int = Field(default=0, ge=0)
"""是否自发0=否1=是)"""
tracking_number: str | None = None
"""快递单号(自发时填写)"""
customer_demand: str | None = None
"""客户需求描述"""
2026-05-19 17:30:35 +08:00
remark: str | None = None
"""备注"""
2026-05-19 17:30:35 +08:00
items: list[OrderItemPayload] = Field(default_factory=list)
"""订单商品明细列表"""
2026-05-19 17:30:35 +08:00
class UpdateOrderRequest(BaseModel):
"""更新订单请求体。被 PUT /api/orders/{id} 路由使用。"""
2026-05-14 10:15:51 +08:00
customer_name: str
"""客户名称"""
2026-05-14 10:15:51 +08:00
customer_mobile: str
"""客户联系电话"""
2026-05-14 13:51:06 +08:00
customer_address: str | None = None
"""配送地址"""
2026-05-14 10:15:51 +08:00
order_source: str | None = None
"""订单来源"""
2026-05-14 10:15:51 +08:00
delivery_type: str | None = None
"""配送方式"""
2026-05-14 10:15:51 +08:00
factory_id: int | None = None
"""生产工厂 ID"""
2026-06-19 23:57:25 +08:00
contract_amount: float = Field(default=0, ge=0)
"""合同金额(客户应付总额)"""
commission_amount: float = Field(default=0, ge=0)
"""佣金金额"""
rebate_total: float = Field(default=0, ge=0)
"""返利合计"""
freight_total: float = Field(default=0, ge=0)
"""运费合计"""
tax_total: float = Field(default=0, ge=0)
"""税额合计"""
other_fee_total: float = Field(default=0, ge=0)
"""其他费用合计"""
2026-06-19 23:03:14 +08:00
payment_method: str | None = None
"""收款渠道"""
tax_amount: float = Field(default=0, ge=0)
"""含税金额"""
2026-06-22 14:59:51 +08:00
need_invoice: int = Field(default=0, ge=0)
"""是否需要发票0=否1=是)"""
order_type: str | None = None
"""订单类型industry=工业订单daily=日用品订单)"""
self_delivery: int = Field(default=0, ge=0)
"""是否自发0=否1=是)"""
tracking_number: str | None = None
"""快递单号(自发时填写)"""
customer_demand: str | None = None
"""客户需求描述"""
2026-05-14 10:15:51 +08:00
remark: str | None = None
"""备注"""
2026-05-14 13:51:06 +08:00
items: list[OrderItemPayload] = Field(default_factory=list)
"""订单商品明细列表(全量替换)"""
2026-05-14 10:15:51 +08:00
2026-05-14 13:51:06 +08:00
class CancelOrderRequest(BaseModel):
"""取消订单请求体。被 POST /api/orders/{id}/cancel 路由使用。"""
2026-05-14 13:51:06 +08:00
cancel_reason: str
"""取消原因"""
2026-05-14 13:51:06 +08:00
cancel_opinion: str | None = None
"""取消审批意见"""
2026-05-14 13:51:06 +08:00
class ApproveOrderRequest(BaseModel):
"""审批订单请求体。被 POST /api/orders/{id}/approve 路由使用。"""
2026-05-14 13:51:06 +08:00
approve_result: str
2026-06-30 20:54:17 +08:00
"""审批结果pass=通过, reject=退回)"""
2026-05-14 13:51:06 +08:00
approve_opinion: str | None = None
"""审批意见"""
2026-05-14 13:51:06 +08:00
factory_id: int | None = None
"""下发工厂 ID审批通过时可选同时选择工厂和司机可跳过待工厂节点"""
driver_id: int | None = None
2026-06-30 20:54:17 +08:00
"""分配司机 ID审批通过时可选同时选择工厂和司机可直接创建物流任务"""
2026-05-14 13:51:06 +08:00
class SupplierTextRequest(BaseModel):
"""获取供应商对账文本请求体。被 POST /api/orders/supplier-text 路由使用。"""
2026-05-14 13:51:06 +08:00
supplier_id: int
"""供应商 ID"""
2026-05-14 13:51:06 +08:00
class ConfirmSupplierTextRequest(BaseModel):
"""确认供应商对账文本请求体。被 POST /api/orders/supplier-text/confirm 路由使用。"""
2026-05-14 13:51:06 +08:00
supplier_id: int
"""供应商 ID"""
2026-05-14 13:51:06 +08:00
text_content: str
"""对账文本内容"""
2026-05-14 13:51:06 +08:00
remark: str | None = None
"""备注"""
class ChangeOrderStatusRequest(BaseModel):
"""变更订单状态请求体。被 POST /api/orders/{id}/status 路由使用。"""
target_status: str
"""目标状态"""
remark: str | None = None
"""备注"""
2026-06-30 20:54:17 +08:00
class ReviseOrderRequest(BaseModel):
"""管理员修订订单请求体。被 POST /api/orders/{id}/revise 路由使用。"""
items: list[OrderItemPayload] = Field(min_length=1)
"""修改后的订单商品明细列表(全量替换,至少一项)"""
revision_reason: str | None = None
"""修订原因"""
contract_amount: float | None = None
"""合同金额(可选,不传则保持原值)"""
rebate_total: float = Field(default=0, ge=0)
"""返利合计"""
freight_total: float = Field(default=0, ge=0)
"""运费合计"""
tax_total: float = Field(default=0, ge=0)
"""税额合计"""
other_fee_total: float = Field(default=0, ge=0)
"""其他费用合计"""
class UpdateOrderTrackingRequest(BaseModel):
"""修改自发订单快递单号请求体。被 PUT /api/orders/{id}/tracking 路由使用。"""
tracking_number: str
"""快递单号"""
remark: str | None = None
class LogisticsMatchItem(BaseModel):
"""批量匹配物流条目。"""
tracking_number: str
"""快递单号"""
express_company: str | None = None
"""快递公司"""
recipient_name: str | None = None
"""收件人姓名(面单场景可能为空)"""
order_id: int | None = None
"""用户确认后填入的目标订单 ID"""
class BatchMatchLogisticsRequest(BaseModel):
"""批量匹配物流请求体。被 POST /api/orders/batch-match-logistics 路由使用。"""
mode: str
"""模式text文本粘贴| image_table物流表格截图| express_images快递面单照片"""
text: str | None = None
"""mode=text 时的文本内容"""
image_urls: list[str] = Field(default_factory=list)
"""mode=image_table 或 express_images 时的图片 URL 列表"""
class BatchMatchConfirmRequest(BaseModel):
"""批量匹配确认请求体。被 POST /api/orders/batch-match-logistics/confirm 路由使用。"""
matches: list[LogisticsMatchItem] = Field(min_length=1)
"""用户确认后的匹配列表,至少一条"""