初始提交:飞球 ETL 系统全量代码

This commit is contained in:
Neo
2026-02-13 08:05:34 +08:00
commit 3c51f5485d
441 changed files with 117631 additions and 0 deletions

402
docs/audit/flow_tree.md Normal file
View File

@@ -0,0 +1,402 @@
# 项目流程树报告
- 生成时间: 2026-02-12T14:33:39Z
- 仓库路径: `C:\ZQYY\FQ-ETL`
## 流程图Mermaid
```mermaid
graph TD
N0["`cli.main`"]
N0 --> N1
N1["`config.settings`"]
N0 --> N2
N2["`orchestration.scheduler`"]
N2 --> N3
N3["`api.client`"]
N3 --> N4
N4["`api.endpoint_routing`"]
N2 --> N5
N5["`database.connection`"]
N2 --> N6
N6["`database.operations`"]
N2 --> N7
N7["`orchestration.cursor_manager`"]
N2 --> N8
N8["`orchestration.run_tracker`"]
N2 --> N9
N9["`orchestration.task_registry`"]
N9 --> N10
N10["`tasks.ods.orders_task [任务]`"]
N10 --> N11
N11["`tasks.base_task [任务]`"]
N11 --> N12
N12["`utils.windowing`"]
N10 --> N13
N13["`loaders.facts.order [事实表加载器]`"]
N10 --> N14
N14["`models.parsers`"]
N9 --> N15
N15["`tasks.ods.payments_task [任务]`"]
N15 --> N16
N16["`loaders.facts.payment [事实表加载器]`"]
N9 --> N17
N17["`tasks.ods.members_task [任务]`"]
N17 --> N18
N18["`loaders.dimensions.member [维度加载器 (SCD2)]`"]
N9 --> N19
N19["`tasks.ods.products_task [任务]`"]
N19 --> N20
N20["`loaders.dimensions.product [维度加载器 (SCD2)]`"]
N20 --> N21
N21["`scd.scd2_handler`"]
N9 --> N22
N22["`tasks.ods.tables_task [任务]`"]
N22 --> N23
N23["`loaders.dimensions.table [维度加载器 (SCD2)]`"]
N9 --> N24
N24["`tasks.ods.assistants_task [任务]`"]
N24 --> N25
N25["`loaders.dimensions.assistant [维度加载器 (SCD2)]`"]
N9 --> N26
N26["`tasks.ods.packages_task [任务]`"]
N26 --> N27
N27["`loaders.dimensions.package [维度加载器 (SCD2)]`"]
N9 --> N28
N28["`tasks.ods.refunds_task [任务]`"]
N28 --> N29
N29["`loaders.facts.refund [事实表加载器]`"]
N9 --> N30
N30["`tasks.ods.coupon_usage_task [任务]`"]
N30 --> N31
N31["`loaders.facts.coupon_usage [事实表加载器]`"]
N9 --> N32
N32["`tasks.ods.inventory_change_task [任务]`"]
N32 --> N33
N33["`loaders.facts.inventory_change [事实表加载器]`"]
N9 --> N34
N34["`tasks.ods.topups_task [任务]`"]
N34 --> N35
N35["`loaders.facts.topup [事实表加载器]`"]
N9 --> N36
N36["`tasks.ods.table_discount_task [任务]`"]
N36 --> N37
N37["`loaders.facts.table_discount [事实表加载器]`"]
N9 --> N38
N38["`tasks.ods.assistant_abolish_task [任务]`"]
N38 --> N39
N39["`loaders.facts.assistant_abolish [事实表加载器]`"]
N9 --> N40
N40["`tasks.ods.ledger_task [任务]`"]
N40 --> N41
N41["`loaders.facts.assistant_ledger [事实表加载器]`"]
N9 --> N42
N42["`tasks.ods.ods_tasks [ODS 抓取任务]`"]
N9 --> N43
N43["`tasks.ods.ods_json_archive_task [ODS 抓取任务]`"]
N43 --> N44
N44["`utils.json_store`"]
N9 --> N45
N45["`tasks.dwd.payments_dwd_task [任务]`"]
N9 --> N46
N46["`tasks.dwd.members_dwd_task [任务]`"]
N9 --> N47
N47["`tasks.dwd.dwd_load_task [DWD 加载任务]`"]
N9 --> N48
N48["`tasks.dwd.ticket_dwd_task [任务]`"]
N48 --> N49
N49["`loaders.facts.ticket [事实表加载器]`"]
N9 --> N50
N50["`tasks.dwd.dwd_quality_task [DWD 加载任务]`"]
N9 --> N51
N51["`tasks.utility.manual_ingest_task [任务]`"]
N9 --> N52
N52["`tasks.utility.init_schema_task [Schema 初始化任务]`"]
N9 --> N53
N53["`tasks.utility.init_dwd_schema_task [Schema 初始化任务]`"]
N9 --> N54
N54["`tasks.utility.init_dws_schema_task [Schema 初始化任务]`"]
N9 --> N55
N55["`tasks.utility.check_cutoff_task [任务]`"]
N9 --> N56
N56["`tasks.utility.dws_build_order_summary_task [DWS 汇总任务]`"]
N9 --> N57
N57["`tasks.utility.data_integrity_task [任务]`"]
N57 --> N58
N58["`quality.integrity_service`"]
N58 --> N59
N59["`quality.integrity_checker`"]
N59 --> N60
N60["`scripts.check.check_ods_gaps`"]
N60 --> N61
N61["`api.recording_client`"]
N60 --> N62
N62["`utils.logging_utils`"]
N60 --> N63
N63["`utils.ods_record_utils`"]
N58 --> N64
N64["`scripts.repair.backfill_missing_data`"]
N9 --> N65
N65["`tasks.utility.seed_dws_config_task [任务]`"]
N9 --> N66
N66["`tasks.dws [DWS 汇总任务]`"]
N2 --> N67
N67["`orchestration.task_executor`"]
N67 --> N68
N68["`api.local_json_client`"]
N2 --> N69
N69["`orchestration.pipeline_runner`"]
N69 --> N70
N70["`tasks.verification [校验任务]`"]
N69 --> N71
N71["`utils.task_logger`"]
N72["`gui.main`"]
N72 --> N73
N73["`gui.main_window`"]
N74["`scripts.run_update`"]
N74 --> N3
N3["`api.client`"]
N4["`api.endpoint_routing`"]
N74 --> N1
N1["`config.settings`"]
N74 --> N5
N5["`database.connection`"]
N74 --> N6
N6["`database.operations`"]
N74 --> N2
N2["`orchestration.scheduler`"]
N7["`orchestration.cursor_manager`"]
N8["`orchestration.run_tracker`"]
N9["`orchestration.task_registry`"]
N10["`tasks.ods.orders_task [任务]`"]
N11["`tasks.base_task [任务]`"]
N12["`utils.windowing`"]
N13["`loaders.facts.order [事实表加载器]`"]
N14["`models.parsers`"]
N15["`tasks.ods.payments_task [任务]`"]
N16["`loaders.facts.payment [事实表加载器]`"]
N17["`tasks.ods.members_task [任务]`"]
N18["`loaders.dimensions.member [维度加载器 (SCD2)]`"]
N19["`tasks.ods.products_task [任务]`"]
N20["`loaders.dimensions.product [维度加载器 (SCD2)]`"]
N21["`scd.scd2_handler`"]
N22["`tasks.ods.tables_task [任务]`"]
N23["`loaders.dimensions.table [维度加载器 (SCD2)]`"]
N24["`tasks.ods.assistants_task [任务]`"]
N25["`loaders.dimensions.assistant [维度加载器 (SCD2)]`"]
N26["`tasks.ods.packages_task [任务]`"]
N27["`loaders.dimensions.package [维度加载器 (SCD2)]`"]
N28["`tasks.ods.refunds_task [任务]`"]
N29["`loaders.facts.refund [事实表加载器]`"]
N30["`tasks.ods.coupon_usage_task [任务]`"]
N31["`loaders.facts.coupon_usage [事实表加载器]`"]
N32["`tasks.ods.inventory_change_task [任务]`"]
N33["`loaders.facts.inventory_change [事实表加载器]`"]
N34["`tasks.ods.topups_task [任务]`"]
N35["`loaders.facts.topup [事实表加载器]`"]
N36["`tasks.ods.table_discount_task [任务]`"]
N37["`loaders.facts.table_discount [事实表加载器]`"]
N38["`tasks.ods.assistant_abolish_task [任务]`"]
N39["`loaders.facts.assistant_abolish [事实表加载器]`"]
N40["`tasks.ods.ledger_task [任务]`"]
N41["`loaders.facts.assistant_ledger [事实表加载器]`"]
N42["`tasks.ods.ods_tasks [ODS 抓取任务]`"]
N43["`tasks.ods.ods_json_archive_task [ODS 抓取任务]`"]
N44["`utils.json_store`"]
N45["`tasks.dwd.payments_dwd_task [任务]`"]
N46["`tasks.dwd.members_dwd_task [任务]`"]
N47["`tasks.dwd.dwd_load_task [DWD 加载任务]`"]
N48["`tasks.dwd.ticket_dwd_task [任务]`"]
N49["`loaders.facts.ticket [事实表加载器]`"]
N50["`tasks.dwd.dwd_quality_task [DWD 加载任务]`"]
N51["`tasks.utility.manual_ingest_task [任务]`"]
N52["`tasks.utility.init_schema_task [Schema 初始化任务]`"]
N53["`tasks.utility.init_dwd_schema_task [Schema 初始化任务]`"]
N54["`tasks.utility.init_dws_schema_task [Schema 初始化任务]`"]
N55["`tasks.utility.check_cutoff_task [任务]`"]
N56["`tasks.utility.dws_build_order_summary_task [DWS 汇总任务]`"]
N57["`tasks.utility.data_integrity_task [任务]`"]
N58["`quality.integrity_service`"]
N59["`quality.integrity_checker`"]
N60["`scripts.check.check_ods_gaps`"]
N61["`api.recording_client`"]
N62["`utils.logging_utils`"]
N63["`utils.ods_record_utils`"]
N64["`scripts.repair.backfill_missing_data`"]
N65["`tasks.utility.seed_dws_config_task [任务]`"]
N66["`tasks.dws [DWS 汇总任务]`"]
N67["`orchestration.task_executor`"]
N68["`api.local_json_client`"]
N69["`orchestration.pipeline_runner`"]
N70["`tasks.verification [校验任务]`"]
N71["`utils.task_logger`"]
```
## 流程树(缩进文本)
- `cli.main` (`cli/main.py`)
- `config.settings` (`config/settings.py`)
- `orchestration.scheduler` (`orchestration/scheduler.py`)
- `api.client` (`api/client.py`)
- `api.endpoint_routing` (`api/endpoint_routing.py`)
- `database.connection` (`database/connection.py`)
- `database.operations` (`database/operations.py`)
- `orchestration.cursor_manager` (`orchestration/cursor_manager.py`)
- `orchestration.run_tracker` (`orchestration/run_tracker.py`)
- `orchestration.task_registry` (`orchestration/task_registry.py`)
- `tasks.ods.orders_task` (`tasks/ods/orders_task.py`) [任务]
- `tasks.base_task` (`tasks/base_task.py`) [任务]
- `utils.windowing` (`utils/windowing.py`)
- `loaders.facts.order` (`loaders/facts/order.py`) [事实表加载器]
- `models.parsers` (`models/parsers.py`)
- `tasks.ods.payments_task` (`tasks/ods/payments_task.py`) [任务]
- `loaders.facts.payment` (`loaders/facts/payment.py`) [事实表加载器]
- `tasks.ods.members_task` (`tasks/ods/members_task.py`) [任务]
- `loaders.dimensions.member` (`loaders/dimensions/member.py`) [维度加载器 (SCD2)]
- `tasks.ods.products_task` (`tasks/ods/products_task.py`) [任务]
- `loaders.dimensions.product` (`loaders/dimensions/product.py`) [维度加载器 (SCD2)]
- `scd.scd2_handler` (`scd/scd2_handler.py`)
- `tasks.ods.tables_task` (`tasks/ods/tables_task.py`) [任务]
- `loaders.dimensions.table` (`loaders/dimensions/table.py`) [维度加载器 (SCD2)]
- `tasks.ods.assistants_task` (`tasks/ods/assistants_task.py`) [任务]
- `loaders.dimensions.assistant` (`loaders/dimensions/assistant.py`) [维度加载器 (SCD2)]
- `tasks.ods.packages_task` (`tasks/ods/packages_task.py`) [任务]
- `loaders.dimensions.package` (`loaders/dimensions/package.py`) [维度加载器 (SCD2)]
- `tasks.ods.refunds_task` (`tasks/ods/refunds_task.py`) [任务]
- `loaders.facts.refund` (`loaders/facts/refund.py`) [事实表加载器]
- `tasks.ods.coupon_usage_task` (`tasks/ods/coupon_usage_task.py`) [任务]
- `loaders.facts.coupon_usage` (`loaders/facts/coupon_usage.py`) [事实表加载器]
- `tasks.ods.inventory_change_task` (`tasks/ods/inventory_change_task.py`) [任务]
- `loaders.facts.inventory_change` (`loaders/facts/inventory_change.py`) [事实表加载器]
- `tasks.ods.topups_task` (`tasks/ods/topups_task.py`) [任务]
- `loaders.facts.topup` (`loaders/facts/topup.py`) [事实表加载器]
- `tasks.ods.table_discount_task` (`tasks/ods/table_discount_task.py`) [任务]
- `loaders.facts.table_discount` (`loaders/facts/table_discount.py`) [事实表加载器]
- `tasks.ods.assistant_abolish_task` (`tasks/ods/assistant_abolish_task.py`) [任务]
- `loaders.facts.assistant_abolish` (`loaders/facts/assistant_abolish.py`) [事实表加载器]
- `tasks.ods.ledger_task` (`tasks/ods/ledger_task.py`) [任务]
- `loaders.facts.assistant_ledger` (`loaders/facts/assistant_ledger.py`) [事实表加载器]
- `tasks.ods.ods_tasks` (`tasks/ods/ods_tasks.py`) [ODS 抓取任务]
- `tasks.ods.ods_json_archive_task` (`tasks/ods/ods_json_archive_task.py`) [ODS 抓取任务]
- `utils.json_store` (`utils/json_store.py`)
- `tasks.dwd.payments_dwd_task` (`tasks/dwd/payments_dwd_task.py`) [任务]
- `tasks.dwd.members_dwd_task` (`tasks/dwd/members_dwd_task.py`) [任务]
- `tasks.dwd.dwd_load_task` (`tasks/dwd/dwd_load_task.py`) [DWD 加载任务]
- `tasks.dwd.ticket_dwd_task` (`tasks/dwd/ticket_dwd_task.py`) [任务]
- `loaders.facts.ticket` (`loaders/facts/ticket.py`) [事实表加载器]
- `tasks.dwd.dwd_quality_task` (`tasks/dwd/dwd_quality_task.py`) [DWD 加载任务]
- `tasks.utility.manual_ingest_task` (`tasks/utility/manual_ingest_task.py`) [任务]
- `tasks.utility.init_schema_task` (`tasks/utility/init_schema_task.py`) [Schema 初始化任务]
- `tasks.utility.init_dwd_schema_task` (`tasks/utility/init_dwd_schema_task.py`) [Schema 初始化任务]
- `tasks.utility.init_dws_schema_task` (`tasks/utility/init_dws_schema_task.py`) [Schema 初始化任务]
- `tasks.utility.check_cutoff_task` (`tasks/utility/check_cutoff_task.py`) [任务]
- `tasks.utility.dws_build_order_summary_task` (`tasks/utility/dws_build_order_summary_task.py`) [DWS 汇总任务]
- `tasks.utility.data_integrity_task` (`tasks/utility/data_integrity_task.py`) [任务]
- `quality.integrity_service` (`quality/integrity_service.py`)
- `quality.integrity_checker` (`quality/integrity_checker.py`)
- `scripts.check.check_ods_gaps` (`scripts/check/check_ods_gaps.py`)
- `api.recording_client` (`api/recording_client.py`)
- `utils.logging_utils` (`utils/logging_utils.py`)
- `utils.ods_record_utils` (`utils/ods_record_utils.py`)
- `scripts.repair.backfill_missing_data` (`scripts/repair/backfill_missing_data.py`)
- `tasks.utility.seed_dws_config_task` (`tasks/utility/seed_dws_config_task.py`) [任务]
- `tasks.dws` (`tasks/dws/__init__.py`) [DWS 汇总任务]
- `orchestration.task_executor` (`orchestration/task_executor.py`)
- `api.local_json_client` (`api/local_json_client.py`)
- `orchestration.pipeline_runner` (`orchestration/pipeline_runner.py`)
- `tasks.verification` (`tasks/verification/__init__.py`) [校验任务]
- `utils.task_logger` (`utils/task_logger.py`)
- `gui.main` (`gui/main.py`)
- `gui.main_window` (`gui/main_window.py`)
- `scripts.run_update` (`scripts/run_update.py`)
- `api.client` (`api/client.py`)
- *(已展开)*
- `config.settings` (`config/settings.py`)
- `database.connection` (`database/connection.py`)
- `database.operations` (`database/operations.py`)
- `orchestration.scheduler` (`orchestration/scheduler.py`)
- *(已展开)*
## 孤立模块
- `config/defaults.py`
- `config/env_parser.py`
- `database/base.py`
- `gui/models/schedule_model.py`
- `gui/models/task_model.py`
- `gui/models/task_registry.py`
- `gui/utils/app_settings.py`
- `gui/utils/cli_builder.py`
- `gui/utils/config_helper.py`
- `gui/widgets/db_viewer.py`
- `gui/widgets/env_editor.py`
- `gui/widgets/log_viewer.py`
- `gui/widgets/pipeline_selector.py`
- `gui/widgets/settings_dialog.py`
- `gui/widgets/status_panel.py`
- `gui/widgets/task_manager.py`
- `gui/widgets/task_panel.py`
- `gui/widgets/task_selector.py`
- `gui/workers/db_worker.py`
- `gui/workers/task_worker.py`
- `loaders/base_loader.py`
- `loaders/ods/generic.py`
- `models/validators.py`
- `quality/balance_checker.py`
- `quality/base_checker.py`
- `scripts/check/check_data_integrity.py`
- `scripts/check/check_dwd_service.py`
- `scripts/check/check_ods_content_hash.py`
- `scripts/check/check_ods_json_vs_table.py`
- `scripts/check/verify_dws_config.py`
- `scripts/db_admin/import_dws_excel.py`
- `scripts/export/export_cfg_index_parameters.py`
- `scripts/export/export_groupbuy_orders_with_assistant_service.py`
- `scripts/export/export_index_tables.py`
- `scripts/export/export_intimacy_full_json.py`
- `scripts/export/export_visit_60d_member_detail_with_indices.py`
- `scripts/rebuild/rebuild_db_and_run_ods_to_dwd.py`
- `scripts/repair/dedupe_ods_snapshots.py`
- `scripts/repair/fix_dim_assistant_user_id.py`
- `scripts/repair/repair_ods_content_hash.py`
- `scripts/repair/tune_integrity_indexes.py`
- `tasks/dwd/base_dwd_task.py`
- `tasks/dws/assistant_customer_task.py`
- `tasks/dws/assistant_daily_task.py`
- `tasks/dws/assistant_finance_task.py`
- `tasks/dws/assistant_monthly_task.py`
- `tasks/dws/assistant_salary_task.py`
- `tasks/dws/base_dws_task.py`
- `tasks/dws/finance_daily_task.py`
- `tasks/dws/finance_discount_task.py`
- `tasks/dws/finance_income_task.py`
- `tasks/dws/finance_recharge_task.py`
- `tasks/dws/index/base_index_task.py`
- `tasks/dws/index/intimacy_index_task.py`
- `tasks/dws/index/member_index_base.py`
- `tasks/dws/index/ml_manual_import_task.py`
- `tasks/dws/index/newconv_index_task.py`
- `tasks/dws/index/recall_index_task.py`
- `tasks/dws/index/relation_index_task.py`
- `tasks/dws/index/winback_index_task.py`
- `tasks/dws/member_consumption_task.py`
- `tasks/dws/member_visit_task.py`
- `tasks/dws/mv_refresh_task.py`
- `tasks/dws/retention_cleanup_task.py`
- `tasks/verification/base_verifier.py`
- `tasks/verification/dwd_verifier.py`
- `tasks/verification/dws_verifier.py`
- `tasks/verification/index_verifier.py`
- `tasks/verification/models.py`
- `tasks/verification/ods_verifier.py`
- `utils/helpers.py`
- `utils/reporting.py`
## 统计摘要
| 指标 | 数量 |
|------|------|
| 入口点 | 3 |
| 任务 | 29 |
| 加载器 | 15 |
| 孤立模块 | 72 |