diff --git a/etl_billiards/api/recording_client.py b/etl_billiards/api/recording_client.py index 04fb831..cbdddd7 100644 --- a/etl_billiards/api/recording_client.py +++ b/etl_billiards/api/recording_client.py @@ -174,7 +174,8 @@ def build_recording_client( tz = ZoneInfo(tz_name) ts = datetime.now(tz).strftime("%Y%m%d-%H%M%S") fetch_root = _cfg_get(cfg, "pipeline.fetch_root") or _cfg_get(cfg, "io.export_root") or "export/JSON" - output_dir = Path(fetch_root) / f"{str(task_code).upper()}-{run_id}-{ts}" + task_upper = str(task_code).upper() + output_dir = Path(fetch_root) / task_upper / f"{task_upper}-{run_id}-{ts}" return RecordingAPIClient( base_client=base_client, diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_assistant_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_assistant_ex.md index 4de70d7..5926d68 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_assistant_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_assistant_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -69,6 +68,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_assistant_ex +WHERE assistant_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.*, e.* diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_groupbuy_package_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_groupbuy_package_ex.md index b9d2dca..e52a97c 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_groupbuy_package_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_groupbuy_package_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -53,6 +52,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_groupbuy_package_ex +WHERE groupbuy_package_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.package_name, m.duration_seconds, e.start_clock, e.end_clock, e.effective_status diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_card_account_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_card_account_ex.md index 32d1d05..2fc48ed 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_card_account_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_card_account_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -77,6 +76,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_member_card_account_ex +WHERE member_card_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联查询卡片及折扣配置 SELECT diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_ex.md index 5f3b0f1..915c4fe 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_member_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -40,6 +39,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_member_ex +WHERE member_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.*, e.point, e.growth_value, e.status diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_site_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_site_ex.md index 5e77cbd..9776e2d 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_site_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_site_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -46,6 +45,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_site_ex +WHERE site_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.*, e.* diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_store_goods_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_store_goods_ex.md index 9c159f0..cfe8e35 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_store_goods_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_store_goods_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -51,6 +50,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_store_goods_ex +WHERE site_goods_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.goods_name, m.sale_price, m.sale_qty, e.unit, e.stock_qty, e.cost_price diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_table_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_table_ex.md index 80a1774..c2dfab1 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_table_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_table_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -39,6 +38,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_table_ex +WHERE table_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.table_name, m.site_table_area_name, e.show_status, e.table_status diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_tenant_goods_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_tenant_goods_ex.md index fa384f0..c0f34e5 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_tenant_goods_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dim_tenant_goods_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -43,6 +42,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_tenant_goods_ex +WHERE tenant_goods_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.goods_name, m.market_price, e.cost_price, e.min_discount_price diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_service_log_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_service_log_ex.md index 39b1a1c..bab0466 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_service_log_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_service_log_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -51,6 +50,19 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:ledger_start_time, ledger_end_time, composite_grade_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_assistant_service_log_ex +ORDER BY ledger_start_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT m.nickname, m.ledger_amount, e.table_name, e.assistant_name, e.grade_status diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_trash_event_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_trash_event_ex.md index fb0db73..59d1b80 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_trash_event_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_assistant_trash_event_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -46,4 +45,18 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 主表可用时间字段:create_time + +```sql +-- 取最新一条(按主表时间字段) +SELECT e.* +FROM billiards_dwd.dwd_assistant_trash_event m +JOIN billiards_dwd.dwd_assistant_trash_event_ex e ON m.assistant_trash_event_id = e.assistant_trash_event_id +ORDER BY m.create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** 与主表 `dwd_assistant_trash_event` 通过 `assistant_trash_event_id` 关联,提供台桌和台区名称信息。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_groupbuy_redemption_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_groupbuy_redemption_ex.md index 3115093..147fe5a 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_groupbuy_redemption_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_groupbuy_redemption_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -59,4 +58,18 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 主表可用时间字段:create_time + +```sql +-- 取最新一条(按主表时间字段) +SELECT e.* +FROM billiards_dwd.dwd_groupbuy_redemption m +JOIN billiards_dwd.dwd_groupbuy_redemption_ex e ON m.redemption_id = e.redemption_id +ORDER BY m.create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** 与主表 `dwd_groupbuy_redemption` 通过 `redemption_id` 关联,提供门店、台桌名称、操作员等扩展信息。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_member_balance_change_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_member_balance_change_ex.md index 5ffc86b..c0274be 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_member_balance_change_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_member_balance_change_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -46,4 +45,18 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 主表可用时间字段:change_time + +```sql +-- 取最新一条(按主表时间字段) +SELECT e.* +FROM billiards_dwd.dwd_member_balance_change m +JOIN billiards_dwd.dwd_member_balance_change_ex e ON m.balance_change_id = e.balance_change_id +ORDER BY m.change_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** 与主表 `dwd_member_balance_change` 通过 `balance_change_id` 关联,提供操作员和门店名称等扩展信息。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_platform_coupon_redemption_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_platform_coupon_redemption_ex.md index 18bedac..8dc93fa 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_platform_coupon_redemption_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_platform_coupon_redemption_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -42,6 +41,19 @@ ## 使用说明 -与主表 `dwd_platform_coupon_redemption` 通过 `platform_coupon_redemption_id` 关联,提供操作员等扩展信息。 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 +- 主表可用时间字段:coupon_free_time, create_time, consume_time + +```sql +-- 取最新一条(按主表时间字段) +SELECT e.* +FROM billiards_dwd.dwd_platform_coupon_redemption m +JOIN billiards_dwd.dwd_platform_coupon_redemption_ex e ON m.platform_coupon_redemption_id = e.platform_coupon_redemption_id +ORDER BY m.create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** +与主表 `dwd_platform_coupon_redemption` 通过 `platform_coupon_redemption_id` 关联,提供操作员等扩展信息。 **注意**: `coupon_remark` 字段在抖音渠道的核销记录中包含核验信息。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_recharge_order_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_recharge_order_ex.md index c3acd3d..eaab62a 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_recharge_order_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_recharge_order_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -64,6 +63,18 @@ ## 使用说明 -与主表 `dwd_recharge_order` 通过 `recharge_order_id` 关联,提供操作员、各类金额明细等扩展信息。 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 +- 可用时间字段:revoke_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_recharge_order_ex +ORDER BY revoke_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** +与主表 `dwd_recharge_order` 通过 `recharge_order_id` 关联,提供操作员、各类金额明细等扩展信息。 **注意**: 样本数据获取时因日期解析错误未能获取。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_refund_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_refund_ex.md index 6af3ddf..de6c020 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_refund_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_refund_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -48,4 +47,18 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 主表可用时间字段:pay_time, create_time + +```sql +-- 取最新一条(按主表时间字段) +SELECT e.* +FROM billiards_dwd.dwd_refund m +JOIN billiards_dwd.dwd_refund_ex e ON m.refund_id = e.refund_id +ORDER BY m.pay_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** 与主表 `dwd_refund` 通过 `refund_id` 关联,提供退款状态和渠道等扩展信息。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_settlement_head_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_settlement_head_ex.md index ef85415..3c9b1db 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_settlement_head_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_settlement_head_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -51,6 +50,19 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:revoke_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_settlement_head_ex +ORDER BY revoke_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 关联主表与扩展表 SELECT @@ -59,7 +71,6 @@ SELECT FROM billiards_dwd.dwd_settlement_head m JOIN billiards_dwd.dwd_settlement_head_ex e ON m.order_settle_id = e.order_settle_id; - -- 统计备注订单 SELECT order_remark, COUNT(*) FROM billiards_dwd.dwd_settlement_head_ex diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_store_goods_sale_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_store_goods_sale_ex.md index 9fc6cb8..6b0caf9 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_store_goods_sale_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_store_goods_sale_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -56,4 +55,18 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 主表可用时间字段:create_time + +```sql +-- 取最新一条(按主表时间字段) +SELECT e.* +FROM billiards_dwd.dwd_store_goods_sale m +JOIN billiards_dwd.dwd_store_goods_sale_ex e ON m.store_goods_sale_id = e.store_goods_sale_id +ORDER BY m.create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** 与主表 `dwd_store_goods_sale` 通过 `store_goods_sale_id` 关联,提供销售详情、折扣优惠等扩展信息。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_adjust_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_adjust_ex.md index bcd38ac..987920e 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_adjust_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_adjust_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -36,4 +35,18 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 主表可用时间字段:adjust_time + +```sql +-- 取最新一条(按主表时间字段) +SELECT e.* +FROM billiards_dwd.dwd_table_fee_adjust m +JOIN billiards_dwd.dwd_table_fee_adjust_ex e ON m.table_fee_adjust_id = e.table_fee_adjust_id +ORDER BY m.adjust_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** 与主表 `dwd_table_fee_adjust` 通过 `table_fee_adjust_id` 关联,提供调整类型、申请人、操作员等扩展信息。 diff --git a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_log_ex.md b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_log_ex.md index 343a82f..58c0619 100644 --- a/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_log_ex.md +++ b/etl_billiards/docs/bd_manual/Ex/BD_manual_dwd_table_fee_log_ex.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -41,4 +40,17 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:ledger_start_time, last_use_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_table_fee_log_ex +ORDER BY ledger_start_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** 与主表 `dwd_table_fee_log` 通过 `table_fee_log_id` 关联,提供操作员和时间相关的扩展信息。 diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_billiards_dwd.md b/etl_billiards/docs/bd_manual/main/BD_manual_billiards_dwd.md index ee6cc18..5b2e317 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_billiards_dwd.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_billiards_dwd.md @@ -7,22 +7,21 @@ ## 概述 `billiards_dwd` 是台球门店数据仓库的明细层(DWD),包含维度表(DIM)和事实表(DWD)。本 Schema 基于 SCD2 缓慢变化维度设计,支持历史数据追溯。 - --- ## 维度表 (Dimension Tables) | 序号 | 表名 | 说明 | 主键 | 扩展表 | 文档链接 | |------|------|------|------|--------|----------| -| 1 | dim_assistant | 助教信息 | assistant_id | dim_assistant_ex | [主表](BD_manual_dim_assistant.md) / [扩展表](BD_manual_dim_assistant_ex.md) | -| 2 | dim_goods_category | 商品分类 | goods_category_id | 无 | [主表](BD_manual_dim_goods_category.md) | -| 3 | dim_groupbuy_package | 团购套餐 | groupbuy_package_id | dim_groupbuy_package_ex | [主表](BD_manual_dim_groupbuy_package.md) / [扩展表](BD_manual_dim_groupbuy_package_ex.md) | -| 4 | dim_member | 会员信息 | member_id | dim_member_ex | [主表](BD_manual_dim_member.md) / [扩展表](BD_manual_dim_member_ex.md) | -| 5 | dim_member_card_account | 会员卡账户 | member_card_account_id | dim_member_card_account_ex | [主表](BD_manual_dim_member_card_account.md) / [扩展表](BD_manual_dim_member_card_account_ex.md) | -| 6 | dim_site | 门店信息 | site_id | dim_site_ex | [主表](BD_manual_dim_site.md) / [扩展表](BD_manual_dim_site_ex.md) | -| 7 | dim_store_goods | 门店商品 | store_goods_id | dim_store_goods_ex | [主表](BD_manual_dim_store_goods.md) / [扩展表](BD_manual_dim_store_goods_ex.md) | -| 8 | dim_table | 台桌信息 | table_id | dim_table_ex | [主表](BD_manual_dim_table.md) / [扩展表](BD_manual_dim_table_ex.md) | -| 9 | dim_tenant_goods | 租户商品 | tenant_goods_id | dim_tenant_goods_ex | [主表](BD_manual_dim_tenant_goods.md) / [扩展表](BD_manual_dim_tenant_goods_ex.md) | +| 1 | dim_assistant | 助教信息 | assistant_id, scd2_start_time | dim_assistant_ex | [主表](BD_manual_dim_assistant.md) / [扩展表](BD_manual_dim_assistant_ex.md) | +| 2 | dim_goods_category | 商品分类 | category_id, scd2_start_time | 无 | [主表](BD_manual_dim_goods_category.md) | +| 3 | dim_groupbuy_package | 团购套餐 | groupbuy_package_id, scd2_start_time | dim_groupbuy_package_ex | [主表](BD_manual_dim_groupbuy_package.md) / [扩展表](BD_manual_dim_groupbuy_package_ex.md) | +| 4 | dim_member | 会员信息 | member_id, scd2_start_time | dim_member_ex | [主表](BD_manual_dim_member.md) / [扩展表](BD_manual_dim_member_ex.md) | +| 5 | dim_member_card_account | 会员卡账户 | member_card_id, scd2_start_time | dim_member_card_account_ex | [主表](BD_manual_dim_member_card_account.md) / [扩展表](BD_manual_dim_member_card_account_ex.md) | +| 6 | dim_site | 门店信息 | site_id, scd2_start_time | dim_site_ex | [主表](BD_manual_dim_site.md) / [扩展表](BD_manual_dim_site_ex.md) | +| 7 | dim_store_goods | 门店商品 | site_goods_id, scd2_start_time | dim_store_goods_ex | [主表](BD_manual_dim_store_goods.md) / [扩展表](BD_manual_dim_store_goods_ex.md) | +| 8 | dim_table | 台桌信息 | table_id, scd2_start_time | dim_table_ex | [主表](BD_manual_dim_table.md) / [扩展表](BD_manual_dim_table_ex.md) | +| 9 | dim_tenant_goods | 租户商品 | tenant_goods_id, scd2_start_time | dim_tenant_goods_ex | [主表](BD_manual_dim_tenant_goods.md) / [扩展表](BD_manual_dim_tenant_goods_ex.md) | --- @@ -30,7 +29,7 @@ | 序号 | 表名 | 说明 | 主键 | 扩展表 | 文档链接 | |------|------|------|------|--------|----------| -| 1 | dwd_assistant_service_log | 助教服务流水 | assistant_service_log_id | dwd_assistant_service_log_ex | [主表](BD_manual_dwd_assistant_service_log.md) / [扩展表](BD_manual_dwd_assistant_service_log_ex.md) | +| 1 | dwd_assistant_service_log | 助教服务流水 | assistant_service_id | dwd_assistant_service_log_ex | [主表](BD_manual_dwd_assistant_service_log.md) / [扩展表](BD_manual_dwd_assistant_service_log_ex.md) | | 2 | dwd_assistant_trash_event | 助教服务作废 | assistant_trash_event_id | dwd_assistant_trash_event_ex | [主表](BD_manual_dwd_assistant_trash_event.md) / [扩展表](BD_manual_dwd_assistant_trash_event_ex.md) | | 3 | dwd_groupbuy_redemption | 团购券核销 | redemption_id | dwd_groupbuy_redemption_ex | [主表](BD_manual_dwd_groupbuy_redemption.md) / [扩展表](BD_manual_dwd_groupbuy_redemption_ex.md) | | 4 | dwd_member_balance_change | 会员余额变动 | balance_change_id | dwd_member_balance_change_ex | [主表](BD_manual_dwd_member_balance_change.md) / [扩展表](BD_manual_dwd_member_balance_change_ex.md) | @@ -38,7 +37,7 @@ | 6 | dwd_platform_coupon_redemption | 平台券核销 | platform_coupon_redemption_id | dwd_platform_coupon_redemption_ex | [主表](BD_manual_dwd_platform_coupon_redemption.md) / [扩展表](BD_manual_dwd_platform_coupon_redemption_ex.md) | | 7 | dwd_recharge_order | 充值订单 | recharge_order_id | dwd_recharge_order_ex | [主表](BD_manual_dwd_recharge_order.md) / [扩展表](BD_manual_dwd_recharge_order_ex.md) | | 8 | dwd_refund | 退款流水 | refund_id | dwd_refund_ex | [主表](BD_manual_dwd_refund.md) / [扩展表](BD_manual_dwd_refund_ex.md) | -| 9 | dwd_settlement_head | 结账单 | settlement_head_id | dwd_settlement_head_ex | [主表](BD_manual_dwd_settlement_head.md) / [扩展表](BD_manual_dwd_settlement_head_ex.md) | +| 9 | dwd_settlement_head | 结账单 | order_settle_id | dwd_settlement_head_ex | [主表](BD_manual_dwd_settlement_head.md) / [扩展表](BD_manual_dwd_settlement_head_ex.md) | | 10 | dwd_store_goods_sale | 商品销售流水 | store_goods_sale_id | dwd_store_goods_sale_ex | [主表](BD_manual_dwd_store_goods_sale.md) / [扩展表](BD_manual_dwd_store_goods_sale_ex.md) | | 11 | dwd_table_fee_adjust | 台费调整 | table_fee_adjust_id | dwd_table_fee_adjust_ex | [主表](BD_manual_dwd_table_fee_adjust.md) / [扩展表](BD_manual_dwd_table_fee_adjust_ex.md) | | 12 | dwd_table_fee_log | 台费计费流水 | table_fee_log_id | dwd_table_fee_log_ex | [主表](BD_manual_dwd_table_fee_log.md) / [扩展表](BD_manual_dwd_table_fee_log_ex.md) | @@ -58,6 +57,18 @@ --- +## 最新值获取 + +- 维度表(SCD2):使用 scd2_is_current = 1 获取当前版本。 +- 事实表:无 SCD2 版本字段,按业务时间字段倒序获取最新记录(如 pay_time / create_time / update_time 等)。 + +```sql +-- 维度表取当前版本 +SELECT * FROM billiards_dwd.dim_member WHERE scd2_is_current = 1; +-- 事实表取最新记录(示例:按 pay_time) +SELECT * FROM billiards_dwd.dwd_payment ORDER BY pay_time DESC NULLS LAST LIMIT 1; +``` + ## 常见 ID 关联说明 | ID 字段 | 关联表 | 说明 | @@ -79,6 +90,7 @@ ### 主表 + 扩展表模式 大部分表采用"主表 + 扩展表"的设计模式: + - **主表**:包含核心业务字段(如金额、状态、关键 ID) - **扩展表**:包含附属信息(如操作员、门店名称快照、各类详细字段) - 两表通过主键一对一关联 @@ -86,6 +98,7 @@ ### 枚举值说明 文档中的枚举值格式为 `值(数量)=含义`,例如: + - `1(100)=有效` 表示值为 1 的记录有 100 条,含义为"有效" - **[待确认]** 表示该值的含义无法从数据中确定 diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_assistant.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_assistant.md index ab32a7e..5e301f0 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_assistant.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_assistant.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -40,6 +39,7 @@ ## 使用说明 +使用 scd2_is_current = 1 获取当前版本。 ```sql -- 查询当前在职助教 SELECT * FROM billiards_dwd.dim_assistant diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_goods_category.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_goods_category.md index d612682..55f7c45 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_goods_category.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_goods_category.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -40,12 +39,10 @@ ``` 槟榔(一级) ├── 槟榔(二级) - 器材(一级) ├── 皮头 ├── 球杆 ├── 其他 - 酒水(一级) ├── 饮料 ├── 酒水 @@ -57,11 +54,25 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_goods_category +WHERE category_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询一级分类 SELECT * FROM billiards_dwd.dim_goods_category WHERE scd2_is_current = 1 AND parent_category_id = 0; - -- 查询某一级分类下的二级分类 SELECT * FROM billiards_dwd.dim_goods_category WHERE scd2_is_current = 1 AND parent_category_id = <一级分类ID>; diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_groupbuy_package.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_groupbuy_package.md index bf2565d..5508425 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_groupbuy_package.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_groupbuy_package.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -41,9 +40,23 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_groupbuy_package +WHERE groupbuy_package_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询当前启用的套餐 SELECT * FROM billiards_dwd.dim_groupbuy_package WHERE scd2_is_current = 1 AND is_delete = 0 AND is_enabled = 1; - ``` diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_member.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_member.md index a8df160..d47d27d 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_member.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_member.md @@ -32,15 +32,27 @@ | 13 | scd2_is_current | INTEGER | YES | | 当前版本标记 | | 14 | scd2_version | INTEGER | YES | | 版本号 | - - ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_member +WHERE member_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询当前有效会员 SELECT * FROM billiards_dwd.dim_member WHERE scd2_is_current = 1; - -- 按卡类型统计会员数 SELECT member_card_grade_name, COUNT(*) FROM billiards_dwd.dim_member diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_member_card_account.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_member_card_account.md index defa9e6..74ff6ab 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_member_card_account.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_member_card_account.md @@ -50,9 +50,23 @@ | 2793306611533637 | 月卡 | 充值获得,时长卡,仅可抵扣台费 | | 2791987095408517 | 年卡 | 充值获得,时长卡,仅可抵扣台费 | - ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_member_card_account +WHERE member_card_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询有效的储值卡 SELECT * FROM billiards_dwd.dim_member_card_account diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_site.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_site.md index 0f7034a..56845e4 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_site.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_site.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -44,6 +43,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_site +WHERE site_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询当前有效门店 SELECT * FROM billiards_dwd.dim_site diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_store_goods.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_store_goods.md index 40db18f..98a5de1 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_store_goods.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_store_goods.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -54,6 +53,21 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_store_goods +WHERE site_goods_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询当前上架商品 SELECT * FROM billiards_dwd.dim_store_goods diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_table.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_table.md index 72e24e9..9b83c84 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_table.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_table.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -52,11 +51,25 @@ ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_table +WHERE table_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询当前有效台桌 SELECT * FROM billiards_dwd.dim_table WHERE scd2_is_current = 1; - -- 按台区统计台桌数 SELECT site_table_area_name, COUNT(*) FROM billiards_dwd.dim_table diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dim_tenant_goods.md b/etl_billiards/docs/bd_manual/main/BD_manual_dim_tenant_goods.md index 84f7f0c..7dc5bb5 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dim_tenant_goods.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dim_tenant_goods.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -37,9 +36,23 @@ | 17 | scd2_is_current | INTEGER | YES | | 当前版本标记 | | 18 | scd2_version | INTEGER | YES | | 版本号 | - ## 使用说明 +**版本与最新值** +本表为 SCD2 维度表,版本字段:scd2_start_time / scd2_end_time / scd2_is_current / scd2_version。 + +- 最新版本:scd2_is_current = 1 +- 按业务主键取最新:按 scd2_start_time 倒序 + +```sql +-- 取某业务主键的最新版本 +SELECT * +FROM billiards_dwd.dim_tenant_goods +WHERE tenant_goods_id = +ORDER BY scd2_start_time DESC +LIMIT 1; +``` +**使用示例** ```sql -- 查询当前有效的租户商品 SELECT * FROM billiards_dwd.dim_tenant_goods diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_service_log.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_service_log.md index 2719672..736e991 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_service_log.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_service_log.md @@ -50,9 +50,21 @@ | 31 | last_use_time | TIMESTAMPTZ | YES | | 服务结束时间 | | 32 | is_delete | INTEGER | YES | | 删除标记。**枚举值**: 0=未删除 | - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:create_time, start_use_time, last_use_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_assistant_service_log +ORDER BY create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 统计助教服务收入 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_trash_event.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_trash_event.md index c333185..8f83e24 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_trash_event.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_assistant_trash_event.md @@ -28,9 +28,21 @@ | 9 | trash_reason | VARCHAR | YES | | 作废原因(当前数据全为 NULL) | | 10 | create_time | TIMESTAMPTZ | YES | | 创建时间 | - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:create_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_assistant_trash_event +ORDER BY create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 助教作废金额统计 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_groupbuy_redemption.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_groupbuy_redemption.md index 81c67af..44a442f 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_groupbuy_redemption.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_groupbuy_redemption.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -44,6 +43,19 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:create_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_groupbuy_redemption +ORDER BY create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 各套餐核销统计 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_member_balance_change.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_member_balance_change.md index 57007c2..3e0cf77 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_member_balance_change.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_member_balance_change.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -58,6 +57,19 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:change_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_member_balance_change +ORDER BY change_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 会员消费总额排行 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_payment.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_payment.md index b1e708f..ef7d31d 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_payment.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_payment.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -30,10 +29,21 @@ | 10 | pay_time | TIMESTAMPTZ | YES | | 支付时间 | | 11 | pay_date | DATE | YES | | 支付日期 | - - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:create_time, pay_time, pay_date + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_payment +ORDER BY pay_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 每日支付金额统计 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_platform_coupon_redemption.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_platform_coupon_redemption.md index e957d09..4bd4e32 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_platform_coupon_redemption.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_platform_coupon_redemption.md @@ -40,6 +40,19 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:coupon_free_time, create_time, consume_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_platform_coupon_redemption +ORDER BY create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 各渠道核销统计 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_recharge_order.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_recharge_order.md index 437a6b9..01b1f38 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_recharge_order.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_recharge_order.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -38,9 +37,21 @@ | 18 | create_time | TIMESTAMPTZ | YES | | 创建时间 | | 19 | pay_time | TIMESTAMPTZ | YES | | 支付时间 | - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:create_time, pay_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_recharge_order +ORDER BY pay_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 充值总额统计(不含撤销) SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_refund.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_refund.md index 861c06c..7244e92 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_refund.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_refund.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -31,9 +30,21 @@ | 11 | member_id | BIGINT | YES | | 会员 ID(当前数据全为 0) | | 12 | member_card_id | BIGINT | YES | | 会员卡 ID(当前数据全为 0) | - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:pay_time, create_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_refund +ORDER BY pay_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 退款统计 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_settlement_head.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_settlement_head.md index ddf7944..351cb61 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_settlement_head.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_settlement_head.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -51,9 +50,21 @@ | 31 | rounding_amount | NUMERIC(18,2) | YES | | 抹零金额 | | 32 | point_amount | NUMERIC(18,2) | YES | | 积分抵扣等值金额 | - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:create_time, pay_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_settlement_head +ORDER BY pay_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 每日营收统计 SELECT @@ -64,7 +75,6 @@ SELECT FROM billiards_dwd.dwd_settlement_head GROUP BY DATE(pay_time) ORDER BY pay_date DESC; - -- 台费 vs 商品 vs 助教收入 SELECT SUM(table_charge_money) AS table_revenue, diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_store_goods_sale.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_store_goods_sale.md index 58f8d77..b099697 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_store_goods_sale.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_store_goods_sale.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -42,9 +41,21 @@ | 22 | is_delete | INTEGER | YES | | 删除标记。**枚举值**: 0=未删除 | | 23 | create_time | TIMESTAMPTZ | YES | | 创建时间 | - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:create_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_store_goods_sale +ORDER BY create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 热销商品排行 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_adjust.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_adjust.md index 1695f13..41d9a42 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_adjust.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_adjust.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -33,6 +32,19 @@ ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:adjust_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_table_fee_adjust +ORDER BY adjust_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 台费调整统计 SELECT diff --git a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_log.md b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_log.md index abbd9e5..f6c4335 100644 --- a/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_log.md +++ b/etl_billiards/docs/bd_manual/main/BD_manual_dwd_table_fee_log.md @@ -2,7 +2,6 @@ > 生成时间:2026-01-28 - ## 表信息 | 属性 | 值 | @@ -46,9 +45,21 @@ | 26 | is_single_order | INTEGER | YES | | 是否独立订单。**枚举值**: 0=合并订单, 1=独立订单 | | 27 | is_delete | INTEGER | YES | | 删除标记。**枚举值**: 0=未删除 | - ## 使用说明 +**版本与最新值** +本表为事实表,无 SCD2 版本字段。 + +- 可用时间字段:start_use_time, ledger_end_time, create_time + +```sql +-- 取最新一条(按时间字段倒序) +SELECT * +FROM billiards_dwd.dwd_table_fee_log +ORDER BY create_time DESC NULLS LAST +LIMIT 1; +``` +**使用示例** ```sql -- 各台区台费收入统计 SELECT diff --git a/etl_billiards/gui/widgets/task_panel.py b/etl_billiards/gui/widgets/task_panel.py index cf4b5dd..0ff4524 100644 --- a/etl_billiards/gui/widgets/task_panel.py +++ b/etl_billiards/gui/widgets/task_panel.py @@ -163,7 +163,7 @@ class TaskPanel(QWidget): sync_layout.setSpacing(8) # 说明 - sync_desc = QLabel("从 API 抓取最新数据到 ODS,然后装载到 DWD。适用于日常增量更新。") + sync_desc = QLabel("从 API 抓取最新数据到 ODS,然后装载到 DWD。适用于日常增量更新、数据修复和历史补全。") sync_desc.setProperty("subheading", True) sync_desc.setWordWrap(True) sync_layout.addWidget(sync_desc) @@ -202,7 +202,7 @@ class TaskPanel(QWidget): show_dimensions=True, show_facts=True, default_select_facts=True, - default_select_dimensions=False, + default_select_dimensions=True, # 默认包含维度表 compact=True, max_height=200, ) @@ -242,7 +242,7 @@ class TaskPanel(QWidget): reload_layout.setSpacing(8) # 说明 - reload_desc = QLabel("指定时间窗口,重新抓取 ODS 数据并装载到 DWD。适用于数据修复或历史回补。") + reload_desc = QLabel("指定精确时间窗口,重新抓取 ODS 数据并装载到 DWD。适用于大范围历史数据重刷、跨月补跑等场景。") reload_desc.setProperty("subheading", True) reload_desc.setWordWrap(True) reload_layout.addWidget(reload_desc) diff --git a/etl_billiards/gui/workers/task_worker.py b/etl_billiards/gui/workers/task_worker.py index a6d5ebc..eca47fc 100644 --- a/etl_billiards/gui/workers/task_worker.py +++ b/etl_billiards/gui/workers/task_worker.py @@ -189,114 +189,60 @@ class TaskWorker(QThread): # 解析 DWD 装载统计 if 'tables' in stats: - - - total_dim_inserted = 0 - total_dim_updated = 0 - total_fact_inserted = 0 - total_fact_updated = 0 - dim_tables = [] # ????? - - fact_tables = [] # ????? - - + dim_tables = [] # 维表明细 + fact_tables = [] # 事实表明细 for tbl in stats['tables']: - table_name = tbl.get('table', '').replace('billiards_dwd.', '') - mode = tbl.get('mode', '') - processed = int(tbl.get('processed', 0) or 0) - inserted = int(tbl.get('inserted', 0) or 0) - updated = int(tbl.get('updated', 0) or 0) - has_new_counts = ('inserted' in tbl) or ('updated' in tbl) - - - # ?? _ex ????????? - + # 忽略 _ex 扩展表 if table_name.endswith('_ex'): - continue - - is_dim = table_name.startswith('dim_') or mode == 'SCD2' - if is_dim: - if has_new_counts: - total_dim_inserted += inserted - total_dim_updated += updated - if inserted or updated: - dim_tables.append(f"{table_name}: +{inserted}, ~{updated}") - elif processed > 0: - total_dim_updated += processed - dim_tables.append(f"{table_name}: {processed}") - else: - if has_new_counts: - total_fact_inserted += inserted - total_fact_updated += updated - if inserted or updated: - fact_tables.append(f"{table_name}: +{inserted}, ~{updated}") - elif processed > 0 or inserted > 0: - total_fact_inserted += inserted - if inserted > 0: - fact_tables.append(f"{table_name}: +{inserted}") - - if (total_dim_inserted or total_dim_updated or total_fact_inserted or total_fact_updated): - dwd_stats.append( - - f"????: {total_dim_inserted}?, ????: {total_dim_updated}?, " - - f"????: {total_fact_inserted}?, ????: {total_fact_updated}?" - + f"维表新增: {total_dim_inserted}条, 维表更新: {total_dim_updated}条, " + f"事实表新增: {total_fact_inserted}条, 事实表更新: {total_fact_updated}条" ) - - - # ??????? - + # 维表明细 if dim_tables: + dwd_stats.append(" 维表: " + ", ".join(dim_tables)) - dwd_stats.append(" ???: " + ", ".join(dim_tables)) - - - - # ??????? - + # 事实表明细 if fact_tables: - - dwd_stats.append(" ???: " + ", ".join(fact_tables)) + dwd_stats.append(" 事实表: " + ", ".join(fact_tables)) diff --git a/etl_billiards/orchestration/scheduler.py b/etl_billiards/orchestration/scheduler.py index 1b10389..7d4d42c 100644 --- a/etl_billiards/orchestration/scheduler.py +++ b/etl_billiards/orchestration/scheduler.py @@ -306,7 +306,8 @@ class ETLScheduler: def _build_fetch_dir(self, task_code: str, run_id: int) -> Path: ts = datetime.now(self.tz).strftime("%Y%m%d-%H%M%S") - return Path(self.fetch_root) / f"{task_code.upper()}-{run_id}-{ts}" + task_code = str(task_code or "").upper() + return Path(self.fetch_root) / task_code / f"{task_code}-{run_id}-{ts}" def _resolve_ingest_source(self, fetch_dir: Path, fetch_stats: dict | None) -> Path: if fetch_stats and fetch_dir.exists(): diff --git a/etl_billiards/scheduled_tasks.json b/etl_billiards/scheduled_tasks.json new file mode 100644 index 0000000..1d14960 --- /dev/null +++ b/etl_billiards/scheduled_tasks.json @@ -0,0 +1,71 @@ +{ + "tasks": { + "771c025b": { + "id": "771c025b", + "name": "日常同步 (2h)", + "task_codes": [ + "ODS_TENANT_GOODS", + "ODS_GOODS_CATEGORY", + "ODS_RECHARGE_SETTLE", + "ODS_ASSISTANT_ABOLISH", + "ODS_ASSISTANT_ACCOUNT", + "ODS_PAYMENT", + "ODS_STORE_GOODS", + "ODS_GROUP_BUY_REDEMPTION", + "ODS_INVENTORY_STOCK", + "ODS_GROUP_PACKAGE", + "ODS_PLATFORM_COUPON", + "ODS_ASSISTANT_LEDGER", + "ODS_STORE_GOODS_SALES", + "ODS_MEMBER_BALANCE", + "ODS_SETTLEMENT_RECORDS", + "ODS_REFUND", + "ODS_TABLE_FEE_DISCOUNT", + "ODS_SETTLEMENT_TICKET", + "ODS_TABLES", + "ODS_TABLE_USE", + "ODS_MEMBER", + "ODS_INVENTORY_CHANGE", + "ODS_MEMBER_CARD", + "DWD_LOAD_FROM_ODS" + ], + "schedule": { + "schedule_type": "interval", + "interval_value": 1, + "interval_unit": "hours", + "daily_time": "04:00", + "weekly_days": [ + 1 + ], + "weekly_time": "04:00", + "cron_expression": "0 4 * * *", + "enabled": true, + "start_date": null, + "end_date": null + }, + "task_config": { + "pipeline_flow": "FULL", + "lookback_hours": 2 + }, + "enabled": true, + "last_run": "2026-02-01T23:28:41.246703", + "next_run": "2026-02-02T00:28:41.246703", + "run_count": 1, + "last_status": "成功", + "execution_history": [ + { + "task_id": "2cb92566", + "executed_at": "2026-02-01T23:28:41.246703", + "status": "success", + "exit_code": 0, + "duration_seconds": 191.25862, + "summary": "【DWD 装载】维表新增: 0条, 维表更新: 1条, 事实表新增: 2条, 事实表更新: 0条\n 维表: dim_store_goods: +0, ~1\n 事实表: dwd_settlement_head: +1, ~0, dwd_payment: +1, ~0\n【错误】2026-02-01 23:28:42 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0,; 2026-02-01 23:28:43 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0,; 2026-02-01 23:28:43 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0\n【结果】✓ etl_billiards: ETL运行完成", + "output": "[工作目录] C:\\dev\\LLTQ\\ETL\\feiqiu-ETL\\etl_billiards\n[执行命令] python -m cli.main --tasks ODS_TENANT_GOODS,ODS_GOODS_CATEGORY,ODS_RECHARGE_SETTLE,ODS_ASSISTANT_ABOLISH,ODS_ASSISTANT_ACCOUNT,ODS_PAYMENT,ODS_STORE_GOODS,ODS_GROUP_BUY_REDEMPTION,ODS_INVENTORY_STOCK,ODS_GROUP_PACKAGE,ODS_PLATFORM_COUPON,ODS_ASSISTANT_LEDGER,ODS_STORE_GOODS_SALES,ODS_MEMBER_BALANCE,ODS_SETTLEMENT_RECORDS,ODS_REFUND,ODS_TABLE_FEE_DISCOUNT,ODS_SETTLEMENT_TICKET,ODS_TABLES,ODS_TABLE_USE,ODS_MEMBER,ODS_INVENTORY_CHANGE,ODS_MEMBER_CARD,DWD_LOAD_FROM_ODS --pipeline-flow FULL --window-start 2026-02-01 21:28:41 --window-end 2026-02-01 23:28:41\n2026-02-01 23:28:41 [INFO] etl_billiards: 配置加载完成\n2026-02-01 23:28:41 [INFO] etl_billiards: 门店ID: 2790685415443269\n2026-02-01 23:28:41 [INFO] etl_billiards: 任务列表: ['ODS_TENANT_GOODS', 'ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_ASSISTANT_ABOLISH', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PAYMENT', 'ODS_STORE_GOODS', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_INVENTORY_STOCK', 'ODS_GROUP_PACKAGE', 'ODS_PLATFORM_COUPON', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS_SALES', 'ODS_MEMBER_BALANCE', 'ODS_SETTLEMENT_RECORDS', 'ODS_REFUND', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_SETTLEMENT_TICKET', 'ODS_TABLES', 'ODS_TABLE_USE', 'ODS_MEMBER', 'ODS_INVENTORY_CHANGE', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS']\n2026-02-01 23:28:41 [INFO] etl_billiards: 开始运行任务: ['ODS_TENANT_GOODS', 'ODS_GOODS_CATEGORY', 'ODS_RECHARGE_SETTLE', 'ODS_ASSISTANT_ABOLISH', 'ODS_ASSISTANT_ACCOUNT', 'ODS_PAYMENT', 'ODS_STORE_GOODS', 'ODS_GROUP_BUY_REDEMPTION', 'ODS_INVENTORY_STOCK', 'ODS_GROUP_PACKAGE', 'ODS_PLATFORM_COUPON', 'ODS_ASSISTANT_LEDGER', 'ODS_STORE_GOODS_SALES', 'ODS_MEMBER_BALANCE', 'ODS_SETTLEMENT_RECORDS', 'ODS_REFUND', 'ODS_TABLE_FEE_DISCOUNT', 'ODS_SETTLEMENT_TICKET', 'ODS_TABLES', 'ODS_TABLE_USE', 'ODS_MEMBER', 'ODS_INVENTORY_CHANGE', 'ODS_MEMBER_CARD', 'DWD_LOAD_FROM_ODS'], run_uuid=e889270a378745498e3c92ae97b7d500\n2026-02-01 23:28:41 [INFO] etl_billiards: ODS_TENANT_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_TENANT_GOODS\\ODS_TENANT_GOODS-7371-20260201-232841\n2026-02-01 23:28:41 [INFO] etl_billiards: 开始执行ODS_TENANT_GOODS (ODS)\n2026-02-01 23:28:41 [INFO] etl_billiards: ODS_TENANT_GOODS: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:28:42 [INFO] etl_billiards: ODS_TENANT_GOODS ODS 任务完成: {'fetched': 173, 'inserted': 0, 'updated': 0, 'skipped': 173, 'errors': 0}\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_GOODS_CATEGORY: ODS fetch+load start, dir=export\\JSON\\ODS_GOODS_CATEGORY\\ODS_GOODS_CATEGORY-7372-20260201-232843\n2026-02-01 23:28:43 [INFO] etl_billiards: 开始执行ODS_GOODS_CATEGORY (ODS)\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_GOODS_CATEGORY: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_GOODS_CATEGORY ODS 任务完成: {'fetched': 9, 'inserted': 0, 'updated': 0, 'skipped': 9, 'errors': 0}\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: ODS fetch+load start, dir=export\\JSON\\ODS_RECHARGE_SETTLE\\ODS_RECHARGE_SETTLE-7373-20260201-232843\n2026-02-01 23:28:43 [INFO] etl_billiards: 开始执行ODS_RECHARGE_SETTLE (ODS)\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_RECHARGE_SETTLE: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_RECHARGE_SETTLE ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ABOLISH\\ODS_ASSISTANT_ABOLISH-7374-20260201-232843\n2026-02-01 23:28:43 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ABOLISH (ODS)\n2026-02-01 23:28:43 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:28:44 [INFO] etl_billiards: ODS_ASSISTANT_ABOLISH ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-01 23:28:44 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_ACCOUNT\\ODS_ASSISTANT_ACCOUNT-7375-20260201-232844\n2026-02-01 23:28:44 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_ACCOUNT (ODS)\n2026-02-01 23:28:44 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:28:45 [INFO] etl_billiards: ODS_ASSISTANT_ACCOUNT ODS 任务完成: {'fetched': 69, 'inserted': 0, 'updated': 0, 'skipped': 69, 'errors': 0}\n2026-02-01 23:28:45 [INFO] etl_billiards: ODS_PAYMENT: ODS fetch+load start, dir=export\\JSON\\ODS_PAYMENT\\ODS_PAYMENT-7376-20260201-232845\n2026-02-01 23:28:45 [INFO] etl_billiards: 开始执行ODS_PAYMENT (ODS)\n2026-02-01 23:28:45 [INFO] etl_billiards: ODS_PAYMENT: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:29:11 [INFO] etl_billiards: ODS_PAYMENT ODS 任务完成: {'fetched': 11941, 'inserted': 1, 'updated': 0, 'skipped': 11940, 'errors': 0}\n2026-02-01 23:29:11 [INFO] etl_billiards: ODS_STORE_GOODS: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS\\ODS_STORE_GOODS-7377-20260201-232911\n2026-02-01 23:29:11 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS (ODS)\n2026-02-01 23:29:11 [INFO] etl_billiards: ODS_STORE_GOODS: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:29:11 [INFO] etl_billiards: ODS_STORE_GOODS ODS 任务完成: {'fetched': 172, 'inserted': 1, 'updated': 0, 'skipped': 171, 'errors': 0}\n2026-02-01 23:29:12 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_BUY_REDEMPTION\\ODS_GROUP_BUY_REDEMPTION-7378-20260201-232912\n2026-02-01 23:29:12 [INFO] etl_billiards: 开始执行ODS_GROUP_BUY_REDEMPTION (ODS)\n2026-02-01 23:29:12 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:29:51 [INFO] etl_billiards: ODS_GROUP_BUY_REDEMPTION ODS 任务完成: {'fetched': 8245, 'inserted': 0, 'updated': 0, 'skipped': 8245, 'errors': 0}\n2026-02-01 23:29:51 [INFO] etl_billiards: ODS_INVENTORY_STOCK: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_STOCK\\ODS_INVENTORY_STOCK-7379-20260201-232951\n2026-02-01 23:29:51 [INFO] etl_billiards: 开始执行ODS_INVENTORY_STOCK (ODS)\n2026-02-01 23:29:51 [INFO] etl_billiards: ODS_INVENTORY_STOCK: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:29:52 [INFO] etl_billiards: ODS_INVENTORY_STOCK ODS 任务完成: {'fetched': 172, 'inserted': 1, 'updated': 0, 'skipped': 171, 'errors': 0}\n2026-02-01 23:29:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: ODS fetch+load start, dir=export\\JSON\\ODS_GROUP_PACKAGE\\ODS_GROUP_PACKAGE-7380-20260201-232952\n2026-02-01 23:29:52 [INFO] etl_billiards: 开始执行ODS_GROUP_PACKAGE (ODS)\n2026-02-01 23:29:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:29:52 [INFO] etl_billiards: ODS_GROUP_PACKAGE ODS 任务完成: {'fetched': 18, 'inserted': 0, 'updated': 0, 'skipped': 18, 'errors': 0}\n2026-02-01 23:29:52 [INFO] etl_billiards: ODS_PLATFORM_COUPON: ODS fetch+load start, dir=export\\JSON\\ODS_PLATFORM_COUPON\\ODS_PLATFORM_COUPON-7381-20260201-232952\n2026-02-01 23:29:52 [INFO] etl_billiards: 开始执行ODS_PLATFORM_COUPON (ODS)\n2026-02-01 23:29:52 [INFO] etl_billiards: ODS_PLATFORM_COUPON: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:30:35 [INFO] etl_billiards: ODS_PLATFORM_COUPON ODS 任务完成: {'fetched': 17470, 'inserted': 0, 'updated': 0, 'skipped': 17470, 'errors': 0}\n2026-02-01 23:30:35 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: ODS fetch+load start, dir=export\\JSON\\ODS_ASSISTANT_LEDGER\\ODS_ASSISTANT_LEDGER-7382-20260201-233035\n2026-02-01 23:30:35 [INFO] etl_billiards: 开始执行ODS_ASSISTANT_LEDGER (ODS)\n2026-02-01 23:30:35 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:30:36 [INFO] etl_billiards: ODS_ASSISTANT_LEDGER ODS 任务完成: {'fetched': 6, 'inserted': 0, 'updated': 0, 'skipped': 6, 'errors': 0}\n2026-02-01 23:30:36 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: ODS fetch+load start, dir=export\\JSON\\ODS_STORE_GOODS_SALES\\ODS_STORE_GOODS_SALES-7383-20260201-233036\n2026-02-01 23:30:36 [INFO] etl_billiards: 开始执行ODS_STORE_GOODS_SALES (ODS)\n2026-02-01 23:30:36 [INFO] etl_billiards: ODS_STORE_GOODS_SALES: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:30:36 [INFO] etl_billiards: ODS_STORE_GOODS_SALES ODS 任务完成: {'fetched': 0, 'inserted': 0, 'updated': 0, 'skipped': 0, 'errors': 0}\n2026-02-01 23:30:36 [INFO] etl_billiards: ODS_MEMBER_BALANCE: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_BALANCE\\ODS_MEMBER_BALANCE-7384-20260201-233036\n2026-02-01 23:30:36 [INFO] etl_billiards: 开始执行ODS_MEMBER_BALANCE (ODS)\n2026-02-01 23:30:36 [INFO] etl_billiards: ODS_MEMBER_BALANCE: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:04 [INFO] etl_billiards: ODS_MEMBER_BALANCE ODS 任务完成: {'fetched': 2470, 'inserted': 0, 'updated': 0, 'skipped': 2470, 'errors': 0}\n2026-02-01 23:31:04 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_RECORDS\\ODS_SETTLEMENT_RECORDS-7385-20260201-233104\n2026-02-01 23:31:04 [INFO] etl_billiards: 开始执行ODS_SETTLEMENT_RECORDS (ODS)\n2026-02-01 23:31:04 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:05 [INFO] etl_billiards: ODS_SETTLEMENT_RECORDS ODS 任务完成: {'fetched': 44, 'inserted': 1, 'updated': 0, 'skipped': 43, 'errors': 0}\n2026-02-01 23:31:05 [INFO] etl_billiards: ODS_REFUND: ODS fetch+load start, dir=export\\JSON\\ODS_REFUND\\ODS_REFUND-7386-20260201-233105\n2026-02-01 23:31:05 [INFO] etl_billiards: 开始执行ODS_REFUND (ODS)\n2026-02-01 23:31:05 [INFO] etl_billiards: ODS_REFUND: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:05 [INFO] etl_billiards: ODS_REFUND ODS 任务完成: {'fetched': 40, 'inserted': 0, 'updated': 0, 'skipped': 40, 'errors': 0}\n2026-02-01 23:31:06 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_FEE_DISCOUNT\\ODS_TABLE_FEE_DISCOUNT-7387-20260201-233106\n2026-02-01 23:31:06 [INFO] etl_billiards: 开始执行ODS_TABLE_FEE_DISCOUNT (ODS)\n2026-02-01 23:31:06 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:13 [INFO] etl_billiards: ODS_TABLE_FEE_DISCOUNT ODS 任务完成: {'fetched': 1783, 'inserted': 0, 'updated': 0, 'skipped': 1783, 'errors': 0}\n2026-02-01 23:31:13 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: ODS fetch+load start, dir=export\\JSON\\ODS_SETTLEMENT_TICKET\\ODS_SETTLEMENT_TICKET-7388-20260201-233113\n2026-02-01 23:31:13 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:14 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00] 未发现需要抓取的小票\n2026-02-01 23:31:14 [INFO] etl_billiards: ODS_SETTLEMENT_TICKET: 小票抓取完成,抓取=0 插入=0 更新=0 跳过=0\n2026-02-01 23:31:14 [INFO] etl_billiards: ODS_TABLES: ODS fetch+load start, dir=export\\JSON\\ODS_TABLES\\ODS_TABLES-7389-20260201-233114\n2026-02-01 23:31:14 [INFO] etl_billiards: 开始执行ODS_TABLES (ODS)\n2026-02-01 23:31:14 [INFO] etl_billiards: ODS_TABLES: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:14 [INFO] etl_billiards: ODS_TABLES ODS 任务完成: {'fetched': 74, 'inserted': 1, 'updated': 0, 'skipped': 73, 'errors': 0}\n2026-02-01 23:31:15 [INFO] etl_billiards: ODS_TABLE_USE: ODS fetch+load start, dir=export\\JSON\\ODS_TABLE_USE\\ODS_TABLE_USE-7390-20260201-233115\n2026-02-01 23:31:15 [INFO] etl_billiards: 开始执行ODS_TABLE_USE (ODS)\n2026-02-01 23:31:15 [INFO] etl_billiards: ODS_TABLE_USE: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:35 [INFO] etl_billiards: ODS_TABLE_USE ODS 任务完成: {'fetched': 10138, 'inserted': 0, 'updated': 0, 'skipped': 10138, 'errors': 0}\n2026-02-01 23:31:36 [INFO] etl_billiards: ODS_MEMBER: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER\\ODS_MEMBER-7391-20260201-233136\n2026-02-01 23:31:36 [INFO] etl_billiards: 开始执行ODS_MEMBER (ODS)\n2026-02-01 23:31:36 [INFO] etl_billiards: ODS_MEMBER: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:37 [INFO] etl_billiards: ODS_MEMBER ODS 任务完成: {'fetched': 556, 'inserted': 0, 'updated': 0, 'skipped': 556, 'errors': 0}\n2026-02-01 23:31:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: ODS fetch+load start, dir=export\\JSON\\ODS_INVENTORY_CHANGE\\ODS_INVENTORY_CHANGE-7392-20260201-233138\n2026-02-01 23:31:38 [INFO] etl_billiards: 开始执行ODS_INVENTORY_CHANGE (ODS)\n2026-02-01 23:31:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:38 [INFO] etl_billiards: ODS_INVENTORY_CHANGE ODS 任务完成: {'fetched': 75, 'inserted': 1, 'updated': 0, 'skipped': 74, 'errors': 0}\n2026-02-01 23:31:38 [INFO] etl_billiards: ODS_MEMBER_CARD: ODS fetch+load start, dir=export\\JSON\\ODS_MEMBER_CARD\\ODS_MEMBER_CARD-7393-20260201-233138\n2026-02-01 23:31:38 [INFO] etl_billiards: 开始执行ODS_MEMBER_CARD (ODS)\n2026-02-01 23:31:38 [INFO] etl_billiards: ODS_MEMBER_CARD: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:41 [INFO] etl_billiards: ODS_MEMBER_CARD ODS 任务完成: {'fetched': 945, 'inserted': 0, 'updated': 0, 'skipped': 945, 'errors': 0}\n2026-02-01 23:31:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取阶段开始,目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7394-20260201-233141\n2026-02-01 23:31:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 抓取完成,文件=None,记录数=0\n2026-02-01 23:31:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 本地清洗入库开始,源目录=export\\JSON\\DWD_LOAD_FROM_ODS\\DWD_LOAD_FROM_ODS-7394-20260201-233141\n2026-02-01 23:31:41 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 开始执行(1/1),窗口[2026-02-01 19:28:41+08:00 ~ 2026-02-02 01:28:41+08:00]\n2026-02-01 23:31:41 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site <= billiards_ods.table_fee_transactions\n2026-02-01 23:31:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site,用时 0.42s\n2026-02-01 23:31:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_site_ex <= billiards_ods.table_fee_transactions\n2026-02-01 23:31:42 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_site_ex,用时 0.54s\n2026-02-01 23:31:42 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table <= billiards_ods.site_tables_master\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table,用时 0.18s\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_table_ex <= billiards_ods.site_tables_master\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_table_ex,用时 0.25s\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant <= billiards_ods.assistant_accounts_master\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant,用时 0.18s\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_assistant_ex <= billiards_ods.assistant_accounts_master\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_assistant_ex,用时 0.20s\n2026-02-01 23:31:43 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member <= billiards_ods.member_profiles\n2026-02-01 23:31:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member,用时 0.26s\n2026-02-01 23:31:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_ex <= billiards_ods.member_profiles\n2026-02-01 23:31:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_ex,用时 0.21s\n2026-02-01 23:31:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account <= billiards_ods.member_stored_value_cards\n2026-02-01 23:31:44 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account,用时 0.55s\n2026-02-01 23:31:44 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_member_card_account_ex <= billiards_ods.member_stored_value_cards\n2026-02-01 23:31:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_member_card_account_ex,用时 0.78s\n2026-02-01 23:31:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods <= billiards_ods.tenant_goods_master\n2026-02-01 23:31:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods,用时 0.20s\n2026-02-01 23:31:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_tenant_goods_ex <= billiards_ods.tenant_goods_master\n2026-02-01 23:31:45 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_tenant_goods_ex,用时 0.19s\n2026-02-01 23:31:45 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods <= billiards_ods.store_goods_master\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods,用时 0.25s\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_store_goods_ex <= billiards_ods.store_goods_master\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_store_goods_ex,用时 0.26s\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_goods_category <= billiards_ods.stock_goods_category_tree\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_goods_category,用时 0.17s\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package <= billiards_ods.group_buy_packages\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package,用时 0.17s\n2026-02-01 23:31:46 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dim_groupbuy_package_ex <= billiards_ods.group_buy_packages\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dim_groupbuy_package_ex,用时 0.18s\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head <= billiards_ods.settlement_records\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head,用时 0.23s\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_settlement_head_ex <= billiards_ods.settlement_records\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_settlement_head_ex,用时 0.23s\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log <= billiards_ods.table_fee_transactions\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log,用时 0.41s\n2026-02-01 23:31:47 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_log_ex <= billiards_ods.table_fee_transactions\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_log_ex,用时 0.24s\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust <= billiards_ods.table_fee_discount_records\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust,用时 0.20s\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_table_fee_adjust_ex <= billiards_ods.table_fee_discount_records\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_table_fee_adjust_ex,用时 0.21s\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale <= billiards_ods.store_goods_sales_records\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale,用时 0.22s\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_store_goods_sale_ex <= billiards_ods.store_goods_sales_records\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_store_goods_sale_ex,用时 0.21s\n2026-02-01 23:31:48 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log <= billiards_ods.assistant_service_records\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log,用时 0.26s\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_service_log_ex <= billiards_ods.assistant_service_records\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_service_log_ex,用时 0.20s\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event <= billiards_ods.assistant_cancellation_records\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event,用时 0.20s\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_assistant_trash_event_ex <= billiards_ods.assistant_cancellation_records\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_assistant_trash_event_ex,用时 0.23s\n2026-02-01 23:31:49 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change <= billiards_ods.member_balance_changes\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change,用时 0.20s\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_member_balance_change_ex <= billiards_ods.member_balance_changes\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_member_balance_change_ex,用时 0.20s\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption <= billiards_ods.group_buy_redemption_records\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption,用时 0.23s\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_groupbuy_redemption_ex <= billiards_ods.group_buy_redemption_records\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_groupbuy_redemption_ex,用时 0.23s\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption <= billiards_ods.platform_coupon_redemption_records\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption,用时 0.21s\n2026-02-01 23:31:50 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_platform_coupon_redemption_ex <= billiards_ods.platform_coupon_redemption_records\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_platform_coupon_redemption_ex,用时 0.23s\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order <= billiards_ods.recharge_settlements\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order,用时 0.20s\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_recharge_order_ex <= billiards_ods.recharge_settlements\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_recharge_order_ex,用时 0.20s\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_payment <= billiards_ods.payment_transactions\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_payment,用时 0.28s\n2026-02-01 23:31:51 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund <= billiards_ods.refund_transactions\n2026-02-01 23:31:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund,用时 0.22s\n2026-02-01 23:31:52 [INFO] etl_billiards: DWD 装载开始:billiards_dwd.dwd_refund_ex <= billiards_ods.refund_transactions\n2026-02-01 23:31:52 [INFO] etl_billiards: DWD 装载完成:billiards_dwd.dwd_refund_ex,用时 0.20s\n2026-02-01 23:31:52 [INFO] etl_billiards: DWD_LOAD_FROM_ODS: 完成,统计={'tables': [{'table': 'billiards_dwd.dim_site', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_site_ex', 'mode': 'SCD2', 'processed': 1, 'inserted': 0, 'updated': 0, 'skipped': 1}, {'table': 'billiards_dwd.dim_table', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 0, 'skipped': 74}, {'table': 'billiards_dwd.dim_table_ex', 'mode': 'SCD2', 'processed': 74, 'inserted': 0, 'updated': 1, 'skipped': 73}, {'table': 'billiards_dwd.dim_assistant', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_assistant_ex', 'mode': 'SCD2', 'processed': 69, 'inserted': 0, 'updated': 0, 'skipped': 69}, {'table': 'billiards_dwd.dim_member', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_ex', 'mode': 'SCD2', 'processed': 556, 'inserted': 0, 'updated': 0, 'skipped': 556}, {'table': 'billiards_dwd.dim_member_card_account', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_member_card_account_ex', 'mode': 'SCD2', 'processed': 945, 'inserted': 0, 'updated': 0, 'skipped': 945}, {'table': 'billiards_dwd.dim_tenant_goods', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_tenant_goods_ex', 'mode': 'SCD2', 'processed': 173, 'inserted': 0, 'updated': 0, 'skipped': 173}, {'table': 'billiards_dwd.dim_store_goods', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 1, 'skipped': 171}, {'table': 'billiards_dwd.dim_store_goods_ex', 'mode': 'SCD2', 'processed': 172, 'inserted': 0, 'updated': 1, 'skipped': 171}, {'table': 'billiards_dwd.dim_goods_category', 'mode': 'SCD2', 'processed': 26, 'inserted': 0, 'updated': 0, 'skipped': 26}, {'table': 'billiards_dwd.dim_groupbuy_package', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dim_groupbuy_package_ex', 'mode': 'SCD2', 'processed': 34, 'inserted': 0, 'updated': 0, 'skipped': 34}, {'table': 'billiards_dwd.dwd_settlement_head', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_settlement_head_ex', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_table_fee_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_table_fee_adjust_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_store_goods_sale_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_service_log_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_assistant_trash_event_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_member_balance_change_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_groupbuy_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_platform_coupon_redemption_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_recharge_order_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_payment', 'mode': 'INCREMENT', 'inserted': 1, 'updated': 0, 'processed': 1}, {'table': 'billiards_dwd.dwd_refund', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}, {'table': 'billiards_dwd.dwd_refund_ex', 'mode': 'INCREMENT', 'inserted': 0, 'updated': 0, 'processed': 0}], 'errors': []}\n2026-02-01 23:31:52 [INFO] etl_billiards: 所有任务执行完成\n2026-02-01 23:31:52 [INFO] etl_billiards: ETL运行完成\n", + "error": "" + } + ], + "created_at": "2026-02-01T23:27:58.777762", + "updated_at": "2026-02-01T23:31:52.514792" + } + } +} \ No newline at end of file diff --git a/tmp/1.json b/tmp/1.json new file mode 100644 index 0000000..701f3fa --- /dev/null +++ b/tmp/1.json @@ -0,0 +1,302 @@ +{ + "tables": [ + { + "table": "billiards_dwd.dim_site", + "mode": "SCD2", + "processed": 1, + "inserted": 0, + "updated": 0, + "skipped": 1 + }, + { + "table": "billiards_dwd.dim_site_ex", + "mode": "SCD2", + "processed": 1, + "inserted": 0, + "updated": 0, + "skipped": 1 + }, + { + "table": "billiards_dwd.dim_table", + "mode": "SCD2", + "processed": 74, + "inserted": 0, + "updated": 0, + "skipped": 74 + }, + { + "table": "billiards_dwd.dim_table_ex", + "mode": "SCD2", + "processed": 74, + "inserted": 0, + "updated": 1, + "skipped": 73 + }, + { + "table": "billiards_dwd.dim_assistant", + "mode": "SCD2", + "processed": 69, + "inserted": 0, + "updated": 0, + "skipped": 69 + }, + { + "table": "billiards_dwd.dim_assistant_ex", + "mode": "SCD2", + "processed": 69, + "inserted": 0, + "updated": 0, + "skipped": 69 + }, + { + "table": "billiards_dwd.dim_member", + "mode": "SCD2", + "processed": 556, + "inserted": 0, + "updated": 0, + "skipped": 556 + }, + { + "table": "billiards_dwd.dim_member_ex", + "mode": "SCD2", + "processed": 556, + "inserted": 0, + "updated": 0, + "skipped": 556 + }, + { + "table": "billiards_dwd.dim_member_card_account", + "mode": "SCD2", + "processed": 945, + "inserted": 0, + "updated": 0, + "skipped": 945 + }, + { + "table": "billiards_dwd.dim_member_card_account_ex", + "mode": "SCD2", + "processed": 945, + "inserted": 0, + "updated": 0, + "skipped": 945 + }, + { + "table": "billiards_dwd.dim_tenant_goods", + "mode": "SCD2", + "processed": 173, + "inserted": 0, + "updated": 0, + "skipped": 173 + }, + { + "table": "billiards_dwd.dim_tenant_goods_ex", + "mode": "SCD2", + "processed": 173, + "inserted": 0, + "updated": 0, + "skipped": 173 + }, + { + "table": "billiards_dwd.dim_store_goods", + "mode": "SCD2", + "processed": 172, + "inserted": 0, + "updated": 1, + "skipped": 171 + }, + { + "table": "billiards_dwd.dim_store_goods_ex", + "mode": "SCD2", + "processed": 172, + "inserted": 0, + "updated": 1, + "skipped": 171 + }, + { + "table": "billiards_dwd.dim_goods_category", + "mode": "SCD2", + "processed": 26, + "inserted": 0, + "updated": 0, + "skipped": 26 + }, + { + "table": "billiards_dwd.dim_groupbuy_package", + "mode": "SCD2", + "processed": 34, + "inserted": 0, + "updated": 0, + "skipped": 34 + }, + { + "table": "billiards_dwd.dim_groupbuy_package_ex", + "mode": "SCD2", + "processed": 34, + "inserted": 0, + "updated": 0, + "skipped": 34 + }, + { + "table": "billiards_dwd.dwd_settlement_head", + "mode": "INCREMENT", + "inserted": 1, + "updated": 0, + "processed": 1 + }, + { + "table": "billiards_dwd.dwd_settlement_head_ex", + "mode": "INCREMENT", + "inserted": 1, + "updated": 0, + "processed": 1 + }, + { + "table": "billiards_dwd.dwd_table_fee_log", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_table_fee_log_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_table_fee_adjust", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_table_fee_adjust_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_store_goods_sale", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_store_goods_sale_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_assistant_service_log", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_assistant_service_log_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_assistant_trash_event", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_assistant_trash_event_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_member_balance_change", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_member_balance_change_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_groupbuy_redemption", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_groupbuy_redemption_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_platform_coupon_redemption", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_platform_coupon_redemption_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_recharge_order", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_recharge_order_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_payment", + "mode": "INCREMENT", + "inserted": 1, + "updated": 0, + "processed": 1 + }, + { + "table": "billiards_dwd.dwd_refund", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + }, + { + "table": "billiards_dwd.dwd_refund_ex", + "mode": "INCREMENT", + "inserted": 0, + "updated": 0, + "processed": 0 + } + ], + "errors": [] +}