在前后端开发联调前 的提交20260223

This commit is contained in:
Neo
2026-02-23 23:02:20 +08:00
parent 254ccb1e77
commit fafc95e64c
1142 changed files with 10366960 additions and 36957 deletions

View File

@@ -64,7 +64,7 @@
- 为全部 23 张 ODS 表创建 `(业务主键, fetched_at DESC)` 复合索引
- 使用 `CREATE INDEX CONCURRENTLY IF NOT EXISTS`,保证幂等且不锁表
- 索引命名规范:`idx_ods_{table_name}_latest`
- 同步更新 `db/etl_feiqiu/schemas/ods.sql` 中的索引定义
- 同步更新 `docs/database/ddl/etl_feiqiu__ods.sql` 中的索引定义
### 用途

View File

@@ -0,0 +1,44 @@
# dim_staff 员工档案主表
> 生成时间2026-02-23
## 表信息
| 属性 | 值 |
|------|-----|
| Schema | dwd |
| 表名 | dim_staff |
| 主键 | staff_id, scd2_start_time |
| 扩展表 | dim_staff_ex |
| ODS 来源 | ods.staff_info_master |
| 说明 | 员工档案维度主表SCD2包含核心业务字段 |
## 字段说明
| 序号 | 字段名 | 类型 | 可空 | 主键 | 说明 |
|------|--------|------|------|------|------|
| 1 | staff_id | BIGINT | NO | PK | 员工唯一标识(映射自 ODS id |
| 2 | staff_name | TEXT | YES | | 员工姓名 |
| 3 | alias_name | TEXT | YES | | 别名 |
| 4 | mobile | TEXT | YES | | 手机号 |
| 5 | gender | INTEGER | YES | | 性别 |
| 6 | job | TEXT | YES | | 职位(店长/主管/教练/收银员等) |
| 7 | tenant_id | BIGINT | YES | | 租户 ID |
| 8 | site_id | BIGINT | YES | | 门店 ID |
| 9 | system_role_id | INTEGER | YES | | 系统角色 ID |
| 10 | staff_identity | INTEGER | YES | | 员工身份类型 |
| 11 | status | INTEGER | YES | | 账号状态 |
| 12 | leave_status | INTEGER | YES | | 在职状态0=在职1=离职) |
| 13 | entry_time | TIMESTAMPTZ | YES | | 入职时间 |
| 14 | resign_time | TIMESTAMPTZ | YES | | 离职时间 |
| 15 | is_delete | INTEGER | YES | | 删除标记 |
| 16 | scd2_start_time | TIMESTAMPTZ | NO | PK | SCD2 版本生效时间 |
| 17 | scd2_end_time | TIMESTAMPTZ | YES | | SCD2 版本失效时间 |
| 18 | scd2_is_current | INTEGER | YES | | 当前版本标记 |
| 19 | scd2_version | INTEGER | YES | | 版本号 |
## 与其他表的关系
- 扩展表:`dwd.dim_staff_ex`(次要/低频变更字段)
- ODS 来源:`ods.staff_info_master`
- 与助教维度表(`dim_assistant`)是完全独立的实体

View File

@@ -0,0 +1,51 @@
# dim_staff_ex 员工档案扩展表
> 生成时间2026-02-23
## 表信息
| 属性 | 值 |
|------|-----|
| Schema | dwd |
| 表名 | dim_staff_ex |
| 主键 | staff_id, scd2_start_time |
| 主表 | dim_staff |
| ODS 来源 | ods.staff_info_master |
| 说明 | 员工档案维度扩展表SCD2包含次要/低频变更字段 |
## 字段说明
| 序号 | 字段名 | 类型 | 可空 | 主键 | 说明 |
|------|--------|------|------|------|------|
| 1 | staff_id | BIGINT | NO | PK | 员工唯一标识(映射自 ODS id |
| 2 | avatar | TEXT | YES | | 头像 URL |
| 3 | job_num | TEXT | YES | | 工号 |
| 4 | account_status | INTEGER | YES | | 账号启用状态 |
| 5 | rank_id | INTEGER | YES | | 职级 ID |
| 6 | rank_name | TEXT | YES | | 职级名称 |
| 7 | new_rank_id | INTEGER | YES | | 新职级 ID |
| 8 | new_staff_identity | INTEGER | YES | | 新员工身份 |
| 9 | is_reserve | INTEGER | YES | | 预约标记 |
| 10 | shop_name | TEXT | YES | | 门店名称 |
| 11 | site_label | TEXT | YES | | 门店标签 |
| 12 | tenant_org_id | BIGINT | YES | | 租户组织 ID |
| 13 | system_user_id | BIGINT | YES | | 系统用户 ID |
| 14 | cashier_point_id | BIGINT | YES | | 收银点 ID |
| 15 | cashier_point_name | TEXT | YES | | 收银点名称 |
| 16 | group_id | BIGINT | YES | | 分组 ID |
| 17 | group_name | TEXT | YES | | 分组名称 |
| 18 | staff_profile_id | BIGINT | YES | | 员工档案 ID |
| 19 | auth_code | TEXT | YES | | 授权码 |
| 20 | auth_code_create | TIMESTAMPTZ | YES | | 授权码创建时间 |
| 21 | ding_talk_synced | INTEGER | YES | | 钉钉同步状态 |
| 22 | salary_grant_enabled | INTEGER | YES | | 工资发放启用 |
| 23 | entry_type | INTEGER | YES | | 入职类型 |
| 24 | entry_sign_status | INTEGER | YES | | 入职签约状态 |
| 25 | resign_sign_status | INTEGER | YES | | 离职签约状态 |
| 26 | criticism_status | INTEGER | YES | | 批评状态 |
| 27 | create_time | TIMESTAMPTZ | YES | | 创建时间 |
| 28 | user_roles | JSONB | YES | | 用户角色列表 |
| 29 | scd2_start_time | TIMESTAMPTZ | NO | PK | SCD2 版本生效时间 |
| 30 | scd2_end_time | TIMESTAMPTZ | YES | | SCD2 版本失效时间 |
| 31 | scd2_is_current | INTEGER | YES | | 当前版本标记 |
| 32 | scd2_version | INTEGER | YES | | 版本号 |

View File

@@ -0,0 +1,70 @@
# staff_info_master 员工档案主表
> 生成时间2026-02-23
## 表信息
| 属性 | 值 |
|------|-----|
| Schema | ods |
| 表名 | staff_info_master |
| 主键 | id |
| 数据来源 | SearchSystemStaffInfo API |
| 快照模式 | FULL_TABLE |
| 说明 | 员工档案主数据(店长、主管、教练、收银员等) |
## 字段说明
| 序号 | 字段名 | 类型 | 可空 | 说明 |
|------|--------|------|------|------|
| 1 | id | BIGINT | NO | 员工主键 ID |
| 2 | tenant_id | BIGINT | YES | 租户 ID |
| 3 | site_id | BIGINT | YES | 门店 ID |
| 4 | tenant_org_id | BIGINT | YES | 租户组织 ID |
| 5 | system_user_id | BIGINT | YES | 系统用户 ID |
| 6 | staff_name | TEXT | YES | 员工姓名 |
| 7 | alias_name | TEXT | YES | 别名 |
| 8 | mobile | TEXT | YES | 手机号 |
| 9 | avatar | TEXT | YES | 头像 URL |
| 10 | gender | INTEGER | YES | 性别3=未知) |
| 11 | job | TEXT | YES | 职位(店长/主管/教练/收银员等) |
| 12 | job_num | TEXT | YES | 工号 |
| 13 | staff_identity | INTEGER | YES | 员工身份类型 |
| 14 | status | INTEGER | YES | 账号状态 |
| 15 | account_status | INTEGER | YES | 账号启用状态 |
| 16 | system_role_id | INTEGER | YES | 系统角色 ID |
| 17 | rank_id | INTEGER | YES | 职级 ID |
| 18 | rank_name | TEXT | YES | 职级名称 |
| 19 | new_rank_id | INTEGER | YES | 新职级 ID |
| 20 | new_staff_identity | INTEGER | YES | 新员工身份 |
| 21 | leave_status | INTEGER | YES | 在职状态0=在职1=离职) |
| 22 | entry_time | TIMESTAMP | YES | 入职时间 |
| 23 | resign_time | TIMESTAMP | YES | 离职时间 |
| 24 | create_time | TIMESTAMP | YES | 创建时间 |
| 25 | is_delete | INTEGER | YES | 删除标记 |
| 26 | is_reserve | INTEGER | YES | 预约标记 |
| 27 | shop_name | TEXT | YES | 门店名称 |
| 28 | site_label | TEXT | YES | 门店标签 |
| 29 | cashier_point_id | BIGINT | YES | 收银点 ID |
| 30 | cashier_point_name | TEXT | YES | 收银点名称 |
| 31 | group_id | BIGINT | YES | 分组 ID |
| 32 | group_name | TEXT | YES | 分组名称 |
| 33 | staff_profile_id | BIGINT | YES | 员工档案 ID |
| 34 | auth_code | TEXT | YES | 授权码 |
| 35 | auth_code_create | TIMESTAMP | YES | 授权码创建时间 |
| 36 | ding_talk_synced | INTEGER | YES | 钉钉同步状态 |
| 37 | salary_grant_enabled | INTEGER | YES | 工资发放启用 |
| 38 | entry_type | INTEGER | YES | 入职类型 |
| 39 | entry_sign_status | INTEGER | YES | 入职签约状态 |
| 40 | resign_sign_status | INTEGER | YES | 离职签约状态 |
| 41 | criticism_status | INTEGER | YES | 批评状态 |
| 42 | user_roles | JSONB | YES | 用户角色列表 |
| 43 | content_hash | TEXT | NO | 记录内容哈希 |
| 44 | source_file | TEXT | YES | 来源文件路径 |
| 45 | fetched_at | TIMESTAMPTZ | YES | 抓取时间 |
| 46 | payload | JSONB | NO | 原始 JSON |
## 与其他表的关系
- 员工表与助教表(`assistant_accounts_master`)是完全独立的实体
- 下游:`dwd.dim_staff`(主表)、`dwd.dim_staff_ex`(扩展表)

View File

@@ -0,0 +1,80 @@
# 员工档案SearchSystemStaffInfo → staff_info_master 字段映射
> 生成时间2026-02-23
## 端点信息
| 属性 | 值 |
|------|-----|
| 接口路径 | `PersonnelManagement/SearchSystemStaffInfo` |
| 请求方法 | POST |
| ODS 对应表 | `ods.staff_info_master` |
| JSON 数据路径 | `data.staffProfiles` |
| 快照模式 | FULL_TABLE全量快照 |
## 请求参数
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| workStatusEnum | int | 0 | 在职状态筛选0=全部) |
| dingTalkSynced | int | 0 | 钉钉同步状态0=全部) |
| staffIdentity | int | 0 | 员工身份筛选0=全部) |
| rankId | int | 0 | 职级筛选0=全部) |
| criticismStatus | int | 0 | 批评状态0=全部) |
| signStatus | int | -1 | 签约状态(-1=全部) |
## 字段映射
| JSON 字段 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| id | id | int→BIGINT | 员工主键 ID |
| tenant_id | tenant_id | int→BIGINT | 租户 ID |
| site_id | site_id | int→BIGINT | 门店 ID |
| tenant_org_id | tenant_org_id | int→BIGINT | 租户组织 ID |
| system_user_id | system_user_id | int→BIGINT | 系统用户 ID |
| staff_name | staff_name | string→TEXT | 员工姓名 |
| alias_name | alias_name | string→TEXT | 别名 |
| mobile | mobile | string→TEXT | 手机号 |
| avatar | avatar | string→TEXT | 头像 URL |
| gender | gender | int→INTEGER | 性别3=未知) |
| job | job | string→TEXT | 职位名称(店长/主管/教练等) |
| job_num | job_num | string→TEXT | 工号 |
| staff_identity | staff_identity | int→INTEGER | 员工身份类型 |
| status | status | int→INTEGER | 账号状态 |
| account_status | account_status | int→INTEGER | 账号启用状态 |
| system_role_id | system_role_id | int→INTEGER | 系统角色 ID |
| rank_id | rank_id | int→INTEGER | 职级 ID |
| rankName | rank_name | string→TEXT | 职级名称(驼峰→蛇形) |
| new_rank_id | new_rank_id | int→INTEGER | 新职级 ID |
| new_staff_identity | new_staff_identity | int→INTEGER | 新员工身份 |
| leave_status | leave_status | int→INTEGER | 在职状态0=在职) |
| entry_time | entry_time | string→TIMESTAMP | 入职时间 |
| resign_time | resign_time | string→TIMESTAMP | 离职时间 |
| create_time | create_time | string→TIMESTAMP | 创建时间 |
| is_delete | is_delete | int→INTEGER | 删除标记 |
| is_reserve | is_reserve | int→INTEGER | 预约标记 |
| shop_name | shop_name | string→TEXT | 门店名称 |
| site_label | site_label | string→TEXT | 门店标签 |
| cashierPointId | cashier_point_id | int→BIGINT | 收银点 ID驼峰→蛇形 |
| cashierPointName | cashier_point_name | string→TEXT | 收银点名称(驼峰→蛇形) |
| groupId | group_id | int→BIGINT | 分组 ID驼峰→蛇形 |
| groupName | group_name | string→TEXT | 分组名称(驼峰→蛇形) |
| staff_profile_id | staff_profile_id | int→BIGINT | 员工档案 ID |
| auth_code | auth_code | string→TEXT | 授权码 |
| auth_code_create | auth_code_create | string→TIMESTAMP | 授权码创建时间 |
| ding_talk_synced | ding_talk_synced | int→INTEGER | 钉钉同步状态 |
| salary_grant_enabled | salary_grant_enabled | int→INTEGER | 工资发放启用 |
| entry_type | entry_type | int→INTEGER | 入职类型 |
| entry_sign_status | entry_sign_status | int→INTEGER | 入职签约状态 |
| resign_sign_status | resign_sign_status | int→INTEGER | 离职签约状态 |
| criticism_status | criticism_status | int→INTEGER | 批评状态 |
| userRoles | user_roles | array→JSONB | 用户角色列表(驼峰→蛇形) |
## ETL 元数据列
| 列名 | 类型 | 说明 |
|------|------|------|
| content_hash | TEXT | 记录内容哈希(去重用) |
| source_file | TEXT | 来源文件路径 |
| fetched_at | TIMESTAMPTZ | 抓取时间 |
| payload | JSONB | 原始 JSON 完整保留 |

View File

@@ -1,230 +1,38 @@
# BD_Manual — 飞球 ETL 数据库手册
# 飞球 ETL 数据库手册
> 本文档是 `docs/bd_manual/` 目录的导航索引,涵盖 ODS、DWD、DWS、ETL_Admin 四个数据层的表级文档、字段映射文档和变更记录
> 模块专属的表级文档、字段映射、扩展表说明
> DDL 基线见项目级 `docs/database/ddl/`,变更记录已归档至 `_archived/`。
## 目录结构
```
docs/bd_manual/
├── README.md ← 本文件(根索引)
├── ddl_compare_results.md ← DDL 对比结果汇总
├── ODS/ ← 操作数据存储层ods schema
│ ├── main/ ← 表级文档
│ ├── mappings/ ← API JSON → ODS 字段映射文档
│ └── changes/ ← 变更记录
├── DWD/ ← 明细数据层dwd schema
── main/ ← 表级文档
├── Ex/ ← 扩展表文档SCD2 维度扩展等)
│ └── changes/ ← 变更记录
── DWS/ ← 数据服务层dws schema
│ ├── main/ ← 表级文档
│ └── changes/ ← 变更记录
└── ETL_Admin/ ← ETL 管理层meta schema
├── main/ ← 表级文档
└── changes/ ← 变更记录
database/
├── ODS/
│ ├── main/ — ODS 表级文档BD_manual_*.md
│ └── mappings/ — API JSON → ODS 字段映射mapping_*.md
├── DWD/
│ ├── main/ — DWD 主表文档
│ └── Ex/ — DWD 扩展表文档
├── DWS/
── main/ — DWS 汇总表文档
├── ETL_Admin/
│ └── main/ — meta schema 表文档
── _archived/ — 过时的变更记录、DDL 对比报告、已删除表文档
```
## 文档命名规范
## 文档类型
| 文档类型 | 命名格式 | 示例 |
|----------|----------|------|
| 表级文档 | `BD_manual_{表名}.md` | `BD_manual_member_profiles.md` |
| 映射文档 | `mapping_{API端点名}_{ODS表名}.md` | `mapping_GetTenantMemberList_member_profiles.md` |
| 变更记录 | `{YYYYMMDD}_{变更简述}.md``{YYYY-MM-DD}_{变更简述}.md` | `2026-02-13_ddl_sync_ods.md` |
| 类型 | 命名规则 | 说明 |
|------|---------|------|
| 表级文档 | `BD_manual_{表名}.md` | 字段说明、主键、业务含义 |
| 扩展表文档 | `BD_manual_{表名}_ex.md` | SCD2 扩展字段、溢出字段 |
| 字段映射 | `mapping_{API端点}_{ODS表名}.md` | API JSON 字段 → ODS 列的映射关系 |
## ODS 层文档清单ods
## 与项目级文档的关系
### 表级文档(`ODS/main/`)— 共 23 份
| 序号 | 文件名 | 对应表 |
|------|--------|--------|
| 1 | `BD_manual_assistant_accounts_master.md` | assistant_accounts_master |
| 2 | `BD_manual_assistant_cancellation_records.md` | assistant_cancellation_records |
| 3 | `BD_manual_assistant_service_records.md` | assistant_service_records |
| 4 | `BD_manual_goods_stock_movements.md` | goods_stock_movements |
| 5 | `BD_manual_goods_stock_summary.md` | goods_stock_summary |
| 6 | `BD_manual_group_buy_packages.md` | group_buy_packages |
| 7 | `BD_manual_group_buy_redemption_records.md` | group_buy_redemption_records |
| 8 | `BD_manual_member_balance_changes.md` | member_balance_changes |
| 9 | `BD_manual_member_profiles.md` | member_profiles |
| 10 | `BD_manual_member_stored_value_cards.md` | member_stored_value_cards |
| 11 | `BD_manual_payment_transactions.md` | payment_transactions |
| 12 | `BD_manual_platform_coupon_redemption_records.md` | platform_coupon_redemption_records |
| 13 | `BD_manual_recharge_settlements.md` | recharge_settlements |
| 14 | `BD_manual_refund_transactions.md` | refund_transactions |
| 15 | `BD_manual_settlement_records.md` | settlement_records |
| 16 | `BD_manual_settlement_ticket_details.md` | settlement_ticket_details |
| 17 | `BD_manual_site_tables_master.md` | site_tables_master |
| 18 | `BD_manual_stock_goods_category_tree.md` | stock_goods_category_tree |
| 19 | `BD_manual_store_goods_master.md` | store_goods_master |
| 20 | `BD_manual_store_goods_sales_records.md` | store_goods_sales_records |
| 21 | `BD_manual_table_fee_discount_records.md` | table_fee_discount_records |
| 22 | `BD_manual_table_fee_transactions.md` | table_fee_transactions |
| 23 | `BD_manual_tenant_goods_master.md` | tenant_goods_master |
### API→ODS 字段映射文档(`ODS/mappings/`)— 共 23 份
| 序号 | 文件名 | API 端点 → ODS 表 |
|------|--------|-------------------|
| 1 | `mapping_GetAbolitionAssistant_assistant_cancellation_records.md` | GetAbolitionAssistant → assistant_cancellation_records |
| 2 | `mapping_GetAllOrderSettleList_settlement_records.md` | GetAllOrderSettleList → settlement_records |
| 3 | `mapping_GetGoodsInventoryList_store_goods_master.md` | GetGoodsInventoryList → store_goods_master |
| 4 | `mapping_GetGoodsSalesList_store_goods_sales_records.md` | GetGoodsSalesList → store_goods_sales_records |
| 5 | `mapping_GetGoodsStockReport_goods_stock_summary.md` | GetGoodsStockReport → goods_stock_summary |
| 6 | `mapping_GetMemberCardBalanceChange_member_balance_changes.md` | GetMemberCardBalanceChange → member_balance_changes |
| 7 | `mapping_GetOfflineCouponConsumePageList_platform_coupon_redemption_records.md` | GetOfflineCouponConsumePageList → platform_coupon_redemption_records |
| 8 | `mapping_GetOrderAssistantDetails_assistant_service_records.md` | GetOrderAssistantDetails → assistant_service_records |
| 9 | `mapping_GetOrderSettleTicketNew_settlement_ticket_details.md` | GetOrderSettleTicketNew → settlement_ticket_details |
| 10 | `mapping_GetPayLogListPage_payment_transactions.md` | GetPayLogListPage → payment_transactions |
| 11 | `mapping_GetRechargeSettleList_recharge_settlements.md` | GetRechargeSettleList → recharge_settlements |
| 12 | `mapping_GetRefundPayLogList_refund_transactions.md` | GetRefundPayLogList → refund_transactions |
| 13 | `mapping_GetSiteTableOrderDetails_table_fee_transactions.md` | GetSiteTableOrderDetails → table_fee_transactions |
| 14 | `mapping_GetSiteTables_site_tables_master.md` | GetSiteTables → site_tables_master |
| 15 | `mapping_GetSiteTableUseDetails_group_buy_redemption_records.md` | GetSiteTableUseDetails → group_buy_redemption_records |
| 16 | `mapping_GetTaiFeeAdjustList_table_fee_discount_records.md` | GetTaiFeeAdjustList → table_fee_discount_records |
| 17 | `mapping_GetTenantMemberCardList_member_stored_value_cards.md` | GetTenantMemberCardList → member_stored_value_cards |
| 18 | `mapping_GetTenantMemberList_member_profiles.md` | GetTenantMemberList → member_profiles |
| 19 | `mapping_QueryGoodsOutboundReceipt_goods_stock_movements.md` | QueryGoodsOutboundReceipt → goods_stock_movements |
| 20 | `mapping_QueryPackageCouponList_group_buy_packages.md` | QueryPackageCouponList → group_buy_packages |
| 21 | `mapping_QueryPrimarySecondaryCategory_stock_goods_category_tree.md` | QueryPrimarySecondaryCategory → stock_goods_category_tree |
| 22 | `mapping_QueryTenantGoods_tenant_goods_master.md` | QueryTenantGoods → tenant_goods_master |
| 23 | `mapping_SearchAssistantInfo_assistant_accounts_master.md` | SearchAssistantInfo → assistant_accounts_master |
### 变更记录(`ODS/changes/`
| 文件名 | 说明 |
|--------|------|
| `2026-02-13_ddl_sync_ods.md` | DDL 对比同步 — ODS 层 |
| `20260213_align_ods_with_api.md` | ODS 表结构与 API 对齐 |
| `20260214_drop_ods_option_name_able_site_transfer.md` | 移除 ODS 冗余字段/表 |
| `20260214_drop_ods_settlelist.md` | 移除 ODS settle_list 表 |
## DWD 层文档清单dwd
### 表级文档(`DWD/main/`)— 共 22 份
| 序号 | 文件名 | 对应表 |
|------|--------|--------|
| 1 | `BD_manual_dwd.md` | dwd层级概览 |
| 2 | `BD_manual_dim_assistant.md` | dim_assistant |
| 3 | `BD_manual_dim_goods_category.md` | dim_goods_category |
| 4 | `BD_manual_dim_groupbuy_package.md` | dim_groupbuy_package |
| 5 | `BD_manual_dim_member.md` | dim_member |
| 6 | `BD_manual_dim_member_card_account.md` | dim_member_card_account |
| 7 | `BD_manual_dim_site.md` | dim_site |
| 8 | `BD_manual_dim_store_goods.md` | dim_store_goods |
| 9 | `BD_manual_dim_table.md` | dim_table |
| 10 | `BD_manual_dim_tenant_goods.md` | dim_tenant_goods |
| 11 | `BD_manual_dwd_assistant_service_log.md` | dwd_assistant_service_log |
| 12 | `BD_manual_dwd_assistant_trash_event.md` | dwd_assistant_trash_event |
| 13 | `BD_manual_dwd_groupbuy_redemption.md` | dwd_groupbuy_redemption |
| 14 | `BD_manual_dwd_member_balance_change.md` | dwd_member_balance_change |
| 15 | `BD_manual_dwd_payment.md` | dwd_payment |
| 16 | `BD_manual_dwd_platform_coupon_redemption.md` | dwd_platform_coupon_redemption |
| 17 | `BD_manual_dwd_recharge_order.md` | dwd_recharge_order |
| 18 | `BD_manual_dwd_refund.md` | dwd_refund |
| 19 | `BD_manual_dwd_settlement_head.md` | dwd_settlement_head |
| 20 | `BD_manual_dwd_store_goods_sale.md` | dwd_store_goods_sale |
| 21 | `BD_manual_dwd_table_fee_adjust.md` | dwd_table_fee_adjust |
| 22 | `BD_manual_dwd_table_fee_log.md` | dwd_table_fee_log |
### 扩展表文档(`DWD/Ex/`)— 共 19 份
| 序号 | 文件名 | 对应扩展表 |
|------|--------|------------|
| 1 | `BD_manual_dim_assistant_ex.md` | dim_assistant_ex |
| 2 | `BD_manual_dim_groupbuy_package_ex.md` | dim_groupbuy_package_ex |
| 3 | `BD_manual_dim_member_card_account_ex.md` | dim_member_card_account_ex |
| 4 | `BD_manual_dim_member_ex.md` | dim_member_ex |
| 5 | `BD_manual_dim_site_ex.md` | dim_site_ex |
| 6 | `BD_manual_dim_store_goods_ex.md` | dim_store_goods_ex |
| 7 | `BD_manual_dim_table_ex.md` | dim_table_ex |
| 8 | `BD_manual_dim_tenant_goods_ex.md` | dim_tenant_goods_ex |
| 9 | `BD_manual_dwd_assistant_service_log_ex.md` | dwd_assistant_service_log_ex |
| 10 | `BD_manual_dwd_assistant_trash_event_ex.md` | dwd_assistant_trash_event_ex |
| 11 | `BD_manual_dwd_groupbuy_redemption_ex.md` | dwd_groupbuy_redemption_ex |
| 12 | `BD_manual_dwd_member_balance_change_ex.md` | dwd_member_balance_change_ex |
| 13 | `BD_manual_dwd_platform_coupon_redemption_ex.md` | dwd_platform_coupon_redemption_ex |
| 14 | `BD_manual_dwd_recharge_order_ex.md` | dwd_recharge_order_ex |
| 15 | `BD_manual_dwd_refund_ex.md` | dwd_refund_ex |
| 16 | `BD_manual_dwd_settlement_head_ex.md` | dwd_settlement_head_ex |
| 17 | `BD_manual_dwd_store_goods_sale_ex.md` | dwd_store_goods_sale_ex |
| 18 | `BD_manual_dwd_table_fee_adjust_ex.md` | dwd_table_fee_adjust_ex |
| 19 | `BD_manual_dwd_table_fee_log_ex.md` | dwd_table_fee_log_ex |
### 变更记录(`DWD/changes/`
| 文件名 | 说明 |
|--------|------|
| `2026-02-13_ddl_sync_dwd.md` | DDL 对比同步 — DWD 层 |
| `20260214_drop_dwd_settle_list.md` | 移除 DWD settle_list 表 |
## DWS 层文档清单dws
### 表级文档(`DWS/main/`)— 共 29 份
| 序号 | 文件名 | 对应表 |
|------|--------|--------|
| 1 | `BD_manual_cfg_area_category.md` | cfg_area_category |
| 2 | `BD_manual_cfg_assistant_level_price.md` | cfg_assistant_level_price |
| 3 | `BD_manual_cfg_bonus_rules.md` | cfg_bonus_rules |
| 4 | `BD_manual_cfg_index_parameters.md` | cfg_index_parameters |
| 5 | `BD_manual_cfg_performance_tier.md` | cfg_performance_tier |
| 6 | `BD_manual_cfg_skill_type.md` | cfg_skill_type |
| 7 | `BD_manual_dws_assistant_customer_stats.md` | dws_assistant_customer_stats |
| 8 | `BD_manual_dws_assistant_daily_detail.md` | dws_assistant_daily_detail |
| 9 | `BD_manual_dws_assistant_finance_analysis.md` | dws_assistant_finance_analysis |
| 10 | `BD_manual_dws_assistant_monthly_summary.md` | dws_assistant_monthly_summary |
| 11 | `BD_manual_dws_assistant_recharge_commission.md` | dws_assistant_recharge_commission |
| 12 | `BD_manual_dws_assistant_salary_calc.md` | dws_assistant_salary_calc |
| 13 | `BD_manual_dws_finance_daily_summary.md` | dws_finance_daily_summary |
| 14 | `BD_manual_dws_finance_discount_detail.md` | dws_finance_discount_detail |
| 15 | `BD_manual_dws_finance_expense_summary.md` | dws_finance_expense_summary |
| 16 | `BD_manual_dws_finance_income_structure.md` | dws_finance_income_structure |
| 17 | `BD_manual_dws_finance_recharge_summary.md` | dws_finance_recharge_summary |
| 18 | `BD_manual_dws_index_percentile_history.md` | dws_index_percentile_history |
| 19 | `BD_manual_dws_member_assistant_intimacy.md` | dws_member_assistant_intimacy |
| 20 | `BD_manual_dws_member_assistant_relation_index.md` | dws_member_assistant_relation_index |
| 21 | `BD_manual_dws_member_consumption_summary.md` | dws_member_consumption_summary |
| 22 | `BD_manual_dws_member_newconv_index.md` | dws_member_newconv_index |
| 23 | `BD_manual_dws_member_visit_detail.md` | dws_member_visit_detail |
| 24 | `BD_manual_dws_member_winback_index.md` | dws_member_winback_index |
| 25 | `BD_manual_dws_ml_manual_order_alloc.md` | dws_ml_manual_order_alloc |
| 26 | `BD_manual_dws_ml_manual_order_source.md` | dws_ml_manual_order_source |
| 27 | `BD_manual_dws_order_summary.md` | dws_order_summary |
| 28 | `BD_manual_dws_platform_settlement.md` | dws_platform_settlement |
| 29 | `BD_manual_v_member_recall_priority.md` | v_member_recall_priority |
### 变更记录(`DWS/changes/`
| 文件名 | 说明 |
|--------|------|
| `2026-02-13_ddl_sync_dws.md` | DDL 对比同步 — DWS 层 |
## ETL_Admin 层文档清单etl_admin
### 表级文档(`ETL_Admin/main/`)— 共 3 份
| 序号 | 文件名 | 对应表 |
|------|--------|--------|
| 1 | `BD_manual_etl_cursor.md` | etl_cursor |
| 2 | `BD_manual_etl_run.md` | etl_run |
| 3 | `BD_manual_etl_task.md` | etl_task |
### 变更记录(`ETL_Admin/changes/`
暂无变更记录。
## 相关资源
| 资源 | 路径 | 说明 |
| 内容 | 位置 | 说明 |
|------|------|------|
| ODS 数据字典 | `docs/dictionary/ods_tables_dictionary.md` | ODS 层所有表的概览汇总 |
| DDL 对比结果 | `docs/bd_manual/ddl_compare_results.md` | DDL 文件与数据库实际状态的对比报告 |
| DDL 文件 — ODS | `database/schema_ODS_doc.sql` | ODS 层表结构定义 |
| DDL 文件 — DWD | `database/schema_dwd_doc.sql` | DWD 层表结构定义 |
| DDL 文件 — DWS | `database/schema_dws.sql` | DWS 层表结构定义 |
| DDL 文件 — ETL_Admin | `database/schema_etl_admin.sql` | ETL_Admin 层表结构定义 |
| API 端点文档 | `docs/api-reference/endpoints/` | 上游 SaaS API 端点说明 |
| DDL 对比脚本 | `scripts/compare_ddl_db.py` | DDL 与数据库实际状态对比工具 |
| 文档验证脚本 | `scripts/validate_bd_manual.py` | BD_Manual 文档覆盖率和格式验证 |
| DDL 基线 | `docs/database/ddl/` | 从数据库自动导出,按 schema 分文件 |
| ODS→DWD 字段映射 | `docs/database/BD_Manual_*.md` | 跨层映射ODS 表 → DWD 表) |
| 表级字段说明 | 本目录 `*/main/BD_manual_*.md` | 单表字段详情 |
| API→ODS 字段映射 | 本目录 `ODS/mappings/` | API JSON → ODS 列映射 |

View File

@@ -51,7 +51,7 @@ graph LR
| 文档 | 说明 |
|------|------|
| [BaseTask 公共机制](base_task_mechanism.md) | 任务基类模板方法、TaskContext、时间窗口、注册表、Flow 执行 |
| [ODS 层任务](ods_tasks.md) | 23 个通用 ODS 任务的架构、配置结构、API 端点、目标表 |
| [ODS 层任务](ods_tasks.md) | 22 个通用 ODS 任务的架构、配置结构、API 端点、目标表 |
| [DWD 层任务](dwd_tasks.md) | DWD_LOAD_FROM_ODS 核心装载、SCD2 处理、质量校验 |
| [DWS 层任务](dws_tasks.md) | 助教业绩、会员分析、财务统计、运维任务共 13 个 DWS 任务 |
| [INDEX 层任务](index_tasks.md) | WBI/NCI/RS 指数算法 + ML 手动台账导入 |
@@ -88,7 +88,6 @@ graph LR
| `ODS_TABLE_FEE_DISCOUNT` | `OdsTableDiscountTask` | `ods.table_fee_discount_records` | 台费折扣/调账 | [查看](ods_tasks.md) |
| `ODS_STORE_GOODS_SALES` | `OdsGoodsLedgerTask` | `ods.store_goods_sales_records` | 门店商品销售流水 | [查看](ods_tasks.md) |
| `ODS_TENANT_GOODS` | `OdsTenantGoodsTask` | `ods.tenant_goods_master` | 租户商品档案 | [查看](ods_tasks.md) |
| `ODS_SETTLEMENT_TICKET` | `OdsSettlementTicketTask` | `ods.settlement_ticket_details` | 结账小票详情 | [查看](ods_tasks.md) |
| `ODS_SETTLEMENT_RECORDS` | `OdsOrderSettleTask` | `ods.settlement_records` | 结账记录 | [查看](ods_tasks.md) |
### DWD 层(明细数据)
@@ -280,6 +279,7 @@ Flow执行流程定义了多层任务的执行顺序。通过 `--flow` 参
| `--idle-start` | str | — | 闲时窗口开始HH:MM |
| `--idle-end` | str | — | 闲时窗口结束HH:MM |
| `--allow-empty-advance` | flag | `false` | 允许空结果推进窗口 |
| `--force-full` | flag | `false` | 强制全量处理:跳过 ODS hash 去重和 DWD 变更对比,无条件写入 |
### 已弃用参数

View File

@@ -14,8 +14,8 @@
|------|------|----------|
| Task 1 | 新增 `SnapshotMode` 枚举(`FULL_SET` / `TIME_WINDOW` / `NONE` | `tasks/ods/ods_tasks.py` |
| Task 2 | content_hash 算法从 MD5 改为 SHA-256 | `tasks/ods/ods_tasks.py` |
| Task 3 | ODS DDL 补齐 `content_hash` 列 + `is_delete` 列 + `(pk, fetched_at DESC)` 索引 | `db/etl_feiqiu/schemas/ods.sql` |
| Task 4 | 迁移脚本:为已有 ODS 表添加 `latest_version` 索引 | `db/etl_feiqiu/migrations/2026-02-17__add_ods_latest_version_indexes.sql` |
| Task 3 | ODS DDL 补齐 `content_hash` 列 + `is_delete` 列 + `(pk, fetched_at DESC)` 索引 | `docs/database/ddl/etl_feiqiu__ods.sql`(原 `db/etl_feiqiu/schemas/ods.sql`,已归档) |
| Task 4 | 迁移脚本:为已有 ODS 表添加 `latest_version` 索引 | `db/_archived/ddl_baseline_2026-02-22/db/etl_feiqiu/migrations/2026-02-17__add_ods_latest_version_indexes.sql`(已归档) |
| Task 5 | 软删除重构:`_mark_missing_as_deleted` 改为 INSERT 删除版本行 | `tasks/ods/ods_tasks.py` |
| Task 6 | 属性测试覆盖去重和软删除逻辑 | `tests/unit/test_ods_dedup_properties.py` |
| Task 7-9 | 文档同步、集成验证 | 多文件 |

View File

@@ -1480,3 +1480,107 @@ recharge_order_flag = (consume_money = 0 AND pay_amount > 0)
- `refreshed`:刷新的物化视图数量
- `cleaned`:清理的历史数据行数
---
## 库存汇总域
库存汇总域包含 3 个任务,围绕商品库存的日度、周度、月度汇总展开。数据流向为:
```
dwd_goods_stock_summary ──┬──► DWS_GOODS_STOCK_DAILY日度汇总
├──► DWS_GOODS_STOCK_WEEKLY周度汇总
└──► DWS_GOODS_STOCK_MONTHLY月度汇总
```
三个任务均依赖 `DWD_LOAD_FROM_ODS` 完成后的 `dwd.dwd_goods_stock_summary` 数据。
---
### DWS_GOODS_STOCK_DAILY — 库存日度汇总
| 属性 | 值 |
|------|-----|
| 任务代码 | `DWS_GOODS_STOCK_DAILY` |
| Python 类 | `GoodsStockDailyTask``tasks/dws/goods_stock_daily_task.py` |
| 目标表 | `dws.dws_goods_stock_daily_summary` |
| 主键 | `site_id`, `stat_date`, `site_goods_id` |
| 粒度 | 日期 + 门店 + 商品 |
| 更新策略 | upsertON CONFLICT DO UPDATE |
| 更新频率 | 每日更新 |
| 依赖 | `DWD_LOAD_FROM_ODS` |
#### 数据来源
| 来源表 | Schema | 用途 |
|--------|--------|------|
| `dwd_goods_stock_summary` | `dwd` | 库存汇总明细(按 fetched_at 日期聚合) |
#### 核心业务逻辑
-`fetched_at` 的日期部分分组,同一天同一商品可能有多条 DWD 记录
- 数值指标(入库/出库/销售等)取 SUM 聚合
- `range_start_stock` 取当日第一条记录的值(期初快照)
- `range_end_stock` / `current_stock` 取当日最后一条记录的值(期末快照)
- `stat_period = 'daily'`
---
### DWS_GOODS_STOCK_WEEKLY — 库存周度汇总
| 属性 | 值 |
|------|-----|
| 任务代码 | `DWS_GOODS_STOCK_WEEKLY` |
| Python 类 | `GoodsStockWeeklyTask``tasks/dws/goods_stock_weekly_task.py` |
| 目标表 | `dws.dws_goods_stock_weekly_summary` |
| 主键 | `site_id`, `stat_date`, `site_goods_id` |
| 粒度 | ISO 周 + 门店 + 商品 |
| 更新策略 | upsertON CONFLICT DO UPDATE |
| 更新频率 | 每周更新 |
| 依赖 | `DWD_LOAD_FROM_ODS` |
#### 数据来源
| 来源表 | Schema | 用途 |
|--------|--------|------|
| `dwd_goods_stock_summary` | `dwd` | 库存汇总明细(按 ISO 周聚合) |
#### 核心业务逻辑
- 按 ISO 周分组isocalendar`stat_date` = 该周的周一日期
- 同一周同一商品可能有多条 DWD 记录
- 数值指标取 SUM 聚合
- `range_start_stock` 取该周第一条记录的值(期初快照)
- `range_end_stock` / `current_stock` 取该周最后一条记录的值(期末快照)
- `stat_period = 'weekly'`
---
### DWS_GOODS_STOCK_MONTHLY — 库存月度汇总
| 属性 | 值 |
|------|-----|
| 任务代码 | `DWS_GOODS_STOCK_MONTHLY` |
| Python 类 | `GoodsStockMonthlyTask``tasks/dws/goods_stock_monthly_task.py` |
| 目标表 | `dws.dws_goods_stock_monthly_summary` |
| 主键 | `site_id`, `stat_date`, `site_goods_id` |
| 粒度 | 自然月 + 门店 + 商品 |
| 更新策略 | upsertON CONFLICT DO UPDATE |
| 更新频率 | 每日更新当月数据 |
| 依赖 | `DWD_LOAD_FROM_ODS` |
#### 数据来源
| 来源表 | Schema | 用途 |
|--------|--------|------|
| `dwd_goods_stock_summary` | `dwd` | 库存汇总明细(按自然月聚合) |
#### 核心业务逻辑
- 按自然月分组,`stat_date` = 该月的第一天(如 2026-01-01 代表 2026 年 1 月)
- 同一月同一商品可能有多条 DWD 记录
- 数值指标取 SUM 聚合
- `range_start_stock` 取该月第一条记录的值(期初快照)
- `range_end_stock` / `current_stock` 取该月最后一条记录的值(期末快照)
- `stat_period = 'monthly'`

View File

@@ -751,5 +751,5 @@ ORDER BY effective_from DESC
| `compression_mode` | 1 | 压缩模式(默认 log1p |
| `use_smoothing` / `ewma_alpha` | 1 / 0.2 | EWMA 平滑 |
> 种子数据脚本:`database/seed_index_parameters.sql`
> DDL 定义:`database/schema_dws.sql`(第 21 节)
> 种子数据脚本:`db/etl_feiqiu/seeds/seed_index_parameters.sql`
> DDL 定义:`docs/database/ddl/etl_feiqiu__dws.sql`

View File

@@ -1,6 +1,6 @@
# ODS 任务参数矩阵
> 本文档列举所有 23 个 ODS 任务的关键配置参数,说明每个参数在 ETL 处理流程中的作用,
> 本文档列举所有 22 个 ODS 任务的关键配置参数,说明每个参数在 ETL 处理流程中的作用,
> 并以通俗语言概述飞球 ETL 的 API → ODS 现状。
>
> 数据来源:`tasks/ods/ods_tasks.py` 中的 `ODS_TASK_SPECS` 声明。
@@ -12,7 +12,7 @@
### 从哪抓
从上游飞球 SaaS 平台的 REST API 抓取,共对接 22 个不同的 API 端点(加上小票的特殊接口共 23 个)。覆盖台球门店的核心业务:订单结账、支付退款、会员档案与余额、助教服务与废除、商品库存、台桌、团购套餐、台费折扣等。每个端点对应一个 ODS 任务。
从上游飞球 SaaS 平台的 REST API 抓取,共对接 22 个不同的 API 端点。覆盖台球门店的核心业务:订单结账、支付退款、会员档案与余额、助教服务与废除、商品库存、台桌、团购套餐、台费折扣等。每个端点对应一个 ODS 任务。
### 怎么解析
@@ -20,11 +20,11 @@ API 返回的 JSON 响应通过两级路径定位数据:先按 `data_path`
### 写到哪
全部写入 PostgreSQL 的 `ods.*` schema对应实际的 `ods` schema23 张表一一对应 23 个任务。
全部写入 PostgreSQL 的 `ods.*` schema对应实际的 `ods` schema22 张表一一对应 22 个任务。
### 怎么去重
所有 23 个任务默认开启 `skip_unchanged=True`:基于原始 payload + is_delete 计算 content_hashSHA-256若与数据库中该业务 ID 最新版本的 hash 相同则跳过写入,避免无意义的版本膨胀。
所有 22 个任务默认开启 `skip_unchanged=True`:基于原始 payload + is_delete 计算 content_hashSHA-256若与数据库中该业务 ID 最新版本的 hash 相同则跳过写入,避免无意义的版本膨胀。
冲突处理模式默认是 `update`(全字段对比,有变化才更新),也支持 `backfill`(只回填 NULL 列)和 `nothing`(跳过已存在记录),通过运行时配置 `run.ods_conflict_mode` 控制。
@@ -34,7 +34,7 @@ API 返回的 JSON 响应通过两级路径定位数据:先按 `data_path`
- 全表快照5 个任务API 返回全量数据,本次没返回但数据库里有的记录插入一条 `is_delete=1` 的删除版本行。适用于维度表/档案表,数据量小。
- 窗口快照8 个任务):只在指定时间列的窗口范围内做软删除。适用于流水表,数据量大,只能按时间段比对。
- 无快照(10 个任务):纯增量写入,不做软删除。
- 无快照(9 个任务):纯增量写入,不做软删除。
下游 DWD 层取数规约:`DISTINCT ON (id) ORDER BY id, fetched_at DESC`,再过滤 `is_delete = 0`
@@ -96,12 +96,10 @@ API 返回的 JSON 响应通过两级路径定位数据:先按 `data_path`
| `ODS_STORE_GOODS` | ❌ | 默认 | ❌ | ✅ | ✅ | `FULL_TABLE` | — |
| `ODS_TABLE_FEE_DISCOUNT` | ❌ | 默认 | ❌ | ✅ | ✅ | `WINDOW` | `create_time` |
| `ODS_TENANT_GOODS` | ❌ | 默认 | ❌ | ✅ | ✅ | `FULL_TABLE` | — |
| `ODS_SETTLEMENT_TICKET` | ❌ | — | ✅ | ✅ | ✅ | `NONE` | — |
> - "默认" `time_fields` 表示 `(startTime, endTime)`
> - "—" 表示该参数为 `None` 或不适用
> - `skip_unchanged` 所有任务均为 `True`(默认值),基于 payload + is_delete 计算 content_hash
> - `ODS_SETTLEMENT_TICKET` 的 `time_fields` 为 `—` 是因为它不走标准分页抓取流程,而是先收集 `orderSettleId` 再逐个调用小票接口
> - `ODS_RECHARGE_SETTLE` 是唯一手动映射 60+ 列的任务(其余任务按 DB schema 自动匹配)
@@ -109,7 +107,7 @@ API 返回的 JSON 响应通过两级路径定位数据:先按 `data_path`
## 去重策略
所有 23 个任务统一使用 `skip_unchanged=True`(默认值):
所有 22 个任务统一使用 `skip_unchanged=True`(默认值):
- content_hash 基于原始 payload`json.dumps(sort_keys=True, separators=(',',':'), ensure_ascii=False)`+ `is_delete` 值计算 SHA-256
- 写入时与数据库中该业务 ID 最新版本的 content_hash 比对,相同则跳过
@@ -121,6 +119,6 @@ API 返回的 JSON 响应通过两级路径定位数据:先按 `data_path`
|------|:---:|----------|------|
| 全表快照 | `FULL_TABLE` | `ODS_ASSISTANT_ACCOUNT``ODS_MEMBER_CARD``ODS_GROUP_PACKAGE``ODS_STORE_GOODS``ODS_TENANT_GOODS`5 个) | API 返回全量,不在返回集中的记录插入一条 `is_delete=1` 的删除版本行 |
| 窗口快照 | `WINDOW` | `ODS_TABLE_USE``ODS_ASSISTANT_LEDGER``ODS_STORE_GOODS_SALES``ODS_REFUND``ODS_PLATFORM_COUPON``ODS_MEMBER_BALANCE``ODS_GROUP_BUY_REDEMPTION``ODS_TABLE_FEE_DISCOUNT`8 个) | 仅在 `snapshot_time_column` 指定的时间列窗口范围内做软删除 |
| 无快照 | `NONE` | 其余 10 个 | 纯增量写入,不做软删除 |
| 无快照 | `NONE` | 其余 9 个 | 纯增量写入,不做软删除 |
软删除语义INSERT 一条 `is_delete=1` 的新版本行(而非 UPDATE 历史版本),保持 ODS 追加写入的一致性。若最新版本已是 `is_delete=1` 则跳过(幂等)。

View File

@@ -40,7 +40,7 @@ ODS 层采用**声明式配置**驱动的通用任务模式:由 `BaseOdsTask`
| `ODS_STORE_GOODS` | `OdsStoreGoodsTask` | `/TenantGoods/GetGoodsInventoryList` | `store_goods_master` | 门店商品档案 |
| `ODS_TABLE_FEE_DISCOUNT` | `OdsTableDiscountTask` | `/Site/GetTaiFeeAdjustList` | `table_fee_discount_records` | 台费折扣/调账 |
| `ODS_TENANT_GOODS` | `OdsTenantGoodsTask` | `/TenantGoods/QueryTenantGoods` | `tenant_goods_master` | 租户商品档案 |
| `ODS_SETTLEMENT_TICKET` | `OdsSettlementTicketTask` | `/Order/GetOrderSettleTicketNew` | `settlement_ticket_details` | 结账小票详情 |
| `ODS_STAFF_INFO` | `OdsStaffInfoTask` | `/PersonnelManagement/SearchSystemStaffInfo` | `staff_info_master` | 员工档案(含在职/离职) |
> 所有目标表均位于 `ods` schema 下。
@@ -228,7 +228,7 @@ execute(cursor_data)
### content_hash 去重机制
`content_hash` 是通用 ODS 任务的核心去重手段,所有 23 个任务默认开启(`skip_unchanged=True`)。
`content_hash` 是通用 ODS 任务的核心去重手段,所有 22 个任务默认开启(`skip_unchanged=True`)。
#### 计算方式
@@ -295,8 +295,6 @@ ORDER BY id, fetched_at DESC;
| `ODS_STORE_GOODS` | 否 | `FULL_TABLE` | — | 门店商品档案 |
| `ODS_TABLE_FEE_DISCOUNT` | 否 | `WINDOW` | `create_time` | 台费折扣/调账 |
| `ODS_TENANT_GOODS` | 否 | `FULL_TABLE` | — | 租户商品档案 |
| `ODS_SETTLEMENT_TICKET` | 否 | `NONE` | — | 结账小票详情(专用实现,见下文) |
| `ODS_STAFF_INFO` | 否 | `FULL_TABLE` | — | 员工档案,全量快照 |
> 所有 23 个任务默认 `skip_unchanged=True`(去重开启)。
> **特殊任务**`ODS_SETTLEMENT_TICKET` 虽然在 `ODS_TASK_SPECS` 中声明,但其 `ODS_TASK_CLASSES` 条目被 `OdsSettlementTicketTask` 专用实现覆盖。该任务不走标准分页抓取流程,而是先从 `payment_transactions` 表或支付 API 收集 `orderSettleId`,再逐个调用小票接口获取详情。

View File

@@ -52,8 +52,11 @@ load()
| DDL 文件 | 创建的 Schema | 主要内容 |
|----------|--------------|----------|
| `database/schema_etl_admin.sql` | `meta` | `etl_task`(任务注册表)、`etl_cursor`(游标表)、`etl_run`(运行记录表) |
| `database/schema_ODS_doc.sql` | `ods` | 20+ 张 ODS 原始表member_profiles、settlement_records、payment_transactions 等) |
| meta DDL代码默认 `database/schema_etl_admin.sql` | `meta` | `etl_task`(任务注册表)、`etl_cursor`(游标表)、`etl_run`(运行记录表) |
| ODS DDL代码默认 `database/schema_ODS_doc.sql` | `ods` | 20+ 张 ODS 原始表member_profiles、settlement_records、payment_transactions 等) |
> 注:模块内 `database/` 目录下的旧 DDL 文件已不存在。INIT 任务通过配置参数 `schema.ods_file` / `schema.etl_admin_file` 指定 DDL 路径。
> 当前 DDL 基线统一维护在 `docs/database/ddl/`(如 `etl_feiqiu__ods.sql`、`etl_feiqiu__meta.sql`),使用时需通过配置参数指向正确路径。
### ODS DDL 清洗逻辑
@@ -75,8 +78,8 @@ ODS DDL 文件可能包含头部说明文本和 `COMMENT ON` 语句CamelCase
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `schema.ods_file` | `database/schema_ODS_doc.sql` | ODS DDL 文件路径 |
| `schema.etl_admin_file` | `database/schema_etl_admin.sql` | meta DDL 文件路径 |
| `schema.ods_file` | `database/schema_ODS_doc.sql`(⚠️ 旧路径,需配置为实际 DDL 位置) | ODS DDL 文件路径 |
| `schema.etl_admin_file` | `database/schema_etl_admin.sql`(⚠️ 旧路径) | meta DDL 文件路径 |
| `io.log_root` | — | 日志目录 |
| `io.export_root` | — | 导出目录 |
| `pipeline.fetch_root` | — | 抓取数据目录 |
@@ -115,7 +118,9 @@ load()
| DDL 文件 | 创建的 Schema | 主要内容 |
|----------|--------------|----------|
| `database/schema_dwd_doc.sql` | `dwd` | 维度表dim_*,含 SCD2 约束、事实表dwd_*、fact_*)、扩展表(*_ex |
| DWD DDL代码默认 `database/schema_dwd_doc.sql` | `dwd` | 维度表dim_*,含 SCD2 约束、事实表dwd_*、fact_*)、扩展表(*_ex |
> DDL 基线见 `docs/database/ddl/etl_feiqiu__dwd.sql`,使用时需通过 `schema.dwd_file` 配置参数指向正确路径。
DWD DDL 的特殊处理:
- 自动为含 `scd2_start_time` 列的表设置 SCD2 默认值(`scd2_start_time=now()``scd2_end_time='9999-12-31'``scd2_is_current=1``scd2_version=1`
@@ -126,7 +131,7 @@ DWD DDL 的特殊处理:
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `schema.dwd_file` | `database/schema_dwd_doc.sql` | DWD DDL 文件路径 |
| `schema.dwd_file` | `database/schema_dwd_doc.sql`(⚠️ 旧路径,需配置为实际 DDL 位置) | DWD DDL 文件路径 |
| `dwd.drop_schema_first` | `False` | 是否先 DROP 再重建(危险操作,会丢失所有 DWD 数据) |
### CLI 示例
@@ -166,7 +171,9 @@ load()
| DDL 文件 | 创建的 Schema | 主要内容 |
|----------|--------------|----------|
| `database/schema_dws.sql` | `dws` | 配置表5 张 cfg_*、助教域5 张、会员域2 张、财务域7 张、订单汇总1 张) |
| DWS DDL代码默认 `database/schema_dws.sql` | `dws` | 配置表5 张 cfg_*、助教域5 张、会员域2 张、财务域7 张、订单汇总1 张) |
> DDL 基线见 `docs/database/ddl/etl_feiqiu__dws.sql`,使用时需通过 `schema.dws_file` 配置参数指向正确路径。
DWS Schema 包含的配置表:
@@ -182,7 +189,7 @@ DWS Schema 包含的配置表:
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `schema.dws_file` | `database/schema_dws.sql` | DWS DDL 文件路径 |
| `schema.dws_file` | `database/schema_dws.sql`(⚠️ 旧路径,需配置为实际 DDL 位置) | DWS DDL 文件路径 |
| `dws.drop_schema_first` | `False` | 是否先 DROP 再重建(危险操作) |
### CLI 示例
@@ -231,7 +238,7 @@ load()
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `schema.seed_dws_file` | `database/seed_dws_config.sql` | 种子数据 SQL 文件路径 |
| `schema.seed_dws_file` | `database/seed_dws_config.sql`(⚠️ 旧路径,种子数据现位于 `db/etl_feiqiu/seeds/seed_dws_config.sql` | 种子数据 SQL 文件路径 |
### CLI 示例
@@ -290,7 +297,6 @@ execute()
| `platform_coupon_redemption_records` | `ods.platform_coupon_redemption_records` |
| `group_buy_redemption_records` | `ods.group_buy_redemption_records` |
| `group_buy_packages` | `ods.group_buy_packages` |
| `settlement_ticket_details` | `ods.settlement_ticket_details` |
| `store_goods_master` | `ods.store_goods_master` |
| `tenant_goods_master` | `ods.tenant_goods_master` |
| `store_goods_sales_records` | `ods.store_goods_sales_records` |

View File

@@ -51,15 +51,18 @@ uv sync --group test
在项目根目录创建 `.env` 文件(禁止提交到版本控制):
```dotenv
# 数据库连接
# 数据库连接(推荐使用 DSN 模式)
PG_DSN=postgresql://用户名:密码@主机:端口/数据库名
# 或分别指定
# 或分离式配置(不使用 DSN 时启用)
PG_HOST=localhost
PG_PORT=5432
PG_NAME=billiards
PG_NAME=your_database
PG_USER=your_user
PG_PASSWORD=your_password
# 业务库 DSN后端 / 跨模块脚本使用)
APP_DB_DSN=postgresql://用户名:密码@主机:端口/数据库名
# 门店与 API
STORE_ID=1
API_TOKEN=your_bearer_token
@@ -99,19 +102,22 @@ config/defaults.py → .env / 环境变量 → CLI 参数
初始化步骤:
```bash
# 1. 执行 DDL 创建表结构DDL 文件位于 db/etl_feiqiu/schemas/
psql "$PG_DSN" -f db/etl_feiqiu/schemas/schema_etl_admin.sql
psql "$PG_DSN" -f db/etl_feiqiu/schemas/schema_ODS_doc.sql
psql "$PG_DSN" -f db/etl_feiqiu/schemas/schema_dwd_doc.sql
psql "$PG_DSN" -f db/etl_feiqiu/schemas/schema_dws.sql
# 推荐使用 CLI 工具任务初始化DDL 基线见 docs/database/ddl/
python -m cli.main --tasks INIT_ODS_SCHEMA,INIT_DWD_SCHEMA,INIT_DWS_SCHEMA,SEED_DWS_CONFIG --pg-dsn "$PG_DSN"
# 2. 执行种子数据(如有
# 或手动执行 DDL从 docs/database/ddl/ 获取最新基线
psql "$PG_DSN" -f docs/database/ddl/etl_feiqiu__meta.sql
psql "$PG_DSN" -f docs/database/ddl/etl_feiqiu__ods.sql
psql "$PG_DSN" -f docs/database/ddl/etl_feiqiu__dwd.sql
psql "$PG_DSN" -f docs/database/ddl/etl_feiqiu__dws.sql
# 执行种子数据
psql "$PG_DSN" -f db/etl_feiqiu/seeds/seed_*.sql
# 3. 执行迁移脚本(按日期前缀顺序)
ls db/etl_feiqiu/migrations/*.sql | sort | xargs -I {} psql "$PG_DSN" -f {}
```
> 注:旧的 `db/etl_feiqiu/schemas/` 和 `db/etl_feiqiu/migrations/` 已归档至 `db/_archived/`。
> DDL 基线现由 `docs/database/ddl/` 统一管理,可通过 `python scripts/ops/gen_consolidated_ddl.py` 重新生成。
或使用 CLI 工具任务初始化:
```bash

View File

@@ -15,7 +15,7 @@
参考路径:
- DWD schema 文档:`docs/database/`
- DWS DDL`db/etl_feiqiu/schemas/`
- DWS DDL`docs/database/ddl/etl_feiqiu__dws.sql`
- DWS 种子数据:`db/etl_feiqiu/seeds/`
---
@@ -170,7 +170,7 @@ Top3 销冠奖2026-03-01 起):第 1 名 1000 元,第 2 名 600 元,
需求中明确 7/10/15/30/60/90 天窗口,在 `dws_assistant_customer_stats``dws_member_consumption_summary` 中直接落多窗口字段。
### 6.2 DDL 完整性
所有方案中列出的表需在 `db/etl_feiqiu/schemas/` 中落全 DDL。
所有方案中列出的表需在 `docs/database/ddl/etl_feiqiu__dws.sql` 中落全 DDL。
### 6.3 时间分层实现
UI 需要"最近半年不含本月、上季度"等时间维度并满足上个周期的环比。DWS 分层仅到 3 个月,可能需要额外聚合层。