"""SDS 订单同步:按下单时间窗口(+筛选)拉取订单与商品。 对应 sds-order-sync。主时间维度 payDate(下单时间)。 """ from __future__ import annotations from typing import Any from prefect import flow, task from flows.sds._pipeline import sync_sds_records from flows.shared import ( SyncDB, create_sds_client, fetch_sds_all_pages, get_channel_type_map, refresh_channel_type_map, ) @task(retries=3, retry_delay_seconds=[3, 6, 9]) def extract_orders(params: dict[str, Any]) -> list: client = create_sds_client() try: return fetch_sds_all_pages(client, params) finally: client.close() @task def upsert_records(raw_orders: list) -> dict: client = create_sds_client() try: channel_map = get_channel_type_map(client) return sync_sds_records(raw_orders, channel_map, SyncDB(), channel_refresh=lambda: refresh_channel_type_map(client)) finally: client.close() @flow(name="sds-order-sync", log_prints=True) def sds_order_sync( pay_date_begin: str, pay_date_end: str, order_status_code: 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, keywords: str | None = None, page_size: int = 500, ) -> dict[str, Any]: params: dict[str, Any] = { "pay_date_begin": pay_date_begin, "pay_date_end": pay_date_end, "size": page_size, } if order_status_code is not None: params["order_status_code"] = order_status_code if factory_ids: params["factory_ids"] = factory_ids if merchant_ids: params["merchant_ids"] = merchant_ids if logistics_ids: params["logistics_ids"] = logistics_ids if issuing_bay_area_id is not None: params["issuing_bay_area_id"] = issuing_bay_area_id if keywords: params["keywords"] = keywords print(f"SDS 订单同步 {pay_date_begin} ~ {pay_date_end}") raw = extract_orders(params) stats = upsert_records(raw) print(f"完成: 订单 {stats['orderCount']} / 商品 {stats['goodsCount']} / 跳过待付款 {stats.get('skippedUnpaid',0)}") return {"syncRange": {"from": pay_date_begin, "to": pay_date_end}, **stats} if __name__ == "__main__": sds_order_sync.serve(name="sds-order-sync")