{
  "tasks": {
    "8e41eb3a": {
      "id": "8e41eb3a",
      "name": "数据校验 (最近 2h)",
      "task_codes": [
        "DATA_INTEGRITY_CHECK"
      ],
      "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-01-27T22:13:11.204212",
      "next_run": "2026-01-27T23:13:11.204212",
      "run_count": 1,
      "last_status": "成功",
      "execution_history": [
        {
          "task_id": "0c577148",
          "executed_at": "2026-01-27T22:13:11.204212",
          "status": "success",
          "exit_code": 0,
          "duration_seconds": 378.080146,
          "summary": "【数据校验】检查 107799 条记录, 发现 133 条缺失, 已补全 114 条\n  缺失: ODS_SETTLEMENT_RECORDS: 缺失8/37; ODS_TABLE_USE: 缺失7/10020; ODS_PAYMENT: 缺失8/11849 等12项\n【错误】2026-01-27 22:19:29 [INFO] etl_billiards: 数据补全完成 总缺失=150 已补全=114 错误数=0; 2026-01-27 22:19:29 [INFO] etl_billiards: 自动补全完成 已补全=114 错误数=0\n【结果】✓ etl_billiards: DATA_INTEGRITY_CHECK: 工具类任务执行成功 | ✓ etl_billiards: ETL运行完成",
          "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks DATA_INTEGRITY_CHECK --pipeline-flow FULL --window-start 2026-01-27 20:13:11 --window-end 2026-01-27 22:13:11\n2026-01-27 22:13:11 [INFO] etl_billiards: 配置加载完成\n2026-01-27 22:13:11 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-01-27 22:13:11 [INFO] etl_billiards: 任务列表: ['DATA_INTEGRITY_CHECK']\n2026-01-27 22:13:12 [INFO] etl_billiards: 开始运行任务: ['DATA_INTEGRITY_CHECK'], run_uuid=7529523bada34ef8806b976f06eadd5c\n2026-01-27 22:13:12 [INFO] etl_billiards: DATA_INTEGRITY_CHECK: 开始执行工具类任务\n2026-01-27 22:13:12 [INFO] etl_billiards: 检测到 CLI 时间窗口参数，自动切换到 window 模式: 2026-01-27 20:13:11 ~ 2026-01-27 22:13:11\n2026-01-27 22:13:12 [INFO] etl_billiards: START range=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 window_days=0 window_hours=6 split_unit=none comp_hours=0 page_size=200 chunk_size=500\n2026-01-27 22:13:12 [INFO] etl_billiards: CHECK_START task=ODS_ASSISTANT_ACCOUNT table=billiards_ods.assistant_accounts_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:12 [INFO] etl_billiards: WINDOW_START task=ODS_ASSISTANT_ACCOUNT idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:13:13 [INFO] etl_billiards: WINDOW_DONE task=ODS_ASSISTANT_ACCOUNT idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=69 missing=0 skipped=0\n2026-01-27 22:13:13 [INFO] etl_billiards: CHECK_DONE task=ODS_ASSISTANT_ACCOUNT missing=0 records=69 errors=0\n2026-01-27 22:13:13 [INFO] etl_billiards: CHECK_START task=ODS_SETTLEMENT_RECORDS table=billiards_ods.settlement_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:13 [INFO] etl_billiards: WINDOW_START task=ODS_SETTLEMENT_RECORDS idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:13:13 [INFO] etl_billiards: WINDOW_DONE task=ODS_SETTLEMENT_RECORDS idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=37 missing=8 skipped=0\n2026-01-27 22:13:13 [INFO] etl_billiards: CHECK_DONE task=ODS_SETTLEMENT_RECORDS missing=8 records=37 errors=0\n2026-01-27 22:13:13 [INFO] etl_billiards: CHECK_START task=ODS_TABLE_USE table=billiards_ods.table_fee_transactions windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:13 [INFO] etl_billiards: WINDOW_START task=ODS_TABLE_USE idx=1 window=FULL\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_DONE task=ODS_TABLE_USE idx=1 window=FULL pages=51 records=10020 missing=7 skipped=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_DONE task=ODS_TABLE_USE missing=7 records=10020 errors=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_START task=ODS_ASSISTANT_LEDGER table=billiards_ods.assistant_service_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_START task=ODS_ASSISTANT_LEDGER idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_DONE task=ODS_ASSISTANT_LEDGER idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=4 missing=0 skipped=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_DONE task=ODS_ASSISTANT_LEDGER missing=0 records=4 errors=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_START task=ODS_ASSISTANT_ABOLISH table=billiards_ods.assistant_cancellation_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_START task=ODS_ASSISTANT_ABOLISH idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_DONE task=ODS_ASSISTANT_ABOLISH idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=0 missing=0 skipped=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_DONE task=ODS_ASSISTANT_ABOLISH missing=0 records=0 errors=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_START task=ODS_STORE_GOODS_SALES table=billiards_ods.store_goods_sales_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_START task=ODS_STORE_GOODS_SALES idx=1 window=FULL\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_DONE task=ODS_STORE_GOODS_SALES idx=1 window=FULL pages=1 records=0 missing=0 skipped=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_DONE task=ODS_STORE_GOODS_SALES missing=0 records=0 errors=0\n2026-01-27 22:13:27 [INFO] etl_billiards: CHECK_START task=ODS_PAYMENT table=billiards_ods.payment_transactions windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:27 [INFO] etl_billiards: WINDOW_START task=ODS_PAYMENT idx=1 window=FULL\n2026-01-27 22:13:49 [INFO] etl_billiards: WINDOW_DONE task=ODS_PAYMENT idx=1 window=FULL pages=60 records=11849 missing=8 skipped=0\n2026-01-27 22:13:49 [INFO] etl_billiards: CHECK_DONE task=ODS_PAYMENT missing=8 records=11849 errors=0\n2026-01-27 22:13:49 [INFO] etl_billiards: CHECK_START task=ODS_REFUND table=billiards_ods.refund_transactions windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:49 [INFO] etl_billiards: WINDOW_START task=ODS_REFUND idx=1 window=FULL\n2026-01-27 22:13:49 [INFO] etl_billiards: WINDOW_DONE task=ODS_REFUND idx=1 window=FULL pages=1 records=38 missing=0 skipped=0\n2026-01-27 22:13:49 [INFO] etl_billiards: CHECK_DONE task=ODS_REFUND missing=0 records=38 errors=0\n2026-01-27 22:13:49 [INFO] etl_billiards: CHECK_START task=ODS_PLATFORM_COUPON table=billiards_ods.platform_coupon_redemption_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:13:49 [INFO] etl_billiards: WINDOW_START task=ODS_PLATFORM_COUPON idx=1 window=FULL\n2026-01-27 22:14:20 [INFO] etl_billiards: WINDOW_DONE task=ODS_PLATFORM_COUPON idx=1 window=FULL pages=86 records=17083 missing=4 skipped=0\n2026-01-27 22:14:20 [INFO] etl_billiards: CHECK_DONE task=ODS_PLATFORM_COUPON missing=4 records=17083 errors=0\n2026-01-27 22:14:20 [INFO] etl_billiards: CHECK_START task=ODS_MEMBER table=billiards_ods.member_profiles windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:14:20 [INFO] etl_billiards: WINDOW_START task=ODS_MEMBER idx=1 window=FULL\n2026-01-27 22:14:22 [INFO] etl_billiards: WINDOW_DONE task=ODS_MEMBER idx=1 window=FULL pages=3 records=556 missing=0 skipped=0\n2026-01-27 22:14:22 [INFO] etl_billiards: CHECK_DONE task=ODS_MEMBER missing=0 records=556 errors=0\n2026-01-27 22:14:22 [INFO] etl_billiards: CHECK_START task=ODS_MEMBER_CARD table=billiards_ods.member_stored_value_cards windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:14:22 [INFO] etl_billiards: WINDOW_START task=ODS_MEMBER_CARD idx=1 window=FULL\n2026-01-27 22:14:24 [INFO] etl_billiards: WINDOW_DONE task=ODS_MEMBER_CARD idx=1 window=FULL pages=5 records=945 missing=0 skipped=0\n2026-01-27 22:14:24 [INFO] etl_billiards: CHECK_DONE task=ODS_MEMBER_CARD missing=0 records=945 errors=0\n2026-01-27 22:14:24 [INFO] etl_billiards: CHECK_START task=ODS_MEMBER_BALANCE table=billiards_ods.member_balance_changes windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:14:24 [INFO] etl_billiards: WINDOW_START task=ODS_MEMBER_BALANCE idx=1 window=FULL\n2026-01-27 22:14:49 [INFO] etl_billiards: WINDOW_DONE task=ODS_MEMBER_BALANCE idx=1 window=FULL pages=13 records=2480 missing=0 skipped=0\n2026-01-27 22:14:49 [INFO] etl_billiards: CHECK_DONE task=ODS_MEMBER_BALANCE missing=0 records=2480 errors=0\n2026-01-27 22:14:49 [INFO] etl_billiards: CHECK_START task=ODS_RECHARGE_SETTLE table=billiards_ods.recharge_settlements windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:14:49 [INFO] etl_billiards: WINDOW_START task=ODS_RECHARGE_SETTLE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:14:49 [INFO] etl_billiards: WINDOW_DONE task=ODS_RECHARGE_SETTLE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=0 missing=0 skipped=0\n2026-01-27 22:14:49 [INFO] etl_billiards: CHECK_DONE task=ODS_RECHARGE_SETTLE missing=0 records=0 errors=0\n2026-01-27 22:14:49 [INFO] etl_billiards: CHECK_START task=ODS_GROUP_PACKAGE table=billiards_ods.group_buy_packages windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:14:49 [INFO] etl_billiards: WINDOW_START task=ODS_GROUP_PACKAGE idx=1 window=FULL\n2026-01-27 22:14:50 [INFO] etl_billiards: WINDOW_DONE task=ODS_GROUP_PACKAGE idx=1 window=FULL pages=1 records=18 missing=0 skipped=0\n2026-01-27 22:14:50 [INFO] etl_billiards: CHECK_DONE task=ODS_GROUP_PACKAGE missing=0 records=18 errors=0\n2026-01-27 22:14:50 [INFO] etl_billiards: CHECK_START task=ODS_GROUP_BUY_REDEMPTION table=billiards_ods.group_buy_redemption_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:14:50 [INFO] etl_billiards: WINDOW_START task=ODS_GROUP_BUY_REDEMPTION idx=1 window=FULL\n2026-01-27 22:15:25 [INFO] etl_billiards: WINDOW_DONE task=ODS_GROUP_BUY_REDEMPTION idx=1 window=FULL pages=42 records=8224 missing=8 skipped=0\n2026-01-27 22:15:25 [INFO] etl_billiards: CHECK_DONE task=ODS_GROUP_BUY_REDEMPTION missing=8 records=8224 errors=0\n2026-01-27 22:15:25 [INFO] etl_billiards: CHECK_START task=ODS_INVENTORY_STOCK table=billiards_ods.goods_stock_summary windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:25 [INFO] etl_billiards: WINDOW_START task=ODS_INVENTORY_STOCK idx=1 window=FULL\n2026-01-27 22:15:25 [INFO] etl_billiards: WINDOW_DONE task=ODS_INVENTORY_STOCK idx=1 window=FULL pages=1 records=171 missing=0 skipped=0\n2026-01-27 22:15:25 [INFO] etl_billiards: CHECK_DONE task=ODS_INVENTORY_STOCK missing=0 records=171 errors=0\n2026-01-27 22:15:25 [INFO] etl_billiards: CHECK_START task=ODS_INVENTORY_CHANGE table=billiards_ods.goods_stock_movements windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:25 [INFO] etl_billiards: WINDOW_START task=ODS_INVENTORY_CHANGE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:15:25 [INFO] etl_billiards: WINDOW_DONE task=ODS_INVENTORY_CHANGE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=186 missing=98 skipped=0\n2026-01-27 22:15:25 [INFO] etl_billiards: CHECK_DONE task=ODS_INVENTORY_CHANGE missing=98 records=186 errors=0\n2026-01-27 22:15:25 [INFO] etl_billiards: CHECK_START task=ODS_TABLES table=billiards_ods.site_tables_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:25 [INFO] etl_billiards: WINDOW_START task=ODS_TABLES idx=1 window=FULL\n2026-01-27 22:15:26 [INFO] etl_billiards: WINDOW_DONE task=ODS_TABLES idx=1 window=FULL pages=1 records=74 missing=0 skipped=0\n2026-01-27 22:15:26 [INFO] etl_billiards: CHECK_DONE task=ODS_TABLES missing=0 records=74 errors=0\n2026-01-27 22:15:26 [INFO] etl_billiards: CHECK_START task=ODS_GOODS_CATEGORY table=billiards_ods.stock_goods_category_tree windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:26 [INFO] etl_billiards: WINDOW_START task=ODS_GOODS_CATEGORY idx=1 window=FULL\n2026-01-27 22:15:26 [INFO] etl_billiards: WINDOW_DONE task=ODS_GOODS_CATEGORY idx=1 window=FULL pages=1 records=9 missing=0 skipped=0\n2026-01-27 22:15:26 [INFO] etl_billiards: CHECK_DONE task=ODS_GOODS_CATEGORY missing=0 records=9 errors=0\n2026-01-27 22:15:26 [INFO] etl_billiards: CHECK_START task=ODS_STORE_GOODS table=billiards_ods.store_goods_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:26 [INFO] etl_billiards: WINDOW_START task=ODS_STORE_GOODS idx=1 window=FULL\n2026-01-27 22:15:26 [INFO] etl_billiards: WINDOW_DONE task=ODS_STORE_GOODS idx=1 window=FULL pages=1 records=171 missing=0 skipped=0\n2026-01-27 22:15:26 [INFO] etl_billiards: CHECK_DONE task=ODS_STORE_GOODS missing=0 records=171 errors=0\n2026-01-27 22:15:26 [INFO] etl_billiards: CHECK_START task=ODS_TABLE_FEE_DISCOUNT table=billiards_ods.table_fee_discount_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:26 [INFO] etl_billiards: WINDOW_START task=ODS_TABLE_FEE_DISCOUNT idx=1 window=FULL\n2026-01-27 22:15:32 [INFO] etl_billiards: WINDOW_DONE task=ODS_TABLE_FEE_DISCOUNT idx=1 window=FULL pages=9 records=1748 missing=0 skipped=0\n2026-01-27 22:15:32 [INFO] etl_billiards: CHECK_DONE task=ODS_TABLE_FEE_DISCOUNT missing=0 records=1748 errors=0\n2026-01-27 22:15:32 [INFO] etl_billiards: CHECK_START task=ODS_TENANT_GOODS table=billiards_ods.tenant_goods_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:32 [INFO] etl_billiards: WINDOW_START task=ODS_TENANT_GOODS idx=1 window=FULL\n2026-01-27 22:15:33 [INFO] etl_billiards: WINDOW_DONE task=ODS_TENANT_GOODS idx=1 window=FULL pages=1 records=172 missing=0 skipped=0\n2026-01-27 22:15:33 [INFO] etl_billiards: CHECK_DONE task=ODS_TENANT_GOODS missing=0 records=172 errors=0\n2026-01-27 22:15:33 [INFO] etl_billiards: CHECK_START task=ODS_SETTLEMENT_TICKET table=billiards_ods.settlement_ticket_details windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:33 [INFO] etl_billiards: WINDOW_START task=ODS_SETTLEMENT_TICKET idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:15:33 [INFO] etl_billiards: WINDOW_DONE task=ODS_SETTLEMENT_TICKET idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=37 missing=0 skipped=37\n2026-01-27 22:15:33 [INFO] etl_billiards: CHECK_DONE task=ODS_SETTLEMENT_TICKET missing=0 records=37 errors=0\n2026-01-27 22:15:42 [INFO] etl_billiards: 自动补全开始 起始=2026-01-27 20:13:11+08:00 结束=2026-01-27 22:13:11+08:00\n2026-01-27 22:15:43 [INFO] etl_billiards: 数据补全开始 起始=2026-01-27T20:13:11+08:00 结束=2026-01-27T22:13:11+08:00\n2026-01-27 22:15:43 [INFO] etl_billiards: 正在执行缺失检查...\n2026-01-27 22:15:43 [INFO] etl_billiards: START range=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 window_days=0 window_hours=2 split_unit=month comp_hours=2 page_size=200 chunk_size=500\n2026-01-27 22:15:43 [INFO] etl_billiards: CHECK_START task=ODS_ASSISTANT_ACCOUNT table=billiards_ods.assistant_accounts_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:43 [INFO] etl_billiards: WINDOW_START task=ODS_ASSISTANT_ACCOUNT idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:15:45 [INFO] etl_billiards: WINDOW_DONE task=ODS_ASSISTANT_ACCOUNT idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=69 missing=0 skipped=0\n2026-01-27 22:15:45 [INFO] etl_billiards: CHECK_DONE task=ODS_ASSISTANT_ACCOUNT missing=0 records=69 errors=0\n2026-01-27 22:15:45 [INFO] etl_billiards: CHECK_START task=ODS_SETTLEMENT_RECORDS table=billiards_ods.settlement_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:45 [INFO] etl_billiards: WINDOW_START task=ODS_SETTLEMENT_RECORDS idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:15:45 [INFO] etl_billiards: WINDOW_DONE task=ODS_SETTLEMENT_RECORDS idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=37 missing=8 skipped=0\n2026-01-27 22:15:45 [INFO] etl_billiards: CHECK_DONE task=ODS_SETTLEMENT_RECORDS missing=8 records=37 errors=0\n2026-01-27 22:15:45 [INFO] etl_billiards: CHECK_START task=ODS_TABLE_USE table=billiards_ods.table_fee_transactions windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:45 [INFO] etl_billiards: WINDOW_START task=ODS_TABLE_USE idx=1 window=FULL\n2026-01-27 22:15:58 [INFO] etl_billiards: WINDOW_DONE task=ODS_TABLE_USE idx=1 window=FULL pages=51 records=10020 missing=7 skipped=0\n2026-01-27 22:15:58 [INFO] etl_billiards: CHECK_DONE task=ODS_TABLE_USE missing=7 records=10020 errors=0\n2026-01-27 22:15:58 [INFO] etl_billiards: CHECK_START task=ODS_ASSISTANT_LEDGER table=billiards_ods.assistant_service_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:58 [INFO] etl_billiards: WINDOW_START task=ODS_ASSISTANT_LEDGER idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:15:59 [INFO] etl_billiards: WINDOW_DONE task=ODS_ASSISTANT_LEDGER idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=4 missing=0 skipped=0\n2026-01-27 22:15:59 [INFO] etl_billiards: CHECK_DONE task=ODS_ASSISTANT_LEDGER missing=0 records=4 errors=0\n2026-01-27 22:15:59 [INFO] etl_billiards: CHECK_START task=ODS_ASSISTANT_ABOLISH table=billiards_ods.assistant_cancellation_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:59 [INFO] etl_billiards: WINDOW_START task=ODS_ASSISTANT_ABOLISH idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:15:59 [INFO] etl_billiards: WINDOW_DONE task=ODS_ASSISTANT_ABOLISH idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=0 missing=0 skipped=0\n2026-01-27 22:15:59 [INFO] etl_billiards: CHECK_DONE task=ODS_ASSISTANT_ABOLISH missing=0 records=0 errors=0\n2026-01-27 22:15:59 [INFO] etl_billiards: CHECK_START task=ODS_STORE_GOODS_SALES table=billiards_ods.store_goods_sales_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:59 [INFO] etl_billiards: WINDOW_START task=ODS_STORE_GOODS_SALES idx=1 window=FULL\n2026-01-27 22:15:59 [INFO] etl_billiards: WINDOW_DONE task=ODS_STORE_GOODS_SALES idx=1 window=FULL pages=1 records=0 missing=0 skipped=0\n2026-01-27 22:15:59 [INFO] etl_billiards: CHECK_DONE task=ODS_STORE_GOODS_SALES missing=0 records=0 errors=0\n2026-01-27 22:15:59 [INFO] etl_billiards: CHECK_START task=ODS_PAYMENT table=billiards_ods.payment_transactions windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:15:59 [INFO] etl_billiards: WINDOW_START task=ODS_PAYMENT idx=1 window=FULL\n2026-01-27 22:16:20 [INFO] etl_billiards: WINDOW_DONE task=ODS_PAYMENT idx=1 window=FULL pages=60 records=11849 missing=8 skipped=0\n2026-01-27 22:16:20 [INFO] etl_billiards: CHECK_DONE task=ODS_PAYMENT missing=8 records=11849 errors=0\n2026-01-27 22:16:20 [INFO] etl_billiards: CHECK_START task=ODS_REFUND table=billiards_ods.refund_transactions windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:16:20 [INFO] etl_billiards: WINDOW_START task=ODS_REFUND idx=1 window=FULL\n2026-01-27 22:16:20 [INFO] etl_billiards: WINDOW_DONE task=ODS_REFUND idx=1 window=FULL pages=1 records=38 missing=0 skipped=0\n2026-01-27 22:16:20 [INFO] etl_billiards: CHECK_DONE task=ODS_REFUND missing=0 records=38 errors=0\n2026-01-27 22:16:20 [INFO] etl_billiards: CHECK_START task=ODS_PLATFORM_COUPON table=billiards_ods.platform_coupon_redemption_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:16:20 [INFO] etl_billiards: WINDOW_START task=ODS_PLATFORM_COUPON idx=1 window=FULL\n2026-01-27 22:16:52 [INFO] etl_billiards: WINDOW_DONE task=ODS_PLATFORM_COUPON idx=1 window=FULL pages=86 records=17083 missing=4 skipped=0\n2026-01-27 22:16:52 [INFO] etl_billiards: CHECK_DONE task=ODS_PLATFORM_COUPON missing=4 records=17083 errors=0\n2026-01-27 22:16:52 [INFO] etl_billiards: CHECK_START task=ODS_MEMBER table=billiards_ods.member_profiles windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:16:52 [INFO] etl_billiards: WINDOW_START task=ODS_MEMBER idx=1 window=FULL\n2026-01-27 22:16:54 [INFO] etl_billiards: WINDOW_DONE task=ODS_MEMBER idx=1 window=FULL pages=3 records=556 missing=0 skipped=0\n2026-01-27 22:16:54 [INFO] etl_billiards: CHECK_DONE task=ODS_MEMBER missing=0 records=556 errors=0\n2026-01-27 22:16:54 [INFO] etl_billiards: CHECK_START task=ODS_MEMBER_CARD table=billiards_ods.member_stored_value_cards windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:16:54 [INFO] etl_billiards: WINDOW_START task=ODS_MEMBER_CARD idx=1 window=FULL\n2026-01-27 22:16:56 [INFO] etl_billiards: WINDOW_DONE task=ODS_MEMBER_CARD idx=1 window=FULL pages=5 records=945 missing=0 skipped=0\n2026-01-27 22:16:56 [INFO] etl_billiards: CHECK_DONE task=ODS_MEMBER_CARD missing=0 records=945 errors=0\n2026-01-27 22:16:56 [INFO] etl_billiards: CHECK_START task=ODS_MEMBER_BALANCE table=billiards_ods.member_balance_changes windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:16:56 [INFO] etl_billiards: WINDOW_START task=ODS_MEMBER_BALANCE idx=1 window=FULL\n2026-01-27 22:17:21 [INFO] etl_billiards: WINDOW_DONE task=ODS_MEMBER_BALANCE idx=1 window=FULL pages=13 records=2480 missing=0 skipped=0\n2026-01-27 22:17:21 [INFO] etl_billiards: CHECK_DONE task=ODS_MEMBER_BALANCE missing=0 records=2480 errors=0\n2026-01-27 22:17:21 [INFO] etl_billiards: CHECK_START task=ODS_RECHARGE_SETTLE table=billiards_ods.recharge_settlements windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:21 [INFO] etl_billiards: WINDOW_START task=ODS_RECHARGE_SETTLE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:17:22 [INFO] etl_billiards: WINDOW_DONE task=ODS_RECHARGE_SETTLE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=0 missing=0 skipped=0\n2026-01-27 22:17:22 [INFO] etl_billiards: CHECK_DONE task=ODS_RECHARGE_SETTLE missing=0 records=0 errors=0\n2026-01-27 22:17:22 [INFO] etl_billiards: CHECK_START task=ODS_GROUP_PACKAGE table=billiards_ods.group_buy_packages windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:22 [INFO] etl_billiards: WINDOW_START task=ODS_GROUP_PACKAGE idx=1 window=FULL\n2026-01-27 22:17:22 [INFO] etl_billiards: WINDOW_DONE task=ODS_GROUP_PACKAGE idx=1 window=FULL pages=1 records=18 missing=0 skipped=0\n2026-01-27 22:17:22 [INFO] etl_billiards: CHECK_DONE task=ODS_GROUP_PACKAGE missing=0 records=18 errors=0\n2026-01-27 22:17:22 [INFO] etl_billiards: CHECK_START task=ODS_GROUP_BUY_REDEMPTION table=billiards_ods.group_buy_redemption_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:22 [INFO] etl_billiards: WINDOW_START task=ODS_GROUP_BUY_REDEMPTION idx=1 window=FULL\n2026-01-27 22:17:53 [INFO] etl_billiards: WINDOW_DONE task=ODS_GROUP_BUY_REDEMPTION idx=1 window=FULL pages=42 records=8224 missing=8 skipped=0\n2026-01-27 22:17:53 [INFO] etl_billiards: CHECK_DONE task=ODS_GROUP_BUY_REDEMPTION missing=8 records=8224 errors=0\n2026-01-27 22:17:53 [INFO] etl_billiards: CHECK_START task=ODS_INVENTORY_STOCK table=billiards_ods.goods_stock_summary windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:53 [INFO] etl_billiards: WINDOW_START task=ODS_INVENTORY_STOCK idx=1 window=FULL\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_DONE task=ODS_INVENTORY_STOCK idx=1 window=FULL pages=1 records=171 missing=0 skipped=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_DONE task=ODS_INVENTORY_STOCK missing=0 records=171 errors=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_START task=ODS_INVENTORY_CHANGE table=billiards_ods.goods_stock_movements windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_START task=ODS_INVENTORY_CHANGE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_DONE task=ODS_INVENTORY_CHANGE idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=2 records=203 missing=115 skipped=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_DONE task=ODS_INVENTORY_CHANGE missing=115 records=203 errors=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_START task=ODS_TABLES table=billiards_ods.site_tables_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_START task=ODS_TABLES idx=1 window=FULL\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_DONE task=ODS_TABLES idx=1 window=FULL pages=1 records=74 missing=0 skipped=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_DONE task=ODS_TABLES missing=0 records=74 errors=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_START task=ODS_GOODS_CATEGORY table=billiards_ods.stock_goods_category_tree windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_START task=ODS_GOODS_CATEGORY idx=1 window=FULL\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_DONE task=ODS_GOODS_CATEGORY idx=1 window=FULL pages=1 records=9 missing=0 skipped=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_DONE task=ODS_GOODS_CATEGORY missing=0 records=9 errors=0\n2026-01-27 22:17:54 [INFO] etl_billiards: CHECK_START task=ODS_STORE_GOODS table=billiards_ods.store_goods_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:54 [INFO] etl_billiards: WINDOW_START task=ODS_STORE_GOODS idx=1 window=FULL\n2026-01-27 22:17:55 [INFO] etl_billiards: WINDOW_DONE task=ODS_STORE_GOODS idx=1 window=FULL pages=1 records=171 missing=0 skipped=0\n2026-01-27 22:17:55 [INFO] etl_billiards: CHECK_DONE task=ODS_STORE_GOODS missing=0 records=171 errors=0\n2026-01-27 22:17:55 [INFO] etl_billiards: CHECK_START task=ODS_TABLE_FEE_DISCOUNT table=billiards_ods.table_fee_discount_records windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:17:55 [INFO] etl_billiards: WINDOW_START task=ODS_TABLE_FEE_DISCOUNT idx=1 window=FULL\n2026-01-27 22:18:00 [INFO] etl_billiards: WINDOW_DONE task=ODS_TABLE_FEE_DISCOUNT idx=1 window=FULL pages=9 records=1748 missing=0 skipped=0\n2026-01-27 22:18:00 [INFO] etl_billiards: CHECK_DONE task=ODS_TABLE_FEE_DISCOUNT missing=0 records=1748 errors=0\n2026-01-27 22:18:00 [INFO] etl_billiards: CHECK_START task=ODS_TENANT_GOODS table=billiards_ods.tenant_goods_master windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:18:00 [INFO] etl_billiards: WINDOW_START task=ODS_TENANT_GOODS idx=1 window=FULL\n2026-01-27 22:18:00 [INFO] etl_billiards: WINDOW_DONE task=ODS_TENANT_GOODS idx=1 window=FULL pages=1 records=172 missing=0 skipped=0\n2026-01-27 22:18:00 [INFO] etl_billiards: CHECK_DONE task=ODS_TENANT_GOODS missing=0 records=172 errors=0\n2026-01-27 22:18:00 [INFO] etl_billiards: CHECK_START task=ODS_SETTLEMENT_TICKET table=billiards_ods.settlement_ticket_details windows=1 start=2026-01-27T18:13:11+08:00 end=2026-01-28T00:13:11+08:00\n2026-01-27 22:18:00 [INFO] etl_billiards: WINDOW_START task=ODS_SETTLEMENT_TICKET idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00\n2026-01-27 22:18:01 [INFO] etl_billiards: WINDOW_DONE task=ODS_SETTLEMENT_TICKET idx=1 window=2026-01-27T18:13:11+08:00~2026-01-28T00:13:11+08:00 pages=1 records=37 missing=0 skipped=37\n2026-01-27 22:18:01 [INFO] etl_billiards: CHECK_DONE task=ODS_SETTLEMENT_TICKET missing=0 records=37 errors=0\n2026-01-27 22:18:01 [INFO] etl_billiards: 缺失检查完成 总缺失=150\n2026-01-27 22:18:01 [INFO] etl_billiards: 开始补全任务 任务=ODS_SETTLEMENT_RECORDS 缺失=8 样本数=8\n2026-01-27 22:18:01 [INFO] etl_billiards: 开始获取数据 任务=ODS_SETTLEMENT_RECORDS 缺失主键数=8\n2026-01-27 22:18:01 [INFO] etl_billiards: 已插入 任务=ODS_SETTLEMENT_RECORDS 页=1 数量=8\n2026-01-27 22:18:01 [INFO] etl_billiards: 任务补全完成 任务=ODS_SETTLEMENT_RECORDS 已补全=8\n2026-01-27 22:18:01 [INFO] etl_billiards: 开始补全任务 任务=ODS_TABLE_USE 缺失=7 样本数=7\n2026-01-27 22:18:01 [INFO] etl_billiards: 开始获取数据 任务=ODS_TABLE_USE 缺失主键数=7\n2026-01-27 22:18:02 [INFO] etl_billiards: 已插入 任务=ODS_TABLE_USE 页=1 数量=7\n2026-01-27 22:18:14 [INFO] etl_billiards: 任务补全完成 任务=ODS_TABLE_USE 已补全=7\n2026-01-27 22:18:14 [INFO] etl_billiards: 开始补全任务 任务=ODS_PAYMENT 缺失=8 样本数=8\n2026-01-27 22:18:14 [INFO] etl_billiards: 开始获取数据 任务=ODS_PAYMENT 缺失主键数=8\n2026-01-27 22:18:14 [INFO] etl_billiards: 已插入 任务=ODS_PAYMENT 页=1 数量=8\n2026-01-27 22:18:31 [INFO] etl_billiards: 任务补全完成 任务=ODS_PAYMENT 已补全=8\n2026-01-27 22:18:31 [INFO] etl_billiards: 开始补全任务 任务=ODS_PLATFORM_COUPON 缺失=4 样本数=4\n2026-01-27 22:18:31 [INFO] etl_billiards: 开始获取数据 任务=ODS_PLATFORM_COUPON 缺失主键数=4\n2026-01-27 22:18:32 [INFO] etl_billiards: 已插入 任务=ODS_PLATFORM_COUPON 页=1 数量=4\n2026-01-27 22:18:58 [INFO] etl_billiards: 任务补全完成 任务=ODS_PLATFORM_COUPON 已补全=4\n2026-01-27 22:18:58 [INFO] etl_billiards: 开始补全任务 任务=ODS_GROUP_BUY_REDEMPTION 缺失=8 样本数=8\n2026-01-27 22:18:58 [INFO] etl_billiards: 开始获取数据 任务=ODS_GROUP_BUY_REDEMPTION 缺失主键数=8\n2026-01-27 22:18:59 [INFO] etl_billiards: 已插入 任务=ODS_GROUP_BUY_REDEMPTION 页=1 数量=8\n2026-01-27 22:19:28 [INFO] etl_billiards: 任务补全完成 任务=ODS_GROUP_BUY_REDEMPTION 已补全=8\n2026-01-27 22:19:28 [INFO] etl_billiards: 开始补全任务 任务=ODS_INVENTORY_CHANGE 缺失=115 样本数=115\n2026-01-27 22:19:28 [INFO] etl_billiards: 开始获取数据 任务=ODS_INVENTORY_CHANGE 缺失主键数=115\n2026-01-27 22:19:29 [INFO] etl_billiards: 已插入 任务=ODS_INVENTORY_CHANGE 页=1 数量=79\n2026-01-27 22:19:29 [INFO] etl_billiards: 任务补全完成 任务=ODS_INVENTORY_CHANGE 已补全=79\n2026-01-27 22:19:29 [INFO] etl_billiards: 数据补全完成 总缺失=150 已补全=114 错误数=0\n2026-01-27 22:19:29 [INFO] etl_billiards: 自动补全完成 已补全=114 错误数=0\n2026-01-27 22:19:29 [INFO] etl_billiards: DATA_INTEGRITY_CHECK: 工具类任务执行成功\n2026-01-27 22:19:29 [INFO] etl_billiards: DATA_INTEGRITY_CHECK: 结果统计: {'missing': 133, 'errors': 0, 'backfilled': 114}\n2026-01-27 22:19:29 [INFO] etl_billiards: 所有任务执行完成\n2026-01-27 22:19:29 [INFO] etl_billiards: ETL运行完成\n",
          "error": ""
        }
      ],
      "created_at": "2026-01-27T22:12:39.781369",
      "updated_at": "2026-01-27T22:19:29.288249"
    }
  }
}