Files
Neo-ZQYY/export/SYSTEM/LOGS/2026-02-21__etl_run_raw_v7.json

5 lines
67 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"execution_id": "0929ab3a-e8eb-441a-89a4-b33b70481052",
"output_log": "",
"error_log": "[2026-02-21 21:25:10] INFO | etl_billiards | 配置加载完成\n[2026-02-21 21:25:10] INFO | etl_billiards | 门店ID: 2790685415443269\n[2026-02-21 21:25:11] INFO | etl_billiards | 执行模式: Flow 模式\n[2026-02-21 21:25:11] INFO | etl_billiards | Flow 类型: api_full\n[2026-02-21 21:25:11] INFO | etl_billiards | 处理模式: full_window\n[2026-02-21 21:25:11] INFO | etl_billiards | 使用回溯时间窗口: 2026-02-20 21:25:11.380879+08:00 ~ 2026-02-21 21:25:11.380879+08:00\n[2026-02-21 21:25:11] INFO | etl_billiards | FLOW_API_FULL | 开始执行 Flow: api_full | 开始时间: 2026-02-21 21:25:11\n[2026-02-21 21:25:11] INFO | etl_billiards | Flow api_full: 执行增量 ETL层=['ODS', 'DWD', 'DWS', 'INDEX']\n[2026-02-21 21:25:11] INFO | etl_billiards | 开始运行任务: ['ODS_FETCH', 'DWD_LOAD_FROM_ODS', 'DWS_ASSISTANT_DAILY', 'DWS_ASSISTANT_MONTHLY', 'DWS_ASSISTANT_CUSTOMER', 'DWS_ASSISTANT_SALARY', 'DWS_ASSISTANT_FINANCE', 'DWS_MEMBER_CONSUMPTION', 'DWS_MEMBER_VISIT', 'DWS_GOODS_STOCK_DAILY', 'DWS_GOODS_STOCK_WEEKLY', 'DWS_GOODS_STOCK_MONTHLY', 'DWS_FINANCE_DAILY', 'DWS_FINANCE_RECHARGE', 'DWS_FINANCE_INCOME_STRUCTURE', 'DWS_FINANCE_DISCOUNT_DETAIL', 'DWS_WINBACK_INDEX', 'DWS_NEWCONV_INDEX', 'DWS_RELATION_INDEX'], run_uuid=ee10c1892c594ac3b6abe0d4042b9d17\n[2026-02-21 21:25:11] WARNING | etl_billiards | 任务 ODS_FETCH 未启用或不存在\n[2026-02-21 21:25:11] INFO | etl_billiards | DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8889-20260221-212511\n[2026-02-21 21:25:11] INFO | etl_billiards | DWD_LOAD_FROM_ODS: 抓取完成,文件=None记录数=0\n[2026-02-21 21:25:11] INFO | etl_billiards | DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-8889-20260221-212511\n[2026-02-21 21:25:11] INFO | etl_billiards | DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:25:11] INFO | etl_billiards | DWD 装载开始dwd.dim_site <= ods.table_fee_transactions\n[2026-02-21 21:25:12] ERROR | etl_billiards | DWD 装载失败dwd.dim_site用时 0.37serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:12] INFO | etl_billiards | DWD 装载开始dwd.dim_site_ex <= ods.table_fee_transactions\n[2026-02-21 21:25:12] ERROR | etl_billiards | DWD 装载失败dwd.dim_site_ex用时 0.53serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:12] INFO | etl_billiards | DWD 装载开始dwd.dim_table <= ods.site_tables_master\n[2026-02-21 21:25:12] ERROR | etl_billiards | DWD 装载失败dwd.dim_table用时 0.44serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:12] INFO | etl_billiards | DWD 装载开始dwd.dim_table_ex <= ods.site_tables_master\n[2026-02-21 21:25:13] ERROR | etl_billiards | DWD 装载失败dwd.dim_table_ex用时 0.89serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:13] INFO | etl_billiards | DWD 装载开始dwd.dim_assistant <= ods.assistant_accounts_master\n[2026-02-21 21:25:14] ERROR | etl_billiards | DWD 装载失败dwd.dim_assistant用时 0.39serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:14] INFO | etl_billiards | DWD 装载开始dwd.dim_assistant_ex <= ods.assistant_accounts_master\n[2026-02-21 21:25:14] ERROR | etl_billiards | DWD 装载失败dwd.dim_assistant_ex用时 0.40serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:14] INFO | etl_billiards | DWD 装载开始dwd.dim_member <= ods.member_profiles\n[2026-02-21 21:25:15] ERROR | etl_billiards | DWD 装载失败dwd.dim_member用时 0.77serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:15] INFO | etl_billiards | DWD 装载开始dwd.dim_member_ex <= ods.member_profiles\n[2026-02-21 21:25:16] ERROR | etl_billiards | DWD 装载失败dwd.dim_member_ex用时 0.72serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:16] INFO | etl_billiards | DWD 装载开始dwd.dim_member_card_account <= ods.member_stored_value_cards\n[2026-02-21 21:25:16] ERROR | etl_billiards | DWD 装载失败dwd.dim_member_card_account用时 0.37serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:16] INFO | etl_billiards | DWD 装载开始dwd.dim_member_card_account_ex <= ods.member_stored_value_cards\n[2026-02-21 21:25:16] ERROR | etl_billiards | DWD 装载失败dwd.dim_member_card_account_ex用时 0.36serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:16] INFO | etl_billiards | DWD 装载开始dwd.dim_tenant_goods <= ods.tenant_goods_master\n[2026-02-21 21:25:17] ERROR | etl_billiards | DWD 装载失败dwd.dim_tenant_goods用时 0.37serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:17] INFO | etl_billiards | DWD 装载开始dwd.dim_tenant_goods_ex <= ods.tenant_goods_master\n[2026-02-21 21:25:17] ERROR | etl_billiards | DWD 装载失败dwd.dim_tenant_goods_ex用时 0.35serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:17] INFO | etl_billiards | DWD 装载开始dwd.dim_store_goods <= ods.store_goods_master\n[2026-02-21 21:25:17] ERROR | etl_billiards | DWD 装载失败dwd.dim_store_goods用时 0.38serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:17] INFO | etl_billiards | DWD 装载开始dwd.dim_store_goods_ex <= ods.store_goods_master\n[2026-02-21 21:25:18] ERROR | etl_billiards | DWD 装载失败dwd.dim_store_goods_ex用时 0.36serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:18] INFO | etl_billiards | DWD 装载开始dwd.dim_goods_category <= ods.stock_goods_category_tree\n[2026-02-21 21:25:18] ERROR | etl_billiards | DWD 装载失败dwd.dim_goods_category用时 0.36serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:18] INFO | etl_billiards | DWD 装载开始dwd.dim_groupbuy_package <= ods.group_buy_packages\n[2026-02-21 21:25:19] ERROR | etl_billiards | DWD 装载失败dwd.dim_groupbuy_package用时 0.36serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:19] INFO | etl_billiards | DWD 装载开始dwd.dim_groupbuy_package_ex <= ods.group_buy_packages\n[2026-02-21 21:25:19] ERROR | etl_billiards | DWD 装载失败dwd.dim_groupbuy_package_ex用时 0.35serr='DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 670, in load\n dim_counts = self._merge_dim(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 827, in _merge_dim\n return self._merge_dim_scd2(cur, dwd_table, ods_table, dwd_cols, ods_cols, now)\n ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 888, in _merge_dim_scd2\n order_col = self._pick_snapshot_order_column(ods_cols)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: 'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\n[2026-02-21 21:25:19] INFO | etl_billiards | DWD 装载开始dwd.dwd_settlement_head <= ods.settlement_records\n[2026-02-21 21:25:20] INFO | etl_billiards | DWD 装载完成dwd.dwd_settlement_head用时 1.16s\n[2026-02-21 21:25:20] INFO | etl_billiards | DWD 装载开始dwd.dwd_settlement_head_ex <= ods.settlement_records\n[2026-02-21 21:25:21] INFO | etl_billiards | DWD 装载完成dwd.dwd_settlement_head_ex用时 1.09s\n[2026-02-21 21:25:21] INFO | etl_billiards | DWD 装载开始dwd.dwd_table_fee_log <= ods.table_fee_transactions\n[2026-02-21 21:25:22] INFO | etl_billiards | DWD 装载完成dwd.dwd_table_fee_log用时 1.04s\n[2026-02-21 21:25:22] INFO | etl_billiards | DWD 装载开始dwd.dwd_table_fee_log_ex <= ods.table_fee_transactions\n[2026-02-21 21:25:23] INFO | etl_billiards | DWD 装载完成dwd.dwd_table_fee_log_ex用时 0.73s\n[2026-02-21 21:25:23] INFO | etl_billiards | DWD 装载开始dwd.dwd_table_fee_adjust <= ods.table_fee_discount_records\n[2026-02-21 21:25:24] INFO | etl_billiards | DWD 装载完成dwd.dwd_table_fee_adjust用时 0.58s\n[2026-02-21 21:25:24] INFO | etl_billiards | DWD 装载开始dwd.dwd_table_fee_adjust_ex <= ods.table_fee_discount_records\n[2026-02-21 21:25:24] INFO | etl_billiards | DWD 装载完成dwd.dwd_table_fee_adjust_ex用时 0.54s\n[2026-02-21 21:25:24] INFO | etl_billiards | DWD 装载开始dwd.dwd_store_goods_sale <= ods.store_goods_sales_records\n[2026-02-21 21:25:25] INFO | etl_billiards | DWD 装载完成dwd.dwd_store_goods_sale用时 0.53s\n[2026-02-21 21:25:25] INFO | etl_billiards | DWD 装载开始dwd.dwd_store_goods_sale_ex <= ods.store_goods_sales_records\n[2026-02-21 21:25:25] INFO | etl_billiards | DWD 装载完成dwd.dwd_store_goods_sale_ex用时 0.52s\n[2026-02-21 21:25:25] INFO | etl_billiards | DWD 装载开始dwd.dwd_assistant_service_log <= ods.assistant_service_records\n[2026-02-21 21:25:26] INFO | etl_billiards | DWD 装载完成dwd.dwd_assistant_service_log用时 0.63s\n[2026-02-21 21:25:26] INFO | etl_billiards | DWD 装载开始dwd.dwd_assistant_service_log_ex <= ods.assistant_service_records\n[2026-02-21 21:25:26] INFO | etl_billiards | DWD 装载完成dwd.dwd_assistant_service_log_ex用时 0.58s\n[2026-02-21 21:25:26] INFO | etl_billiards | DWD 装载开始dwd.dwd_assistant_trash_event <= ods.assistant_cancellation_records\n[2026-02-21 21:25:27] INFO | etl_billiards | DWD 装载完成dwd.dwd_assistant_trash_event用时 0.55s\n[2026-02-21 21:25:27] INFO | etl_billiards | DWD 装载开始dwd.dwd_assistant_trash_event_ex <= ods.assistant_cancellation_records\n[2026-02-21 21:25:27] INFO | etl_billiards | DWD 装载完成dwd.dwd_assistant_trash_event_ex用时 0.52s\n[2026-02-21 21:25:27] INFO | etl_billiards | DWD 装载开始dwd.dwd_member_balance_change <= ods.member_balance_changes\n[2026-02-21 21:25:29] INFO | etl_billiards | DWD 装载完成dwd.dwd_member_balance_change用时 1.62s\n[2026-02-21 21:25:29] INFO | etl_billiards | DWD 装载开始dwd.dwd_member_balance_change_ex <= ods.member_balance_changes\n[2026-02-21 21:25:30] INFO | etl_billiards | DWD 装载完成dwd.dwd_member_balance_change_ex用时 1.11s\n[2026-02-21 21:25:30] INFO | etl_billiards | DWD 装载开始dwd.dwd_groupbuy_redemption <= ods.group_buy_redemption_records\n[2026-02-21 21:25:31] INFO | etl_billiards | DWD 装载完成dwd.dwd_groupbuy_redemption用时 0.98s\n[2026-02-21 21:25:31] INFO | etl_billiards | DWD 装载开始dwd.dwd_groupbuy_redemption_ex <= ods.group_buy_redemption_records\n[2026-02-21 21:25:32] INFO | etl_billiards | DWD 装载完成dwd.dwd_groupbuy_redemption_ex用时 1.38s\n[2026-02-21 21:25:32] INFO | etl_billiards | DWD 装载开始dwd.dwd_platform_coupon_redemption <= ods.platform_coupon_redemption_records\n[2026-02-21 21:25:34] INFO | etl_billiards | DWD 装载完成dwd.dwd_platform_coupon_redemption用时 1.97s\n[2026-02-21 21:25:34] INFO | etl_billiards | DWD 装载开始dwd.dwd_platform_coupon_redemption_ex <= ods.platform_coupon_redemption_records\n[2026-02-21 21:25:36] INFO | etl_billiards | DWD 装载完成dwd.dwd_platform_coupon_redemption_ex用时 1.26s\n[2026-02-21 21:25:36] INFO | etl_billiards | DWD 装载开始dwd.dwd_recharge_order <= ods.recharge_settlements\n[2026-02-21 21:25:36] INFO | etl_billiards | DWD 装载完成dwd.dwd_recharge_order用时 0.56s\n[2026-02-21 21:25:36] INFO | etl_billiards | DWD 装载开始dwd.dwd_recharge_order_ex <= ods.recharge_settlements\n[2026-02-21 21:25:37] INFO | etl_billiards | DWD 装载完成dwd.dwd_recharge_order_ex用时 0.54s\n[2026-02-21 21:25:37] INFO | etl_billiards | DWD 装载开始dwd.dwd_payment <= ods.payment_transactions\n[2026-02-21 21:25:38] INFO | etl_billiards | DWD 装载完成dwd.dwd_payment用时 1.20s\n[2026-02-21 21:25:38] INFO | etl_billiards | DWD 装载开始dwd.dwd_refund <= ods.refund_transactions\n[2026-02-21 21:25:39] INFO | etl_billiards | DWD 装载完成dwd.dwd_refund用时 0.63s\n[2026-02-21 21:25:39] INFO | etl_billiards | DWD 装载开始dwd.dwd_refund_ex <= ods.refund_transactions\n[2026-02-21 21:25:40] INFO | etl_billiards | DWD 装载完成dwd.dwd_refund_ex用时 1.76s\n[2026-02-21 21:25:40] INFO | etl_billiards | DWD 装载开始dwd.dwd_goods_stock_summary <= ods.goods_stock_summary\n[2026-02-21 21:25:41] ERROR | etl_billiards | DWD 装载失败dwd.dwd_goods_stock_summary用时 0.55serr=错误: 字段 \"siteGoodsId\" 不存在\nLINE 1: ...numeric):: bigint, \"fetched_at\") CAST(NULLIF(CAST(\"siteGoods...\n ^\nHINT: 也许您想要引用列\"goods_stock_summary.sitegoodsid\"。\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 676, in load\n fact_counts = self._merge_fact_increment(\n cur,\n ...<7 lines>...\n window_end=context.window_end,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 1301, in _merge_fact_increment\n cur.execute(sql, params)\n ~~~~~~~~~~~^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.UndefinedColumn: 错误: 字段 \"siteGoodsId\" 不存在\nLINE 1: ...numeric):: bigint, \"fetched_at\") CAST(NULLIF(CAST(\"siteGoods...\n ^\nHINT: 也许您想要引用列\"goods_stock_summary.sitegoodsid\"。\n\n[2026-02-21 21:25:41] INFO | etl_billiards | DWD 装载开始dwd.dwd_goods_stock_movement <= ods.goods_stock_movements\n[2026-02-21 21:25:42] ERROR | etl_billiards | DWD 装载失败dwd.dwd_goods_stock_movement用时 0.53serr=错误: 字段 \"siteGoodsStockId\" 不存在\nLINE 1: ...text), '') AS numeric):: bigint) CAST(NULLIF(CAST(\"siteGoods...\n ^\nHINT: 也许您想要引用列\"goods_stock_movements.sitegoodsstockid\"。\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 676, in load\n fact_counts = self._merge_fact_increment(\n cur,\n ...<7 lines>...\n window_end=context.window_end,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dwd\\dwd_load_task.py\", line 1301, in _merge_fact_increment\n cur.execute(sql, params)\n ~~~~~~~~~~~^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.UndefinedColumn: 错误: 字段 \"siteGoodsStockId\" 不存在\nLINE 1: ...text), '') AS numeric):: bigint) CAST(NULLIF(CAST(\"siteGoods...\n ^\nHINT: 也许您想要引用列\"goods_stock_movements.sitegoodsstockid\"。\n\n[2026-02-21 21:25:42] INFO | etl_billiards | DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 10366, 'processed': 10366}, {'table': 'dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 10366, 'processed': 10366}, {'table': 'dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 9103, 'processed': 9103}, {'table': 'dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 9103, 'processed': 9103}, {'table': 'dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 1616, 'processed': 1616}, {'table': 'dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 1616, 'processed': 1616}, {'table': 'dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 2619, 'processed': 2619}, {'table': 'dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 16, 'updated': 2603, 'processed': 2619}, {'table': 'dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 78, 'processed': 78}, {'table': 'dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 78, 'processed': 78}, {'table': 'dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 2185, 'processed': 2185}, {'table': 'dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 2185, 'processed': 2185}, {'table': 'dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 7267, 'processed': 7267}, {'table': 'dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 7267, 'processed': 7267}, {'table': 'dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 18311, 'processed': 18311}, {'table': 'dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 18311, 'processed': 18311}, {'table': 'dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 191, 'processed': 191}, {'table': 'dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 191, 'processed': 191}, {'table': 'dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 10625, 'processed': 10625}, {'table': 'dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 29, 'processed': 29}, {'table': 'dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 29, 'processed': 29}], 'errors': [{'table': 'dwd.dim_site', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_site_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_table', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_table_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_assistant', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_assistant_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_member', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_member_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_member_card_account', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_member_card_account_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_tenant_goods', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_tenant_goods_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_store_goods', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_store_goods_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_goods_category', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_groupbuy_package', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dim_groupbuy_package_ex', 'error': \"'DwdLoadTask' object has no attribute '_pick_snapshot_order_column'\"}, {'table': 'dwd.dwd_goods_stock_summary', 'error': '错误: 字段 \"siteGoodsId\" 不存在\\nLINE 1: ...numeric):: bigint, \"fetched_at\") CAST(NULLIF(CAST(\"siteGoods...\\n ^\\nHINT: 也许您想要引用列\"goods_stock_summary.sitegoodsid\"。\\n'}, {'table': 'dwd.dwd_goods_stock_movement', 'error': '错误: 字段 \"siteGoodsStockId\" 不存在\\nLINE 1: ...text), \\'\\') AS numeric):: bigint) CAST(NULLIF(CAST(\"siteGoods...\\n ^\\nHINT: 也许您想要引用列\"goods_stock_movements.sitegoodsstockid\"。\\n'}]}\n[2026-02-21 21:25:42] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_DAILY\\DWS_ASSISTANT_DAILY-8890-20260221-212542\n[2026-02-21 21:25:42] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 提取数据,日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:25:42] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 抓取完成,文件=None记录数=0\n[2026-02-21 21:25:42] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_DAILY\\DWS_ASSISTANT_DAILY-8890-20260221-212542\n[2026-02-21 21:25:42] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:25:42] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 提取数据,日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:25:43] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 转换数据,服务记录 0 条,废除记录 0 条\n[2026-02-21 21:25:43] INFO | etl_billiards | DWS_ASSISTANT_DAILY: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:25:43] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_MONTHLY\\DWS_ASSISTANT_MONTHLY-8891-20260221-212543\n[2026-02-21 21:25:43] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 提取数据,月份范围 ['2026-02-01']\n[2026-02-21 21:25:44] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 抓取完成,文件=None记录数=0\n[2026-02-21 21:25:44] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_MONTHLY\\DWS_ASSISTANT_MONTHLY-8891-20260221-212543\n[2026-02-21 21:25:44] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:25:44] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 提取数据,月份范围 ['2026-02-01']\n[2026-02-21 21:25:44] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 转换数据1 个月份9 条聚合记录\n[2026-02-21 21:25:45] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 加载完成,删除 9 行,插入 9 行\n[2026-02-21 21:25:46] INFO | etl_billiards | DWS_ASSISTANT_MONTHLY: 完成,统计={'counts': {'fetched': 9, 'inserted': 9, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 9}}\n[2026-02-21 21:25:48] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_CUSTOMER\\DWS_ASSISTANT_CUSTOMER-8892-20260221-212548\n[2026-02-21 21:25:48] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 提取数据,统计日期 2026-02-21\n[2026-02-21 21:25:50] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 抓取完成,文件=None记录数=0\n[2026-02-21 21:25:50] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_CUSTOMER\\DWS_ASSISTANT_CUSTOMER-8892-20260221-212548\n[2026-02-21 21:25:50] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:25:50] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 提取数据,统计日期 2026-02-21\n[2026-02-21 21:25:50] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 转换数据285 条服务关系记录\n[2026-02-21 21:26:10] INFO | etl_billiards | DWS_ASSISTANT_CUSTOMER: 完成,统计={'counts': {'fetched': 285, 'inserted': 285, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 289}}\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_SALARY\\DWS_ASSISTANT_SALARY-8893-20260221-212611\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 非工资结算期,跳过\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_SALARY\\DWS_ASSISTANT_SALARY-8893-20260221-212611\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 非工资结算期,跳过\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 无数据需要写入\n[2026-02-21 21:26:11] INFO | etl_billiards | DWS_ASSISTANT_SALARY: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:13] INFO | etl_billiards | DWS_ASSISTANT_FINANCE: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_FINANCE\\DWS_ASSISTANT_FINANCE-8894-20260221-212613\n[2026-02-21 21:26:13] INFO | etl_billiards | DWS_ASSISTANT_FINANCE: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:13] INFO | etl_billiards | DWS_ASSISTANT_FINANCE: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_ASSISTANT_FINANCE\\DWS_ASSISTANT_FINANCE-8894-20260221-212613\n[2026-02-21 21:26:13] INFO | etl_billiards | DWS_ASSISTANT_FINANCE: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:14] INFO | etl_billiards | DWS_ASSISTANT_FINANCE: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:15] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_MEMBER_CONSUMPTION\\DWS_MEMBER_CONSUMPTION-8895-20260221-212615\n[2026-02-21 21:26:15] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 提取数据,统计日期 2026-02-21\n[2026-02-21 21:26:15] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:15] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_MEMBER_CONSUMPTION\\DWS_MEMBER_CONSUMPTION-8895-20260221-212615\n[2026-02-21 21:26:15] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:15] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 提取数据,统计日期 2026-02-21\n[2026-02-21 21:26:15] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 转换数据198 条会员消费记录\n[2026-02-21 21:26:28] INFO | etl_billiards | DWS_MEMBER_CONSUMPTION: 完成,统计={'counts': {'fetched': 198, 'inserted': 198, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 198}}\n[2026-02-21 21:26:28] INFO | etl_billiards | DWS_MEMBER_VISIT: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_MEMBER_VISIT\\DWS_MEMBER_VISIT-8896-20260221-212628\n[2026-02-21 21:26:28] INFO | etl_billiards | DWS_MEMBER_VISIT: 提取数据,日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:29] INFO | etl_billiards | DWS_MEMBER_VISIT: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:29] INFO | etl_billiards | DWS_MEMBER_VISIT: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_MEMBER_VISIT\\DWS_MEMBER_VISIT-8896-20260221-212628\n[2026-02-21 21:26:29] INFO | etl_billiards | DWS_MEMBER_VISIT: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:29] INFO | etl_billiards | DWS_MEMBER_VISIT: 提取数据,日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:29] INFO | etl_billiards | DWS_MEMBER_VISIT: 转换数据0 条结账单\n[2026-02-21 21:26:29] INFO | etl_billiards | DWS_MEMBER_VISIT: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_GOODS_STOCK_DAILY\\DWS_GOODS_STOCK_DAILY-8897-20260221-212630\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取数据,门店=2790685415443269日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取到 0 条 DWD 记录\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_GOODS_STOCK_DAILY\\DWS_GOODS_STOCK_DAILY-8897-20260221-212630\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取数据,门店=2790685415443269日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取到 0 条 DWD 记录\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 无数据需要汇总\n[2026-02-21 21:26:30] INFO | etl_billiards | DWS_GOODS_STOCK_DAILY: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_GOODS_STOCK_WEEKLY\\DWS_GOODS_STOCK_WEEKLY-8898-20260221-212631\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取数据,门店=2790685415443269日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取到 0 条 DWD 记录\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_GOODS_STOCK_WEEKLY\\DWS_GOODS_STOCK_WEEKLY-8898-20260221-212631\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取数据,门店=2790685415443269日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取到 0 条 DWD 记录\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 无数据需要汇总\n[2026-02-21 21:26:31] INFO | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_GOODS_STOCK_MONTHLY\\DWS_GOODS_STOCK_MONTHLY-8899-20260221-212632\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取数据,门店=2790685415443269日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取到 0 条 DWD 记录\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_GOODS_STOCK_MONTHLY\\DWS_GOODS_STOCK_MONTHLY-8899-20260221-212632\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取数据,门店=2790685415443269日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取到 0 条 DWD 记录\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 无数据需要汇总\n[2026-02-21 21:26:32] INFO | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:33] INFO | etl_billiards | DWS_FINANCE_DAILY: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_FINANCE_DAILY\\DWS_FINANCE_DAILY-8900-20260221-212633\n[2026-02-21 21:26:33] INFO | etl_billiards | DWS_FINANCE_DAILY: 提取数据,日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:33] INFO | etl_billiards | DWS_FINANCE_DAILY: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:33] INFO | etl_billiards | DWS_FINANCE_DAILY: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_FINANCE_DAILY\\DWS_FINANCE_DAILY-8900-20260221-212633\n[2026-02-21 21:26:33] INFO | etl_billiards | DWS_FINANCE_DAILY: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:33] INFO | etl_billiards | DWS_FINANCE_DAILY: 提取数据,日期范围 2026-02-20 ~ 2026-02-21\n[2026-02-21 21:26:34] INFO | etl_billiards | DWS_FINANCE_DAILY: 转换数据0 天结账数据0 天充值数据\n[2026-02-21 21:26:34] INFO | etl_billiards | DWS_FINANCE_DAILY: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:34] INFO | etl_billiards | DWS_FINANCE_RECHARGE: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_FINANCE_RECHARGE\\DWS_FINANCE_RECHARGE-8901-20260221-212634\n[2026-02-21 21:26:34] INFO | etl_billiards | DWS_FINANCE_RECHARGE: 抓取完成,文件=None记录数=0\n[2026-02-21 21:26:34] INFO | etl_billiards | DWS_FINANCE_RECHARGE: 本地清洗入库开始,源目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_FINANCE_RECHARGE\\DWS_FINANCE_RECHARGE-8901-20260221-212634\n[2026-02-21 21:26:34] INFO | etl_billiards | DWS_FINANCE_RECHARGE: 开始执行(1/1),窗口[2026-02-20 19:25:11.380879+08:00 ~ 2026-02-21 23:25:11.380879+08:00]\n[2026-02-21 21:26:35] INFO | etl_billiards | DWS_FINANCE_RECHARGE: 完成,统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}\n[2026-02-21 21:26:36] INFO | etl_billiards | DWS_FINANCE_INCOME_STRUCTURE: 抓取阶段开始,目录=C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\JSON\\DWS_FINANCE_INCOME_STRUCTURE\\DWS_FINANCE_INCOME_STRUCTURE-8902-20260221-212636\n[2026-02-21 21:26:36] ERROR | etl_billiards | 任务 DWS_FINANCE_INCOME_STRUCTURE 失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 215, in run_single_task\n fetch_stats = self._execute_fetch(task_code, cursor_data, fetch_dir, run_id)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 289, in _execute_fetch\n extracted = task.extract(context)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\finance_income_task.py\", line 75, in extract\n income_by_type = self._extract_income_by_type(site_id, start_date, end_date)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\finance_income_task.py\", line 125, in _extract_income_by_type\n rows = self.db.query(sql, {\n 'site_id': site_id,\n 'start_date': start_date,\n 'end_date': end_date,\n })\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.UndefinedColumn: 错误: 字段 \"settle_status\" 不存在\nLINE 22: AND settle_status = 1 -- 已结账\n ^\n\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 94, in run_tasks\n task_result = self.run_single_task(\n task_code, run_uuid, store_id, data_source=data_source,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 255, in run_single_task\n self.run_tracker.update_run(\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n run_id=run_id,\n ^^^^^^^^^^^^^^\n ...<3 lines>...\n error_message=str(exc),\n ^^^^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\run_tracker.py\", line 105, in update_run\n self.db.execute(\n ~~~~~~~~~~~~~~~^\n sql,\n ^^^^\n ...<18 lines>...\n ),\n ^^\n )\n ^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 56, in execute\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] ERROR | etl_billiards | 任务 DWS_FINANCE_DISCOUNT_DETAIL 失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 94, in run_tasks\n task_result = self.run_single_task(\n task_code, run_uuid, store_id, data_source=data_source,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 152, in run_single_task\n task_cfg = self._load_task_config(task_code, store_id)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 429, in _load_task_config\n rows = self.db_ops.query(sql, (store_id, task_code))\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] INFO | etl_billiards | DWS_WINBACK_INDEX: 开始执行工具类任务\n[2026-02-21 21:26:36] INFO | etl_billiards | 开始计算 DWS_WINBACK_INDEX\n[2026-02-21 21:26:36] ERROR | etl_billiards | DWS_WINBACK_INDEX: 工具类任务执行失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 403, in _run_utility_task\n result = task.execute(None)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 84, in execute\n tenant_id = self._get_tenant_id()\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 169, in _get_tenant_id\n rows = self.db.query(sql)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] ERROR | etl_billiards | 任务 DWS_WINBACK_INDEX 失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 94, in run_tasks\n task_result = self.run_single_task(\n task_code, run_uuid, store_id, data_source=data_source,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 150, in run_single_task\n return self._run_utility_task(task_code_upper, store_id)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 403, in _run_utility_task\n result = task.execute(None)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 84, in execute\n tenant_id = self._get_tenant_id()\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 169, in _get_tenant_id\n rows = self.db.query(sql)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] INFO | etl_billiards | DWS_NEWCONV_INDEX: 开始执行工具类任务\n[2026-02-21 21:26:36] INFO | etl_billiards | 开始计算 DWS_NEWCONV_INDEX\n[2026-02-21 21:26:36] ERROR | etl_billiards | DWS_NEWCONV_INDEX: 工具类任务执行失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 403, in _run_utility_task\n result = task.execute(None)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 84, in execute\n tenant_id = self._get_tenant_id()\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 169, in _get_tenant_id\n rows = self.db.query(sql)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] ERROR | etl_billiards | 任务 DWS_NEWCONV_INDEX 失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 94, in run_tasks\n task_result = self.run_single_task(\n task_code, run_uuid, store_id, data_source=data_source,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 150, in run_single_task\n return self._run_utility_task(task_code_upper, store_id)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 403, in _run_utility_task\n result = task.execute(None)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 84, in execute\n tenant_id = self._get_tenant_id()\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\member_index_base.py\", line 169, in _get_tenant_id\n rows = self.db.query(sql)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] INFO | etl_billiards | DWS_RELATION_INDEX: 开始执行工具类任务\n[2026-02-21 21:26:36] INFO | etl_billiards | 开始计算关系指数RS/OS/MS/ML\n[2026-02-21 21:26:36] ERROR | etl_billiards | DWS_RELATION_INDEX: 工具类任务执行失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 403, in _run_utility_task\n result = task.execute(None)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\relation_index_task.py\", line 145, in execute\n tenant_id = self._get_tenant_id()\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\relation_index_task.py\", line 688, in _get_tenant_id\n rows = self.db.query(sql)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] ERROR | etl_billiards | 任务 DWS_RELATION_INDEX 失败: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 94, in run_tasks\n task_result = self.run_single_task(\n task_code, run_uuid, store_id, data_source=data_source,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 150, in run_single_task\n return self._run_utility_task(task_code_upper, store_id)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\task_executor.py\", line 403, in _run_utility_task\n result = task.execute(None)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\relation_index_task.py\", line 145, in execute\n tenant_id = self._get_tenant_id()\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\tasks\\dws\\index\\relation_index_task.py\", line 688, in _get_tenant_id\n rows = self.db.query(sql)\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\operations.py\", line 99, in query\n return self._connection.query(sql, args)\n ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\database\\connection.py\", line 50, in query\n c.execute(sql, args)\n ~~~~~~~~~^^^^^^^^^^^\n File \"C:\\NeoZQYY\\.venv\\Lib\\site-packages\\psycopg2\\extras.py\", line 236, in execute\n return super().execute(query, vars)\n ~~~~~~~~~~~~~~~^^^^^^^^^^^^^\npsycopg2.errors.InFailedSqlTransaction: 错误: 当前事务被终止, 事务块结束之前的查询被忽略\n\n[2026-02-21 21:26:36] INFO | etl_billiards | 所有任务执行完成\n[2026-02-21 21:26:39] INFO | etl_billiards | 一致性检查报告已生成: C:\\NeoZQYY\\export\\ETL-Connectors\\feiqiu\\REPORTS\\consistency_report_20260221_212639.md\n[2026-02-21 21:26:39] INFO | etl_billiards | 计时报告已生成\n[2026-02-21 21:26:39] ERROR | etl_billiards | \n╔══════════════════════════════════════════════════════════════╗\n║ 任务执行总结 ║\n╠══════════════════════════════════════════════════════════════╣\n║ 任务代码: FLOW_API_FULL ║\n║ 执行状态: 失败 ║\n║ 执行时间: 2026-02-21 21:25:11 ~ 21:26:39 (1分28秒) ║\n╠══════════════════════════════════════════════════════════════╣\n║ 数据统计 ║\n║ - 获取记录: 0 ║\n║ - 新增记录: 0 ║\n║ - 更新记录: 0 ║\n║ - 跳过记录: 0 ║\n║ - 错误记录: 0 ║\n╠══════════════════════════════════════════════════════════════╣\n║ 错误信息: unsupported operand type(s) for +: 'int' and 'list ║\n╚══════════════════════════════════════════════════════════════╝\n[2026-02-21 21:26:39] ERROR | etl_billiards | \n╔══════════════════════════════════════════════════════════════╗\n║ 任务执行总结 ║\n╠══════════════════════════════════════════════════════════════╣\n║ 任务代码: FLOW_API_FULL ║\n║ 执行状态: 失败 ║\n║ 执行时间: 2026-02-21 21:25:11 ~ 21:26:39 (1分28秒) ║\n╠══════════════════════════════════════════════════════════════╣\n║ 数据统计 ║\n║ - 获取记录: 0 ║\n║ - 新增记录: 0 ║\n║ - 更新记录: 0 ║\n║ - 跳过记录: 0 ║\n║ - 错误记录: 0 ║\n╠══════════════════════════════════════════════════════════════╣\n║ 错误信息: unsupported operand type(s) for +: 'int' and 'list ║\n╚══════════════════════════════════════════════════════════════╝\n[2026-02-21 21:26:39] ERROR | etl_billiards | ETL运行失败: unsupported operand type(s) for +: 'int' and 'list'\nTraceback (most recent call last):\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\cli\\main.py\", line 536, in main\n result = runner.run(\n flow=args.flow,\n ...<7 lines>...\n verify_tables=verify_tables,\n )\n File \"C:\\NeoZQYY\\apps\\etl\\connectors\\feiqiu\\orchestration\\flow_runner.py\", line 209, in run\n errors=sum(r.get(\"counts\", {}).get(\"errors\", 0) for r in results),\n ~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTypeError: unsupported operand type(s) for +: 'int' and 'list'"
}