"""SDS POD 平台 —— 数据模型(pydantic v2)。 移植自 @inkreach/sds-mng。订单域为 camelCase;物流域混用 snake_case, 对 snake_case 字段显式标注 alias(alias 优先于 alias_generator)。 所有模型 extra='allow',不丢字段。 """ from __future__ import annotations from typing import Any from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel class _SdsModel(BaseModel): model_config = ConfigDict( extra="allow", populate_by_name=True, alias_generator=to_camel, ) # ----- 认证 ----- class LoginResult(_SdsModel): access_token: str # ----- 订单域(camelCase)----- class MerchantStore(_SdsModel): id: int | None = None name: str | None = None platform_name: str | None = None platform_code: str | None = None status: int | None = None class Address(_SdsModel): id: int | None = None country: str | None = None consignee: str | None = None city: str | None = None detail: str | None = None province: str | None = None mobile_phone: str | None = None postcode: str | None = None email: str | None = None class IssuingBayArea(_SdsModel): name: str | None = None type: str | None = None id: int | None = None class IssuingBayRef(_SdsModel): id: int | None = None name: str | None = None city: str | None = None province: str | None = None detail: str | None = None class ImportProduct(_SdsModel): id: str | None = None import_sku: str | None = None import_product_name: str | None = None import_color: str | None = None import_size: str | None = None import_img: str | None = None import_style_number: str | None = None import_sku_id: str | None = None class OrderItem(_SdsModel): id: str | None = None order_id: str | None = None no: str | None = None out_order_item_id: str | None = None import_product: ImportProduct | None = None product_id: int | None = None factory_id: int | None = None factory: Any | None = None seller_sku: str | None = None product_name: str | None = None img_url: str | None = None product_color_block: Any | None = None product_size: str | None = None num: int | None = None status: int | None = None origin_price: float | None = None price: float | None = None supply_price: float | None = None amount: float | None = None profit: float | None = None refund_status: str | None = None design_status: str | None = None class Merchant(_SdsModel): id: int | None = None name: str | None = None class StatusHistory(_SdsModel): status: int | None = None gmt_update_time: str | None = None class Compensation(_SdsModel): status: int | None = None amount: float | None = None class Order(_SdsModel): id: str store_id: int | None = None customer_id: int | None = None no: str | None = None out_order_no: str | None = None username: str | None = None origin: str | None = None total_amount: float | None = None product_amount: float | None = None cost_amount: float | None = None status: int | None = None online_order_status_name: str | None = None online_order_status_code: str | None = None gmt_created: str | None = None gmt_pay: str | None = None pay_status: int | None = None latest_ship_time: Any | None = None refund_status: int | None = None be_after_service_order: bool | None = None fba_type: str | None = None remark: str | None = None carriage_name: str | None = None parcel_list: list[Any] = [] merchant_store: MerchantStore | None = None address: Address | None = None issuing_bay_area: IssuingBayArea | None = None issuing_bay: IssuingBayRef | None = None items: list[OrderItem] = [] logistics_id: int | None = None delivery_type: int | None = None merchant: Merchant | None = None finish_time: Any | None = None status_history: list[StatusHistory] = [] compensation: Compensation | None = None compensation_status: int | None = None express_type: int | None = None class OrderPageResponse(_SdsModel): total_count: int = Field(default=0, alias="totalCount") current_page: int | None = None page_size: int | None = None records: list[Order] = Field(default=[], alias="list") class OrderStatus(_SdsModel): name: str | None = None order_status_code: str | None = None sort: int | None = None class OrderStatistics(_SdsModel): name: str | None = None order_num: int | None = None order_status_code: str | None = None sort: int | None = None # ----- 产品域(camelCase)----- class ProductCategory(_SdsModel): id: int | None = None name: str | None = None class ProductSupply(_SdsModel): factory_id: int | None = None name: str | None = None supply_price: str | None = None max_price: float | None = None min_price: float | None = None online_supply_num: int | None = None class Product(_SdsModel): id: int img_url: str | None = None thumb_img_url: str | None = None category_id: int | None = None category_list: list[ProductCategory] = [] on_sale_status: int | None = None public_status: int | None = None platform_price: str | None = None on_sale_price: str | None = None status: int | None = None sku: str | None = None name: str | None = None english_name: str | None = None product_supply: list[ProductSupply] = [] class ProductListResponse(_SdsModel): total_count: int = Field(default=0, alias="totalCount") records: list[Product] = Field(default=[], alias="list") # ----- 物流域(混用 snake_case,显式 alias)----- class IssuingBay(_SdsModel): id: int | None = None name: str | None = None type: str | None = None country: str | None = None country_name: str | None = Field(default=None, alias="country_name") province: str | None = None province_code: str | None = Field(default=None, alias="province_code") city: str | None = None city_code: str | None = Field(default=None, alias="city_code") detail: str | None = None priority: int | None = None status: int | None = None issuing_bay_area_id: int | None = Field(default=None, alias="issuing_bay_area_id") created_time: int | None = Field(default=None, alias="created_time") updated_time: int | None = Field(default=None, alias="updated_time") class IssuingBayAreaDetail(_SdsModel): id: int | None = None name: str | None = None type: str | None = None country_code: str | None = None address: str | None = None icon_url: str | None = None status: int | None = None priority: int | None = None created_time: int | None = Field(default=None, alias="created_time") updated_time: int | None = Field(default=None, alias="updated_time") issuing_bays: list[IssuingBay] = [] class IssuingBayAreaResponse(_SdsModel): items: list[IssuingBayAreaDetail] = [] class LogisticsItem(IssuingBay): factory_num: int | None = None account_num: int | None = None class LogisticsPageResponse(_SdsModel): items: list[LogisticsItem] = [] page: int | None = None size: int | None = None total_count: int = Field(default=0, alias="totalCount") total_count_alt: int | None = Field(default=None, alias="total_count") # ----- 筛选面板(camelCase)----- class FilterItem(_SdsModel): name: str | None = None id: Any | None = None fp: Any | None = None class FiltratePanelResponse(_SdsModel): factory_list: list[FilterItem] = [] merchant_list: list[FilterItem] = [] logistics_list: list[FilterItem] = [] early_warning_list: list[FilterItem] = [] issuing_bay_area_list: list[FilterItem] = [] extend_status_list: list[FilterItem] = [] # ----- 查询参数(请求 schema)----- class OrderPageRequest(BaseModel): """SDS 订单分页查询参数。keywords(换行分隔订单号)/时间范围/状态等可选。""" model_config = ConfigDict(extra="allow") size: int | None = None page: int | None = None keywords: str | None = None created_date_begin: str | None = None created_date_end: str | None = None pay_date_begin: str | None = None pay_date_end: str | None = None confirm_date_begin: str | None = None confirm_date_end: str | None = None finish_date_begin: str | None = None finish_date_end: str | None = None order_status_code: str | None = None product_keywords: str | None = None order_time_range_type: str | None = None factory_ids: list[int] | None = None merchant_ids: list[int] | None = None logistics_ids: list[int] | None = None issuing_bay_area_id: int | None = None extend_status: str | None = None early_warning_type: str | None = None item_num_type: str | None = None limit: int | None = None all: bool | None = None class OrderQueryParams(BaseModel): """SDS 订单筛选/状态/统计查询参数(不含分页)。""" model_config = ConfigDict(extra="allow") created_date_begin: str | None = None created_date_end: str | None = None pay_date_begin: str | None = None pay_date_end: str | None = None confirm_date_begin: str | None = None confirm_date_end: str | None = None finish_date_begin: str | None = None finish_date_end: str | None = None order_time_range_type: str | None = None product_keywords: str | None = None factory_ids: list[int] | None = None merchant_ids: list[int] | None = None logistics_ids: list[int] | None = None issuing_bay_area_id: int | None = None extend_status: str | None = None early_warning_type: str | None = None item_num_type: str | None = None class ProductListRequest(BaseModel): model_config = ConfigDict(extra="allow") keyword: str | None = None page: int | None = None size: int | None = None public_status: int | None = None limit: int | None = None all: bool | None = None class LogisticsPageRequest(BaseModel): model_config = ConfigDict(extra="allow") keyword: str | None = None delivery_method: str | None = None issuing_bay_area_id: int page: int | None = None size: int | None = None limit: int | None = None all: bool | None = None