{ "tasks": { "8f669bfd": { "id": "8f669bfd", "name": "日常同步 (2h)", "task_codes": [ "ODS_GOODS_CATEGORY", "ODS_RECHARGE_SETTLE", "ODS_TENANT_GOODS", "ODS_SETTLEMENT_TICKET", "ODS_GROUP_PACKAGE", "ODS_ASSISTANT_ABOLISH", "ODS_MEMBER", "ODS_ASSISTANT_LEDGER", "ODS_STORE_GOODS", "ODS_TABLE_USE", "ODS_TABLE_FEE_DISCOUNT", "ODS_MEMBER_BALANCE", "ODS_TABLES", "ODS_STORE_GOODS_SALES", "ODS_INVENTORY_STOCK", "ODS_REFUND", "ODS_ASSISTANT_ACCOUNT", "ODS_PLATFORM_COUPON", "ODS_INVENTORY_CHANGE", "ODS_GROUP_BUY_REDEMPTION", "ODS_PAYMENT", "ODS_SETTLEMENT_RECORDS", "ODS_MEMBER_CARD", "DWD_LOAD_FROM_ODS" ], "schedule": { "schedule_type": "interval", "interval_value": 1, "interval_unit": "hours", "daily_time": "04:00", "weekly_days": [ 1 ], "weekly_time": "04:00", "cron_expression": "0 4 * * *", "enabled": true, "start_date": null, "end_date": null }, "task_config": { "pipeline_flow": "FULL", "lookback_hours": 2 }, "enabled": true, "last_run": "2026-02-03T17:26:49.822562", "next_run": "2026-02-03T18:26:49.822562", "run_count": 27, "last_status": "成功", "execution_history": [ { "task_id": "7898901d", "executed_at": "2026-02-03T17:26:49.822562", "status": "success", "exit_code": 0, "duration_seconds": 234.96317, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 17条, 事实表新增: 28条, 事实表更新: 0条\n 维表: dim_table: +0, ~9, dim_assistant: +0, ~1, dim_member: +0, ~1, dim_store_goods: +0, ~6\n 事实表: dwd_settlement_head: +7, ~0, dwd_table_fee_log: +5, ~0, dwd_member_balance_change: +1, ~0, dwd_groupbuy_redemption: +6, ~0, dwd_platform_coupon_redemption: +2, ~0, dwd_payment: +7, ~0\n【错误】2026-02-03 17:26:51 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 17:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 17:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 15:26:49 --window-end 2026-02-03 17:26:49\n2026-02-03 17:26:50 [INFO] etl_billiards: 配置加载完成\n2026-02-03 17:26:50 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 17:26:50 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 17:26:50 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=1ba620e80f0d4ee3959adf99e2cc48f9\n2026-02-03 17:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8228-20260203-172650\n2026-02-03 17:26:50 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 17:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:51 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 17:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8229-20260203-172651\n2026-02-03 17:26:51 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 17:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 17:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8230-20260203-172651\n2026-02-03 17:26:51 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 17:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 17:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8231-20260203-172652\n2026-02-03 17:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 17:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 17:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8232-20260203-172653\n2026-02-03 17:26:53 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 17:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 17:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8233-20260203-172653\n2026-02-03 17:26:53 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 17:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 17:26:54 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8234-20260203-172654\n2026-02-03 17:26:54 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 17:26:54 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:55 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 1, 'updated': 0, 'skipped': 555, 'errors': 0}\n2026-02-03 17:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8235-20260203-172656\n2026-02-03 17:26:56 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 17:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 1, 'inserted': 0, 'updated': 0, 'skipped': 1, 'errors': 0}\n2026-02-03 17:26:56 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8236-20260203-172656\n2026-02-03 17:26:56 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 17:26:56 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:26:57 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 6, 'updated': 0, 'skipped': 166, 'errors': 0}\n2026-02-03 17:26:57 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8237-20260203-172657\n2026-02-03 17:26:57 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 17:26:57 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:27:23 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10026, 'inserted': 5, 'updated': 0, 'skipped': 10021, 'errors': 0}\n2026-02-03 17:27:23 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8238-20260203-172723\n2026-02-03 17:27:23 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 17:27:23 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:27:31 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 17:27:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8239-20260203-172731\n2026-02-03 17:27:31 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 17:27:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:28:00 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2449, 'inserted': 1, 'updated': 0, 'skipped': 2448, 'errors': 0}\n2026-02-03 17:28:00 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8240-20260203-172800\n2026-02-03 17:28:00 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 17:28:00 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:28:01 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 9, 'updated': 0, 'skipped': 65, 'errors': 0}\n2026-02-03 17:28:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8241-20260203-172801\n2026-02-03 17:28:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 17:28:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:28:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 17:28:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8242-20260203-172802\n2026-02-03 17:28:02 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 17:28:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:28:04 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 6, 'updated': 0, 'skipped': 166, 'errors': 0}\n2026-02-03 17:28:05 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8243-20260203-172805\n2026-02-03 17:28:05 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 17:28:05 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:28:06 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 17:28:06 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8244-20260203-172806\n2026-02-03 17:28:06 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 17:28:06 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:28:07 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 1, 'updated': 0, 'skipped': 68, 'errors': 0}\n2026-02-03 17:28:08 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8245-20260203-172808\n2026-02-03 17:28:08 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 17:28:08 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:28:59 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17575, 'inserted': 2, 'updated': 0, 'skipped': 17573, 'errors': 0}\n2026-02-03 17:28:59 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8246-20260203-172859\n2026-02-03 17:28:59 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 17:28:59 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:29:01 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 18, 'inserted': 7, 'updated': 0, 'skipped': 11, 'errors': 0}\n2026-02-03 17:29:01 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8247-20260203-172901\n2026-02-03 17:29:01 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 17:29:01 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:29:45 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8125, 'inserted': 6, 'updated': 0, 'skipped': 8119, 'errors': 0}\n2026-02-03 17:29:46 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8248-20260203-172946\n2026-02-03 17:29:46 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 17:29:46 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:30:25 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11793, 'inserted': 7, 'updated': 0, 'skipped': 11786, 'errors': 0}\n2026-02-03 17:30:27 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8249-20260203-173027\n2026-02-03 17:30:27 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 17:30:27 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:30:28 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 13, 'inserted': 7, 'updated': 0, 'skipped': 6, 'errors': 0}\n2026-02-03 17:30:29 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8250-20260203-173029\n2026-02-03 17:30:29 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 17:30:29 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:30:32 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 17:30:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8251-20260203-173032\n2026-02-03 17:30:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 17:30:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8251-20260203-173032\n2026-02-03 17:30:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 13:26:49+08:00 ~ 2026-02-03 19:26:49+08:00]\n2026-02-03 17:30:32 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 17:30:32 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.40s\n2026-02-03 17:30:32 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.52s\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.22s\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.21s\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.23s\n2026-02-03 17:30:33 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 17:30:34 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.31s\n2026-02-03 17:30:34 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 17:30:34 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.64s\n2026-02-03 17:30:34 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 17:30:35 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.55s\n2026-02-03 17:30:35 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 17:30:35 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.41s\n2026-02-03 17:30:35 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 17:30:36 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.63s\n2026-02-03 17:30:36 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 17:30:36 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.18s\n2026-02-03 17:30:36 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 17:30:36 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.18s\n2026-02-03 17:30:36 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.24s\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.23s\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.16s\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.16s\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.16s\n2026-02-03 17:30:37 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.27s\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.26s\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.22s\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.19s\n2026-02-03 17:30:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.21s\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.29s\n2026-02-03 17:30:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 17:30:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.27s\n2026-02-03 17:30:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 17:30:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.33s\n2026-02-03 17:30:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 17:30:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.88s\n2026-02-03 17:30:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 17:30:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.72s\n2026-02-03 17:30:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 17:30:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.41s\n2026-02-03 17:30:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 17:30:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.39s\n2026-02-03 17:30:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.37s\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.21s\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.18s\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.18s\n2026-02-03 17:30:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 17:30:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.23s\n2026-02-03 17:30:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 17:30:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-03 17:30:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 17:30:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.22s\n2026-02-03 17:30:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 9, 'skipped': 65}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 7, 'skipped': 67}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 1, 'skipped': 68}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 1, 'skipped': 68}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 1, 'skipped': 555}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 6, 'skipped': 166}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 6, 'skipped': 166}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 6, 'updated': 0, 'processed': 6}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 6, 'updated': 0, 'processed': 6}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 17:30:44 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 17:30:44 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "ed01246f", "executed_at": "2026-02-03T16:26:49.644837", "status": "success", "exit_code": 0, "duration_seconds": 210.896258, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 15条, 事实表新增: 21条, 事实表更新: 0条\n 维表: dim_table: +0, ~9, dim_member: +0, ~1, dim_member_card_account: +0, ~2, dim_store_goods: +0, ~3\n 事实表: dwd_settlement_head: +4, ~0, dwd_table_fee_log: +4, ~0, dwd_assistant_service_log: +1, ~0, dwd_member_balance_change: +1, ~0, dwd_groupbuy_redemption: +3, ~0, dwd_platform_coupon_redemption: +4, ~0, dwd_payment: +4, ~0\n【错误】2026-02-03 16:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 16:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 16:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 14:26:49 --window-end 2026-02-03 16:26:49\n2026-02-03 16:26:50 [INFO] etl_billiards: 配置加载完成\n2026-02-03 16:26:50 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 16:26:50 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 16:26:50 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=d51504180a204e24aa52eaf221022b78\n2026-02-03 16:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8204-20260203-162650\n2026-02-03 16:26:50 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 16:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 16:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8205-20260203-162651\n2026-02-03 16:26:51 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 16:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 16:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8206-20260203-162651\n2026-02-03 16:26:51 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 16:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 16:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8207-20260203-162652\n2026-02-03 16:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:53 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 16:26:53 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 16:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8208-20260203-162653\n2026-02-03 16:26:53 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 16:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 16:26:54 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8209-20260203-162654\n2026-02-03 16:26:54 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 16:26:54 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:54 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 16:26:54 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8210-20260203-162654\n2026-02-03 16:26:54 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 16:26:54 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:56 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 1, 'updated': 0, 'skipped': 555, 'errors': 0}\n2026-02-03 16:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8211-20260203-162656\n2026-02-03 16:26:56 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 16:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 16:26:57 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8212-20260203-162657\n2026-02-03 16:26:57 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 16:26:57 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:26:57 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-03 16:26:58 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8213-20260203-162658\n2026-02-03 16:26:58 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 16:26:58 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:27:23 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10021, 'inserted': 4, 'updated': 0, 'skipped': 10017, 'errors': 0}\n2026-02-03 16:27:23 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8214-20260203-162723\n2026-02-03 16:27:23 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 16:27:23 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:27:31 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 16:27:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8215-20260203-162731\n2026-02-03 16:27:31 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 16:27:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:27:59 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2448, 'inserted': 1, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 16:28:00 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8216-20260203-162800\n2026-02-03 16:28:00 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 16:28:00 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:28:00 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 9, 'updated': 0, 'skipped': 65, 'errors': 0}\n2026-02-03 16:28:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8217-20260203-162801\n2026-02-03 16:28:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 16:28:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:28:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 16:28:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8218-20260203-162802\n2026-02-03 16:28:02 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 16:28:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:28:04 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-03 16:28:04 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8219-20260203-162804\n2026-02-03 16:28:04 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 16:28:04 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:28:05 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 16:28:05 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8220-20260203-162805\n2026-02-03 16:28:05 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 16:28:05 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:28:06 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 16:28:06 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8221-20260203-162806\n2026-02-03 16:28:06 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 16:28:06 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:28:52 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17573, 'inserted': 4, 'updated': 0, 'skipped': 17569, 'errors': 0}\n2026-02-03 16:28:52 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8222-20260203-162852\n2026-02-03 16:28:52 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 16:28:52 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:28:52 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 12, 'inserted': 7, 'updated': 0, 'skipped': 5, 'errors': 0}\n2026-02-03 16:28:53 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8223-20260203-162853\n2026-02-03 16:28:53 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 16:28:53 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:29:34 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8119, 'inserted': 3, 'updated': 0, 'skipped': 8116, 'errors': 0}\n2026-02-03 16:29:34 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8224-20260203-162934\n2026-02-03 16:29:34 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 16:29:34 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:30:04 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11786, 'inserted': 4, 'updated': 0, 'skipped': 11782, 'errors': 0}\n2026-02-03 16:30:04 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8225-20260203-163004\n2026-02-03 16:30:04 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 16:30:04 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:30:05 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 9, 'inserted': 4, 'updated': 0, 'skipped': 5, 'errors': 0}\n2026-02-03 16:30:05 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8226-20260203-163005\n2026-02-03 16:30:05 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 16:30:05 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:30:08 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 2, 'updated': 0, 'skipped': 943, 'errors': 0}\n2026-02-03 16:30:09 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8227-20260203-163009\n2026-02-03 16:30:09 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 16:30:09 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8227-20260203-163009\n2026-02-03 16:30:09 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 12:26:49+08:00 ~ 2026-02-03 18:26:49+08:00]\n2026-02-03 16:30:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 16:30:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.38s\n2026-02-03 16:30:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.48s\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.24s\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.22s\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.21s\n2026-02-03 16:30:10 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 16:30:11 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.23s\n2026-02-03 16:30:11 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 16:30:11 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.43s\n2026-02-03 16:30:11 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 16:30:11 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.22s\n2026-02-03 16:30:11 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 16:30:12 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.38s\n2026-02-03 16:30:12 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 16:30:12 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.64s\n2026-02-03 16:30:12 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 16:30:12 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.18s\n2026-02-03 16:30:12 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.25s\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.24s\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-03 16:30:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 16:30:14 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-03 16:30:14 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 16:30:14 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.26s\n2026-02-03 16:30:14 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 16:30:14 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.27s\n2026-02-03 16:30:14 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.42s\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.39s\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.40s\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.20s\n2026-02-03 16:30:15 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 16:30:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.24s\n2026-02-03 16:30:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 16:30:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.24s\n2026-02-03 16:30:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 16:30:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.40s\n2026-02-03 16:30:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 16:30:17 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.68s\n2026-02-03 16:30:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 16:30:17 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.31s\n2026-02-03 16:30:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.18s\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.20s\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.23s\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.25s\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.26s\n2026-02-03 16:30:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.19s\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.19s\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-03 16:30:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 16:30:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.24s\n2026-02-03 16:30:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 16:30:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-03 16:30:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 16:30:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.19s\n2026-02-03 16:30:20 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 9, 'skipped': 65}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 8, 'skipped': 66}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 1, 'skipped': 555}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 2, 'skipped': 943}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 16:30:20 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 16:30:20 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "0651aefe", "executed_at": "2026-02-03T15:26:49.556007", "status": "success", "exit_code": 0, "duration_seconds": 200.458922, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 11条, 事实表新增: 12条, 事实表更新: 0条\n 维表: dim_table: +0, ~8, dim_store_goods: +0, ~3\n 事实表: dwd_settlement_head: +2, ~0, dwd_table_fee_log: +1, ~0, dwd_groupbuy_redemption: +2, ~0, dwd_platform_coupon_redemption: +5, ~0, dwd_payment: +2, ~0\n【错误】2026-02-03 15:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 15:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 15:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 13:26:49 --window-end 2026-02-03 15:26:49\n2026-02-03 15:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 15:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 15:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 15:26:50 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=590c8c7b6161420bb40031f1b888feff\n2026-02-03 15:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8180-20260203-152650\n2026-02-03 15:26:50 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 15:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 15:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8181-20260203-152651\n2026-02-03 15:26:51 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 15:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 15:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8182-20260203-152651\n2026-02-03 15:26:51 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 15:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 15:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8183-20260203-152652\n2026-02-03 15:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 15:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 15:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8184-20260203-152652\n2026-02-03 15:26:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 15:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 15:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8185-20260203-152653\n2026-02-03 15:26:53 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 15:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 15:26:53 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8186-20260203-152653\n2026-02-03 15:26:53 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 15:26:53 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:55 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 15:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8187-20260203-152655\n2026-02-03 15:26:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 15:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 15:26:56 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8188-20260203-152656\n2026-02-03 15:26:56 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 15:26:56 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:26:56 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-03 15:26:56 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8189-20260203-152656\n2026-02-03 15:26:56 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 15:26:56 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:27:21 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10018, 'inserted': 1, 'updated': 0, 'skipped': 10017, 'errors': 0}\n2026-02-03 15:27:21 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8190-20260203-152721\n2026-02-03 15:27:21 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 15:27:21 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:27:29 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 15:27:29 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8191-20260203-152729\n2026-02-03 15:27:29 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 15:27:29 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:27:57 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 15:27:57 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8192-20260203-152757\n2026-02-03 15:27:57 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 15:27:57 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:27:58 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 8, 'updated': 0, 'skipped': 66, 'errors': 0}\n2026-02-03 15:27:58 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8193-20260203-152758\n2026-02-03 15:27:58 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 15:27:58 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:27:58 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 15:27:58 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8194-20260203-152758\n2026-02-03 15:27:58 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 15:27:58 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:28:01 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-03 15:28:01 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8195-20260203-152801\n2026-02-03 15:28:01 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 15:28:01 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:28:02 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 15:28:02 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8196-20260203-152802\n2026-02-03 15:28:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 15:28:02 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:28:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 15:28:04 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8197-20260203-152804\n2026-02-03 15:28:04 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 15:28:04 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:28:46 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17569, 'inserted': 5, 'updated': 0, 'skipped': 17564, 'errors': 0}\n2026-02-03 15:28:46 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8198-20260203-152846\n2026-02-03 15:28:46 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 15:28:46 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:28:46 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 5, 'inserted': 4, 'updated': 0, 'skipped': 1, 'errors': 0}\n2026-02-03 15:28:46 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8199-20260203-152846\n2026-02-03 15:28:46 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 15:28:46 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:29:28 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8116, 'inserted': 2, 'updated': 0, 'skipped': 8114, 'errors': 0}\n2026-02-03 15:29:29 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8200-20260203-152929\n2026-02-03 15:29:29 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 15:29:29 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:29:56 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11782, 'inserted': 2, 'updated': 0, 'skipped': 11780, 'errors': 0}\n2026-02-03 15:29:56 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8201-20260203-152956\n2026-02-03 15:29:56 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 15:29:56 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:29:56 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 5, 'inserted': 2, 'updated': 0, 'skipped': 3, 'errors': 0}\n2026-02-03 15:29:57 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8202-20260203-152957\n2026-02-03 15:29:57 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 15:29:57 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:30:00 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 15:30:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8203-20260203-153000\n2026-02-03 15:30:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 15:30:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8203-20260203-153000\n2026-02-03 15:30:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 11:26:49+08:00 ~ 2026-02-03 17:26:49+08:00]\n2026-02-03 15:30:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.42s\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.45s\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.20s\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.19s\n2026-02-03 15:30:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.19s\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.24s\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-03 15:30:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 15:30:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.33s\n2026-02-03 15:30:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 15:30:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.59s\n2026-02-03 15:30:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 15:30:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.18s\n2026-02-03 15:30:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.21s\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.23s\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.23s\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.18s\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-03 15:30:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.27s\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.27s\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-03 15:30:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.23s\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.19s\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.19s\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.19s\n2026-02-03 15:30:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.25s\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.19s\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.19s\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.19s\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.18s\n2026-02-03 15:30:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.18s\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.27s\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.19s\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.20s\n2026-02-03 15:30:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.18s\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.18s\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.23s\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.17s\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.17s\n2026-02-03 15:30:09 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 8, 'skipped': 66}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 8, 'skipped': 66}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 15:30:09 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 15:30:09 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "a0245b61", "executed_at": "2026-02-03T14:26:49.404241", "status": "success", "exit_code": 0, "duration_seconds": 306.454686, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 3条, 事实表新增: 3条, 事实表更新: 0条\n 维表: dim_table: +0, ~3\n 事实表: dwd_platform_coupon_redemption: +3, ~0\n【错误】2026-02-03 14:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 14:26:52 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 14:26:54 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 12:26:49 --window-end 2026-02-03 14:26:49\n2026-02-03 14:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 14:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 14:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 14:26:50 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=1480cc6d221746d98eed1ec3b0f88a8b\n2026-02-03 14:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8156-20260203-142650\n2026-02-03 14:26:50 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 14:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 14:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8157-20260203-142651\n2026-02-03 14:26:51 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 14:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:26:52 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 14:26:53 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8158-20260203-142652\n2026-02-03 14:26:53 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 14:26:53 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:26:54 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 14:26:54 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8159-20260203-142654\n2026-02-03 14:26:54 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:26:55 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 14:26:55 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 14:26:55 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8160-20260203-142655\n2026-02-03 14:26:55 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 14:26:55 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:26:56 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 14:26:56 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8161-20260203-142656\n2026-02-03 14:26:56 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 14:26:56 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:26:56 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 14:26:57 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8162-20260203-142657\n2026-02-03 14:26:57 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 14:26:57 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:27:00 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 14:27:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8163-20260203-142701\n2026-02-03 14:27:01 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 14:27:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:27:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 14:27:01 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8164-20260203-142701\n2026-02-03 14:27:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 14:27:01 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:27:02 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 14:27:03 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8165-20260203-142703\n2026-02-03 14:27:03 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 14:27:03 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:27:42 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10016, 'inserted': 0, 'updated': 0, 'skipped': 10016, 'errors': 0}\n2026-02-03 14:27:43 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8166-20260203-142743\n2026-02-03 14:27:43 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 14:27:43 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:27:53 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 14:27:54 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8167-20260203-142754\n2026-02-03 14:27:54 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 14:27:54 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:28:23 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 14:28:23 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8168-20260203-142823\n2026-02-03 14:28:23 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 14:28:23 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:28:24 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 4, 'updated': 0, 'skipped': 70, 'errors': 0}\n2026-02-03 14:28:24 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8169-20260203-142824\n2026-02-03 14:28:24 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 14:28:24 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:28:24 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 14:28:25 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8170-20260203-142825\n2026-02-03 14:28:25 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 14:28:25 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:28:28 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 14:28:28 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8171-20260203-142828\n2026-02-03 14:28:28 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 14:28:28 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:28:29 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 14:28:29 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8172-20260203-142829\n2026-02-03 14:28:29 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 14:28:29 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:28:31 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 14:28:31 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8173-20260203-142831\n2026-02-03 14:28:31 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 14:28:31 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:29:40 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17564, 'inserted': 3, 'updated': 0, 'skipped': 17561, 'errors': 0}\n2026-02-03 14:29:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8174-20260203-142940\n2026-02-03 14:29:40 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 14:29:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:29:41 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 1, 'inserted': 0, 'updated': 0, 'skipped': 1, 'errors': 0}\n2026-02-03 14:29:41 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8175-20260203-142941\n2026-02-03 14:29:41 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 14:29:41 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:30:35 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8114, 'inserted': 0, 'updated': 0, 'skipped': 8114, 'errors': 0}\n2026-02-03 14:30:35 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8176-20260203-143035\n2026-02-03 14:30:35 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 14:30:35 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:31:18 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11780, 'inserted': 0, 'updated': 0, 'skipped': 11780, 'errors': 0}\n2026-02-03 14:31:19 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8177-20260203-143119\n2026-02-03 14:31:19 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 14:31:19 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:31:20 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 3, 'inserted': 0, 'updated': 0, 'skipped': 3, 'errors': 0}\n2026-02-03 14:31:20 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8178-20260203-143120\n2026-02-03 14:31:20 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 14:31:20 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:31:32 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 14:31:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8179-20260203-143132\n2026-02-03 14:31:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 14:31:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8179-20260203-143132\n2026-02-03 14:31:32 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 10:26:49+08:00 ~ 2026-02-03 16:26:49+08:00]\n2026-02-03 14:31:32 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 14:31:32 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.45s\n2026-02-03 14:31:32 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 14:31:33 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.48s\n2026-02-03 14:31:33 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 14:31:33 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.24s\n2026-02-03 14:31:33 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 14:31:33 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.26s\n2026-02-03 14:31:33 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.19s\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.20s\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.28s\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.22s\n2026-02-03 14:31:34 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 14:31:35 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.43s\n2026-02-03 14:31:35 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 14:31:36 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 1.06s\n2026-02-03 14:31:36 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 14:31:36 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.51s\n2026-02-03 14:31:36 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 14:31:36 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.27s\n2026-02-03 14:31:36 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 14:31:37 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 1.00s\n2026-02-03 14:31:37 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 14:31:38 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.34s\n2026-02-03 14:31:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 14:31:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.98s\n2026-02-03 14:31:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 14:31:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.23s\n2026-02-03 14:31:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 14:31:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.51s\n2026-02-03 14:31:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 14:31:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.71s\n2026-02-03 14:31:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 14:31:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 1.36s\n2026-02-03 14:31:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 14:31:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.62s\n2026-02-03 14:31:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 14:31:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.64s\n2026-02-03 14:31:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 14:31:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.60s\n2026-02-03 14:31:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 14:31:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.49s\n2026-02-03 14:31:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 14:31:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.59s\n2026-02-03 14:31:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 14:31:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.80s\n2026-02-03 14:31:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 14:31:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.36s\n2026-02-03 14:31:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 14:31:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.89s\n2026-02-03 14:31:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 14:31:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.28s\n2026-02-03 14:31:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 14:31:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.59s\n2026-02-03 14:31:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 14:31:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.37s\n2026-02-03 14:31:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 14:31:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.66s\n2026-02-03 14:31:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 14:31:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 1.42s\n2026-02-03 14:31:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 14:31:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.45s\n2026-02-03 14:31:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 14:31:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.98s\n2026-02-03 14:31:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 14:31:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.34s\n2026-02-03 14:31:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 14:31:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.31s\n2026-02-03 14:31:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 14:31:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.69s\n2026-02-03 14:31:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 14:31:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 1.48s\n2026-02-03 14:31:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 14:31:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.29s\n2026-02-03 14:31:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 14:31:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.39s\n2026-02-03 14:31:55 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 3, 'skipped': 71}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 3, 'skipped': 71}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 14:31:55 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 14:31:55 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "f44a3e9d", "executed_at": "2026-02-03T13:26:49.269103", "status": "success", "exit_code": 0, "duration_seconds": 188.737971, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 4条, 事实表新增: 11条, 事实表更新: 0条\n 维表: dim_table: +0, ~3, dim_store_goods: +0, ~1\n 事实表: dwd_settlement_head: +3, ~0, dwd_table_fee_log: +2, ~0, dwd_groupbuy_redemption: +3, ~0, dwd_payment: +3, ~0\n【错误】2026-02-03 13:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 13:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 13:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 11:26:49 --window-end 2026-02-03 13:26:49\n2026-02-03 13:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 13:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 13:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 13:26:49 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=f5e361059d8546dd987f07cb28fd4190\n2026-02-03 13:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8132-20260203-132650\n2026-02-03 13:26:50 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 13:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 13:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8133-20260203-132650\n2026-02-03 13:26:50 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 13:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:51 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 13:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8134-20260203-132651\n2026-02-03 13:26:51 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 13:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:52 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 13:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8135-20260203-132652\n2026-02-03 13:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 13:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 13:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8136-20260203-132652\n2026-02-03 13:26:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 13:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:53 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 13:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8137-20260203-132653\n2026-02-03 13:26:53 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 13:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 13:26:53 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8138-20260203-132653\n2026-02-03 13:26:53 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 13:26:53 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:55 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 13:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8139-20260203-132656\n2026-02-03 13:26:56 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 13:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:56 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 13:26:56 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8140-20260203-132656\n2026-02-03 13:26:56 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 13:26:56 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:26:57 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 1, 'updated': 0, 'skipped': 171, 'errors': 0}\n2026-02-03 13:26:57 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8141-20260203-132657\n2026-02-03 13:26:57 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 13:26:57 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:19 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10016, 'inserted': 2, 'updated': 0, 'skipped': 10014, 'errors': 0}\n2026-02-03 13:27:19 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8142-20260203-132719\n2026-02-03 13:27:19 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 13:27:19 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:26 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 13:27:26 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8143-20260203-132726\n2026-02-03 13:27:26 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 13:27:26 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:53 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 13:27:53 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8144-20260203-132753\n2026-02-03 13:27:53 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 13:27:53 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:54 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 3, 'updated': 0, 'skipped': 71, 'errors': 0}\n2026-02-03 13:27:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8145-20260203-132754\n2026-02-03 13:27:54 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 13:27:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 13:27:54 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8146-20260203-132754\n2026-02-03 13:27:54 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 13:27:54 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:56 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 1, 'updated': 0, 'skipped': 171, 'errors': 0}\n2026-02-03 13:27:57 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8147-20260203-132757\n2026-02-03 13:27:57 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 13:27:57 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:57 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 13:27:57 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8148-20260203-132757\n2026-02-03 13:27:57 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 13:27:57 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:27:58 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 13:27:59 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8149-20260203-132759\n2026-02-03 13:27:59 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 13:27:59 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:28:40 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17561, 'inserted': 0, 'updated': 0, 'skipped': 17561, 'errors': 0}\n2026-02-03 13:28:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8150-20260203-132840\n2026-02-03 13:28:40 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 13:28:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:28:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 13:28:41 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8151-20260203-132841\n2026-02-03 13:28:41 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 13:28:41 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:29:20 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8114, 'inserted': 3, 'updated': 0, 'skipped': 8111, 'errors': 0}\n2026-02-03 13:29:20 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8152-20260203-132920\n2026-02-03 13:29:20 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 13:29:20 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:29:44 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11780, 'inserted': 3, 'updated': 0, 'skipped': 11777, 'errors': 0}\n2026-02-03 13:29:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8153-20260203-132945\n2026-02-03 13:29:45 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 13:29:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:29:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 3, 'inserted': 3, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 13:29:45 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8154-20260203-132945\n2026-02-03 13:29:45 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 13:29:45 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:29:48 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 13:29:48 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8155-20260203-132948\n2026-02-03 13:29:48 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 13:29:48 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8155-20260203-132948\n2026-02-03 13:29:48 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 09:26:49+08:00 ~ 2026-02-03 15:26:49+08:00]\n2026-02-03 13:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 13:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.38s\n2026-02-03 13:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.48s\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.21s\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.20s\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.16s\n2026-02-03 13:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.18s\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.25s\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.41s\n2026-02-03 13:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 13:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.62s\n2026-02-03 13:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 13:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.18s\n2026-02-03 13:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 13:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.20s\n2026-02-03 13:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.24s\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.24s\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-03 13:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.27s\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.21s\n2026-02-03 13:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.18s\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.19s\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.21s\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-03 13:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.21s\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.19s\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.21s\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.18s\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.18s\n2026-02-03 13:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.23s\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.19s\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.18s\n2026-02-03 13:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.24s\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.25s\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.22s\n2026-02-03 13:29:57 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 3, 'skipped': 71}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 3, 'skipped': 71}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 1, 'skipped': 171}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 1, 'skipped': 171}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 13:29:57 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 13:29:57 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "fce387f3", "executed_at": "2026-02-03T12:26:49.192367", "status": "success", "exit_code": 0, "duration_seconds": 180.537483, "summary": "【错误】2026-02-03 12:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 12:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 12:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 10:26:49 --window-end 2026-02-03 12:26:49\n2026-02-03 12:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 12:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 12:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 12:26:49 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=b2b5c7f9c11d49a4a46ca59f9129fdcf\n2026-02-03 12:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8108-20260203-122650\n2026-02-03 12:26:50 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 12:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 12:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8109-20260203-122650\n2026-02-03 12:26:50 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 12:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 12:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8110-20260203-122651\n2026-02-03 12:26:51 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 12:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 12:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8111-20260203-122651\n2026-02-03 12:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 12:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 12:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8112-20260203-122652\n2026-02-03 12:26:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 12:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 12:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8113-20260203-122653\n2026-02-03 12:26:53 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 12:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 12:26:53 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8114-20260203-122653\n2026-02-03 12:26:53 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 12:26:53 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:55 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 12:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8115-20260203-122655\n2026-02-03 12:26:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 12:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 12:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8116-20260203-122655\n2026-02-03 12:26:55 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 12:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:26:56 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 12:26:56 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8117-20260203-122656\n2026-02-03 12:26:56 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 12:26:56 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:18 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10014, 'inserted': 0, 'updated': 0, 'skipped': 10014, 'errors': 0}\n2026-02-03 12:27:18 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8118-20260203-122718\n2026-02-03 12:27:18 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 12:27:18 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 12:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8119-20260203-122725\n2026-02-03 12:27:25 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 12:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:52 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 12:27:52 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8120-20260203-122752\n2026-02-03 12:27:52 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 12:27:52 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:53 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 1, 'updated': 0, 'skipped': 73, 'errors': 0}\n2026-02-03 12:27:53 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8121-20260203-122753\n2026-02-03 12:27:53 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 12:27:53 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:53 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 12:27:53 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8122-20260203-122753\n2026-02-03 12:27:53 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 12:27:53 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:54 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 12:27:54 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8123-20260203-122754\n2026-02-03 12:27:54 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 12:27:54 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:54 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 12:27:54 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8124-20260203-122754\n2026-02-03 12:27:54 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 12:27:54 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:27:56 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 12:27:56 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8125-20260203-122756\n2026-02-03 12:27:56 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 12:27:56 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:28:35 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17561, 'inserted': 0, 'updated': 0, 'skipped': 17561, 'errors': 0}\n2026-02-03 12:28:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8126-20260203-122836\n2026-02-03 12:28:36 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 12:28:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:28:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 12:28:36 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8127-20260203-122836\n2026-02-03 12:28:36 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 12:28:36 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:29:13 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8111, 'inserted': 0, 'updated': 0, 'skipped': 8111, 'errors': 0}\n2026-02-03 12:29:13 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8128-20260203-122913\n2026-02-03 12:29:13 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 12:29:13 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:29:37 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11777, 'inserted': 0, 'updated': 0, 'skipped': 11777, 'errors': 0}\n2026-02-03 12:29:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8129-20260203-122937\n2026-02-03 12:29:37 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 12:29:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:29:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 12:29:37 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8130-20260203-122937\n2026-02-03 12:29:37 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 12:29:37 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:29:40 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 12:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8131-20260203-122940\n2026-02-03 12:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 12:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8131-20260203-122940\n2026-02-03 12:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 08:26:49+08:00 ~ 2026-02-03 14:26:49+08:00]\n2026-02-03 12:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 12:29:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.39s\n2026-02-03 12:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.48s\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.19s\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.20s\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.16s\n2026-02-03 12:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.17s\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.22s\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.20s\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.33s\n2026-02-03 12:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.64s\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.17s\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.18s\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.18s\n2026-02-03 12:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.19s\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.20s\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.16s\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.16s\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.28s\n2026-02-03 12:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.24s\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.19s\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.18s\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.17s\n2026-02-03 12:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.18s\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.18s\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.18s\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.17s\n2026-02-03 12:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.17s\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.19s\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.18s\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.25s\n2026-02-03 12:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 12:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.24s\n2026-02-03 12:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 12:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.49s\n2026-02-03 12:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 12:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.19s\n2026-02-03 12:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.20s\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.21s\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.17s\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.19s\n2026-02-03 12:29:49 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 12:29:49 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 12:29:49 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "b97e838a", "executed_at": "2026-02-03T11:26:49.120246", "status": "success", "exit_code": 0, "duration_seconds": 185.84853, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 1条, 事实表新增: 2条, 事实表更新: 0条\n 维表: dim_table: +0, ~1\n 事实表: dwd_platform_coupon_redemption: +2, ~0\n【错误】2026-02-03 11:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 11:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 11:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 09:26:49 --window-end 2026-02-03 11:26:49\n2026-02-03 11:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 11:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 11:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 11:26:49 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=ac0413975e2843eebf968075ec9903f4\n2026-02-03 11:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8084-20260203-112649\n2026-02-03 11:26:49 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 11:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 11:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8085-20260203-112650\n2026-02-03 11:26:50 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 11:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 11:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8086-20260203-112650\n2026-02-03 11:26:50 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 11:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 11:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8087-20260203-112651\n2026-02-03 11:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 11:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 11:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8088-20260203-112652\n2026-02-03 11:26:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 11:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 11:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8089-20260203-112652\n2026-02-03 11:26:52 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 11:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 11:26:53 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8090-20260203-112653\n2026-02-03 11:26:53 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 11:26:53 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:54 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 11:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8091-20260203-112655\n2026-02-03 11:26:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 11:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 11:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8092-20260203-112655\n2026-02-03 11:26:55 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 11:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:26:55 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 11:26:56 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8093-20260203-112656\n2026-02-03 11:26:56 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 11:26:56 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:17 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10014, 'inserted': 0, 'updated': 0, 'skipped': 10014, 'errors': 0}\n2026-02-03 11:27:17 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8094-20260203-112717\n2026-02-03 11:27:17 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 11:27:17 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 11:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8095-20260203-112725\n2026-02-03 11:27:25 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 11:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:53 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 11:27:53 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8096-20260203-112753\n2026-02-03 11:27:53 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 11:27:53 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:53 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 1, 'updated': 0, 'skipped': 73, 'errors': 0}\n2026-02-03 11:27:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8097-20260203-112754\n2026-02-03 11:27:54 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 11:27:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 11:27:54 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8098-20260203-112754\n2026-02-03 11:27:54 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 11:27:54 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:55 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 11:27:55 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8099-20260203-112755\n2026-02-03 11:27:55 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 11:27:55 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:55 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 11:27:55 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8100-20260203-112755\n2026-02-03 11:27:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 11:27:55 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:27:57 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 11:27:57 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8101-20260203-112757\n2026-02-03 11:27:57 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 11:27:57 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:28:38 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17561, 'inserted': 2, 'updated': 0, 'skipped': 17559, 'errors': 0}\n2026-02-03 11:28:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8102-20260203-112838\n2026-02-03 11:28:38 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 11:28:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:28:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 11:28:38 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8103-20260203-112838\n2026-02-03 11:28:38 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 11:28:38 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:29:17 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8111, 'inserted': 0, 'updated': 0, 'skipped': 8111, 'errors': 0}\n2026-02-03 11:29:17 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8104-20260203-112917\n2026-02-03 11:29:17 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 11:29:17 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:29:41 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11777, 'inserted': 0, 'updated': 0, 'skipped': 11777, 'errors': 0}\n2026-02-03 11:29:41 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8105-20260203-112941\n2026-02-03 11:29:41 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 11:29:41 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:29:41 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 11:29:42 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8106-20260203-112942\n2026-02-03 11:29:42 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 11:29:42 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:29:44 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 11:29:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8107-20260203-112945\n2026-02-03 11:29:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 11:29:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8107-20260203-112945\n2026-02-03 11:29:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 07:26:49+08:00 ~ 2026-02-03 13:26:49+08:00]\n2026-02-03 11:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 11:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.51s\n2026-02-03 11:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 11:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.46s\n2026-02-03 11:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 11:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.21s\n2026-02-03 11:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 11:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.20s\n2026-02-03 11:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.19s\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.17s\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.23s\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.20s\n2026-02-03 11:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.38s\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.61s\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.18s\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.18s\n2026-02-03 11:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.19s\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.24s\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.16s\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.16s\n2026-02-03 11:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.26s\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.21s\n2026-02-03 11:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.18s\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.20s\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-03 11:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.19s\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.18s\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.18s\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.19s\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.17s\n2026-02-03 11:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.26s\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.24s\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.19s\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.19s\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.24s\n2026-02-03 11:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.25s\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.23s\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.19s\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.25s\n2026-02-03 11:29:54 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 11:29:54 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 11:29:54 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "feed33b6", "executed_at": "2026-02-03T10:26:49.023312", "status": "success", "exit_code": 0, "duration_seconds": 182.126621, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 1条, 事实表新增: 1条, 事实表更新: 0条\n 维表: dim_table: +0, ~1\n 事实表: dwd_platform_coupon_redemption: +1, ~0\n【错误】2026-02-03 10:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 10:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 10:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 08:26:49 --window-end 2026-02-03 10:26:49\n2026-02-03 10:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 10:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 10:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 10:26:49 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=8f61e130cb8d440e9e7dfb48e761a717\n2026-02-03 10:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8060-20260203-102649\n2026-02-03 10:26:49 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 10:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 10:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8061-20260203-102650\n2026-02-03 10:26:50 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 10:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 10:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8062-20260203-102650\n2026-02-03 10:26:50 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 10:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 10:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8063-20260203-102651\n2026-02-03 10:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00] 未发现需要抓取的小票\n2026-02-03 10:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 10:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8064-20260203-102652\n2026-02-03 10:26:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 10:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 10:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8065-20260203-102653\n2026-02-03 10:26:53 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 10:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 10:26:53 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8066-20260203-102653\n2026-02-03 10:26:53 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 10:26:53 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:55 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 10:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8067-20260203-102655\n2026-02-03 10:26:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 10:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 3, 'inserted': 0, 'updated': 0, 'skipped': 3, 'errors': 0}\n2026-02-03 10:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8068-20260203-102655\n2026-02-03 10:26:55 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 10:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:26:56 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 10:26:56 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8069-20260203-102656\n2026-02-03 10:26:56 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 10:26:56 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:17 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10014, 'inserted': 0, 'updated': 0, 'skipped': 10014, 'errors': 0}\n2026-02-03 10:27:17 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8070-20260203-102717\n2026-02-03 10:27:17 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 10:27:17 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 10:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8071-20260203-102725\n2026-02-03 10:27:25 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 10:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:51 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 10:27:52 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8072-20260203-102752\n2026-02-03 10:27:52 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 10:27:52 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:52 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 1, 'updated': 0, 'skipped': 73, 'errors': 0}\n2026-02-03 10:27:52 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8073-20260203-102752\n2026-02-03 10:27:52 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 10:27:52 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:52 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 10:27:53 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8074-20260203-102753\n2026-02-03 10:27:53 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 10:27:53 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:53 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 10:27:53 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8075-20260203-102753\n2026-02-03 10:27:53 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 10:27:53 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:54 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 10:27:54 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8076-20260203-102754\n2026-02-03 10:27:54 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 10:27:54 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:27:55 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 10:27:55 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8077-20260203-102755\n2026-02-03 10:27:55 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 10:27:55 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:28:36 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17559, 'inserted': 1, 'updated': 0, 'skipped': 17558, 'errors': 0}\n2026-02-03 10:28:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8078-20260203-102836\n2026-02-03 10:28:36 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 10:28:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:28:37 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 10:28:37 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8079-20260203-102837\n2026-02-03 10:28:37 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 10:28:37 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:29:13 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8111, 'inserted': 0, 'updated': 0, 'skipped': 8111, 'errors': 0}\n2026-02-03 10:29:13 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8080-20260203-102913\n2026-02-03 10:29:13 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 10:29:13 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:29:37 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11777, 'inserted': 0, 'updated': 0, 'skipped': 11777, 'errors': 0}\n2026-02-03 10:29:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8081-20260203-102937\n2026-02-03 10:29:37 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 10:29:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:29:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 1, 'inserted': 0, 'updated': 0, 'skipped': 1, 'errors': 0}\n2026-02-03 10:29:37 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8082-20260203-102937\n2026-02-03 10:29:37 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 10:29:37 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:29:40 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 10:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8083-20260203-102940\n2026-02-03 10:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 10:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8083-20260203-102940\n2026-02-03 10:29:40 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 06:26:49+08:00 ~ 2026-02-03 12:26:49+08:00]\n2026-02-03 10:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 10:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.38s\n2026-02-03 10:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 10:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.52s\n2026-02-03 10:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 10:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.22s\n2026-02-03 10:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.20s\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.19s\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.23s\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.22s\n2026-02-03 10:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 10:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.41s\n2026-02-03 10:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 10:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.62s\n2026-02-03 10:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 10:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.19s\n2026-02-03 10:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 10:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.22s\n2026-02-03 10:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 10:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.42s\n2026-02-03 10:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 10:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.70s\n2026-02-03 10:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 10:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.32s\n2026-02-03 10:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 10:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-03 10:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.26s\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.22s\n2026-02-03 10:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.22s\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.20s\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.21s\n2026-02-03 10:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.25s\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.20s\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.19s\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.18s\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.20s\n2026-02-03 10:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.18s\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.23s\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.24s\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-03 10:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.23s\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.23s\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.24s\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-03 10:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 10:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.18s\n2026-02-03 10:29:51 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 10:29:51 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 10:29:51 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "59850fcc", "executed_at": "2026-02-03T09:26:48.960752", "status": "success", "exit_code": 0, "duration_seconds": 179.520466, "summary": "【错误】2026-02-03 09:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 09:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 09:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 07:26:48 --window-end 2026-02-03 09:26:48\n2026-02-03 09:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 09:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 09:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 09:26:49 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=44852a60f7da486bb6106866008a2506\n2026-02-03 09:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8036-20260203-092649\n2026-02-03 09:26:49 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 09:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 09:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8037-20260203-092650\n2026-02-03 09:26:50 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 09:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 09:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8038-20260203-092650\n2026-02-03 09:26:50 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 09:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 09:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8039-20260203-092651\n2026-02-03 09:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00] 未发现需要抓取的小票\n2026-02-03 09:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 09:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8040-20260203-092652\n2026-02-03 09:26:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 09:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 09:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8041-20260203-092652\n2026-02-03 09:26:52 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 09:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 09:26:53 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8042-20260203-092653\n2026-02-03 09:26:53 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 09:26:53 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:54 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 09:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8043-20260203-092655\n2026-02-03 09:26:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 09:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 4, 'inserted': 0, 'updated': 0, 'skipped': 4, 'errors': 0}\n2026-02-03 09:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8044-20260203-092655\n2026-02-03 09:26:55 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 09:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:26:55 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 09:26:56 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8045-20260203-092656\n2026-02-03 09:26:56 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 09:26:56 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:18 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10014, 'inserted': 0, 'updated': 0, 'skipped': 10014, 'errors': 0}\n2026-02-03 09:27:19 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8046-20260203-092719\n2026-02-03 09:27:19 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 09:27:19 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:26 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 09:27:26 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8047-20260203-092726\n2026-02-03 09:27:26 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 09:27:26 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:52 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 09:27:52 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8048-20260203-092752\n2026-02-03 09:27:52 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 09:27:52 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:53 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-03 09:27:53 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8049-20260203-092753\n2026-02-03 09:27:53 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 09:27:53 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:53 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 09:27:53 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8050-20260203-092753\n2026-02-03 09:27:53 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 09:27:53 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:54 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 09:27:54 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8051-20260203-092754\n2026-02-03 09:27:54 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 09:27:54 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:54 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 09:27:55 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8052-20260203-092755\n2026-02-03 09:27:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 09:27:55 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:27:55 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 09:27:56 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8053-20260203-092756\n2026-02-03 09:27:56 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 09:27:56 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:28:36 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17558, 'inserted': 0, 'updated': 0, 'skipped': 17558, 'errors': 0}\n2026-02-03 09:28:37 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8054-20260203-092837\n2026-02-03 09:28:37 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 09:28:37 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:28:37 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 1, 'inserted': 0, 'updated': 0, 'skipped': 1, 'errors': 0}\n2026-02-03 09:28:37 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8055-20260203-092837\n2026-02-03 09:28:37 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 09:28:37 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:29:13 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8111, 'inserted': 0, 'updated': 0, 'skipped': 8111, 'errors': 0}\n2026-02-03 09:29:13 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8056-20260203-092913\n2026-02-03 09:29:13 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 09:29:13 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:29:36 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11777, 'inserted': 0, 'updated': 0, 'skipped': 11777, 'errors': 0}\n2026-02-03 09:29:36 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8057-20260203-092936\n2026-02-03 09:29:36 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 09:29:36 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:29:36 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 2, 'inserted': 0, 'updated': 0, 'skipped': 2, 'errors': 0}\n2026-02-03 09:29:36 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8058-20260203-092936\n2026-02-03 09:29:36 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 09:29:36 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:29:39 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 09:29:39 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8059-20260203-092939\n2026-02-03 09:29:39 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 09:29:39 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8059-20260203-092939\n2026-02-03 09:29:39 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 05:26:48+08:00 ~ 2026-02-03 11:26:48+08:00]\n2026-02-03 09:29:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 09:29:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.37s\n2026-02-03 09:29:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.45s\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.16s\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.16s\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.18s\n2026-02-03 09:29:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 09:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.25s\n2026-02-03 09:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 09:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-03 09:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 09:29:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.36s\n2026-02-03 09:29:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.57s\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.19s\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.18s\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.19s\n2026-02-03 09:29:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.19s\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.16s\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.22s\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.16s\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.27s\n2026-02-03 09:29:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.27s\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.23s\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.22s\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-03 09:29:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.20s\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.25s\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.19s\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.18s\n2026-02-03 09:29:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.18s\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.19s\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.18s\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.24s\n2026-02-03 09:29:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.19s\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.18s\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.18s\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.22s\n2026-02-03 09:29:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 09:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-03 09:29:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 09:29:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.18s\n2026-02-03 09:29:48 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 09:29:48 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 09:29:48 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "e899db8e", "executed_at": "2026-02-03T08:26:48.917342", "status": "success", "exit_code": 0, "duration_seconds": 190.12797, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 50条, 事实表新增: 0条, 事实表更新: 0条\n 维表: dim_store_goods: +0, ~50\n【错误】2026-02-03 08:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 08:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-03 08:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 06:26:48 --window-end 2026-02-03 08:26:48\n2026-02-03 08:26:49 [INFO] etl_billiards: 配置加载完成\n2026-02-03 08:26:49 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 08:26:49 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 08:26:49 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=86095867d4614b32bf01f84b9f37e59d\n2026-02-03 08:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-8012-20260203-082649\n2026-02-03 08:26:49 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 08:26:49 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:50 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 08:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-8013-20260203-082650\n2026-02-03 08:26:50 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 08:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:50 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 08:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-8014-20260203-082650\n2026-02-03 08:26:50 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 08:26:50 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:51 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 08:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-8015-20260203-082651\n2026-02-03 08:26:51 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00] 未发现需要抓取的小票\n2026-02-03 08:26:52 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 08:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-8016-20260203-082652\n2026-02-03 08:26:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 08:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 08:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-8017-20260203-082652\n2026-02-03 08:26:52 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 08:26:52 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:53 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 08:26:53 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-8018-20260203-082653\n2026-02-03 08:26:53 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 08:26:53 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:55 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 08:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-8019-20260203-082655\n2026-02-03 08:26:55 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 08:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:55 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 4, 'inserted': 0, 'updated': 0, 'skipped': 4, 'errors': 0}\n2026-02-03 08:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-8020-20260203-082655\n2026-02-03 08:26:55 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 08:26:55 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:26:56 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 57, 'updated': 0, 'skipped': 115, 'errors': 0}\n2026-02-03 08:26:56 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-8021-20260203-082656\n2026-02-03 08:26:56 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 08:26:56 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:17 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10014, 'inserted': 0, 'updated': 0, 'skipped': 10014, 'errors': 0}\n2026-02-03 08:27:17 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-8022-20260203-082717\n2026-02-03 08:27:17 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 08:27:17 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1779, 'inserted': 0, 'updated': 0, 'skipped': 1779, 'errors': 0}\n2026-02-03 08:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-8023-20260203-082725\n2026-02-03 08:27:25 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 08:27:25 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:55 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2447, 'inserted': 0, 'updated': 0, 'skipped': 2447, 'errors': 0}\n2026-02-03 08:27:55 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8024-20260203-082755\n2026-02-03 08:27:55 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 08:27:55 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:56 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-03 08:27:56 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8025-20260203-082756\n2026-02-03 08:27:56 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 08:27:56 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:56 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 08:27:56 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8026-20260203-082756\n2026-02-03 08:27:56 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 08:27:56 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:57 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 08:27:57 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8027-20260203-082757\n2026-02-03 08:27:57 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 08:27:57 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:58 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 39, 'inserted': 0, 'updated': 0, 'skipped': 39, 'errors': 0}\n2026-02-03 08:27:58 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8028-20260203-082758\n2026-02-03 08:27:58 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 08:27:58 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:27:59 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 08:27:59 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8029-20260203-082759\n2026-02-03 08:27:59 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 08:27:59 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:28:38 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17558, 'inserted': 0, 'updated': 0, 'skipped': 17558, 'errors': 0}\n2026-02-03 08:28:39 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8030-20260203-082839\n2026-02-03 08:28:39 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 08:28:39 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:28:39 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 2, 'inserted': 0, 'updated': 0, 'skipped': 2, 'errors': 0}\n2026-02-03 08:28:39 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8031-20260203-082839\n2026-02-03 08:28:39 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 08:28:39 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:29:19 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8111, 'inserted': 0, 'updated': 0, 'skipped': 8111, 'errors': 0}\n2026-02-03 08:29:19 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8032-20260203-082919\n2026-02-03 08:29:19 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 08:29:19 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:29:45 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11777, 'inserted': 0, 'updated': 0, 'skipped': 11777, 'errors': 0}\n2026-02-03 08:29:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8033-20260203-082945\n2026-02-03 08:29:45 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 08:29:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:29:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 2, 'inserted': 0, 'updated': 0, 'skipped': 2, 'errors': 0}\n2026-02-03 08:29:45 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8034-20260203-082945\n2026-02-03 08:29:45 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 08:29:45 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:29:49 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 08:29:49 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8035-20260203-082949\n2026-02-03 08:29:49 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 08:29:49 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8035-20260203-082949\n2026-02-03 08:29:49 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 04:26:48+08:00 ~ 2026-02-03 10:26:48+08:00]\n2026-02-03 08:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 08:29:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.44s\n2026-02-03 08:29:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.51s\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.16s\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.16s\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.18s\n2026-02-03 08:29:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 08:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.27s\n2026-02-03 08:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 08:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.24s\n2026-02-03 08:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 08:29:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.39s\n2026-02-03 08:29:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 08:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.71s\n2026-02-03 08:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 08:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.18s\n2026-02-03 08:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 08:29:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-03 08:29:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.27s\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.33s\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.16s\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.19s\n2026-02-03 08:29:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.20s\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.25s\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.27s\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.20s\n2026-02-03 08:29:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.18s\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.22s\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.20s\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-03 08:29:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.19s\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.18s\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.19s\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.21s\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.18s\n2026-02-03 08:29:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.25s\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.19s\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.20s\n2026-02-03 08:29:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.31s\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.22s\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.17s\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.18s\n2026-02-03 08:29:58 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 50, 'skipped': 122}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 43, 'skipped': 129}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 08:29:59 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 08:29:59 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "8457c6e6", "executed_at": "2026-02-03T07:25:51.667995", "status": "success", "exit_code": 0, "duration_seconds": 203.449928, "summary": "【错误】2026-02-03 07:32:05 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 07:32:06 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1; 2026-02-03 07:32:07 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 05:25:51 --window-end 2026-02-03 07:25:51\n2026-02-03 07:32:04 [INFO] etl_billiards: 配置加载完成\n2026-02-03 07:32:04 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 07:32:04 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 07:32:05 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=c79020f652284c4c81822b0f26f199b9\n2026-02-03 07:32:05 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7988-20260203-073205\n2026-02-03 07:32:05 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 07:32:05 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:05 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 07:32:06 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7989-20260203-073206\n2026-02-03 07:32:06 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 07:32:06 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:06 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 07:32:06 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7990-20260203-073206\n2026-02-03 07:32:06 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 07:32:06 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:07 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 07:32:07 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7991-20260203-073207\n2026-02-03 07:32:07 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:07 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00] 未发现需要抓取的小票\n2026-02-03 07:32:07 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 07:32:08 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7992-20260203-073208\n2026-02-03 07:32:08 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 07:32:08 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:08 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 07:32:08 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7993-20260203-073208\n2026-02-03 07:32:08 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 07:32:08 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:08 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 07:32:09 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7994-20260203-073209\n2026-02-03 07:32:09 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 07:32:09 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:11 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 07:32:11 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7995-20260203-073211\n2026-02-03 07:32:11 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 07:32:11 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:11 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 7, 'inserted': 0, 'updated': 0, 'skipped': 7, 'errors': 0}\n2026-02-03 07:32:12 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7996-20260203-073212\n2026-02-03 07:32:12 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 07:32:12 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:14 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 07:32:14 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7997-20260203-073214\n2026-02-03 07:32:14 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 07:32:14 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:38 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10129, 'inserted': 0, 'updated': 0, 'skipped': 10129, 'errors': 0}\n2026-02-03 07:32:38 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7998-20260203-073238\n2026-02-03 07:32:38 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 07:32:38 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:32:46 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1794, 'inserted': 0, 'updated': 0, 'skipped': 1794, 'errors': 0}\n2026-02-03 07:32:46 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7999-20260203-073246\n2026-02-03 07:32:46 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 07:32:46 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:33:12 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2471, 'inserted': 0, 'updated': 0, 'skipped': 2471, 'errors': 0}\n2026-02-03 07:33:13 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-8000-20260203-073313\n2026-02-03 07:33:13 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 07:33:13 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:33:14 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-03 07:33:15 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-8001-20260203-073315\n2026-02-03 07:33:15 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 07:33:15 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:33:16 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 07:33:17 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-8002-20260203-073317\n2026-02-03 07:33:17 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 07:33:17 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:33:18 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 07:33:19 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-8003-20260203-073319\n2026-02-03 07:33:19 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 07:33:19 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:33:20 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-03 07:33:20 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-8004-20260203-073320\n2026-02-03 07:33:20 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 07:33:20 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:33:22 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 07:33:22 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-8005-20260203-073322\n2026-02-03 07:33:22 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 07:33:22 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:34:03 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17558, 'inserted': 0, 'updated': 0, 'skipped': 17558, 'errors': 0}\n2026-02-03 07:34:03 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-8006-20260203-073403\n2026-02-03 07:34:03 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 07:34:03 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:34:04 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 5, 'inserted': 0, 'updated': 0, 'skipped': 5, 'errors': 0}\n2026-02-03 07:34:04 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-8007-20260203-073404\n2026-02-03 07:34:04 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 07:34:04 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:34:44 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8204, 'inserted': 0, 'updated': 0, 'skipped': 8204, 'errors': 0}\n2026-02-03 07:34:44 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-8008-20260203-073444\n2026-02-03 07:34:44 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 07:34:44 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:35:11 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11912, 'inserted': 0, 'updated': 0, 'skipped': 11912, 'errors': 0}\n2026-02-03 07:35:13 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-8009-20260203-073513\n2026-02-03 07:35:13 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 07:35:13 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:35:13 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 4, 'inserted': 0, 'updated': 0, 'skipped': 4, 'errors': 0}\n2026-02-03 07:35:13 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-8010-20260203-073513\n2026-02-03 07:35:13 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 07:35:13 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:35:17 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 07:35:18 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8011-20260203-073518\n2026-02-03 07:35:18 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 07:35:18 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8011-20260203-073518\n2026-02-03 07:35:18 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 03:25:51+08:00 ~ 2026-02-03 09:25:51+08:00]\n2026-02-03 07:35:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 07:35:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.44s\n2026-02-03 07:35:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.48s\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.18s\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.16s\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.20s\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.23s\n2026-02-03 07:35:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 07:35:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.23s\n2026-02-03 07:35:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 07:35:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.43s\n2026-02-03 07:35:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.65s\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.21s\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.20s\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.22s\n2026-02-03 07:35:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.21s\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.16s\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.18s\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.16s\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.28s\n2026-02-03 07:35:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.27s\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.29s\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.20s\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.23s\n2026-02-03 07:35:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.21s\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.23s\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.21s\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.33s\n2026-02-03 07:35:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.20s\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.21s\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.18s\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.19s\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.19s\n2026-02-03 07:35:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.25s\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.20s\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.19s\n2026-02-03 07:35:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.27s\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.19s\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.20s\n2026-02-03 07:35:27 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 07:35:27 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 07:35:27 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "7df114bf", "executed_at": "2026-02-03T07:25:48.878438", "status": "success", "exit_code": 0, "duration_seconds": 204.842007, "summary": "【错误】2026-02-03 07:28:40 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-03 07:28:41 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1; 2026-02-03 07:28:41 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-03 05:25:48 --window-end 2026-02-03 07:25:48\n2026-02-03 07:28:39 [INFO] etl_billiards: 配置加载完成\n2026-02-03 07:28:39 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-03 07:28:39 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-03 07:28:39 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=0e514ecef7964063a979b5d3af2a43ac\n2026-02-03 07:28:40 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7964-20260203-072840\n2026-02-03 07:28:40 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-03 07:28:40 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:40 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-03 07:28:40 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7965-20260203-072840\n2026-02-03 07:28:40 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-03 07:28:40 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:41 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 07:28:41 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7966-20260203-072841\n2026-02-03 07:28:41 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-03 07:28:41 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:41 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-03 07:28:42 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7967-20260203-072842\n2026-02-03 07:28:42 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:42 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00] 未发现需要抓取的小票\n2026-02-03 07:28:42 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-03 07:28:42 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7968-20260203-072842\n2026-02-03 07:28:42 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-03 07:28:42 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:43 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-03 07:28:43 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7969-20260203-072843\n2026-02-03 07:28:43 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-03 07:28:43 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:43 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 07:28:43 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7970-20260203-072843\n2026-02-03 07:28:43 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-03 07:28:43 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:45 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-03 07:28:45 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7971-20260203-072845\n2026-02-03 07:28:45 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-03 07:28:45 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:46 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 7, 'inserted': 0, 'updated': 0, 'skipped': 7, 'errors': 0}\n2026-02-03 07:28:46 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7972-20260203-072846\n2026-02-03 07:28:46 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-03 07:28:46 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:28:46 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 07:28:47 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7973-20260203-072847\n2026-02-03 07:28:47 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-03 07:28:47 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:09 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10129, 'inserted': 0, 'updated': 0, 'skipped': 10129, 'errors': 0}\n2026-02-03 07:29:10 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7974-20260203-072910\n2026-02-03 07:29:10 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-03 07:29:10 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:17 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1794, 'inserted': 0, 'updated': 0, 'skipped': 1794, 'errors': 0}\n2026-02-03 07:29:17 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7975-20260203-072917\n2026-02-03 07:29:17 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-03 07:29:17 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:44 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2471, 'inserted': 0, 'updated': 0, 'skipped': 2471, 'errors': 0}\n2026-02-03 07:29:44 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7976-20260203-072944\n2026-02-03 07:29:44 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-03 07:29:44 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:45 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-03 07:29:45 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7977-20260203-072945\n2026-02-03 07:29:45 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-03 07:29:45 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:45 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-03 07:29:45 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7978-20260203-072945\n2026-02-03 07:29:45 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-03 07:29:45 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:46 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-03 07:29:46 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7979-20260203-072946\n2026-02-03 07:29:46 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-03 07:29:46 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:47 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-03 07:29:48 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7980-20260203-072948\n2026-02-03 07:29:48 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-03 07:29:48 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:29:49 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-03 07:29:49 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7981-20260203-072949\n2026-02-03 07:29:49 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-03 07:29:49 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:30:33 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17558, 'inserted': 0, 'updated': 0, 'skipped': 17558, 'errors': 0}\n2026-02-03 07:30:34 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7982-20260203-073034\n2026-02-03 07:30:34 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-03 07:30:34 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:30:34 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 5, 'inserted': 0, 'updated': 0, 'skipped': 5, 'errors': 0}\n2026-02-03 07:30:34 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7983-20260203-073034\n2026-02-03 07:30:34 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-03 07:30:34 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:31:17 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8204, 'inserted': 0, 'updated': 0, 'skipped': 8204, 'errors': 0}\n2026-02-03 07:31:18 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7984-20260203-073118\n2026-02-03 07:31:18 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-03 07:31:18 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:31:48 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11912, 'inserted': 0, 'updated': 0, 'skipped': 11912, 'errors': 0}\n2026-02-03 07:31:48 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7985-20260203-073148\n2026-02-03 07:31:48 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-03 07:31:48 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:31:48 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 4, 'inserted': 0, 'updated': 0, 'skipped': 4, 'errors': 0}\n2026-02-03 07:31:49 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7986-20260203-073149\n2026-02-03 07:31:49 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-03 07:31:49 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:31:51 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-03 07:31:51 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7987-20260203-073151\n2026-02-03 07:31:51 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-03 07:31:51 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7987-20260203-073151\n2026-02-03 07:31:51 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-03 03:25:48+08:00 ~ 2026-02-03 09:25:48+08:00]\n2026-02-03 07:31:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-03 07:31:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.42s\n2026-02-03 07:31:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-03 07:31:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.49s\n2026-02-03 07:31:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-03 07:31:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.18s\n2026-02-03 07:31:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.17s\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.18s\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.34s\n2026-02-03 07:31:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-03 07:31:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.25s\n2026-02-03 07:31:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-03 07:31:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.52s\n2026-02-03 07:31:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-03 07:31:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.72s\n2026-02-03 07:31:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-03 07:31:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.28s\n2026-02-03 07:31:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.37s\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.24s\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.20s\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.38s\n2026-02-03 07:31:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-03 07:31:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.21s\n2026-02-03 07:31:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-03 07:31:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.53s\n2026-02-03 07:31:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-03 07:31:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 1.18s\n2026-02-03 07:31:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-03 07:31:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.62s\n2026-02-03 07:31:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-03 07:31:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.22s\n2026-02-03 07:31:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-03 07:31:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.24s\n2026-02-03 07:31:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.20s\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.21s\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.25s\n2026-02-03 07:32:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.22s\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.20s\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.19s\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.21s\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.19s\n2026-02-03 07:32:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.25s\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.26s\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.19s\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.24s\n2026-02-03 07:32:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.19s\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.23s\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.20s\n2026-02-03 07:32:03 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-03 07:32:03 [INFO] etl_billiards: 所有任务执行完成\n2026-02-03 07:32:03 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "8d78ffd7", "executed_at": "2026-02-02T17:16:58.004405", "status": "success", "exit_code": 0, "duration_seconds": 213.637389, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 19条, 事实表新增: 37条, 事实表更新: 0条\n 维表: dim_table: +0, ~14, dim_store_goods: +0, ~5\n 事实表: dwd_settlement_head: +7, ~0, dwd_table_fee_log: +6, ~0, dwd_groupbuy_redemption: +9, ~0, dwd_platform_coupon_redemption: +8, ~0, dwd_payment: +7, ~0\n【错误】2026-02-02 17:16:59 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 17:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 17:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 15:16:58 --window-end 2026-02-02 17:16:58\n2026-02-02 17:16:58 [INFO] etl_billiards: 配置加载完成\n2026-02-02 17:16:58 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 17:16:58 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 17:16:58 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=3b88b9a266794a5984ed5cdf5fc7fab4\n2026-02-02 17:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7844-20260202-171658\n2026-02-02 17:16:58 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 17:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:16:59 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 17:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7845-20260202-171659\n2026-02-02 17:16:59 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 17:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 17:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7846-20260202-171700\n2026-02-02 17:17:00 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 17:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 17:17:00 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7847-20260202-171700\n2026-02-02 17:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00] 未发现需要抓取的小票\n2026-02-02 17:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 17:17:01 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7848-20260202-171701\n2026-02-02 17:17:01 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 17:17:01 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:02 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 17:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7849-20260202-171702\n2026-02-02 17:17:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 17:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 17:17:02 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7850-20260202-171702\n2026-02-02 17:17:02 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 17:17:02 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:04 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 17:17:05 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7851-20260202-171705\n2026-02-02 17:17:05 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 17:17:05 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:05 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 17:17:05 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7852-20260202-171705\n2026-02-02 17:17:05 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 17:17:05 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:06 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 5, 'updated': 0, 'skipped': 167, 'errors': 0}\n2026-02-02 17:17:06 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7853-20260202-171706\n2026-02-02 17:17:06 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 17:17:06 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:36 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10042, 'inserted': 6, 'updated': 0, 'skipped': 10036, 'errors': 0}\n2026-02-02 17:17:36 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7854-20260202-171736\n2026-02-02 17:17:36 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 17:17:36 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:17:43 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 17:17:44 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7855-20260202-171744\n2026-02-02 17:17:44 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 17:17:44 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:18:12 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2451, 'inserted': 0, 'updated': 0, 'skipped': 2451, 'errors': 0}\n2026-02-02 17:18:12 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7856-20260202-171812\n2026-02-02 17:18:12 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 17:18:12 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:18:13 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 14, 'updated': 0, 'skipped': 60, 'errors': 0}\n2026-02-02 17:18:13 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7857-20260202-171813\n2026-02-02 17:18:13 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 17:18:13 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:18:13 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 17:18:13 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7858-20260202-171813\n2026-02-02 17:18:13 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 17:18:13 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:18:15 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 5, 'updated': 0, 'skipped': 167, 'errors': 0}\n2026-02-02 17:18:16 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7859-20260202-171816\n2026-02-02 17:18:16 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 17:18:16 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:18:16 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 17:18:16 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7860-20260202-171816\n2026-02-02 17:18:16 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 17:18:16 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:18:17 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 17:18:17 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7861-20260202-171817\n2026-02-02 17:18:17 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 17:18:17 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:19:04 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17506, 'inserted': 8, 'updated': 0, 'skipped': 17498, 'errors': 0}\n2026-02-02 17:19:04 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7862-20260202-171904\n2026-02-02 17:19:04 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 17:19:04 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:19:04 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 14, 'inserted': 6, 'updated': 0, 'skipped': 8, 'errors': 0}\n2026-02-02 17:19:04 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7863-20260202-171904\n2026-02-02 17:19:04 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 17:19:04 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:19:48 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8142, 'inserted': 9, 'updated': 0, 'skipped': 8133, 'errors': 0}\n2026-02-02 17:19:48 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7864-20260202-171948\n2026-02-02 17:19:48 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 17:19:48 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:20:19 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11820, 'inserted': 7, 'updated': 0, 'skipped': 11813, 'errors': 0}\n2026-02-02 17:20:19 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7865-20260202-172019\n2026-02-02 17:20:19 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 17:20:19 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:20:20 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 19, 'inserted': 7, 'updated': 0, 'skipped': 12, 'errors': 0}\n2026-02-02 17:20:20 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7866-20260202-172020\n2026-02-02 17:20:20 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 17:20:20 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:20:21 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 17:20:21 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 17:20:21 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7867-20260202-172021\n2026-02-02 17:20:21 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 17:20:21 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7867-20260202-172021\n2026-02-02 17:20:21 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 13:16:58+08:00 ~ 2026-02-02 19:16:58+08:00]\n2026-02-02 17:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 17:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.40s\n2026-02-02 17:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 17:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.49s\n2026-02-02 17:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 17:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.22s\n2026-02-02 17:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.22s\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.20s\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.24s\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.23s\n2026-02-02 17:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 17:20:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.37s\n2026-02-02 17:20:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 17:20:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.66s\n2026-02-02 17:20:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.22s\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.20s\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.26s\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.26s\n2026-02-02 17:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.20s\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.18s\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.24s\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.27s\n2026-02-02 17:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.22s\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.22s\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.20s\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.23s\n2026-02-02 17:20:27 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.22s\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.27s\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.21s\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.20s\n2026-02-02 17:20:28 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.20s\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.22s\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.25s\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.22s\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.21s\n2026-02-02 17:20:29 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.21s\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.20s\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.20s\n2026-02-02 17:20:30 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 17:20:31 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.24s\n2026-02-02 17:20:31 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 17:20:31 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.22s\n2026-02-02 17:20:31 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 17:20:31 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.20s\n2026-02-02 17:20:31 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 14, 'skipped': 60}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 13, 'skipped': 61}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 5, 'skipped': 167}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 5, 'skipped': 167}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 6, 'updated': 0, 'processed': 6}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 6, 'updated': 0, 'processed': 6}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 9, 'updated': 0, 'processed': 9}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 9, 'updated': 0, 'processed': 9}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 8, 'updated': 0, 'processed': 8}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 8, 'updated': 0, 'processed': 8}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 17:20:31 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 17:20:31 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "926c4d29", "executed_at": "2026-02-02T16:16:57.920781", "status": "success", "exit_code": 0, "duration_seconds": 209.076515, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 14条, 事实表新增: 21条, 事实表更新: 0条\n 维表: dim_table: +0, ~11, dim_store_goods: +0, ~3\n 事实表: dwd_settlement_head: +4, ~0, dwd_table_fee_log: +4, ~0, dwd_groupbuy_redemption: +4, ~0, dwd_platform_coupon_redemption: +5, ~0, dwd_payment: +4, ~0\n【错误】2026-02-02 16:16:59 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 16:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 16:17:01 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 14:16:57 --window-end 2026-02-02 16:16:57\n2026-02-02 16:16:58 [INFO] etl_billiards: 配置加载完成\n2026-02-02 16:16:58 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 16:16:58 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 16:16:58 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=0babb46114af4e6290e77e89dc3227b6\n2026-02-02 16:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7820-20260202-161658\n2026-02-02 16:16:58 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 16:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:16:59 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 16:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7821-20260202-161659\n2026-02-02 16:16:59 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 16:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 16:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7822-20260202-161700\n2026-02-02 16:17:00 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 16:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:01 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 16:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7823-20260202-161701\n2026-02-02 16:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00] 未发现需要抓取的小票\n2026-02-02 16:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 16:17:02 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7824-20260202-161702\n2026-02-02 16:17:02 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 16:17:02 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:02 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 16:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7825-20260202-161702\n2026-02-02 16:17:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 16:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 16:17:03 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7826-20260202-161703\n2026-02-02 16:17:03 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 16:17:03 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:05 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 16:17:05 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7827-20260202-161705\n2026-02-02 16:17:05 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 16:17:05 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:05 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 16:17:05 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7828-20260202-161705\n2026-02-02 16:17:05 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 16:17:05 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:06 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-02 16:17:06 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7829-20260202-161706\n2026-02-02 16:17:06 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 16:17:06 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:33 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10036, 'inserted': 4, 'updated': 0, 'skipped': 10032, 'errors': 0}\n2026-02-02 16:17:34 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7830-20260202-161734\n2026-02-02 16:17:34 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 16:17:34 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:17:41 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 16:17:42 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7831-20260202-161742\n2026-02-02 16:17:42 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 16:17:42 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:18:10 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2451, 'inserted': 0, 'updated': 0, 'skipped': 2451, 'errors': 0}\n2026-02-02 16:18:10 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7832-20260202-161810\n2026-02-02 16:18:10 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 16:18:10 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:18:10 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 12, 'updated': 0, 'skipped': 62, 'errors': 0}\n2026-02-02 16:18:11 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7833-20260202-161811\n2026-02-02 16:18:11 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 16:18:11 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:18:11 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 16:18:11 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7834-20260202-161811\n2026-02-02 16:18:11 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 16:18:11 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:18:14 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-02 16:18:14 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7835-20260202-161814\n2026-02-02 16:18:14 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 16:18:14 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:18:15 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 16:18:15 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7836-20260202-161815\n2026-02-02 16:18:15 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 16:18:15 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:18:16 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 16:18:16 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7837-20260202-161816\n2026-02-02 16:18:16 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 16:18:16 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:19:00 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17498, 'inserted': 5, 'updated': 0, 'skipped': 17493, 'errors': 0}\n2026-02-02 16:19:01 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7838-20260202-161901\n2026-02-02 16:19:01 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 16:19:01 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:19:01 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 13, 'inserted': 3, 'updated': 0, 'skipped': 10, 'errors': 0}\n2026-02-02 16:19:01 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7839-20260202-161901\n2026-02-02 16:19:01 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 16:19:01 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:19:45 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8133, 'inserted': 4, 'updated': 0, 'skipped': 8129, 'errors': 0}\n2026-02-02 16:19:45 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7840-20260202-161945\n2026-02-02 16:19:45 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 16:19:45 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:20:15 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11813, 'inserted': 4, 'updated': 0, 'skipped': 11809, 'errors': 0}\n2026-02-02 16:20:15 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7841-20260202-162015\n2026-02-02 16:20:15 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 16:20:15 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:20:15 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 16, 'inserted': 4, 'updated': 0, 'skipped': 12, 'errors': 0}\n2026-02-02 16:20:16 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7842-20260202-162016\n2026-02-02 16:20:16 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 16:20:16 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:20:16 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 16:20:17 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 16:20:17 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7843-20260202-162017\n2026-02-02 16:20:17 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 16:20:17 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7843-20260202-162017\n2026-02-02 16:20:17 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 12:16:57+08:00 ~ 2026-02-02 18:16:57+08:00]\n2026-02-02 16:20:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 16:20:17 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.42s\n2026-02-02 16:20:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.50s\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.23s\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.23s\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.19s\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.21s\n2026-02-02 16:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 16:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.29s\n2026-02-02 16:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 16:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.25s\n2026-02-02 16:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 16:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.37s\n2026-02-02 16:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 16:20:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.57s\n2026-02-02 16:20:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 16:20:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.20s\n2026-02-02 16:20:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 16:20:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.20s\n2026-02-02 16:20:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.26s\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.26s\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.18s\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.21s\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.18s\n2026-02-02 16:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.23s\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.24s\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.23s\n2026-02-02 16:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.19s\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.22s\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.23s\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.27s\n2026-02-02 16:20:23 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.22s\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.20s\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.20s\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.21s\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.21s\n2026-02-02 16:20:24 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.22s\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.21s\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.21s\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-02 16:20:25 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.20s\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.20s\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.23s\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.20s\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.19s\n2026-02-02 16:20:26 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 11, 'skipped': 63}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 10, 'skipped': 64}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 16:20:26 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 16:20:26 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "47fa666c", "executed_at": "2026-02-02T15:16:57.634176", "status": "success", "exit_code": 0, "duration_seconds": 204.7959, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 12条, 事实表新增: 20条, 事实表更新: 0条\n 维表: dim_table: +0, ~9, dim_store_goods: +0, ~3\n 事实表: dwd_settlement_head: +4, ~0, dwd_table_fee_log: +3, ~0, dwd_groupbuy_redemption: +3, ~0, dwd_platform_coupon_redemption: +6, ~0, dwd_payment: +4, ~0\n【错误】2026-02-02 15:16:59 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 15:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 15:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 13:16:57 --window-end 2026-02-02 15:16:57\n2026-02-02 15:16:57 [INFO] etl_billiards: 配置加载完成\n2026-02-02 15:16:57 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 15:16:57 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 15:16:58 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=4b076e3a454a4b3195e8e37d2a4b2006\n2026-02-02 15:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7796-20260202-151658\n2026-02-02 15:16:58 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 15:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:16:59 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 15:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7797-20260202-151659\n2026-02-02 15:16:59 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 15:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:16:59 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 15:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7798-20260202-151659\n2026-02-02 15:16:59 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 15:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:00 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 15:17:00 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7799-20260202-151700\n2026-02-02 15:17:00 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00] 未发现需要抓取的小票\n2026-02-02 15:17:01 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 15:17:01 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7800-20260202-151701\n2026-02-02 15:17:01 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 15:17:01 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:01 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 15:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7801-20260202-151702\n2026-02-02 15:17:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 15:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:02 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 15:17:02 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7802-20260202-151702\n2026-02-02 15:17:02 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 15:17:02 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:04 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 15:17:04 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7803-20260202-151704\n2026-02-02 15:17:04 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 15:17:04 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:05 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 15:17:05 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7804-20260202-151705\n2026-02-02 15:17:05 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 15:17:05 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:05 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-02 15:17:06 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7805-20260202-151706\n2026-02-02 15:17:06 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 15:17:06 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:30 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10032, 'inserted': 3, 'updated': 0, 'skipped': 10029, 'errors': 0}\n2026-02-02 15:17:30 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7806-20260202-151730\n2026-02-02 15:17:30 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 15:17:30 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:17:38 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 15:17:38 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7807-20260202-151738\n2026-02-02 15:17:38 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 15:17:38 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:06 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2451, 'inserted': 0, 'updated': 0, 'skipped': 2451, 'errors': 0}\n2026-02-02 15:18:06 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7808-20260202-151806\n2026-02-02 15:18:06 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 15:18:06 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:06 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 9, 'updated': 0, 'skipped': 65, 'errors': 0}\n2026-02-02 15:18:07 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7809-20260202-151807\n2026-02-02 15:18:07 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 15:18:07 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:07 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 15:18:07 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7810-20260202-151807\n2026-02-02 15:18:07 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 15:18:07 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:09 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-02 15:18:09 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7811-20260202-151809\n2026-02-02 15:18:09 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 15:18:09 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:09 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 15:18:10 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7812-20260202-151810\n2026-02-02 15:18:10 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 15:18:10 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:11 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 15:18:11 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7813-20260202-151811\n2026-02-02 15:18:11 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 15:18:11 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:56 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17493, 'inserted': 6, 'updated': 0, 'skipped': 17487, 'errors': 0}\n2026-02-02 15:18:57 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7814-20260202-151857\n2026-02-02 15:18:57 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 15:18:57 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:18:57 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 12, 'inserted': 3, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 15:18:57 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7815-20260202-151857\n2026-02-02 15:18:57 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 15:18:57 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:19:41 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8129, 'inserted': 3, 'updated': 0, 'skipped': 8126, 'errors': 0}\n2026-02-02 15:19:41 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7816-20260202-151941\n2026-02-02 15:19:41 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 15:19:41 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:20:10 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11809, 'inserted': 4, 'updated': 0, 'skipped': 11805, 'errors': 0}\n2026-02-02 15:20:10 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7817-20260202-152010\n2026-02-02 15:20:10 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 15:20:10 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:20:10 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 14, 'inserted': 4, 'updated': 0, 'skipped': 10, 'errors': 0}\n2026-02-02 15:20:11 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7818-20260202-152011\n2026-02-02 15:20:11 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 15:20:11 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:20:11 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 15:20:11 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7819-20260202-152012\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7819-20260202-152012\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 11:16:57+08:00 ~ 2026-02-02 17:16:57+08:00]\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.42s\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.47s\n2026-02-02 15:20:12 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.28s\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.24s\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.20s\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.21s\n2026-02-02 15:20:13 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 15:20:14 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.26s\n2026-02-02 15:20:14 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 15:20:14 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.23s\n2026-02-02 15:20:14 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 15:20:14 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.39s\n2026-02-02 15:20:14 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 15:20:15 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.69s\n2026-02-02 15:20:15 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 15:20:15 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.21s\n2026-02-02 15:20:15 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 15:20:15 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.22s\n2026-02-02 15:20:15 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.27s\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.27s\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.20s\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.19s\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.19s\n2026-02-02 15:20:16 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.26s\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.23s\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.23s\n2026-02-02 15:20:17 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.22s\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.21s\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.23s\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.23s\n2026-02-02 15:20:18 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.28s\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.22s\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.21s\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.21s\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.23s\n2026-02-02 15:20:19 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.23s\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.23s\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.23s\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.23s\n2026-02-02 15:20:20 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.22s\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.21s\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.27s\n2026-02-02 15:20:21 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 15:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.23s\n2026-02-02 15:20:22 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 15:20:22 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.21s\n2026-02-02 15:20:22 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 9, 'skipped': 65}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 8, 'skipped': 66}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 6, 'updated': 0, 'processed': 6}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 6, 'updated': 0, 'processed': 6}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 15:20:22 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 15:20:22 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "2d422111", "executed_at": "2026-02-02T14:16:57.126884", "status": "success", "exit_code": 0, "duration_seconds": 189.098646, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 9条, 事实表新增: 21条, 事实表更新: 0条\n 维表: dim_table: +0, ~7, dim_store_goods: +0, ~2\n 事实表: dwd_settlement_head: +4, ~0, dwd_table_fee_log: +3, ~0, dwd_groupbuy_redemption: +3, ~0, dwd_platform_coupon_redemption: +7, ~0, dwd_payment: +4, ~0\n【错误】2026-02-02 14:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 14:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 14:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 12:16:57 --window-end 2026-02-02 14:16:57\n2026-02-02 14:16:57 [INFO] etl_billiards: 配置加载完成\n2026-02-02 14:16:57 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 14:16:57 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 14:16:57 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=acb9074c3c104351b82d42cbae988241\n2026-02-02 14:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7772-20260202-141657\n2026-02-02 14:16:57 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 14:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:16:58 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 14:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7773-20260202-141658\n2026-02-02 14:16:58 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 14:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 14:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7774-20260202-141659\n2026-02-02 14:16:59 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 14:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 14:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7775-20260202-141659\n2026-02-02 14:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:00 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00] 未发现需要抓取的小票\n2026-02-02 14:17:00 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 14:17:00 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7776-20260202-141700\n2026-02-02 14:17:00 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 14:17:00 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:01 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 14:17:01 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7777-20260202-141701\n2026-02-02 14:17:01 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 14:17:01 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:01 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 14:17:01 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7778-20260202-141701\n2026-02-02 14:17:01 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 14:17:01 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:03 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 14:17:04 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7779-20260202-141704\n2026-02-02 14:17:04 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 14:17:04 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:04 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 14:17:04 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7780-20260202-141704\n2026-02-02 14:17:04 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 14:17:04 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:04 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 2, 'updated': 0, 'skipped': 170, 'errors': 0}\n2026-02-02 14:17:05 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7781-20260202-141705\n2026-02-02 14:17:05 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 14:17:05 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:27 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10029, 'inserted': 3, 'updated': 0, 'skipped': 10026, 'errors': 0}\n2026-02-02 14:17:27 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7782-20260202-141727\n2026-02-02 14:17:27 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 14:17:27 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:17:34 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 14:17:34 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7783-20260202-141734\n2026-02-02 14:17:34 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 14:17:34 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:01 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2451, 'inserted': 0, 'updated': 0, 'skipped': 2451, 'errors': 0}\n2026-02-02 14:18:01 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7784-20260202-141801\n2026-02-02 14:18:01 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 14:18:01 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:02 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 8, 'updated': 0, 'skipped': 66, 'errors': 0}\n2026-02-02 14:18:02 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7785-20260202-141802\n2026-02-02 14:18:02 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 14:18:02 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:02 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 14:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7786-20260202-141802\n2026-02-02 14:18:02 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 14:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:04 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 2, 'updated': 0, 'skipped': 170, 'errors': 0}\n2026-02-02 14:18:04 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7787-20260202-141804\n2026-02-02 14:18:04 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 14:18:04 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:04 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 14:18:05 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7788-20260202-141805\n2026-02-02 14:18:05 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 14:18:05 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:06 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 14:18:06 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7789-20260202-141806\n2026-02-02 14:18:06 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 14:18:06 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:47 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17487, 'inserted': 7, 'updated': 0, 'skipped': 17480, 'errors': 0}\n2026-02-02 14:18:47 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7790-20260202-141847\n2026-02-02 14:18:47 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 14:18:47 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:18:47 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 9, 'inserted': 2, 'updated': 0, 'skipped': 7, 'errors': 0}\n2026-02-02 14:18:47 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7791-20260202-141847\n2026-02-02 14:18:47 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 14:18:47 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:19:29 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8126, 'inserted': 3, 'updated': 0, 'skipped': 8123, 'errors': 0}\n2026-02-02 14:19:29 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7792-20260202-141929\n2026-02-02 14:19:29 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 14:19:29 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:19:54 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11805, 'inserted': 4, 'updated': 0, 'skipped': 11801, 'errors': 0}\n2026-02-02 14:19:54 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7793-20260202-141954\n2026-02-02 14:19:54 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 14:19:54 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:19:55 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 10, 'inserted': 4, 'updated': 0, 'skipped': 6, 'errors': 0}\n2026-02-02 14:19:55 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7794-20260202-141955\n2026-02-02 14:19:55 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 14:19:55 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:19:56 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 14:19:56 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 14:19:56 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7795-20260202-141956\n2026-02-02 14:19:56 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 14:19:56 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7795-20260202-141956\n2026-02-02 14:19:56 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 10:16:57+08:00 ~ 2026-02-02 16:16:57+08:00]\n2026-02-02 14:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 14:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.49s\n2026-02-02 14:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.47s\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.26s\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.22s\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-02 14:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.20s\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.25s\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.22s\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.36s\n2026-02-02 14:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 14:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.59s\n2026-02-02 14:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 14:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.21s\n2026-02-02 14:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 14:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.20s\n2026-02-02 14:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.26s\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.27s\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.18s\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.18s\n2026-02-02 14:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.19s\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.23s\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.24s\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.22s\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.22s\n2026-02-02 14:20:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.20s\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.22s\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.24s\n2026-02-02 14:20:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.26s\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.23s\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.20s\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.20s\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.21s\n2026-02-02 14:20:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.21s\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.23s\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.22s\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.21s\n2026-02-02 14:20:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.20s\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.20s\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.24s\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.20s\n2026-02-02 14:20:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 14:20:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.20s\n2026-02-02 14:20:06 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 7, 'skipped': 67}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 6, 'skipped': 68}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 2, 'skipped': 170}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 2, 'skipped': 170}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 14:20:06 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 14:20:06 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "101350da", "executed_at": "2026-02-02T13:16:56.744049", "status": "success", "exit_code": 0, "duration_seconds": 184.542973, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 7条, 事实表新增: 16条, 事实表更新: 0条\n 维表: dim_table: +0, ~4, dim_store_goods: +0, ~3\n 事实表: dwd_settlement_head: +4, ~0, dwd_table_fee_log: +3, ~0, dwd_groupbuy_redemption: +3, ~0, dwd_platform_coupon_redemption: +2, ~0, dwd_payment: +4, ~0\n【错误】2026-02-02 13:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 13:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 13:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 11:16:56 --window-end 2026-02-02 13:16:56\n2026-02-02 13:16:57 [INFO] etl_billiards: 配置加载完成\n2026-02-02 13:16:57 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 13:16:57 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 13:16:57 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=1307568bb1df4a41b94fc5fe912b388e\n2026-02-02 13:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7748-20260202-131657\n2026-02-02 13:16:57 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 13:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 13:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7749-20260202-131658\n2026-02-02 13:16:58 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 13:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:16:58 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 13:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7750-20260202-131658\n2026-02-02 13:16:58 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 13:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:16:59 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 13:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7751-20260202-131659\n2026-02-02 13:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00] 未发现需要抓取的小票\n2026-02-02 13:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 13:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7752-20260202-131659\n2026-02-02 13:16:59 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 13:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:00 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 13:17:00 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7753-20260202-131700\n2026-02-02 13:17:00 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 13:17:00 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:00 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 13:17:00 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7754-20260202-131700\n2026-02-02 13:17:00 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 13:17:00 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:02 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 13:17:03 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7755-20260202-131703\n2026-02-02 13:17:03 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 13:17:03 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:03 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 13:17:03 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7756-20260202-131703\n2026-02-02 13:17:03 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 13:17:03 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:03 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-02 13:17:04 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7757-20260202-131704\n2026-02-02 13:17:04 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 13:17:04 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:25 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10026, 'inserted': 3, 'updated': 0, 'skipped': 10023, 'errors': 0}\n2026-02-02 13:17:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7758-20260202-131725\n2026-02-02 13:17:25 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 13:17:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:32 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 13:17:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7759-20260202-131732\n2026-02-02 13:17:32 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 13:17:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:17:59 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2451, 'inserted': 0, 'updated': 0, 'skipped': 2451, 'errors': 0}\n2026-02-02 13:18:00 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7760-20260202-131800\n2026-02-02 13:18:00 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 13:18:00 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:18:00 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 5, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 13:18:00 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7761-20260202-131800\n2026-02-02 13:18:00 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 13:18:00 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 13:18:01 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7762-20260202-131801\n2026-02-02 13:18:01 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 13:18:01 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:18:03 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 3, 'updated': 0, 'skipped': 169, 'errors': 0}\n2026-02-02 13:18:03 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7763-20260202-131803\n2026-02-02 13:18:03 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 13:18:03 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:18:04 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 13:18:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7764-20260202-131804\n2026-02-02 13:18:04 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 13:18:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:18:05 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 13:18:05 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7765-20260202-131805\n2026-02-02 13:18:05 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 13:18:05 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:18:46 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17480, 'inserted': 2, 'updated': 0, 'skipped': 17478, 'errors': 0}\n2026-02-02 13:18:46 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7766-20260202-131846\n2026-02-02 13:18:46 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 13:18:46 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:18:46 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 7, 'inserted': 5, 'updated': 0, 'skipped': 2, 'errors': 0}\n2026-02-02 13:18:47 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7767-20260202-131847\n2026-02-02 13:18:47 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 13:18:47 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:19:25 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8123, 'inserted': 3, 'updated': 0, 'skipped': 8120, 'errors': 0}\n2026-02-02 13:19:26 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7768-20260202-131926\n2026-02-02 13:19:26 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 13:19:26 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:19:50 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11801, 'inserted': 4, 'updated': 0, 'skipped': 11797, 'errors': 0}\n2026-02-02 13:19:50 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7769-20260202-131950\n2026-02-02 13:19:50 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 13:19:50 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:19:50 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 6, 'inserted': 4, 'updated': 0, 'skipped': 2, 'errors': 0}\n2026-02-02 13:19:51 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7770-20260202-131951\n2026-02-02 13:19:51 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 13:19:51 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:19:51 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 13:19:51 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7771-20260202-131952\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7771-20260202-131952\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 09:16:56+08:00 ~ 2026-02-02 15:16:56+08:00]\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.36s\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.49s\n2026-02-02 13:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.23s\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.22s\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.19s\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.26s\n2026-02-02 13:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 13:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-02 13:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 13:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.36s\n2026-02-02 13:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.57s\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.19s\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.25s\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.24s\n2026-02-02 13:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.16s\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.22s\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.23s\n2026-02-02 13:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.20s\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.19s\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.19s\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.20s\n2026-02-02 13:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.25s\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.20s\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.19s\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.19s\n2026-02-02 13:19:58 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.19s\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.19s\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.21s\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.21s\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-02 13:19:59 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.20s\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.19s\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.22s\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.19s\n2026-02-02 13:20:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 13:20:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.19s\n2026-02-02 13:20:01 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 4, 'skipped': 70}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 3, 'skipped': 71}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 3, 'skipped': 169}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 3, 'updated': 0, 'processed': 3}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 13:20:01 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 13:20:01 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "9fec4a10", "executed_at": "2026-02-02T12:16:56.398831", "status": "success", "exit_code": 0, "duration_seconds": 180.610921, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 7条, 事实表新增: 11条, 事实表更新: 0条\n 维表: dim_table: +0, ~4, dim_member: +0, ~1, dim_store_goods: +0, ~2\n 事实表: dwd_settlement_head: +2, ~0, dwd_table_fee_log: +1, ~0, dwd_member_balance_change: +1, ~0, dwd_groupbuy_redemption: +1, ~0, dwd_platform_coupon_redemption: +4, ~0, dwd_payment: +2, ~0\n【错误】2026-02-02 12:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 12:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 12:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 10:16:56 --window-end 2026-02-02 12:16:56\n2026-02-02 12:16:56 [INFO] etl_billiards: 配置加载完成\n2026-02-02 12:16:56 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 12:16:56 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 12:16:57 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=d33c7a9f3e324b3e814d23c73038b86b\n2026-02-02 12:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7724-20260202-121657\n2026-02-02 12:16:57 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 12:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 12:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7725-20260202-121657\n2026-02-02 12:16:57 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 12:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 12:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7726-20260202-121658\n2026-02-02 12:16:58 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 12:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 12:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7727-20260202-121658\n2026-02-02 12:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00] 未发现需要抓取的小票\n2026-02-02 12:16:59 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 12:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7728-20260202-121659\n2026-02-02 12:16:59 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 12:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 12:17:00 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7729-20260202-121700\n2026-02-02 12:17:00 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 12:17:00 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:17:00 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 12:17:00 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7730-20260202-121700\n2026-02-02 12:17:00 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 12:17:00 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:17:02 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 1, 'updated': 0, 'skipped': 555, 'errors': 0}\n2026-02-02 12:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7731-20260202-121702\n2026-02-02 12:17:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 12:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 12:17:03 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7732-20260202-121703\n2026-02-02 12:17:03 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 12:17:03 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:17:03 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 2, 'updated': 0, 'skipped': 170, 'errors': 0}\n2026-02-02 12:17:03 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7733-20260202-121703\n2026-02-02 12:17:03 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 12:17:03 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:17:24 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10023, 'inserted': 1, 'updated': 0, 'skipped': 10022, 'errors': 0}\n2026-02-02 12:17:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7734-20260202-121725\n2026-02-02 12:17:25 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 12:17:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:17:31 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 12:17:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7735-20260202-121731\n2026-02-02 12:17:31 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 12:17:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:17:59 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2451, 'inserted': 1, 'updated': 0, 'skipped': 2450, 'errors': 0}\n2026-02-02 12:17:59 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7736-20260202-121759\n2026-02-02 12:17:59 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 12:17:59 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:18:00 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 4, 'updated': 0, 'skipped': 70, 'errors': 0}\n2026-02-02 12:18:00 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7737-20260202-121800\n2026-02-02 12:18:00 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 12:18:00 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:18:00 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 12:18:00 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7738-20260202-121800\n2026-02-02 12:18:00 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 12:18:00 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:18:01 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 2, 'updated': 0, 'skipped': 170, 'errors': 0}\n2026-02-02 12:18:01 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7739-20260202-121801\n2026-02-02 12:18:01 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 12:18:01 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:18:01 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 12:18:02 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7740-20260202-121802\n2026-02-02 12:18:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 12:18:02 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:18:03 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 12:18:03 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7741-20260202-121803\n2026-02-02 12:18:03 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 12:18:03 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:18:43 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17478, 'inserted': 4, 'updated': 0, 'skipped': 17474, 'errors': 0}\n2026-02-02 12:18:43 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7742-20260202-121843\n2026-02-02 12:18:43 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 12:18:43 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:18:43 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 2, 'inserted': 2, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 12:18:44 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7743-20260202-121844\n2026-02-02 12:18:44 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 12:18:44 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:19:21 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8120, 'inserted': 1, 'updated': 0, 'skipped': 8119, 'errors': 0}\n2026-02-02 12:19:21 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7744-20260202-121921\n2026-02-02 12:19:21 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 12:19:21 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:19:45 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11797, 'inserted': 2, 'updated': 0, 'skipped': 11795, 'errors': 0}\n2026-02-02 12:19:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7745-20260202-121945\n2026-02-02 12:19:45 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 12:19:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:19:46 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 2, 'inserted': 2, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 12:19:46 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7746-20260202-121946\n2026-02-02 12:19:46 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 12:19:46 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:19:47 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 12:19:47 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 12:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7747-20260202-121947\n2026-02-02 12:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 12:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7747-20260202-121947\n2026-02-02 12:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 08:16:56+08:00 ~ 2026-02-02 14:16:56+08:00]\n2026-02-02 12:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 12:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.35s\n2026-02-02 12:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.44s\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.24s\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.22s\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-02 12:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.19s\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.27s\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.34s\n2026-02-02 12:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 12:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.54s\n2026-02-02 12:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 12:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.20s\n2026-02-02 12:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 12:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-02 12:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.25s\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.26s\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-02 12:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.22s\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.22s\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.22s\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.44s\n2026-02-02 12:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.19s\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.19s\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.24s\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.21s\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-02 12:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.20s\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.19s\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.19s\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.21s\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.19s\n2026-02-02 12:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.20s\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.20s\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.20s\n2026-02-02 12:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.21s\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.25s\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.23s\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.18s\n2026-02-02 12:19:56 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 4, 'skipped': 70}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 3, 'skipped': 71}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 1, 'skipped': 555}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 2, 'skipped': 170}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 2, 'skipped': 170}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 2, 'updated': 0, 'processed': 2}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 12:19:56 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 12:19:56 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "25f2f24e", "executed_at": "2026-02-02T11:16:55.990890", "status": "success", "exit_code": 0, "duration_seconds": 176.757487, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 1条, 事实表新增: 1条, 事实表更新: 0条\n 维表: dim_table: +0, ~1\n 事实表: dwd_platform_coupon_redemption: +1, ~0\n【错误】2026-02-02 11:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 11:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 11:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 09:16:55 --window-end 2026-02-02 11:16:55\n2026-02-02 11:16:56 [INFO] etl_billiards: 配置加载完成\n2026-02-02 11:16:56 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 11:16:56 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 11:16:56 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=4700843076ae45c1bba1a2ad781cb7f0\n2026-02-02 11:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7700-20260202-111656\n2026-02-02 11:16:56 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 11:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 11:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7701-20260202-111657\n2026-02-02 11:16:57 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 11:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 11:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7702-20260202-111657\n2026-02-02 11:16:57 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 11:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 11:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7703-20260202-111658\n2026-02-02 11:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00] 未发现需要抓取的小票\n2026-02-02 11:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 11:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7704-20260202-111659\n2026-02-02 11:16:59 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 11:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 11:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7705-20260202-111659\n2026-02-02 11:16:59 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 11:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 11:17:00 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7706-20260202-111700\n2026-02-02 11:17:00 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 11:17:00 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:02 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 11:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7707-20260202-111702\n2026-02-02 11:17:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 11:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 11:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7708-20260202-111702\n2026-02-02 11:17:02 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 11:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:03 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 11:17:03 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7709-20260202-111703\n2026-02-02 11:17:03 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 11:17:03 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:24 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10022, 'inserted': 0, 'updated': 0, 'skipped': 10022, 'errors': 0}\n2026-02-02 11:17:24 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7710-20260202-111724\n2026-02-02 11:17:24 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 11:17:24 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:31 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 11:17:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7711-20260202-111731\n2026-02-02 11:17:31 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 11:17:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:58 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2450, 'inserted': 0, 'updated': 0, 'skipped': 2450, 'errors': 0}\n2026-02-02 11:17:58 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7712-20260202-111758\n2026-02-02 11:17:58 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 11:17:58 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:58 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 1, 'updated': 0, 'skipped': 73, 'errors': 0}\n2026-02-02 11:17:59 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7713-20260202-111759\n2026-02-02 11:17:59 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 11:17:59 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:17:59 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 11:17:59 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7714-20260202-111759\n2026-02-02 11:17:59 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 11:17:59 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:18:00 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 11:18:01 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7715-20260202-111801\n2026-02-02 11:18:01 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 11:18:01 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:18:01 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 11:18:01 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7716-20260202-111801\n2026-02-02 11:18:01 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 11:18:01 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:18:02 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 11:18:03 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7717-20260202-111803\n2026-02-02 11:18:03 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 11:18:03 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:18:41 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17474, 'inserted': 1, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 11:18:41 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7718-20260202-111841\n2026-02-02 11:18:41 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 11:18:41 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:18:42 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 11:18:42 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7719-20260202-111842\n2026-02-02 11:18:42 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 11:18:42 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:19:18 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8119, 'inserted': 0, 'updated': 0, 'skipped': 8119, 'errors': 0}\n2026-02-02 11:19:19 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7720-20260202-111919\n2026-02-02 11:19:19 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 11:19:19 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:19:42 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11795, 'inserted': 0, 'updated': 0, 'skipped': 11795, 'errors': 0}\n2026-02-02 11:19:42 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7721-20260202-111942\n2026-02-02 11:19:42 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 11:19:42 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:19:43 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 11:19:43 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7722-20260202-111943\n2026-02-02 11:19:43 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 11:19:43 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:19:43 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 11:19:44 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7723-20260202-111944\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7723-20260202-111944\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 07:16:55+08:00 ~ 2026-02-02 13:16:55+08:00]\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.35s\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.44s\n2026-02-02 11:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.20s\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.24s\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.18s\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.22s\n2026-02-02 11:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 11:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.20s\n2026-02-02 11:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 11:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.33s\n2026-02-02 11:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 11:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.54s\n2026-02-02 11:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.19s\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.18s\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.19s\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.19s\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.15s\n2026-02-02 11:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.16s\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.16s\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.21s\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.21s\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.19s\n2026-02-02 11:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.19s\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.18s\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.19s\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.19s\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.23s\n2026-02-02 11:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.18s\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.18s\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.20s\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.18s\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.18s\n2026-02-02 11:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.19s\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.19s\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.19s\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.19s\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.18s\n2026-02-02 11:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.18s\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.21s\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.18s\n2026-02-02 11:19:52 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 11:19:52 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 11:19:52 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "0458ffd6", "executed_at": "2026-02-02T10:16:55.681120", "status": "success", "exit_code": 0, "duration_seconds": 180.120778, "summary": "【错误】2026-02-02 10:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 10:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 10:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 08:16:55 --window-end 2026-02-02 10:16:55\n2026-02-02 10:16:56 [INFO] etl_billiards: 配置加载完成\n2026-02-02 10:16:56 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 10:16:56 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 10:16:56 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=7e2a96ee2ca84282929200ccf2fddb66\n2026-02-02 10:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7676-20260202-101656\n2026-02-02 10:16:56 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 10:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:16:57 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 10:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7677-20260202-101657\n2026-02-02 10:16:57 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 10:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:16:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 10:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7678-20260202-101657\n2026-02-02 10:16:57 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 10:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:16:58 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 10:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7679-20260202-101658\n2026-02-02 10:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00] 未发现需要抓取的小票\n2026-02-02 10:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 10:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7680-20260202-101659\n2026-02-02 10:16:59 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 10:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:16:59 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 10:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7681-20260202-101659\n2026-02-02 10:16:59 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 10:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 10:17:00 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7682-20260202-101700\n2026-02-02 10:17:00 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 10:17:00 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:17:02 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 10:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7683-20260202-101702\n2026-02-02 10:17:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 10:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 10:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7684-20260202-101702\n2026-02-02 10:17:02 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 10:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:17:03 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 10:17:03 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7685-20260202-101703\n2026-02-02 10:17:03 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 10:17:03 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:17:26 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10022, 'inserted': 0, 'updated': 0, 'skipped': 10022, 'errors': 0}\n2026-02-02 10:17:26 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7686-20260202-101726\n2026-02-02 10:17:26 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 10:17:26 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:17:32 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 10:17:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7687-20260202-101732\n2026-02-02 10:17:32 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 10:17:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:00 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2450, 'inserted': 0, 'updated': 0, 'skipped': 2450, 'errors': 0}\n2026-02-02 10:18:01 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7688-20260202-101801\n2026-02-02 10:18:01 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 10:18:01 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:01 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-02 10:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7689-20260202-101801\n2026-02-02 10:18:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 10:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:02 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 10:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7690-20260202-101802\n2026-02-02 10:18:02 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 10:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:03 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 10:18:03 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7691-20260202-101803\n2026-02-02 10:18:03 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 10:18:03 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:04 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 10:18:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7692-20260202-101804\n2026-02-02 10:18:04 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 10:18:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:05 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 10:18:05 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7693-20260202-101805\n2026-02-02 10:18:05 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 10:18:05 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:44 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 10:18:45 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7694-20260202-101845\n2026-02-02 10:18:45 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 10:18:45 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:18:45 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 10:18:45 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7695-20260202-101845\n2026-02-02 10:18:45 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 10:18:45 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:19:21 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8119, 'inserted': 0, 'updated': 0, 'skipped': 8119, 'errors': 0}\n2026-02-02 10:19:21 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7696-20260202-101921\n2026-02-02 10:19:21 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 10:19:21 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:19:44 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11795, 'inserted': 0, 'updated': 0, 'skipped': 11795, 'errors': 0}\n2026-02-02 10:19:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7697-20260202-101945\n2026-02-02 10:19:45 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 10:19:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:19:45 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 10:19:45 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7698-20260202-101945\n2026-02-02 10:19:45 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 10:19:45 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:19:46 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 10:19:46 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 10:19:46 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7699-20260202-101946\n2026-02-02 10:19:46 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 10:19:46 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7699-20260202-101946\n2026-02-02 10:19:46 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 06:16:55+08:00 ~ 2026-02-02 12:16:55+08:00]\n2026-02-02 10:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 10:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.43s\n2026-02-02 10:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.46s\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.17s\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.17s\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-02 10:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.19s\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.25s\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.36s\n2026-02-02 10:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 10:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.57s\n2026-02-02 10:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 10:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.19s\n2026-02-02 10:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 10:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-02 10:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.20s\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.21s\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.16s\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-02 10:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.21s\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.21s\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.20s\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.20s\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.19s\n2026-02-02 10:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.20s\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.22s\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.32s\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.22s\n2026-02-02 10:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.20s\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.23s\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.20s\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.20s\n2026-02-02 10:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.20s\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.21s\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.19s\n2026-02-02 10:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.22s\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.20s\n2026-02-02 10:19:55 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 10:19:55 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 10:19:55 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "62567464", "executed_at": "2026-02-02T09:16:55.297784", "status": "success", "exit_code": 0, "duration_seconds": 178.074014, "summary": "【错误】2026-02-02 09:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 09:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 09:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 07:16:55 --window-end 2026-02-02 09:16:55\n2026-02-02 09:16:55 [INFO] etl_billiards: 配置加载完成\n2026-02-02 09:16:55 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 09:16:55 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 09:16:55 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=68003b7d5ec141f88ab5497510fc6f47\n2026-02-02 09:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7652-20260202-091655\n2026-02-02 09:16:55 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 09:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 09:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7653-20260202-091656\n2026-02-02 09:16:56 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 09:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 09:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7654-20260202-091657\n2026-02-02 09:16:57 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 09:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 09:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7655-20260202-091657\n2026-02-02 09:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00] 未发现需要抓取的小票\n2026-02-02 09:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 09:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7656-20260202-091658\n2026-02-02 09:16:58 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 09:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 09:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7657-20260202-091659\n2026-02-02 09:16:59 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 09:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 09:16:59 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7658-20260202-091659\n2026-02-02 09:16:59 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 09:16:59 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:17:01 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 09:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7659-20260202-091702\n2026-02-02 09:17:02 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 09:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:17:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 09:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7660-20260202-091702\n2026-02-02 09:17:02 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 09:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:17:02 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 09:17:03 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7661-20260202-091703\n2026-02-02 09:17:03 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 09:17:03 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:17:25 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10022, 'inserted': 0, 'updated': 0, 'skipped': 10022, 'errors': 0}\n2026-02-02 09:17:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7662-20260202-091725\n2026-02-02 09:17:25 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 09:17:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:17:32 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 09:17:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7663-20260202-091732\n2026-02-02 09:17:32 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 09:17:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:00 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2450, 'inserted': 0, 'updated': 0, 'skipped': 2450, 'errors': 0}\n2026-02-02 09:18:00 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7664-20260202-091800\n2026-02-02 09:18:00 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 09:18:00 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:01 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-02 09:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7665-20260202-091801\n2026-02-02 09:18:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 09:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 09:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7666-20260202-091802\n2026-02-02 09:18:02 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 09:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 09:18:03 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7667-20260202-091803\n2026-02-02 09:18:03 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 09:18:03 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:03 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 09:18:03 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7668-20260202-091803\n2026-02-02 09:18:03 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 09:18:03 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 09:18:04 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7669-20260202-091804\n2026-02-02 09:18:04 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 09:18:04 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:43 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 09:18:43 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7670-20260202-091843\n2026-02-02 09:18:43 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 09:18:43 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:18:44 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 09:18:44 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7671-20260202-091844\n2026-02-02 09:18:44 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 09:18:44 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:19:19 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8119, 'inserted': 0, 'updated': 0, 'skipped': 8119, 'errors': 0}\n2026-02-02 09:19:19 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7672-20260202-091919\n2026-02-02 09:19:19 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 09:19:19 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:19:43 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11795, 'inserted': 0, 'updated': 0, 'skipped': 11795, 'errors': 0}\n2026-02-02 09:19:43 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7673-20260202-091943\n2026-02-02 09:19:43 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 09:19:43 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:19:43 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 09:19:43 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7674-20260202-091943\n2026-02-02 09:19:43 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 09:19:43 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:19:44 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 09:19:44 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 09:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7675-20260202-091944\n2026-02-02 09:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 09:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7675-20260202-091944\n2026-02-02 09:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 05:16:55+08:00 ~ 2026-02-02 11:16:55+08:00]\n2026-02-02 09:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 09:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.36s\n2026-02-02 09:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.43s\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.17s\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.17s\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-02 09:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.18s\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.24s\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.33s\n2026-02-02 09:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.57s\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.21s\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.20s\n2026-02-02 09:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.20s\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.21s\n2026-02-02 09:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.21s\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.20s\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.20s\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.19s\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-02 09:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.20s\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.19s\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.19s\n2026-02-02 09:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.18s\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.21s\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.19s\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.20s\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.20s\n2026-02-02 09:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.20s\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.19s\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.22s\n2026-02-02 09:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 09:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-02 09:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 09:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.19s\n2026-02-02 09:19:53 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 09:19:53 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 09:19:53 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "78be21ce", "executed_at": "2026-02-02T08:16:54.927356", "status": "success", "exit_code": 0, "duration_seconds": 182.469738, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 66条, 事实表新增: 0条, 事实表更新: 0条\n 维表: dim_store_goods: +0, ~66\n【错误】2026-02-02 08:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 08:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0; 2026-02-02 08:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 06:16:54 --window-end 2026-02-02 08:16:54\n2026-02-02 08:16:55 [INFO] etl_billiards: 配置加载完成\n2026-02-02 08:16:55 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 08:16:55 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 08:16:55 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=741a786d9149476eac23c265e8cf5cba\n2026-02-02 08:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7628-20260202-081655\n2026-02-02 08:16:55 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 08:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:16:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 08:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7629-20260202-081656\n2026-02-02 08:16:56 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 08:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 08:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7630-20260202-081656\n2026-02-02 08:16:56 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 08:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:16:57 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 08:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7631-20260202-081657\n2026-02-02 08:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00] 未发现需要抓取的小票\n2026-02-02 08:16:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 08:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7632-20260202-081658\n2026-02-02 08:16:58 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 08:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 08:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7633-20260202-081659\n2026-02-02 08:16:59 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 08:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:16:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 08:16:59 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7634-20260202-081659\n2026-02-02 08:16:59 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 08:16:59 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:17:01 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 08:17:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7635-20260202-081701\n2026-02-02 08:17:01 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 08:17:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:17:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 08:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7636-20260202-081702\n2026-02-02 08:17:02 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 08:17:02 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:17:02 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 70, 'updated': 0, 'skipped': 102, 'errors': 0}\n2026-02-02 08:17:02 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7637-20260202-081702\n2026-02-02 08:17:02 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 08:17:02 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:17:23 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10022, 'inserted': 0, 'updated': 0, 'skipped': 10022, 'errors': 0}\n2026-02-02 08:17:24 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7638-20260202-081724\n2026-02-02 08:17:24 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 08:17:24 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:17:31 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1777, 'inserted': 0, 'updated': 0, 'skipped': 1777, 'errors': 0}\n2026-02-02 08:17:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7639-20260202-081731\n2026-02-02 08:17:31 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 08:17:31 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:00 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2450, 'inserted': 0, 'updated': 0, 'skipped': 2450, 'errors': 0}\n2026-02-02 08:18:00 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7640-20260202-081800\n2026-02-02 08:18:00 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 08:18:00 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:01 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-02 08:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7641-20260202-081801\n2026-02-02 08:18:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 08:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 08:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7642-20260202-081802\n2026-02-02 08:18:02 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 08:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 08:18:02 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7643-20260202-081802\n2026-02-02 08:18:02 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 08:18:02 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:03 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 08:18:03 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7644-20260202-081803\n2026-02-02 08:18:03 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 08:18:03 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 08:18:04 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7645-20260202-081804\n2026-02-02 08:18:04 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 08:18:04 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:42 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 08:18:42 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7646-20260202-081842\n2026-02-02 08:18:42 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 08:18:42 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:18:42 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 08:18:42 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7647-20260202-081842\n2026-02-02 08:18:42 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 08:18:42 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:19:20 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8119, 'inserted': 0, 'updated': 0, 'skipped': 8119, 'errors': 0}\n2026-02-02 08:19:21 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7648-20260202-081921\n2026-02-02 08:19:21 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 08:19:21 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:19:46 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11795, 'inserted': 0, 'updated': 0, 'skipped': 11795, 'errors': 0}\n2026-02-02 08:19:46 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7649-20260202-081946\n2026-02-02 08:19:46 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 08:19:46 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:19:46 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 08:19:46 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7650-20260202-081946\n2026-02-02 08:19:46 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 08:19:46 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:19:47 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 08:19:47 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 08:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7651-20260202-081947\n2026-02-02 08:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 08:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7651-20260202-081947\n2026-02-02 08:19:47 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 04:16:54+08:00 ~ 2026-02-02 10:16:54+08:00]\n2026-02-02 08:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.36s\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.49s\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.20s\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.18s\n2026-02-02 08:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.20s\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.24s\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.22s\n2026-02-02 08:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 08:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.37s\n2026-02-02 08:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 08:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.57s\n2026-02-02 08:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 08:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.21s\n2026-02-02 08:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.20s\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.26s\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.26s\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.18s\n2026-02-02 08:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.20s\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.18s\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.23s\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.23s\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.22s\n2026-02-02 08:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.22s\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.21s\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.21s\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.21s\n2026-02-02 08:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.26s\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.21s\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.21s\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.20s\n2026-02-02 08:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.20s\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.20s\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.21s\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.22s\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.22s\n2026-02-02 08:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.23s\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.22s\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.24s\n2026-02-02 08:19:56 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 08:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.20s\n2026-02-02 08:19:57 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 08:19:57 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.20s\n2026-02-02 08:19:57 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 66, 'skipped': 106}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 58, 'skipped': 114}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 08:19:57 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 08:19:57 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "122f9128", "executed_at": "2026-02-02T07:16:54.548199", "status": "success", "exit_code": 0, "duration_seconds": 172.430074, "summary": "【错误】2026-02-02 07:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 07:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1; 2026-02-02 07:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 05:16:54 --window-end 2026-02-02 07:16:54\n2026-02-02 07:16:54 [INFO] etl_billiards: 配置加载完成\n2026-02-02 07:16:54 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 07:16:54 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 07:16:55 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=820216bf246349889a79af066b3d7673\n2026-02-02 07:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7604-20260202-071655\n2026-02-02 07:16:55 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 07:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 07:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7605-20260202-071655\n2026-02-02 07:16:55 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 07:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 07:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7606-20260202-071656\n2026-02-02 07:16:56 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 07:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 07:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7607-20260202-071657\n2026-02-02 07:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00] 未发现需要抓取的小票\n2026-02-02 07:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 07:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7608-20260202-071657\n2026-02-02 07:16:57 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 07:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 07:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7609-20260202-071658\n2026-02-02 07:16:58 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 07:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 07:16:58 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7610-20260202-071658\n2026-02-02 07:16:58 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 07:16:58 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:00 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 07:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7611-20260202-071700\n2026-02-02 07:17:00 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 07:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 07:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7612-20260202-071701\n2026-02-02 07:17:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 07:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:01 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 07:17:02 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7613-20260202-071701\n2026-02-02 07:17:02 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 07:17:02 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:20 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10159, 'inserted': 0, 'updated': 0, 'skipped': 10159, 'errors': 0}\n2026-02-02 07:17:20 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7614-20260202-071720\n2026-02-02 07:17:20 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 07:17:20 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:27 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1789, 'inserted': 0, 'updated': 0, 'skipped': 1789, 'errors': 0}\n2026-02-02 07:17:27 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7615-20260202-071727\n2026-02-02 07:17:27 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 07:17:27 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:54 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2479, 'inserted': 0, 'updated': 0, 'skipped': 2479, 'errors': 0}\n2026-02-02 07:17:54 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7616-20260202-071754\n2026-02-02 07:17:54 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 07:17:54 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:54 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-02 07:17:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7617-20260202-071754\n2026-02-02 07:17:54 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 07:17:54 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:55 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 07:17:55 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7618-20260202-071755\n2026-02-02 07:17:55 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 07:17:55 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:55 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 07:17:56 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7619-20260202-071756\n2026-02-02 07:17:56 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 07:17:56 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:56 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 07:17:56 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7620-20260202-071756\n2026-02-02 07:17:56 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 07:17:56 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:17:57 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 07:17:57 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7621-20260202-071757\n2026-02-02 07:17:57 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 07:17:57 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:18:36 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 07:18:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7622-20260202-071836\n2026-02-02 07:18:36 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 07:18:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:18:36 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 7, 'inserted': 0, 'updated': 0, 'skipped': 7, 'errors': 0}\n2026-02-02 07:18:37 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7623-20260202-071837\n2026-02-02 07:18:37 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 07:18:37 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:19:13 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8250, 'inserted': 0, 'updated': 0, 'skipped': 8250, 'errors': 0}\n2026-02-02 07:19:13 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7624-20260202-071913\n2026-02-02 07:19:13 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 07:19:13 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:19:36 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11962, 'inserted': 0, 'updated': 0, 'skipped': 11962, 'errors': 0}\n2026-02-02 07:19:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7625-20260202-071937\n2026-02-02 07:19:37 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 07:19:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:19:37 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 5, 'inserted': 0, 'updated': 0, 'skipped': 5, 'errors': 0}\n2026-02-02 07:19:37 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7626-20260202-071937\n2026-02-02 07:19:37 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 07:19:37 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:19:38 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 07:19:38 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 07:19:38 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7627-20260202-071938\n2026-02-02 07:19:38 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 07:19:38 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7627-20260202-071938\n2026-02-02 07:19:38 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 03:16:54+08:00 ~ 2026-02-02 09:16:54+08:00]\n2026-02-02 07:19:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 07:19:38 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.37s\n2026-02-02 07:19:38 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.42s\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.17s\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.16s\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.17s\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.19s\n2026-02-02 07:19:39 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 07:19:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.23s\n2026-02-02 07:19:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 07:19:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-02 07:19:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 07:19:40 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.34s\n2026-02-02 07:19:40 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.54s\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.19s\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.18s\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.19s\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.19s\n2026-02-02 07:19:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.16s\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.16s\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.16s\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.21s\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.21s\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.20s\n2026-02-02 07:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.20s\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.19s\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.18s\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.19s\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-02 07:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.19s\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.18s\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.18s\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.19s\n2026-02-02 07:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.19s\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.19s\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.19s\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.19s\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.19s\n2026-02-02 07:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.18s\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.19s\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.22s\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.18s\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.18s\n2026-02-02 07:19:46 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 07:19:46 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 07:19:46 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "5f89d5b2", "executed_at": "2026-02-02T06:16:54.223623", "status": "success", "exit_code": 0, "duration_seconds": 177.257074, "summary": "【错误】2026-02-02 06:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 06:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1; 2026-02-02 06:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 04:16:54 --window-end 2026-02-02 06:16:54\n2026-02-02 06:16:54 [INFO] etl_billiards: 配置加载完成\n2026-02-02 06:16:54 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 06:16:54 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 06:16:54 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=65fa4d91cff94ec6ae937eab98bfc1fa\n2026-02-02 06:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7580-20260202-061654\n2026-02-02 06:16:54 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 06:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 06:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7581-20260202-061655\n2026-02-02 06:16:55 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 06:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:16:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 06:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7582-20260202-061656\n2026-02-02 06:16:56 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 06:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 06:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7583-20260202-061657\n2026-02-02 06:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00] 未发现需要抓取的小票\n2026-02-02 06:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 06:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7584-20260202-061657\n2026-02-02 06:16:57 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 06:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:16:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 06:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7585-20260202-061658\n2026-02-02 06:16:58 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 06:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 06:16:58 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7586-20260202-061658\n2026-02-02 06:16:58 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 06:16:58 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:00 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 06:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7587-20260202-061700\n2026-02-02 06:17:00 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 06:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 06:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7588-20260202-061701\n2026-02-02 06:17:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 06:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:02 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 06:17:02 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7589-20260202-061702\n2026-02-02 06:17:02 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 06:17:02 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:22 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10159, 'inserted': 0, 'updated': 0, 'skipped': 10159, 'errors': 0}\n2026-02-02 06:17:22 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7590-20260202-061722\n2026-02-02 06:17:22 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 06:17:22 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:29 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1789, 'inserted': 0, 'updated': 0, 'skipped': 1789, 'errors': 0}\n2026-02-02 06:17:29 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7591-20260202-061729\n2026-02-02 06:17:29 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 06:17:29 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:55 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2479, 'inserted': 0, 'updated': 0, 'skipped': 2479, 'errors': 0}\n2026-02-02 06:17:56 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7592-20260202-061756\n2026-02-02 06:17:56 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 06:17:56 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:56 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-02 06:17:56 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7593-20260202-061756\n2026-02-02 06:17:56 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 06:17:56 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:56 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 06:17:57 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7594-20260202-061757\n2026-02-02 06:17:57 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 06:17:57 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:57 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 06:17:58 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7595-20260202-061758\n2026-02-02 06:17:58 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 06:17:58 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:58 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 06:17:58 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7596-20260202-061758\n2026-02-02 06:17:58 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 06:17:58 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:17:59 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 06:17:59 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7597-20260202-061759\n2026-02-02 06:17:59 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 06:17:59 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:18:38 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 06:18:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7598-20260202-061838\n2026-02-02 06:18:38 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 06:18:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:18:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 7, 'inserted': 0, 'updated': 0, 'skipped': 7, 'errors': 0}\n2026-02-02 06:18:38 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7599-20260202-061838\n2026-02-02 06:18:38 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 06:18:38 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:19:16 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8250, 'inserted': 0, 'updated': 0, 'skipped': 8250, 'errors': 0}\n2026-02-02 06:19:16 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7600-20260202-061916\n2026-02-02 06:19:16 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 06:19:16 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:19:39 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11962, 'inserted': 0, 'updated': 0, 'skipped': 11962, 'errors': 0}\n2026-02-02 06:19:39 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7601-20260202-061939\n2026-02-02 06:19:39 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 06:19:39 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:19:40 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 5, 'inserted': 0, 'updated': 0, 'skipped': 5, 'errors': 0}\n2026-02-02 06:19:40 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7602-20260202-061940\n2026-02-02 06:19:40 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 06:19:40 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:19:41 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 06:19:41 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 06:19:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7603-20260202-061941\n2026-02-02 06:19:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 06:19:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7603-20260202-061941\n2026-02-02 06:19:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 02:16:54+08:00 ~ 2026-02-02 08:16:54+08:00]\n2026-02-02 06:19:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 06:19:41 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.38s\n2026-02-02 06:19:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.53s\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.22s\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.20s\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.20s\n2026-02-02 06:19:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.21s\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.27s\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.25s\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.36s\n2026-02-02 06:19:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 06:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.58s\n2026-02-02 06:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 06:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.21s\n2026-02-02 06:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 06:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.21s\n2026-02-02 06:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.23s\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.24s\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.19s\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.19s\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 06:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.19s\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.24s\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.24s\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.23s\n2026-02-02 06:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.22s\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.22s\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.23s\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.23s\n2026-02-02 06:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.28s\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.23s\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.22s\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.21s\n2026-02-02 06:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.22s\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.26s\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.23s\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.23s\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.23s\n2026-02-02 06:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.22s\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.22s\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.22s\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.25s\n2026-02-02 06:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 06:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.21s\n2026-02-02 06:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 06:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.22s\n2026-02-02 06:19:51 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 06:19:51 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 06:19:51 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "712b956f", "executed_at": "2026-02-02T05:16:53.863413", "status": "success", "exit_code": 0, "duration_seconds": 181.977561, "summary": "【错误】2026-02-02 05:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 05:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1; 2026-02-02 05:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 03:16:53 --window-end 2026-02-02 05:16:53\n2026-02-02 05:16:54 [INFO] etl_billiards: 配置加载完成\n2026-02-02 05:16:54 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 05:16:54 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 05:16:54 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=06ffd41655e6498bb8518c7e11618494\n2026-02-02 05:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7556-20260202-051654\n2026-02-02 05:16:54 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 05:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:16:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 05:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7557-20260202-051655\n2026-02-02 05:16:55 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 05:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 05:16:55 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7558-20260202-051655\n2026-02-02 05:16:55 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 05:16:55 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 05:16:56 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7559-20260202-051656\n2026-02-02 05:16:56 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00] 未发现需要抓取的小票\n2026-02-02 05:16:57 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 05:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7560-20260202-051657\n2026-02-02 05:16:57 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 05:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 05:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7561-20260202-051658\n2026-02-02 05:16:58 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 05:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:16:58 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 05:16:58 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7562-20260202-051658\n2026-02-02 05:16:58 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 05:16:58 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:00 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 05:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7563-20260202-051700\n2026-02-02 05:17:00 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 05:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 10, 'inserted': 0, 'updated': 0, 'skipped': 10, 'errors': 0}\n2026-02-02 05:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7564-20260202-051701\n2026-02-02 05:17:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 05:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:02 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 05:17:02 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7565-20260202-051702\n2026-02-02 05:17:02 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 05:17:02 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:22 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10159, 'inserted': 0, 'updated': 0, 'skipped': 10159, 'errors': 0}\n2026-02-02 05:17:23 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7566-20260202-051723\n2026-02-02 05:17:23 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 05:17:23 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:30 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1789, 'inserted': 0, 'updated': 0, 'skipped': 1789, 'errors': 0}\n2026-02-02 05:17:30 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7567-20260202-051730\n2026-02-02 05:17:30 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 05:17:30 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:56 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2479, 'inserted': 0, 'updated': 0, 'skipped': 2479, 'errors': 0}\n2026-02-02 05:17:56 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7568-20260202-051756\n2026-02-02 05:17:56 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 05:17:56 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:56 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-02 05:17:57 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7569-20260202-051757\n2026-02-02 05:17:57 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 05:17:57 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:57 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 05:17:57 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7570-20260202-051757\n2026-02-02 05:17:57 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 05:17:57 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:58 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 05:17:58 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7571-20260202-051758\n2026-02-02 05:17:58 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 05:17:58 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:17:58 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 05:17:59 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7572-20260202-051759\n2026-02-02 05:17:59 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 05:17:59 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:18:00 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-02 05:18:00 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7573-20260202-051800\n2026-02-02 05:18:00 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 05:18:00 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:18:40 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 05:18:41 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7574-20260202-051841\n2026-02-02 05:18:41 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 05:18:41 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:18:41 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 13, 'inserted': 0, 'updated': 0, 'skipped': 13, 'errors': 0}\n2026-02-02 05:18:41 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7575-20260202-051841\n2026-02-02 05:18:41 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 05:18:41 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:19:19 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8250, 'inserted': 0, 'updated': 0, 'skipped': 8250, 'errors': 0}\n2026-02-02 05:19:19 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7576-20260202-051919\n2026-02-02 05:19:19 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 05:19:19 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:19:43 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11962, 'inserted': 0, 'updated': 0, 'skipped': 11962, 'errors': 0}\n2026-02-02 05:19:43 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7577-20260202-051943\n2026-02-02 05:19:43 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 05:19:43 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:19:44 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 10, 'inserted': 0, 'updated': 0, 'skipped': 10, 'errors': 0}\n2026-02-02 05:19:44 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7578-20260202-051944\n2026-02-02 05:19:44 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 05:19:44 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:19:45 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 05:19:45 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 05:19:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7579-20260202-051945\n2026-02-02 05:19:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 05:19:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7579-20260202-051945\n2026-02-02 05:19:45 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 01:16:53+08:00 ~ 2026-02-02 07:16:53+08:00]\n2026-02-02 05:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 05:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.42s\n2026-02-02 05:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.51s\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.22s\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.21s\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.21s\n2026-02-02 05:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.22s\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.26s\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.24s\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.37s\n2026-02-02 05:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 05:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.60s\n2026-02-02 05:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 05:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.22s\n2026-02-02 05:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.22s\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.24s\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.23s\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.20s\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.21s\n2026-02-02 05:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.21s\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.26s\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.29s\n2026-02-02 05:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.26s\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.23s\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.23s\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.24s\n2026-02-02 05:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.24s\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.29s\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.23s\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.22s\n2026-02-02 05:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.22s\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.23s\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.23s\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.24s\n2026-02-02 05:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.24s\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.24s\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.24s\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.23s\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.23s\n2026-02-02 05:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 05:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.26s\n2026-02-02 05:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 05:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.22s\n2026-02-02 05:19:55 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 05:19:55 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.22s\n2026-02-02 05:19:55 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 05:19:55 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 05:19:55 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "b1d05764", "executed_at": "2026-02-02T04:16:53.349381", "status": "success", "exit_code": 0, "duration_seconds": 181.269416, "summary": "【DWD 装载】维表新增: 0条, 维表更新: 18条, 事实表新增: 36条, 事实表更新: 0条\n 维表: dim_table: +0, ~6, dim_assistant: +0, ~5, dim_member: +0, ~2, dim_store_goods: +0, ~5\n 事实表: dwd_settlement_head: +5, ~0, dwd_table_fee_log: +7, ~0, dwd_table_fee_adjust: +4, ~0, dwd_assistant_service_log: +9, ~0, dwd_member_balance_change: +4, ~0, dwd_recharge_order: +1, ~0, dwd_payment: +6, ~0\n【错误】2026-02-02 04:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 04:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1; 2026-02-02 04:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 02:16:53 --window-end 2026-02-02 04:16:53\n2026-02-02 04:16:53 [INFO] etl_billiards: 配置加载完成\n2026-02-02 04:16:53 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 04:16:53 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 04:16:54 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=218ed57fad4947a0a7d7f808018b2b80\n2026-02-02 04:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7532-20260202-041654\n2026-02-02 04:16:54 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 04:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:16:54 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 04:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7533-20260202-041655\n2026-02-02 04:16:55 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 04:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:16:55 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 04:16:55 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7534-20260202-041655\n2026-02-02 04:16:55 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 04:16:55 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:16:56 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 04:16:56 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7535-20260202-041656\n2026-02-02 04:16:56 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:16:56 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00] 未发现需要抓取的小票\n2026-02-02 04:16:56 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 04:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7536-20260202-041657\n2026-02-02 04:16:57 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 04:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:16:57 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 04:16:57 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7537-20260202-041657\n2026-02-02 04:16:57 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 04:16:57 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:16:57 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 04:16:58 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7538-20260202-041658\n2026-02-02 04:16:58 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 04:16:58 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:00 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 2, 'updated': 0, 'skipped': 554, 'errors': 0}\n2026-02-02 04:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7539-20260202-041700\n2026-02-02 04:17:00 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 04:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:00 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 10, 'inserted': 9, 'updated': 0, 'skipped': 1, 'errors': 0}\n2026-02-02 04:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7540-20260202-041701\n2026-02-02 04:17:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 04:17:01 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:01 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 5, 'updated': 0, 'skipped': 167, 'errors': 0}\n2026-02-02 04:17:02 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7541-20260202-041702\n2026-02-02 04:17:02 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 04:17:02 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:22 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10159, 'inserted': 7, 'updated': 0, 'skipped': 10152, 'errors': 0}\n2026-02-02 04:17:22 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7542-20260202-041722\n2026-02-02 04:17:22 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 04:17:22 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:29 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1789, 'inserted': 4, 'updated': 0, 'skipped': 1785, 'errors': 0}\n2026-02-02 04:17:29 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7543-20260202-041729\n2026-02-02 04:17:29 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 04:17:29 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:57 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2479, 'inserted': 4, 'updated': 0, 'skipped': 2475, 'errors': 0}\n2026-02-02 04:17:57 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7544-20260202-041757\n2026-02-02 04:17:57 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 04:17:57 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:57 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 6, 'updated': 0, 'skipped': 68, 'errors': 0}\n2026-02-02 04:17:58 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7545-20260202-041758\n2026-02-02 04:17:58 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 04:17:58 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:58 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 04:17:58 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7546-20260202-041758\n2026-02-02 04:17:58 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 04:17:58 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:59 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 4, 'updated': 0, 'skipped': 168, 'errors': 0}\n2026-02-02 04:17:59 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7547-20260202-041759\n2026-02-02 04:17:59 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 04:17:59 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:17:59 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 04:18:00 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7548-20260202-041800\n2026-02-02 04:18:00 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 04:18:00 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:18:01 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 5, 'updated': 0, 'skipped': 64, 'errors': 0}\n2026-02-02 04:18:01 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7549-20260202-041801\n2026-02-02 04:18:01 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 04:18:01 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:18:40 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 04:18:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7550-20260202-041840\n2026-02-02 04:18:40 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 04:18:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:18:40 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 18, 'inserted': 6, 'updated': 0, 'skipped': 12, 'errors': 0}\n2026-02-02 04:18:40 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7551-20260202-041840\n2026-02-02 04:18:40 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 04:18:40 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:19:18 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8250, 'inserted': 0, 'updated': 0, 'skipped': 8250, 'errors': 0}\n2026-02-02 04:19:18 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7552-20260202-041918\n2026-02-02 04:19:18 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 04:19:18 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:19:42 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11962, 'inserted': 6, 'updated': 0, 'skipped': 11956, 'errors': 0}\n2026-02-02 04:19:42 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7553-20260202-041942\n2026-02-02 04:19:42 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 04:19:42 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:19:42 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 12, 'inserted': 5, 'updated': 0, 'skipped': 7, 'errors': 0}\n2026-02-02 04:19:43 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7554-20260202-041943\n2026-02-02 04:19:43 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 04:19:43 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:19:43 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 04:19:43 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 整数超出范围\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.NumericValueOutOfRange: 错误: 整数超出范围\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7555-20260202-041944\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7555-20260202-041944\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-02 00:16:53+08:00 ~ 2026-02-02 06:16:53+08:00]\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.39s\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.46s\n2026-02-02 04:19:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.27s\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.26s\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.25s\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.26s\n2026-02-02 04:19:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 04:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.31s\n2026-02-02 04:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 04:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.28s\n2026-02-02 04:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 04:19:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.41s\n2026-02-02 04:19:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 04:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.57s\n2026-02-02 04:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 04:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.21s\n2026-02-02 04:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 04:19:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.23s\n2026-02-02 04:19:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.29s\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.29s\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.19s\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.19s\n2026-02-02 04:19:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.19s\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.25s\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.25s\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.24s\n2026-02-02 04:19:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.23s\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.22s\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.22s\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.23s\n2026-02-02 04:19:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.23s\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.28s\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.23s\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.23s\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.21s\n2026-02-02 04:19:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.22s\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.22s\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.23s\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.23s\n2026-02-02 04:19:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.23s\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.23s\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.22s\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.23s\n2026-02-02 04:19:53 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 04:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.25s\n2026-02-02 04:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 04:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.21s\n2026-02-02 04:19:54 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 04:19:54 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.21s\n2026-02-02 04:19:54 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 6, 'skipped': 68}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 5, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 5, 'skipped': 64}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 5, 'skipped': 64}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 2, 'skipped': 554}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 2, 'skipped': 554}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 5, 'skipped': 167}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 5, 'skipped': 167}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 5, 'updated': 0, 'processed': 5}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 7, 'updated': 0, 'processed': 7}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 9, 'updated': 0, 'processed': 9}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 9, 'updated': 0, 'processed': 9}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 4, 'updated': 0, 'processed': 4}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 6, 'updated': 0, 'processed': 6}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 04:19:54 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 04:19:54 [INFO] etl_billiards: ETL运行完成\n", "error": "" }, { "task_id": "b3edf6e8", "executed_at": "2026-02-02T03:15:55.288621", "status": "success", "exit_code": 0, "duration_seconds": 194.682314, "summary": "【错误】2026-02-02 03:15:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-02 03:15:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1; 2026-02-02 03:15:57 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,\n【结果】✓ etl_billiards: ETL运行完成", "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_TENANT_GOODS,ODS_SETTLEMENT_TICKET,ODS_GROUP_PACKAGE,ODS_ASSISTANT_ABOLISH,ODS_MEMBER,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS,ODS_TABLE_USE,ODS_TABLE_FEE_DISCOUNT,ODS_MEMBER_BALANCE,ODS_TABLES,ODS_STORE_GOODS_SALES,ODS_INVENTORY_STOCK,ODS_REFUND,ODS_ASSISTANT_ACCOUNT,ODS_PLATFORM_COUPON,ODS_INVENTORY_CHANGE,ODS_GROUP_BUY_REDEMPTION,ODS_PAYMENT,ODS_SETTLEMENT_RECORDS,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-02 01:15:55 --window-end 2026-02-02 03:15:55\n2026-02-02 03:15:55 [INFO] etl_billiards: 配置加载完成\n2026-02-02 03:15:55 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-02 03:15:55 [INFO] etl_billiards: 任务列表: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-02 03:15:55 [INFO] etl_billiards: 开始运行任务: ['ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_TENANT_GOODS', 'ODS_SETTLEMENT_TICKET', 'ODS_GROUP_PACKAGE', 'ODS_ASSISTANT_ABOLISH', 'ODS_MEMBER', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_MEMBER_BALANCE', 'ODS_TABLES', 'ODS_STORE_GOODS_SALES', 'ODS_INVENTORY_STOCK', 'ODS_REFUND', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PLATFORM_COUPON', 'ODS_INVENTORY_CHANGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_PAYMENT', 'ODS_SETTLEMENT_RECORDS', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=25ea68a0cad7475facb2f3f2de262d3f\n2026-02-02 03:15:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7508-20260202-031555\n2026-02-02 03:15:55 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-02 03:15:55 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:15:56 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-02 03:15:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7509-20260202-031556\n2026-02-02 03:15:56 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-02 03:15:56 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:15:57 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 03:15:57 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7510-20260202-031557\n2026-02-02 03:15:57 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-02 03:15:57 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:15:57 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-02 03:15:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7511-20260202-031558\n2026-02-02 03:15:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:15:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00] 未发现需要抓取的小票\n2026-02-02 03:15:58 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-02 03:15:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7512-20260202-031558\n2026-02-02 03:15:58 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-02 03:15:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:15:58 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 03:15:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7513-20260202-031559\n2026-02-02 03:15:59 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-02 03:15:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:15:59 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 03:15:59 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7514-20260202-031559\n2026-02-02 03:15:59 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-02 03:15:59 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:16:01 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-02 03:16:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7515-20260202-031601\n2026-02-02 03:16:01 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-02 03:16:01 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:16:02 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 4, 'inserted': 0, 'updated': 0, 'skipped': 4, 'errors': 0}\n2026-02-02 03:16:02 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7516-20260202-031602\n2026-02-02 03:16:02 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-02 03:16:02 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:16:03 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 0, 'updated': 0, 'skipped': 172, 'errors': 0}\n2026-02-02 03:16:03 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7517-20260202-031603\n2026-02-02 03:16:03 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-02 03:16:03 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:16:25 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10152, 'inserted': 0, 'updated': 0, 'skipped': 10152, 'errors': 0}\n2026-02-02 03:16:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7518-20260202-031625\n2026-02-02 03:16:25 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-02 03:16:25 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:16:32 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1785, 'inserted': 0, 'updated': 0, 'skipped': 1785, 'errors': 0}\n2026-02-02 03:16:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7519-20260202-031632\n2026-02-02 03:16:32 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-02 03:16:32 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:00 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2475, 'inserted': 0, 'updated': 0, 'skipped': 2475, 'errors': 0}\n2026-02-02 03:17:00 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7520-20260202-031700\n2026-02-02 03:17:00 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-02 03:17:00 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:01 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 0, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-02 03:17:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7521-20260202-031701\n2026-02-02 03:17:01 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-02 03:17:01 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:02 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-02 03:17:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7522-20260202-031702\n2026-02-02 03:17:02 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-02 03:17:02 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:03 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 1, 'updated': 0, 'skipped': 171, 'errors': 0}\n2026-02-02 03:17:03 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7523-20260202-031703\n2026-02-02 03:17:03 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-02 03:17:03 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:04 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-02 03:17:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7524-20260202-031704\n2026-02-02 03:17:04 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-02 03:17:04 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:06 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 1, 'updated': 0, 'skipped': 68, 'errors': 0}\n2026-02-02 03:17:06 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7525-20260202-031706\n2026-02-02 03:17:06 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-02 03:17:06 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:49 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17473, 'inserted': 0, 'updated': 0, 'skipped': 17473, 'errors': 0}\n2026-02-02 03:17:49 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7526-20260202-031749\n2026-02-02 03:17:49 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-02 03:17:49 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:17:49 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 19, 'inserted': 1, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-02 03:17:49 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7527-20260202-031749\n2026-02-02 03:17:49 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-02 03:17:49 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:18:31 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8250, 'inserted': 0, 'updated': 0, 'skipped': 8250, 'errors': 0}\n2026-02-02 03:18:31 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7528-20260202-031831\n2026-02-02 03:18:31 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-02 03:18:31 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:18:58 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11956, 'inserted': 0, 'updated': 0, 'skipped': 11956, 'errors': 0}\n2026-02-02 03:18:58 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7529-20260202-031858\n2026-02-02 03:18:58 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-02 03:18:58 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:18:58 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 15, 'inserted': 0, 'updated': 0, 'skipped': 15, 'errors': 0}\n2026-02-02 03:18:58 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7530-20260202-031858\n2026-02-02 03:18:58 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-02 03:18:58 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:19:00 [ERROR] etl_billiards: ODS_MEMBER_CARD ODS 任务失败\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.DatatypeMismatch: 错误: 字段 \"able_share_member_discount\" 的类型为 boolean, 但表达式的类型为 integer\nLINE 1: ...9df46f9b236457e1d44e86ab2d7e0d93209dc530a51998e5',1,100.0,10...\n ^\nHINT: 你需要重写或转换表达式\n2026-02-02 03:19:00 [ERROR] etl_billiards: 任务 ODS_MEMBER_CARD 失败: 错误: 字段 \"able_share_member_discount\" 的类型为 boolean, 但表达式的类型为 integer\nLINE 1: ...9df46f9b236457e1d44e86ab2d7e0d93209dc530a51998e5',1,100.0,10...\n ^\nHINT: 你需要重写或转换表达式\nTraceback (most recent call last):\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 112, in run_tasks\n self._run_single_task(task_code, run_uuid, store_id)\n ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 168, in _run_single_task\n result, _ = self._execute_ods_record_and_load(task_code, cursor_data, fetch_dir, run_id)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\orchestration\\scheduler.py\", line 297, in _execute_ods_record_and_load\n result = task.execute(cursor_data)\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 124, in execute\n inserted, skipped = self._insert_records_schema_aware(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n table=spec.table_name,\n ^^^^^^^^^^^^^^^^^^^^^^\n ...<3 lines>...\n source_endpoint=spec.endpoint if spec.include_source_endpoint else None,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\\tasks\\ods_tasks.py\", line 462, in _insert_records_schema_aware\n execute_values(cur, sql, chunk, page_size=len(chunk))\n ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\ProgramData\\miniconda3\\Lib\\site-packages\\psycopg2\\extras.py\", line 1299, in execute_values\n cur.execute(b''.join(parts))\n ~~~~~~~~~~~^^^^^^^^^^^^^^^^^\npsycopg2.errors.DatatypeMismatch: 错误: 字段 \"able_share_member_discount\" 的类型为 boolean, 但表达式的类型为 integer\nLINE 1: ...9df46f9b236457e1d44e86ab2d7e0d93209dc530a51998e5',1,100.0,10...\n ^\nHINT: 你需要重写或转换表达式\n2026-02-02 03:19:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7531-20260202-031900\n2026-02-02 03:19:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-02 03:19:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7531-20260202-031900\n2026-02-02 03:19:00 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-01 23:15:55+08:00 ~ 2026-02-02 05:15:55+08:00]\n2026-02-02 03:19:00 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-02 03:19:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.38s\n2026-02-02 03:19:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-02 03:19:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.51s\n2026-02-02 03:19:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-02 03:19:01 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.17s\n2026-02-02 03:19:01 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.17s\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.23s\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.25s\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-02 03:19:02 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-02 03:19:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.33s\n2026-02-02 03:19:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-02 03:19:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.56s\n2026-02-02 03:19:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-02 03:19:03 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.20s\n2026-02-02 03:19:03 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.20s\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.21s\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.18s\n2026-02-02 03:19:04 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.17s\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.22s\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.23s\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.21s\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.21s\n2026-02-02 03:19:05 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.19s\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.21s\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.20s\n2026-02-02 03:19:06 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.24s\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.20s\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.19s\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.20s\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.19s\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.20s\n2026-02-02 03:19:07 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.20s\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.20s\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.20s\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.20s\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.20s\n2026-02-02 03:19:08 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.21s\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.22s\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.19s\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.19s\n2026-02-02 03:19:09 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 1, 'skipped': 68}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 0, 'skipped': 172}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-02 03:19:09 [INFO] etl_billiards: 所有任务执行完成\n2026-02-02 03:19:09 [INFO] etl_billiards: ETL运行完成\n", "error": "" } ], "created_at": "2026-02-02T03:15:21.512369", "updated_at": "2026-02-03T17:30:44.801339" } } }