Files
crm_project/server/app/schemas/order.py
T
hankin 423baff73b v0.1.0: CRM/ERP 系统内测版本 - 安全加固完成
- Docker bridge 网络隔离(8000 端口封死)
- Gunicorn 4 Worker 多进程
- Alembic 数据库迁移基线
- 日志轮转 20m×3
- JWT 密钥 + DB 密码 + CORS 收紧
- 3-2-1 备份链路(NAS + R740-B 冷备)
- 连接池 pool_pre_ping + pool_recycle=3600
2026-03-16 07:31:37 +00:00

112 lines
4.1 KiB
Python

"""
ERP 交易域 Pydantic V2 Schemas
订单创建(嵌套明细)/ 详情响应 / 动态定价
"""
from __future__ import annotations
import uuid
from datetime import date, datetime
from pydantic import BaseModel, Field
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# B2B 动态定价
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
class PriceCalculateRequest(BaseModel):
customer_id: uuid.UUID
sku_id: uuid.UUID
class PriceCalculateResponse(BaseModel):
sku_id: uuid.UUID
sku_code: str
sku_name: str
unit_price: float
price_source: str # "history" | "standard"
last_order_no: str | None = None
last_order_date: date | None = None
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 订单创建(嵌套明细)
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
class OrderItemCreate(BaseModel):
sku_id: uuid.UUID
qty: float = Field(..., gt=0, description="订购数量")
unit_price: float = Field(..., ge=0, description="成交单价")
class OrderCreate(BaseModel):
customer_id: uuid.UUID
remark: str | None = None
order_date: date | None = None
items: list[OrderItemCreate] = Field(..., min_length=1, description="至少一个明细行")
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 订单明细响应
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
class OrderItemResponse(BaseModel):
id: uuid.UUID
sku_id: uuid.UUID
sku_code: str | None = None
sku_name: str | None = None
spec: str | None = None
qty: float
unit_price: float
sub_total: float
shipped_qty: float = 0
model_config = {"from_attributes": True}
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 订单主表响应
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
class OrderResponse(BaseModel):
id: uuid.UUID
order_no: str
customer_id: uuid.UUID
customer_name: str | None = None
salesperson_id: uuid.UUID | None = None
salesperson_name: str | None = None
total_amount: float
shipping_state: str
payment_state: str
paid_amount: float = 0
remark: str | None = None
order_date: date
items: list[OrderItemResponse] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 订单列表(不含 items 明细,减少传输体积)
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
class OrderBriefResponse(BaseModel):
id: uuid.UUID
order_no: str
customer_id: uuid.UUID
customer_name: str | None = None
salesperson_name: str | None = None
total_amount: float
shipping_state: str
payment_state: str
paid_amount: float = 0
order_date: date
created_at: datetime
model_config = {"from_attributes": True}
class OrderListResponse(BaseModel):
total: int
items: list[OrderBriefResponse]
page: int
size: int