在线抓取，更新ODS ，然后将更新的ODS内容，对应到DWD的更新。


可以按“两段定时”跑：先在线抓取+入库更新 ODS，再跑 DWD_LOAD_FROM_ODS 把新增/变更同步到 DWD。CLI 用 python -m etl_billiards.cli.main。

1) ODS：在线抓取 + 入库（FULL）
python -m etl_billiards.cli.main ^
  --pipeline-flow FULL ^
  --tasks PRODUCTS,TABLES,MEMBERS,ASSISTANTS,PACKAGES_DEF,ORDERS,PAYMENTS,REFUNDS,COUPON_USAGE,INVENTORY_CHANGE,TOPUPS,TABLE_DISCOUNT,ASSISTANT_ABOLISH,LEDGER ^
  --pg-dsn "%PG_DSN%" ^
  --store-id %STORE_ID% ^
  --api-token "%API_TOKEN%"
（可选）指定落盘目录：加 --fetch-root "export/JSON"；美化 JSON：--write-pretty-json

2) DWD：ODS → DWD
python -m etl_billiards.cli.main ^
  --pipeline-flow INGEST_ONLY ^
  --tasks DWD_LOAD_FROM_ODS ^
  --pg-dsn "%PG_DSN%" ^
  --store-id %STORE_ID%
推荐的环境变量
PG_DSN=postgresql://user:pwd@host:5432/db
STORE_ID=...
API_TOKEN=...
（可选）JSON_FETCH_ROOT=... / FETCH_ROOT=...，LOG_ROOT=...
如果你希望“一条命令顺序跑完 ODS+DWD”，也可以直接：

python -m etl_billiards.cli.main ^
  --pipeline-flow FULL ^
  --tasks PRODUCTS,TABLES,MEMBERS,ASSISTANTS,PACKAGES_DEF,ORDERS,PAYMENTS,REFUNDS,COUPON_USAGE,INVENTORY_CHANGE,TOPUPS,TABLE_DISCOUNT,ASSISTANT_ABOLISH,LEDGER,DWD_LOAD_FROM_ODS ^
  --pg-dsn "%PG_DSN%" ^
  --store-id %STORE_ID% ^
  --api-token "%API_TOKEN%"
（这会对前半段任务走在线抓取+入库，对 DWD_LOAD_FROM_ODS 只做入库阶段，因为它没有抓取逻辑。）
