[stderr] [2026-03-19 01:22:45] INFO  | etl_billiards | 配置加载完成
[stderr] [2026-03-19 01:22:45] INFO  | etl_billiards | 门店ID: 2790685415443269
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | 执行模式: Flow 模式
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | Flow 类型: api_full
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | 处理模式: full_window
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | 使用回溯时间窗口: 2026-03-18 21:22:46.318958+08:00 ~ 2026-03-19 01:22:46.318958+08:00
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | FLOW_API_FULL | 开始执行 Flow: api_full | 开始时间: 2026-03-19 01:22:46
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | Flow api_full: 执行增量 ETL，层=['ODS', 'DWD', 'DWS', 'INDEX']
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | 开始运行任务: ['ODS_ASSISTANT_ACCOUNT', 'ODS_ASSISTANT_LEDGER', 'ODS_STAFF_INFO', 'ODS_SETTLEMENT_RECORDS', 'ODS_PAYMENT', 'ODS_REFUND', 'ODS_TABLE_USE', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_TABLES', 'ODS_MEMBER', 'ODS_MEMBER_CARD', 'ODS_MEMBER_BALANCE', 'ODS_RECHARGE_SETTLE', 'ODS_GOODS_CATEGORY', 'ODS_STORE_GOODS', 'ODS_STORE_GOODS_SALES', 'ODS_TENANT_GOODS', 'ODS_PLATFORM_COUPON', 'ODS_GROUP_PACKAGE', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_INVENTORY_STOCK', 'ODS_INVENTORY_CHANGE', 'DWD_LOAD_FROM_ODS', 'DWS_ASSISTANT_PROJECT_TAG', 'DWS_MEMBER_PROJECT_TAG', 'DWS_GOODS_STOCK_DAILY', 'DWS_GOODS_STOCK_WEEKLY', 'DWS_GOODS_STOCK_MONTHLY', 'DWS_ASSISTANT_DAILY', 'DWS_ASSISTANT_CUSTOMER', 'DWS_ASSISTANT_SALARY', 'DWS_BUILD_ORDER_SUMMARY', 'DWS_MEMBER_CONSUMPTION', 'DWS_MEMBER_VISIT', 'DWS_FINANCE_DAILY', 'DWS_FINANCE_RECHARGE', 'DWS_FINANCE_INCOME_STRUCTURE', 'DWS_FINANCE_DISCOUNT_DETAIL', 'DWS_ASSISTANT_MONTHLY', 'DWS_ASSISTANT_FINANCE', 'DWS_WINBACK_INDEX', 'DWS_NEWCONV_INDEX', 'DWS_RELATION_INDEX', 'DWS_SPENDING_POWER_INDEX'], run_uuid=772de6b68e78441cb6f052e274e777c5
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_ASSISTANT_ACCOUNT\ODS_ASSISTANT_ACCOUNT-14505-20260319-012246
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | 开始执行ODS_ASSISTANT_ACCOUNT (ODS)
[stderr] [2026-03-19 01:22:46] INFO  | etl_billiards | ODS_ASSISTANT_ACCOUNT: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | ODS_ASSISTANT_ACCOUNT ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchAssistantInfo
[stderr] [2026-03-19 01:22:47] INFO  | etl_billiards | [ODS_ASSISTANT_ACCOUNT] 开始执行ODS_ASSISTANT_ACCOUNT (ODS)
[stderr] [2026-03-19 01:22:47] INFO  | etl_billiards | [ODS_ASSISTANT_ACCOUNT] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | [ODS_ASSISTANT_ACCOUNT] ODS 任务失败
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | 任务 ODS_ASSISTANT_ACCOUNT 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchAssistantInfo
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchAssistantInfo
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | [ODS_ASSISTANT_ACCOUNT] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchAssistantInfo
[stderr] [2026-03-19 01:22:47] INFO  | etl_billiards | ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_ASSISTANT_LEDGER\ODS_ASSISTANT_LEDGER-14506-20260319-012247
[stderr] [2026-03-19 01:22:47] INFO  | etl_billiards | 开始执行ODS_ASSISTANT_LEDGER (ODS)
[stderr] [2026-03-19 01:22:47] INFO  | etl_billiards | ODS_ASSISTANT_LEDGER: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | ODS_ASSISTANT_LEDGER ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/AssistantPerformance/GetOrderAssistantDetails
[stderr] [2026-03-19 01:22:47] INFO  | etl_billiards | [ODS_ASSISTANT_LEDGER] 开始执行ODS_ASSISTANT_LEDGER (ODS)
[stderr] [2026-03-19 01:22:47] INFO  | etl_billiards | [ODS_ASSISTANT_LEDGER] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | [ODS_ASSISTANT_LEDGER] ODS 任务失败
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | 任务 ODS_ASSISTANT_LEDGER 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/AssistantPerformance/GetOrderAssistantDetails
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/AssistantPerformance/GetOrderAssistantDetails
[stderr] [2026-03-19 01:22:47] ERROR | etl_billiards | [ODS_ASSISTANT_LEDGER] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/AssistantPerformance/GetOrderAssistantDetails
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | ODS_STAFF_INFO: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_STAFF_INFO\ODS_STAFF_INFO-14507-20260319-012248
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | 开始执行ODS_STAFF_INFO (ODS)
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | ODS_STAFF_INFO: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | ODS_STAFF_INFO ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchSystemStaffInfo
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | [ODS_STAFF_INFO] 开始执行ODS_STAFF_INFO (ODS)
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | [ODS_STAFF_INFO] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | [ODS_STAFF_INFO] ODS 任务失败
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | 任务 ODS_STAFF_INFO 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchSystemStaffInfo
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchSystemStaffInfo
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | [ODS_STAFF_INFO] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PersonnelManagement/SearchSystemStaffInfo
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_SETTLEMENT_RECORDS\ODS_SETTLEMENT_RECORDS-14508-20260319-012248
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | 开始执行ODS_SETTLEMENT_RECORDS (ODS)
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | ODS_SETTLEMENT_RECORDS: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | ODS_SETTLEMENT_RECORDS ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetAllOrderSettleList
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | [ODS_SETTLEMENT_RECORDS] 开始执行ODS_SETTLEMENT_RECORDS (ODS)
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | [ODS_SETTLEMENT_RECORDS] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | [ODS_SETTLEMENT_RECORDS] ODS 任务失败
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | 任务 ODS_SETTLEMENT_RECORDS 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetAllOrderSettleList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetAllOrderSettleList
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | [ODS_SETTLEMENT_RECORDS] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetAllOrderSettleList
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | ODS_PAYMENT: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_PAYMENT\ODS_PAYMENT-14509-20260319-012248
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | 开始执行ODS_PAYMENT (ODS)
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | ODS_PAYMENT: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | ODS_PAYMENT ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PayLog/GetPayLogListPage
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | [ODS_PAYMENT] 开始执行ODS_PAYMENT (ODS)
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | [ODS_PAYMENT] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | [ODS_PAYMENT] ODS 任务失败
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | 任务 ODS_PAYMENT 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PayLog/GetPayLogListPage
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PayLog/GetPayLogListPage
[stderr] [2026-03-19 01:22:48] ERROR | etl_billiards | [ODS_PAYMENT] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PayLog/GetPayLogListPage
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | ODS_REFUND: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_REFUND\ODS_REFUND-14510-20260319-012248
[stderr] [2026-03-19 01:22:48] INFO  | etl_billiards | 开始执行ODS_REFUND (ODS)
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | ODS_REFUND: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | ODS_REFUND ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Order/GetRefundPayLogList
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | [ODS_REFUND] 开始执行ODS_REFUND (ODS)
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | [ODS_REFUND] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | [ODS_REFUND] ODS 任务失败
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | 任务 ODS_REFUND 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Order/GetRefundPayLogList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Order/GetRefundPayLogList
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | [ODS_REFUND] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Order/GetRefundPayLogList
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | ODS_TABLE_USE: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_TABLE_USE\ODS_TABLE_USE-14511-20260319-012249
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | 开始执行ODS_TABLE_USE (ODS)
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | ODS_TABLE_USE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | ODS_TABLE_USE ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableOrderDetails
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | [ODS_TABLE_USE] 开始执行ODS_TABLE_USE (ODS)
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | [ODS_TABLE_USE] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | [ODS_TABLE_USE] ODS 任务失败
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | 任务 ODS_TABLE_USE 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableOrderDetails
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableOrderDetails
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | [ODS_TABLE_USE] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableOrderDetails
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_TABLE_FEE_DISCOUNT\ODS_TABLE_FEE_DISCOUNT-14512-20260319-012249
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | ODS_TABLE_FEE_DISCOUNT ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetTaiFeeAdjustList
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | [ODS_TABLE_FEE_DISCOUNT] 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)
[stderr] [2026-03-19 01:22:49] INFO  | etl_billiards | [ODS_TABLE_FEE_DISCOUNT] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | [ODS_TABLE_FEE_DISCOUNT] ODS 任务失败
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | 任务 ODS_TABLE_FEE_DISCOUNT 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetTaiFeeAdjustList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetTaiFeeAdjustList
[stderr] [2026-03-19 01:22:49] ERROR | etl_billiards | [ODS_TABLE_FEE_DISCOUNT] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetTaiFeeAdjustList
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | ODS_TABLES: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_TABLES\ODS_TABLES-14513-20260319-012250
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | 开始执行ODS_TABLES (ODS)
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | ODS_TABLES: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | ODS_TABLES ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Table/GetSiteTables
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | [ODS_TABLES] 开始执行ODS_TABLES (ODS)
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | [ODS_TABLES] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | [ODS_TABLES] ODS 任务失败
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | 任务 ODS_TABLES 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Table/GetSiteTables
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Table/GetSiteTables
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | [ODS_TABLES] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Table/GetSiteTables
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | ODS_MEMBER: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_MEMBER\ODS_MEMBER-14514-20260319-012250
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | 开始执行ODS_MEMBER (ODS)
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | ODS_MEMBER: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | ODS_MEMBER ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberList
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | [ODS_MEMBER] 开始执行ODS_MEMBER (ODS)
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | [ODS_MEMBER] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | [ODS_MEMBER] ODS 任务失败
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | 任务 ODS_MEMBER 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberList
[stderr] [2026-03-19 01:22:50] ERROR | etl_billiards | [ODS_MEMBER] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberList
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | ODS_MEMBER_CARD: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_MEMBER_CARD\ODS_MEMBER_CARD-14515-20260319-012250
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | 开始执行ODS_MEMBER_CARD (ODS)
[stderr] [2026-03-19 01:22:50] INFO  | etl_billiards | ODS_MEMBER_CARD: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | ODS_MEMBER_CARD ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberCardList
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_MEMBER_CARD] 开始执行ODS_MEMBER_CARD (ODS)
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_MEMBER_CARD] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | [ODS_MEMBER_CARD] ODS 任务失败
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | 任务 ODS_MEMBER_CARD 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberCardList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberCardList
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | [ODS_MEMBER_CARD] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberCardList
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | ODS_MEMBER_BALANCE: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_MEMBER_BALANCE\ODS_MEMBER_BALANCE-14516-20260319-012251
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | 开始执行ODS_MEMBER_BALANCE (ODS)
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | ODS_MEMBER_BALANCE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | ODS_MEMBER_BALANCE ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetMemberCardBalanceChange
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_MEMBER_BALANCE] 开始执行ODS_MEMBER_BALANCE (ODS)
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_MEMBER_BALANCE] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | [ODS_MEMBER_BALANCE] ODS 任务失败
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | 任务 ODS_MEMBER_BALANCE 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetMemberCardBalanceChange
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetMemberCardBalanceChange
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | [ODS_MEMBER_BALANCE] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetMemberCardBalanceChange
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_RECHARGE_SETTLE\ODS_RECHARGE_SETTLE-14517-20260319-012251
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | 开始执行ODS_RECHARGE_SETTLE (ODS)
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | ODS_RECHARGE_SETTLE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | ODS_RECHARGE_SETTLE ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetRechargeSettleList
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_RECHARGE_SETTLE] 开始执行ODS_RECHARGE_SETTLE (ODS)
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_RECHARGE_SETTLE] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | [ODS_RECHARGE_SETTLE] ODS 任务失败
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | 任务 ODS_RECHARGE_SETTLE 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetRechargeSettleList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetRechargeSettleList
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | [ODS_RECHARGE_SETTLE] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetRechargeSettleList
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | ODS_GOODS_CATEGORY: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_GOODS_CATEGORY\ODS_GOODS_CATEGORY-14518-20260319-012251
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | 开始执行ODS_GOODS_CATEGORY (ODS)
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | ODS_GOODS_CATEGORY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | ODS_GOODS_CATEGORY ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoodsCategory/QueryPrimarySecondaryCategory
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_GOODS_CATEGORY] 开始执行ODS_GOODS_CATEGORY (ODS)
[stderr] [2026-03-19 01:22:51] INFO  | etl_billiards | [ODS_GOODS_CATEGORY] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:51] ERROR | etl_billiards | [ODS_GOODS_CATEGORY] ODS 任务失败
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | 任务 ODS_GOODS_CATEGORY 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoodsCategory/QueryPrimarySecondaryCategory
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoodsCategory/QueryPrimarySecondaryCategory
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | [ODS_GOODS_CATEGORY] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoodsCategory/QueryPrimarySecondaryCategory
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | ODS_STORE_GOODS: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_STORE_GOODS\ODS_STORE_GOODS-14519-20260319-012252
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | 开始执行ODS_STORE_GOODS (ODS)
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | ODS_STORE_GOODS: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | ODS_STORE_GOODS ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsInventoryList
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | [ODS_STORE_GOODS] 开始执行ODS_STORE_GOODS (ODS)
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | [ODS_STORE_GOODS] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | [ODS_STORE_GOODS] ODS 任务失败
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | 任务 ODS_STORE_GOODS 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsInventoryList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsInventoryList
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | [ODS_STORE_GOODS] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsInventoryList
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_STORE_GOODS_SALES\ODS_STORE_GOODS_SALES-14520-20260319-012252
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | 开始执行ODS_STORE_GOODS_SALES (ODS)
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | ODS_STORE_GOODS_SALES: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | ODS_STORE_GOODS_SALES ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsSalesList
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | [ODS_STORE_GOODS_SALES] 开始执行ODS_STORE_GOODS_SALES (ODS)
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | [ODS_STORE_GOODS_SALES] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | [ODS_STORE_GOODS_SALES] ODS 任务失败
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | 任务 ODS_STORE_GOODS_SALES 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsSalesList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsSalesList
[stderr] [2026-03-19 01:22:52] ERROR | etl_billiards | [ODS_STORE_GOODS_SALES] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsSalesList
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | ODS_TENANT_GOODS: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_TENANT_GOODS\ODS_TENANT_GOODS-14521-20260319-012252
[stderr] [2026-03-19 01:22:52] INFO  | etl_billiards | 开始执行ODS_TENANT_GOODS (ODS)
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | ODS_TENANT_GOODS: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | ODS_TENANT_GOODS ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/QueryTenantGoods
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | [ODS_TENANT_GOODS] 开始执行ODS_TENANT_GOODS (ODS)
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | [ODS_TENANT_GOODS] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | [ODS_TENANT_GOODS] ODS 任务失败
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | 任务 ODS_TENANT_GOODS 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/QueryTenantGoods
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/QueryTenantGoods
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | [ODS_TENANT_GOODS] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/QueryTenantGoods
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | ODS_PLATFORM_COUPON: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_PLATFORM_COUPON\ODS_PLATFORM_COUPON-14522-20260319-012253
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | 开始执行ODS_PLATFORM_COUPON (ODS)
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | ODS_PLATFORM_COUPON: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | ODS_PLATFORM_COUPON ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Promotion/GetOfflineCouponConsumePageList
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | [ODS_PLATFORM_COUPON] 开始执行ODS_PLATFORM_COUPON (ODS)
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | [ODS_PLATFORM_COUPON] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | [ODS_PLATFORM_COUPON] ODS 任务失败
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | 任务 ODS_PLATFORM_COUPON 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Promotion/GetOfflineCouponConsumePageList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Promotion/GetOfflineCouponConsumePageList
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | [ODS_PLATFORM_COUPON] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Promotion/GetOfflineCouponConsumePageList
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | ODS_GROUP_PACKAGE: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_GROUP_PACKAGE\ODS_GROUP_PACKAGE-14523-20260319-012253
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | 开始执行ODS_GROUP_PACKAGE (ODS)
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | ODS_GROUP_PACKAGE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | ODS_GROUP_PACKAGE ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PackageCoupon/QueryPackageCouponList
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | [ODS_GROUP_PACKAGE] 开始执行ODS_GROUP_PACKAGE (ODS)
[stderr] [2026-03-19 01:22:53] INFO  | etl_billiards | [ODS_GROUP_PACKAGE] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | [ODS_GROUP_PACKAGE] ODS 任务失败
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | 任务 ODS_GROUP_PACKAGE 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PackageCoupon/QueryPackageCouponList
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PackageCoupon/QueryPackageCouponList
[stderr] [2026-03-19 01:22:53] ERROR | etl_billiards | [ODS_GROUP_PACKAGE] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/PackageCoupon/QueryPackageCouponList
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_GROUP_BUY_REDEMPTION\ODS_GROUP_BUY_REDEMPTION-14524-20260319-012254
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | ODS_GROUP_BUY_REDEMPTION ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableUseDetails
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | [ODS_GROUP_BUY_REDEMPTION] 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | [ODS_GROUP_BUY_REDEMPTION] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | [ODS_GROUP_BUY_REDEMPTION] ODS 任务失败
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | 任务 ODS_GROUP_BUY_REDEMPTION 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableUseDetails
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableUseDetails
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | [ODS_GROUP_BUY_REDEMPTION] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/Site/GetSiteTableUseDetails
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | ODS_INVENTORY_STOCK: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_INVENTORY_STOCK\ODS_INVENTORY_STOCK-14525-20260319-012254
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | 开始执行ODS_INVENTORY_STOCK (ODS)
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | ODS_INVENTORY_STOCK: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | ODS_INVENTORY_STOCK ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsStockReport
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | [ODS_INVENTORY_STOCK] 开始执行ODS_INVENTORY_STOCK (ODS)
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | [ODS_INVENTORY_STOCK] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | [ODS_INVENTORY_STOCK] ODS 任务失败
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | 任务 ODS_INVENTORY_STOCK 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsStockReport
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsStockReport
[stderr] [2026-03-19 01:22:54] ERROR | etl_billiards | [ODS_INVENTORY_STOCK] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/TenantGoods/GetGoodsStockReport
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\ODS_INVENTORY_CHANGE\ODS_INVENTORY_CHANGE-14526-20260319-012254
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | 开始执行ODS_INVENTORY_CHANGE (ODS)
[stderr] [2026-03-19 01:22:54] INFO  | etl_billiards | ODS_INVENTORY_CHANGE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:55] ERROR | etl_billiards | ODS_INVENTORY_CHANGE ODS 任务失败
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/GoodsStockManage/QueryGoodsOutboundReceipt
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | [ODS_INVENTORY_CHANGE] 开始执行ODS_INVENTORY_CHANGE (ODS)
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | [ODS_INVENTORY_CHANGE] 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:55] ERROR | etl_billiards | [ODS_INVENTORY_CHANGE] ODS 任务失败
[stderr] [2026-03-19 01:22:55] ERROR | etl_billiards | 任务 ODS_INVENTORY_CHANGE 失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/GoodsStockManage/QueryGoodsOutboundReceipt
[stderr] Traceback (most recent call last):
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 97, in run_tasks
[stderr]     task_result = self.run_single_task(
[stderr]         task_code, run_uuid, store_id, data_source=data_source,
[stderr]     )
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 191, in run_single_task
[stderr]     result, last_dump = self._execute_ods_record_and_load(
[stderr]                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         task_code, cursor_data, fetch_dir, run_id,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     )
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\orchestration\task_executor.py", line 340, in _execute_ods_record_and_load
[stderr]     result = task.execute(cursor_data)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 233, in execute
[stderr]     pipe_result = pipeline.run(requests, process_fn, write_fn)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 134, in run
[stderr]     self._request_loop(requests, processing_queue, result)
[stderr]     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\pipeline\unified_pipeline.py", line 245, in _request_loop
[stderr]     for req in requests:
[stderr]                ^^^^^^^^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\tasks\ods\ods_tasks.py", line 444, in _build_requests
[stderr]     for page_num, page_records, total, response_payload in self.api.iter_paginated(
[stderr]                                                            ~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=spec.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<3 lines>...
[stderr]         list_key=spec.list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\recording_client.py", line 61, in iter_paginated
[stderr]     for page_no, records, request_params, response in self.base.iter_paginated(
[stderr]                                                       ~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ...<5 lines>...
[stderr]         list_key=list_key,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 215, in iter_paginated
[stderr]     for _, records, request_params, payload in self._iter_paginated_single(
[stderr]                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
[stderr]         endpoint=call.endpoint,
[stderr]         ^^^^^^^^^^^^^^^^^^^^^^^
[stderr]     ...<7 lines>...
[stderr]         page_end=page_end,
[stderr]         ^^^^^^^^^^^^^^^^^^
[stderr]     ):
[stderr]     ^
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 177, in _iter_paginated_single
[stderr]     payload = self._post_json(endpoint, page_params)
[stderr]   File "C:\NeoZQYY\apps\etl\connectors\feiqiu\api\client.py", line 122, in _post_json
[stderr]     resp.raise_for_status()
[stderr]     ~~~~~~~~~~~~~~~~~~~~~^^
[stderr]   File "C:\NeoZQYY\.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
[stderr]     raise HTTPError(http_error_msg, response=self)
[stderr] requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/GoodsStockManage/QueryGoodsOutboundReceipt
[stderr] [2026-03-19 01:22:55] ERROR | etl_billiards | [ODS_INVENTORY_CHANGE] 任务失败: 401 Client Error: Unauthorized for url: https://pc.ficoo.vip/apiprod/admin/v1/GoodsStockManage/QueryGoodsOutboundReceipt
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD_LOAD_FROM_ODS: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWD_LOAD_FROM_ODS\DWD_LOAD_FROM_ODS-14527-20260319-012255
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD_LOAD_FROM_ODS: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD_LOAD_FROM_ODS: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWD_LOAD_FROM_ODS\DWD_LOAD_FROM_ODS-14527-20260319-012255
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD_LOAD_FROM_ODS: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD 装载开始：dwd.dim_site <= ods.table_fee_transactions
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD 装载开始：dwd.dim_site_ex <= ods.table_fee_transactions
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD 装载开始：dwd.dim_table <= ods.site_tables_master
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD 装载开始：dwd.dim_table_ex <= ods.site_tables_master
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD 装载完成：dwd.dim_table，用时 0.56s
[stderr] [2026-03-19 01:22:55] INFO  | etl_billiards | DWD 装载开始：dwd.dim_assistant <= ods.assistant_accounts_master
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载完成：dwd.dim_table_ex，用时 0.63s
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载开始：dwd.dim_assistant_ex <= ods.assistant_accounts_master
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载完成：dwd.dim_site，用时 0.95s
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载开始：dwd.dim_member <= ods.member_profiles
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载完成：dwd.dim_site_ex，用时 1.03s
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载开始：dwd.dim_member_ex <= ods.member_profiles
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载完成：dwd.dim_assistant，用时 0.57s
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载开始：dwd.dim_member_card_account <= ods.member_stored_value_cards
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载完成：dwd.dim_assistant_ex，用时 0.72s
[stderr] [2026-03-19 01:22:56] INFO  | etl_billiards | DWD 装载开始：dwd.dim_member_card_account_ex <= ods.member_stored_value_cards
[stderr] [2026-03-19 01:22:57] INFO  | etl_billiards | DWD 装载完成：dwd.dim_member，用时 0.97s
[stderr] [2026-03-19 01:22:57] INFO  | etl_billiards | DWD 装载开始：dwd.dim_tenant_goods <= ods.tenant_goods_master
[stderr] [2026-03-19 01:22:57] INFO  | etl_billiards | DWD 装载完成：dwd.dim_member_ex，用时 0.93s
[stderr] [2026-03-19 01:22:57] INFO  | etl_billiards | DWD 装载开始：dwd.dim_tenant_goods_ex <= ods.tenant_goods_master
[stderr] [2026-03-19 01:22:57] INFO  | etl_billiards | DWD 装载完成：dwd.dim_member_card_account，用时 1.22s
[stderr] [2026-03-19 01:22:57] INFO  | etl_billiards | DWD 装载开始：dwd.dim_store_goods <= ods.store_goods_master
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载完成：dwd.dim_tenant_goods，用时 1.00s
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载开始：dwd.dim_store_goods_ex <= ods.store_goods_master
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载完成：dwd.dim_tenant_goods_ex，用时 1.01s
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载开始：dwd.dim_goods_category <= ods.stock_goods_category_tree
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载完成：dwd.dim_store_goods，用时 0.92s
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载开始：dwd.dim_groupbuy_package <= ods.group_buy_packages
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载完成：dwd.dim_member_card_account_ex，用时 2.22s
[stderr] [2026-03-19 01:22:58] INFO  | etl_billiards | DWD 装载开始：dwd.dim_groupbuy_package_ex <= ods.group_buy_packages
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载完成：dwd.dim_goods_category，用时 0.83s
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载开始：dwd.dim_staff <= ods.staff_info_master
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载完成：dwd.dim_store_goods_ex，用时 1.03s
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载开始：dwd.dim_staff_ex <= ods.staff_info_master
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载完成：dwd.dim_groupbuy_package，用时 0.77s
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_settlement_head <= ods.settlement_records
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载完成：dwd.dim_groupbuy_package_ex，用时 0.64s
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_settlement_head_ex <= ods.settlement_records
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载完成：dwd.dim_staff，用时 0.54s
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_table_fee_log <= ods.table_fee_transactions
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载完成：dwd.dim_staff_ex，用时 0.53s
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_table_fee_log_ex <= ods.table_fee_transactions
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_settlement_head，用时 0.49s
[stderr] [2026-03-19 01:22:59] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_table_fee_adjust <= ods.table_fee_discount_records
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_settlement_head_ex，用时 0.51s
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_table_fee_adjust_ex <= ods.table_fee_discount_records
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_table_fee_log，用时 0.47s
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_store_goods_sale <= ods.store_goods_sales_records
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_table_fee_log_ex，用时 0.48s
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_store_goods_sale_ex <= ods.store_goods_sales_records
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_table_fee_adjust，用时 0.57s
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_assistant_service_log <= ods.assistant_service_records
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_table_fee_adjust_ex，用时 0.47s
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_assistant_service_log_ex <= ods.assistant_service_records
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_store_goods_sale，用时 0.48s
[stderr] [2026-03-19 01:23:00] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_member_balance_change <= ods.member_balance_changes
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_store_goods_sale_ex，用时 0.74s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_member_balance_change_ex <= ods.member_balance_changes
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_assistant_service_log，用时 0.62s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_groupbuy_redemption <= ods.group_buy_redemption_records
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_assistant_service_log_ex，用时 0.77s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_groupbuy_redemption_ex <= ods.group_buy_redemption_records
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_member_balance_change，用时 0.67s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_platform_coupon_redemption <= ods.platform_coupon_redemption_records
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_member_balance_change_ex，用时 0.46s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_platform_coupon_redemption_ex <= ods.platform_coupon_redemption_records
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_groupbuy_redemption，用时 0.47s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_recharge_order <= ods.recharge_settlements
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_groupbuy_redemption_ex，用时 0.48s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_recharge_order_ex <= ods.recharge_settlements
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_platform_coupon_redemption，用时 0.48s
[stderr] [2026-03-19 01:23:01] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_payment <= ods.payment_transactions
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_platform_coupon_redemption_ex，用时 0.51s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_refund <= ods.refund_transactions
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_recharge_order，用时 0.58s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_refund_ex <= ods.refund_transactions
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_payment，用时 0.50s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_goods_stock_summary <= ods.goods_stock_summary
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_recharge_order_ex，用时 0.50s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载开始：dwd.dwd_goods_stock_movement <= ods.goods_stock_movements
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_refund，用时 0.46s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_refund_ex，用时 0.47s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_goods_stock_summary，用时 0.49s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD 装载完成：dwd.dwd_goods_stock_movement，用时 0.49s
[stderr] [2026-03-19 01:23:02] INFO  | etl_billiards | DWD_LOAD_FROM_ODS: 完成，统计={'tables': 42, 'errors': 0, 'error_details': 0}
[stderr] [2026-03-19 01:23:03] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_PROJECT_TAG\DWS_ASSISTANT_PROJECT_TAG-14528-20260319-012303
[stderr] [2026-03-19 01:23:03] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 提取助教服务数据
[stderr] [2026-03-19 01:23:03] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:03] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_PROJECT_TAG\DWS_ASSISTANT_PROJECT_TAG-14528-20260319-012303
[stderr] [2026-03-19 01:23:03] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:03] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 提取助教服务数据
[stderr] [2026-03-19 01:23:03] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 生成 524 条标签记录（其中 278 条达标）
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 删除 524 条，插入 524 条
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_ASSISTANT_PROJECT_TAG: 完成，统计={'status': 'SUCCESS', 'counts': {'inserted': 524, 'deleted': 524}}
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_MEMBER_PROJECT_TAG\DWS_MEMBER_PROJECT_TAG-14529-20260319-012315
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 提取客户台费时长数据
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_MEMBER_PROJECT_TAG\DWS_MEMBER_PROJECT_TAG-14529-20260319-012315
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:15] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 提取客户台费时长数据
[stderr] [2026-03-19 01:23:16] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 生成 131 条标签记录（其中 109 条达标）
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 删除 131 条，插入 131 条
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_MEMBER_PROJECT_TAG: 完成，统计={'status': 'SUCCESS', 'counts': {'inserted': 131, 'deleted': 131}}
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_GOODS_STOCK_DAILY\DWS_GOODS_STOCK_DAILY-14530-20260319-012319
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取数据，门店=2790685415443269，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取到 167 条 DWD 记录
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_GOODS_STOCK_DAILY\DWS_GOODS_STOCK_DAILY-14530-20260319-012319
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取数据，门店=2790685415443269，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 提取到 167 条 DWD 记录
[stderr] [2026-03-19 01:23:19] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 汇总完成，生成 64 条日度记录
[stderr] [2026-03-19 01:23:20] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 写入完成，inserted=64
[stderr] [2026-03-19 01:23:20] INFO  | etl_billiards | DWS_GOODS_STOCK_DAILY: 完成，统计={'counts': {'fetched': 64, 'inserted': 64, 'updated': 0, 'skipped': 0, 'errors': 0}}
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_GOODS_STOCK_WEEKLY\DWS_GOODS_STOCK_WEEKLY-14531-20260319-012321
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取数据，门店=2790685415443269，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取到 167 条 DWD 记录
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_GOODS_STOCK_WEEKLY\DWS_GOODS_STOCK_WEEKLY-14531-20260319-012321
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取数据，门店=2790685415443269，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 提取到 167 条 DWD 记录
[stderr] [2026-03-19 01:23:21] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 汇总完成，生成 64 条周度记录
[stderr] [2026-03-19 01:23:22] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 写入完成，inserted=64
[stderr] [2026-03-19 01:23:22] INFO  | etl_billiards | DWS_GOODS_STOCK_WEEKLY: 完成，统计={'counts': {'fetched': 64, 'inserted': 64, 'updated': 0, 'skipped': 0, 'errors': 0}}
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_GOODS_STOCK_MONTHLY\DWS_GOODS_STOCK_MONTHLY-14532-20260319-012323
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取数据，门店=2790685415443269，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取到 167 条 DWD 记录
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_GOODS_STOCK_MONTHLY\DWS_GOODS_STOCK_MONTHLY-14532-20260319-012323
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取数据，门店=2790685415443269，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 提取到 167 条 DWD 记录
[stderr] [2026-03-19 01:23:23] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 汇总完成，生成 64 条月度记录
[stderr] [2026-03-19 01:23:24] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 写入完成，inserted=64
[stderr] [2026-03-19 01:23:24] INFO  | etl_billiards | DWS_GOODS_STOCK_MONTHLY: 完成，统计={'counts': {'fetched': 64, 'inserted': 64, 'updated': 0, 'skipped': 0, 'errors': 0}}
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_DAILY\DWS_ASSISTANT_DAILY-14533-20260319-012325
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 提取数据，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_DAILY\DWS_ASSISTANT_DAILY-14533-20260319-012325
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 提取数据，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 转换数据，服务记录 9 条
[stderr] [2026-03-19 01:23:25] INFO  | etl_billiards | DWS_ASSISTANT_DAILY: 完成，统计={'counts': {'fetched': 8, 'inserted': 8, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 7}}
[stderr] [2026-03-19 01:23:26] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_CUSTOMER\DWS_ASSISTANT_CUSTOMER-14534-20260319-012326
[stderr] [2026-03-19 01:23:26] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 提取数据，统计日期 2026-03-19
[stderr] [2026-03-19 01:23:26] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:26] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_CUSTOMER\DWS_ASSISTANT_CUSTOMER-14534-20260319-012326
[stderr] [2026-03-19 01:23:26] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:26] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 提取数据，统计日期 2026-03-19
[stderr] [2026-03-19 01:23:26] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 转换数据，228 条服务关系记录
[stderr] [2026-03-19 01:23:31] INFO  | etl_billiards | DWS_ASSISTANT_CUSTOMER: 完成，统计={'counts': {'fetched': 228, 'inserted': 228, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 226}}
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_SALARY\DWS_ASSISTANT_SALARY-14535-20260319-012332
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 非工资结算期，跳过
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_SALARY\DWS_ASSISTANT_SALARY-14535-20260319-012332
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 非工资结算期，跳过
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 无数据需要写入
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_ASSISTANT_SALARY: 完成，统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_BUILD_ORDER_SUMMARY: 开始执行工具类任务
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_BUILD_ORDER_SUMMARY: 开始执行(1/1), 窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS订单汇总: 删除=111 语句=DELETE FROM dws.dws_order_summary WHERE 1=1 AND site_id = %s AND order_date >= %s AND order_date <= %s
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_BUILD_ORDER_SUMMARY: 完成, 统计={'fetched': 0, 'inserted': 119, 'updated': 0, 'skipped': 0, 'errors': 0}
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_BUILD_ORDER_SUMMARY: 工具类任务执行成功
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_BUILD_ORDER_SUMMARY: 结果统计: {'fetched': 0, 'inserted': 119, 'updated': 0, 'skipped': 0, 'errors': 0}
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_MEMBER_CONSUMPTION\DWS_MEMBER_CONSUMPTION-14536-20260319-012332
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 提取数据，统计日期 2026-03-19
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_MEMBER_CONSUMPTION\DWS_MEMBER_CONSUMPTION-14536-20260319-012332
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:32] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 提取数据，统计日期 2026-03-19
[stderr] [2026-03-19 01:23:33] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 转换数据，199 条会员消费记录
[stderr] [2026-03-19 01:23:37] INFO  | etl_billiards | DWS_MEMBER_CONSUMPTION: 完成，统计={'counts': {'fetched': 199, 'inserted': 199, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 199}}
[stderr] [2026-03-19 01:23:38] INFO  | etl_billiards | DWS_MEMBER_VISIT: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_MEMBER_VISIT\DWS_MEMBER_VISIT-14537-20260319-012338
[stderr] [2026-03-19 01:23:38] INFO  | etl_billiards | DWS_MEMBER_VISIT: 提取数据，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:38] INFO  | etl_billiards | DWS_MEMBER_VISIT: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:38] INFO  | etl_billiards | DWS_MEMBER_VISIT: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_MEMBER_VISIT\DWS_MEMBER_VISIT-14537-20260319-012338
[stderr] [2026-03-19 01:23:38] INFO  | etl_billiards | DWS_MEMBER_VISIT: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:38] INFO  | etl_billiards | DWS_MEMBER_VISIT: 提取数据，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:38] INFO  | etl_billiards | DWS_MEMBER_VISIT: 转换数据，11 条结账单
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_MEMBER_VISIT: 完成，统计={'counts': {'fetched': 11, 'inserted': 11, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 9, 'extra_deleted': 0}}
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_DAILY\DWS_FINANCE_DAILY-14538-20260319-012339
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 提取数据，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_DAILY\DWS_FINANCE_DAILY-14538-20260319-012339
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 提取数据，日期范围 2026-03-18 ~ 2026-03-19
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 转换数据，1 天结账数据，0 天充值数据
[stderr] [2026-03-19 01:23:39] INFO  | etl_billiards | DWS_FINANCE_DAILY: 完成，统计={'counts': {'fetched': 1, 'inserted': 1, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 1}}
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_RECHARGE: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_RECHARGE\DWS_FINANCE_RECHARGE-14539-20260319-012340
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_RECHARGE: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_RECHARGE: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_RECHARGE\DWS_FINANCE_RECHARGE-14539-20260319-012340
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_RECHARGE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_RECHARGE: 完成，统计={'counts': {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}}
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_INCOME_STRUCTURE: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_INCOME_STRUCTURE\DWS_FINANCE_INCOME_STRUCTURE-14540-20260319-012340
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_INCOME_STRUCTURE: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_INCOME_STRUCTURE: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_INCOME_STRUCTURE\DWS_FINANCE_INCOME_STRUCTURE-14540-20260319-012340
[stderr] [2026-03-19 01:23:40] INFO  | etl_billiards | DWS_FINANCE_INCOME_STRUCTURE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:41] INFO  | etl_billiards | DWS_FINANCE_INCOME_STRUCTURE: 完成，统计={'deleted': 8, 'inserted': 8}
[stderr] [2026-03-19 01:23:41] INFO  | etl_billiards | DWS_FINANCE_DISCOUNT_DETAIL: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_DISCOUNT_DETAIL\DWS_FINANCE_DISCOUNT_DETAIL-14541-20260319-012341
[stderr] [2026-03-19 01:23:41] INFO  | etl_billiards | DWS_FINANCE_DISCOUNT_DETAIL: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:41] INFO  | etl_billiards | DWS_FINANCE_DISCOUNT_DETAIL: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_FINANCE_DISCOUNT_DETAIL\DWS_FINANCE_DISCOUNT_DETAIL-14541-20260319-012341
[stderr] [2026-03-19 01:23:41] INFO  | etl_billiards | DWS_FINANCE_DISCOUNT_DETAIL: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:41] INFO  | etl_billiards | DWS_FINANCE_DISCOUNT_DETAIL: 完成，统计={'deleted': 8, 'inserted': 8}
[stderr] [2026-03-19 01:23:42] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_MONTHLY\DWS_ASSISTANT_MONTHLY-14542-20260319-012342
[stderr] [2026-03-19 01:23:42] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 提取数据，月份范围 ['2026-03-01']
[stderr] [2026-03-19 01:23:42] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:42] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_MONTHLY\DWS_ASSISTANT_MONTHLY-14542-20260319-012342
[stderr] [2026-03-19 01:23:42] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:42] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 提取数据，月份范围 ['2026-03-01']
[stderr] [2026-03-19 01:23:42] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 转换数据，1 个月份，25 条聚合记录
[stderr] [2026-03-19 01:23:43] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 加载完成，删除 25 行，插入 25 行
[stderr] [2026-03-19 01:23:43] INFO  | etl_billiards | DWS_ASSISTANT_MONTHLY: 完成，统计={'counts': {'fetched': 25, 'inserted': 25, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 25}}
[stderr] [2026-03-19 01:23:43] INFO  | etl_billiards | DWS_ASSISTANT_FINANCE: 抓取阶段开始，目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_FINANCE\DWS_ASSISTANT_FINANCE-14543-20260319-012343
[stderr] [2026-03-19 01:23:43] INFO  | etl_billiards | DWS_ASSISTANT_FINANCE: 抓取完成，文件=None，记录数=0
[stderr] [2026-03-19 01:23:43] INFO  | etl_billiards | DWS_ASSISTANT_FINANCE: 本地清洗入库开始，源目录=C:\NeoZQYY\export\ETL-Connectors\feiqiu\JSON\DWS_ASSISTANT_FINANCE\DWS_ASSISTANT_FINANCE-14543-20260319-012343
[stderr] [2026-03-19 01:23:43] INFO  | etl_billiards | DWS_ASSISTANT_FINANCE: 开始执行(1/1)，窗口[2026-03-18 19:22:46.318958+08:00 ~ 2026-03-19 03:22:46.318958+08:00]
[stderr] [2026-03-19 01:23:44] INFO  | etl_billiards | DWS_ASSISTANT_FINANCE: 完成，统计={'counts': {'fetched': 8, 'inserted': 8, 'updated': 0, 'skipped': 0, 'errors': 0}, 'extra': {'deleted': 7}}
[stderr] [2026-03-19 01:23:44] INFO  | etl_billiards | DWS_WINBACK_INDEX: 开始执行工具类任务
[stderr] [2026-03-19 01:23:44] INFO  | etl_billiards | 开始计算 DWS_WINBACK_INDEX
[stderr] [2026-03-19 01:23:44] INFO  | etl_billiards | DWS_WINBACK_INDEX: 使用回溯天数覆盖 lookback_days_recency=60
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | WBI calculation finished, inserted 52 rows
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | DWS_WINBACK_INDEX: 工具类任务执行成功
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | DWS_NEWCONV_INDEX: 开始执行工具类任务
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | 开始计算 DWS_NEWCONV_INDEX
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | DWS_NEWCONV_INDEX: 使用回溯天数覆盖 lookback_days_recency=60
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | NCI calculation finished, inserted 12 rows
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | DWS_NEWCONV_INDEX: 工具类任务执行成功
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | DWS_RELATION_INDEX: 开始执行工具类任务
[stderr] [2026-03-19 01:23:46] INFO  | etl_billiards | 开始计算关系指数（RS/OS/MS/ML）
[stderr] [2026-03-19 01:23:47] INFO  | etl_billiards | 服务关系对数量: 106
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | 关系指数计算完成，写入 106 条记录
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | DWS_RELATION_INDEX: 工具类任务执行成功
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | DWS_SPENDING_POWER_INDEX: 开始执行工具类任务
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | 开始计算 SPI 消费力指数
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 消费特征提取完成: site_id=2790685415443269, 会员数=94, 窗口=30/90天
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 充值特征提取完成: site_id=2790685415443269, 有充值会员数=36, 窗口=90天
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 日消费 EWMA 批量计算完成: site_id=2790685415443269, 会员数=94, α=0.30
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 基数校准: amount_base_spend_30 非零样本 12/94，中位数 378.00
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 基数校准: amount_base_spend_90 非零样本 45/94，中位数 236.00
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 基数校准: amount_base_ticket_90 非零样本 45/94，中位数 36.25
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 基数校准: amount_base_recharge_90 非零样本 36/94，中位数 6100.00
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 基数校准: amount_base_speed_abs 非零样本 12/94，中位数 124.26
[stderr] [2026-03-19 01:23:50] INFO  | etl_billiards | SPI 基数校准: amount_base_ewma_90 非零样本 45/94，中位数 48.00
[stderr] [2026-03-19 01:23:52] INFO  | etl_billiards | SPI 数据写入完成: site_id=2790685415443269, 插入记录=94
[stderr] [2026-03-19 01:23:52] INFO  | etl_billiards | SPI 计算完成: site_id=2790685415443269, 会员数=94, 写入记录=94
[stderr] [2026-03-19 01:23:52] INFO  | etl_billiards | DWS_SPENDING_POWER_INDEX: 工具类任务执行成功
[stderr] [2026-03-19 01:23:52] INFO  | etl_billiards | 所有任务执行完成
[stderr] [2026-03-19 01:24:03] INFO  | etl_billiards | 一致性检查报告已生成: C:\NeoZQYY\export\ETL-Connectors\feiqiu\REPORTS\consistency_report_20260319_012403.md
[stderr] [2026-03-19 01:24:03] INFO  | etl_billiards | 计时报告已生成
[stderr] [2026-03-19 01:24:03] INFO  | etl_billiards | 
[stderr] ╔══════════════════════════════════════════════════════════════╗
[stderr] ║                     任务执行总结                              ║
[stderr] ╠══════════════════════════════════════════════════════════════╣
[stderr] ║ 任务代码: FLOW_API_FULL                                      ║
[stderr] ║ 执行状态: 成功                                                 ║
[stderr] ║ 执行时间: 2026-03-19 01:22:46 ~ 01:24:03 (1分17秒)             ║
[stderr] ╠══════════════════════════════════════════════════════════════╣
[stderr] ║ 数据统计                                                      ║
[stderr] ║   - 获取记录:          0                                  ║
[stderr] ║   - 新增记录:        135                                  ║
[stderr] ║   - 更新记录:          0                                  ║
[stderr] ║   - 跳过记录:          0                                  ║
[stderr] ║   - 错误记录:          0                                  ║
[stderr] ╚══════════════════════════════════════════════════════════════╝
[stderr] [2026-03-19 01:24:03] INFO  | etl_billiards | 
[stderr] ╔══════════════════════════════════════════════════════════════╗
[stderr] ║                     任务执行总结                              ║
[stderr] ╠══════════════════════════════════════════════════════════════╣
[stderr] ║ 任务代码: FLOW_API_FULL                                      ║
[stderr] ║ 执行状态: 成功                                                 ║
[stderr] ║ 执行时间: 2026-03-19 01:22:46 ~ 01:24:03 (1分17秒)             ║
[stderr] ╠══════════════════════════════════════════════════════════════╣
[stderr] ║ 数据统计                                                      ║
[stderr] ║   - 获取记录:          0                                  ║
[stderr] ║   - 新增记录:        135                                  ║
[stderr] ║   - 更新记录:          0                                  ║
[stderr] ║   - 跳过记录:          0                                  ║
[stderr] ║   - 错误记录:          0                                  ║
[stderr] ╚══════════════════════════════════════════════════════════════╝
[stderr] [2026-03-19 01:24:03] INFO  | etl_billiards | Flow 执行完成: SUCCESS
[stderr] [2026-03-19 01:24:03] INFO  | etl_billiards | ETL运行完成