主线 1: rns1-customer-coach-api + 04-miniapp-core-business 后端实施
- 新增 GET /xcx/coaches/{id}/banner 轻量接口
- performance/records 加 coach_id 参数 + view_board_coach 权限分流
- coach/customer/performance/board/task 服务层重构
- fdw_queries 结算单粒度聚合 + consumption_summary 视图统一
- task_generator 回访宽限 72h + UPSERT 替代策略 + Step 5 保底清理
- recall_detector settle_type=3 双重限制 + 门店级 resolved
主线 2: 小程序权限分流 + 新增 coach-service-records 管理者视角业绩明细页
- perf-progress 共享模块去重 task-list/coach-detail 动画逻辑
- isScattered 散客标记端到端
- foodDetail/phoneFull/creator* 字段透传
主线 3: P19 指数回测框架 Phase 1+2
- 3 个指数表 stat_date 日快照模式
- 新增 DWS_INDEX_BACKFILL / DWS_TASK_SIMULATION 工具任务
- task_engine 升级 HTTP 实时 + 推演回测双模式
主线 4: Core 维度层启用
- 新增 CORE_DIM_SYNC 任务(DWD → core 4 维度表)
- 修复 app 视图空查询问题
主线 5: member_project_tag 改为 LAST_30_VISITS 消费次数窗口
主线 6: 2 个迁移 SQL 已执行(stat_date + member_project_tag 新窗口)
- schema 基线与 DDL 快照同步
主线 7: 开发机路径迁移 C:\NeoZQYY → C:\Project\NeoZQYY(约 95% 改动量)
附带: 新建运维脚本(churned_customer_report / simulate_historical_tasks /
backfill_index_snapshots)+ tools/task-analysis/ 任务分析工具
合计 157 文件。未包含中间产物(tmp/ .playwright-mcp/ inspect-* excel/sheet 分析 txt)。
审计记录见下一个 commit。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
221 lines
9.0 KiB
Bash
221 lines
9.0 KiB
Bash
# ==============================================================================
|
||
# NeoZQYY ETL Connector(飞球)配置
|
||
# ==============================================================================
|
||
# ETL env_parser.py 从此文件加载
|
||
# 优先级:DEFAULTS < 此 .env < 环境变量 < CLI 参数
|
||
# 敏感值禁止提交;本文件已在 .gitignore 中排除
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 门店配置
|
||
# ------------------------------------------------------------------------------
|
||
STORE_ID=2790685415443269
|
||
TIMEZONE=Asia/Shanghai
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 数据库配置
|
||
# ------------------------------------------------------------------------------
|
||
# CHANGE 2026-02-15 | 默认指向测试库,生产环境切换为 etl_feiqiu
|
||
PG_DSN=postgresql://local-Python:Neo-local-1991125@100.64.0.4:5432/test_etl_feiqiu
|
||
PG_CONNECT_TIMEOUT=10
|
||
|
||
# 数据库 Schema
|
||
SCHEMA_OLTP=ods
|
||
SCHEMA_ETL=meta
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# API 配置(上游 SaaS API)
|
||
# ------------------------------------------------------------------------------
|
||
API_BASE=https://pc.ficoo.vip/apiprod/admin/v1/
|
||
API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGllbnQtdHlwZSI6IjQiLCJ1c2VyLXR5cGUiOiIxIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjoiMTIiLCJyb2xlLWlkIjoiMTIiLCJ0ZW5hbnQtaWQiOiIyNzkwNjgzMTYwNzA5OTU3Iiwibmlja25hbWUiOiLnp5_miLfnrqHnkIblkZjvvJrmganmgakxIiwic2l0ZS1pZCI6IjAiLCJtb2JpbGUiOiIxMzgxMDUwMjMwNCIsInNpZCI6IjI5NTA0ODk2NTgzOTU4NDUiLCJzdGFmZi1pZCI6IjMwMDk5MTg2OTE1NTkwNDUiLCJvcmctaWQiOiIwIiwicm9sZS10eXBlIjoiMyIsInJlZnJlc2hUb2tlbiI6IlJZNldUM2w1UUdLb2hiVnJnd3kzM3pZeVNUZjk3ZkNQS2xwSXNPa0RORTg9IiwicmVmcmVzaEV4cGlyeVRpbWUiOiIyMDI2LzQvMjQg5LiK5Y2IMToyMzo0OSIsIm5lZWRDaGVja1Rva2VuIjoiZmFsc2UiLCJleHAiOjE3NzY5NjUwMjksImlzcyI6InRlc3QiLCJhdWQiOiJVc2VyIn0.l1qPPgUy6Xq0XZprDhhuyZ1phL-zpzf-W7VHQy86DkA
|
||
API_TIMEOUT=20
|
||
API_PAGE_SIZE=200
|
||
API_RETRY_MAX=3
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 路径配置
|
||
# CHANGE 2026-02-19 | 统一迁移到 export/ETL-Connectors/feiqiu/ 下
|
||
# ------------------------------------------------------------------------------
|
||
EXPORT_ROOT=C:/Project/NeoZQYY/export/ETL-Connectors/feiqiu/JSON
|
||
LOG_ROOT=C:/Project/NeoZQYY/export/ETL-Connectors/feiqiu/LOGS
|
||
FETCH_ROOT=C:/Project/NeoZQYY/export/ETL-Connectors/feiqiu/JSON
|
||
WRITE_PRETTY_JSON=true
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 管线流程配置
|
||
# ------------------------------------------------------------------------------
|
||
PIPELINE_FLOW=FULL
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 管道限流配置(RateLimiter 请求间隔,秒)
|
||
# CHANGE 2026-03-06 | 从默认 5-20s 降至 0.1-2s,大幅缩短 ODS 请求耗时
|
||
# ------------------------------------------------------------------------------
|
||
PIPELINE_RATE_MIN=0.1
|
||
PIPELINE_RATE_MAX=2.0
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 时间窗口配置
|
||
# ------------------------------------------------------------------------------
|
||
OVERLAP_SECONDS=600
|
||
WINDOW_BUSY_MIN=30
|
||
WINDOW_IDLE_MIN=180
|
||
IDLE_START=04:00
|
||
IDLE_END=16:00
|
||
WINDOW_SPLIT_UNIT=day
|
||
WINDOW_SPLIT_DAYS=10
|
||
WINDOW_COMPENSATION_HOURS=2
|
||
ALLOW_EMPTY_RESULT_ADVANCE=true
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 快照配置
|
||
# ------------------------------------------------------------------------------
|
||
SNAPSHOT_MISSING_DELETE=true
|
||
SNAPSHOT_ALLOW_EMPTY_DELETE=false
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 数据完整性检查配置
|
||
# ------------------------------------------------------------------------------
|
||
INTEGRITY_MODE=history
|
||
INTEGRITY_HISTORY_START=2025-07-01
|
||
INTEGRITY_INCLUDE_DIMENSIONS=true
|
||
INTEGRITY_AUTO_CHECK=false
|
||
INTEGRITY_AUTO_BACKFILL=false
|
||
INTEGRITY_COMPARE_CONTENT=true
|
||
INTEGRITY_CONTENT_SAMPLE_LIMIT=50
|
||
INTEGRITY_BACKFILL_MISMATCH=true
|
||
INTEGRITY_RECHECK_AFTER_BACKFILL=true
|
||
|
||
# 指定 ODS 任务代码(逗号分隔,为空则全部)
|
||
# INTEGRITY_ODS_TASK_CODES=
|
||
|
||
# 是否强制按月切分(默认 true)
|
||
# INTEGRITY_FORCE_MONTHLY_SPLIT=true
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 校验配置
|
||
# ------------------------------------------------------------------------------
|
||
VERIFY_SKIP_ODS_ON_FETCH=true
|
||
VERIFY_ODS_LOCAL_JSON=true
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 数据库会话参数(defaults.py → db.session.*)
|
||
# ------------------------------------------------------------------------------
|
||
# 会话时区(默认跟随 TIMEZONE)
|
||
# DB_SESSION_TIMEZONE=Asia/Shanghai
|
||
|
||
# SQL 语句超时(毫秒,默认 30000)
|
||
# DB_STATEMENT_TIMEOUT_MS=30000
|
||
|
||
# 锁等待超时(毫秒,默认 5000)
|
||
# DB_LOCK_TIMEOUT_MS=5000
|
||
|
||
# 事务空闲超时(毫秒,默认 600000 = 10 分钟)
|
||
# DB_IDLE_IN_TX_TIMEOUT_MS=600000
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 清洗配置(defaults.py → clean.*)
|
||
# ------------------------------------------------------------------------------
|
||
# 是否记录未知字段(默认 true)
|
||
# CLEAN_LOG_UNKNOWN_FIELDS=true
|
||
|
||
# 未知字段日志上限(默认 50)
|
||
# CLEAN_UNKNOWN_FIELDS_LIMIT=50
|
||
|
||
# 哈希算法(默认 sha1)
|
||
# CLEAN_HASH_ALGO=sha1
|
||
|
||
# 哈希盐值(默认空)
|
||
# CLEAN_HASH_SALT=
|
||
|
||
# 严格数值校验(默认 true)
|
||
# CLEAN_STRICT_NUMERIC=true
|
||
|
||
# 金额舍入精度(默认 2 位小数)
|
||
# CLEAN_ROUND_MONEY_SCALE=2
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 安全配置(defaults.py → security.*)
|
||
# ------------------------------------------------------------------------------
|
||
# 日志中是否脱敏(默认 true)
|
||
# SECURITY_REDACT_IN_LOGS=true
|
||
|
||
# 需脱敏的键名(JSON 数组,默认 ["token","password","Authorization"])
|
||
# SECURITY_REDACT_KEYS=["token","password","Authorization"]
|
||
|
||
# 日志中是否回显 token(默认 false,调试用)
|
||
# SECURITY_ECHO_TOKEN_IN_LOGS=false
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# IO 文件大小限制(defaults.py → io.max_file_bytes)
|
||
# ------------------------------------------------------------------------------
|
||
# 单文件最大字节数(默认 50MB = 52428800)
|
||
# MAX_FILE_BYTES=52428800
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# DWD 层配置
|
||
# ------------------------------------------------------------------------------
|
||
DWD_FACT_UPSERT=true
|
||
|
||
# 事实表 UPSERT 批量大小(默认 1000)
|
||
# DWD_FACT_UPSERT_BATCH_SIZE=1000
|
||
|
||
# 最小批量大小(锁冲突时自动缩小,默认 100)
|
||
# DWD_FACT_UPSERT_MIN_BATCH_SIZE=100
|
||
|
||
# 最大重试次数(默认 2)
|
||
# DWD_FACT_UPSERT_MAX_RETRIES=2
|
||
|
||
# 重试退避时间(JSON 数组,秒,默认 [1,2,4])
|
||
# DWD_FACT_UPSERT_RETRY_BACKOFF=[1,2,4]
|
||
|
||
# 事实表 backfill 锁等待超时(毫秒,为空则沿用 DB_LOCK_TIMEOUT_MS)
|
||
# DWD_FACT_UPSERT_LOCK_TIMEOUT_MS=
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 任务列表配置
|
||
# ------------------------------------------------------------------------------
|
||
RUN_TASKS=PRODUCTS,TABLES,MEMBERS,ASSISTANTS,PACKAGES_DEF,ORDERS,PAYMENTS,REFUNDS,COUPON_USAGE,INVENTORY_CHANGE,TOPUPS,TABLE_DISCOUNT,LEDGER
|
||
INDEX_LOOKBACK_DAYS=90
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# DWS 月度/薪资配置(defaults.py → dws.*)
|
||
# ------------------------------------------------------------------------------
|
||
# 是否允许历史月度重算(默认 false)
|
||
# DWS_MONTHLY_ALLOW_HISTORY=false
|
||
|
||
# 上月宽限天数(默认 5,即次月 1-5 号仍可计算上月)
|
||
# DWS_MONTHLY_PREV_GRACE_DAYS=5
|
||
|
||
# 历史月份数(默认 0,即不回溯)
|
||
# DWS_MONTHLY_HISTORY_MONTHS=0
|
||
|
||
# 新人封顶生效日期(默认 2026-03-01)
|
||
# DWS_MONTHLY_NEW_HIRE_CAP_EFFECTIVE_FROM=2026-03-01
|
||
|
||
# 新人封顶天数(默认 25)
|
||
# DWS_MONTHLY_NEW_HIRE_CAP_DAY=25
|
||
|
||
# 新人最高等级(默认 2)
|
||
# DWS_MONTHLY_NEW_HIRE_MAX_TIER_LEVEL=2
|
||
|
||
# 薪资计算运行天数(默认 5)
|
||
# DWS_SALARY_RUN_DAYS=5
|
||
|
||
# 是否允许非周期内运行(默认 false)
|
||
# DWS_SALARY_ALLOW_OUT_OF_CYCLE=false
|
||
|
||
# 包房课单价(默认 138)
|
||
# DWS_SALARY_ROOM_COURSE_PRICE=138
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# 运行模式(defaults.py → run.data_source)
|
||
# ------------------------------------------------------------------------------
|
||
# 数据源模式:hybrid(默认,API+本地)、online(仅 API)、offline(仅本地)
|
||
# 也可通过 PIPELINE_FLOW 间接设置(FULL→hybrid, FETCH_ONLY→online, INGEST_ONLY→offline)
|
||
# DATA_SOURCE=hybrid
|
||
|
||
# ------------------------------------------------------------------------------
|
||
# API 额外请求头(defaults.py → api.headers_extra)
|
||
# ------------------------------------------------------------------------------
|
||
# JSON 对象格式,默认空
|
||
# API_HEADERS_EXTRA={}
|