206 KiB
[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运行完成