"""RIIN 增量同步:从数据库最近下单时间增量拉取(无参,全自动)。 对应 riin-incremental-sync。from = floorToHour(MAX(orderedAt)),to = now。 """ from __future__ import annotations from datetime import datetime from prefect import flow, task from flows.riin._pipeline import sync_riin_records from flows.shared import ( SyncDB, create_riin_client, fetch_riin_all_pages, floor_to_hour, format_date, ) @task(retries=3, retry_delay_seconds=[3, 6, 9]) def extract_orders(params: dict) -> list: client = create_riin_client() try: return fetch_riin_all_pages(client, params) finally: client.close() @task def upsert_records(raw_orders: list) -> dict: client = create_riin_client() try: return sync_riin_records(raw_orders, client, SyncDB()) finally: client.close() @flow(name="riin-incremental-sync", log_prints=True) def riin_incremental_sync() -> dict: db = SyncDB() latest = db.get_latest_ordered_at("RIIN") now = datetime.now() from_dt = floor_to_hour(latest) if latest else floor_to_hour(now) to_dt = now if from_dt >= to_dt: from_dt = floor_to_hour(now) params = { "time_type": 3, "start_time": format_date(from_dt), "end_time": format_date(to_dt), "page_size": 200, } print(f"RIIN 增量同步 {params['start_time']} ~ {params['end_time']}") raw = extract_orders(params) stats = upsert_records(raw) print(f"完成: 订单 {stats['orderCount']} / 商品 {stats['goodsCount']}") return {"syncRange": {"from": params["start_time"], "to": params["end_time"]}, **stats} if __name__ == "__main__": riin_incremental_sync.serve(name="riin-incremental-sync", cron="0 * * * *")