主线 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>
6.4 KiB
6.4 KiB
实现计划:小程序数据库基础设施层(miniapp-db-foundation)
概述
按照"ETL 库先行 → 业务库跟进 → FDW 桥接 → 验证收尾"的顺序,将设计拆分为可增量执行的编码任务。每个迁移脚本使用幂等语法,所有连接参数通过环境变量驱动。
任务
-
1. ETL 库:创建 app Schema 与 RLS 视图
-
1.1 编写迁移脚本
db/etl_feiqiu/migrations/YYYY-MM-DD__p1_create_app_schema_rls_views.sql- 创建
appSchema(CREATE SCHEMA IF NOT EXISTS app) - 创建
app_reader角色(条件创建,DO $$ ... IF NOT EXISTS ... END $$) - 为 11 张 DWD 表创建 RLS 视图(
CREATE OR REPLACE VIEW app.v_<表名> AS SELECT * FROM dwd.<表名> WHERE site_id = current_setting('app.current_site_id')::bigint) - 为 24 张 DWS 表创建 RLS 视图(同上模式;
cfg_*配置表若无site_id列则直接SELECT *不加过滤) - 在脚本末尾以注释形式预留 P2 待建表位置(
dws_member_spending_power_index、dws_assistant_order_contribution) - 授予
app_reader对appSchema 的 USAGE + SELECT 权限 + ALTER DEFAULT PRIVILEGES - 包含回滚语句(注释形式)
- Requirements: 2.1, 2.2, 2.3, 2.4, 2.7, 2.8, 4.1, 4.3, 4.4, 4.5, 4.6
- 创建
-
1.2 编写属性测试:RLS 视图定义包含 site_id 过滤
- Property 3: RLS 视图定义包含 site_id 过滤
- 遍历
appSchema 所有视图,查询pg_views.definition,验证含site_id列的源表对应视图包含current_setting过滤条件 - Validates: Requirements 2.4
-
1.3 编写属性测试:未设置 site_id 时 RLS 视图拒绝访问
- Property 5: 未设置 site_id 时 RLS 视图拒绝访问
- 遍历所有含
site_id过滤的 RLS 视图,在新会话(未设置app.current_site_id)中执行SELECT,验证抛出错误 - Validates: Requirements 2.6
-
-
2. 业务库:创建 auth/biz Schema 与权限
-
2.1 编写迁移脚本
db/zqyy_app/migrations/YYYY-MM-DD__p1_create_auth_biz_schemas.sql- 创建
authSchema(CREATE SCHEMA IF NOT EXISTS auth) - 创建
bizSchema(CREATE SCHEMA IF NOT EXISTS biz) - 授予
app_user对auth/biz的 USAGE + CRUD 权限 - 设置 ALTER DEFAULT PRIVILEGES 自动授权未来新表
- 包含回滚语句(注释形式)
- Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 4.2, 4.3, 4.4, 4.5, 4.6
- 创建
-
2.2 编写属性测试:默认权限自动授予
- Property 1: 默认权限自动授予
- 使用 hypothesis 生成随机合法表名,在
auth/biz中创建临时表,验证app_user自动获得 SELECT/INSERT/UPDATE/DELETE 权限,测试后清理 - Validates: Requirements 1.5
-
-
3. 业务库:配置 FDW 跨库映射
-
3.1 编写迁移脚本
db/zqyy_app/migrations/YYYY-MM-DD__p1_setup_fdw_etl.sql- 安装
postgres_fdw扩展 - 创建外部服务器
etl_feiqiu_server(host/dbname/port 使用占位符'***',按环境替换) - 创建
app_user→app_reader用户映射 - 创建
fdw_etlSchema - 执行
IMPORT FOREIGN SCHEMA app FROM SERVER etl_feiqiu_server INTO fdw_etl - 授予
app_user对fdw_etl的 USAGE + SELECT 权限 + ALTER DEFAULT PRIVILEGES - 包含回滚语句(注释形式)
- Requirements: 3.1, 3.2, 3.3, 3.4, 3.7, 4.2, 4.3, 4.4, 4.5, 4.6
- 安装
-
3.2 编写属性测试:FDW 外部表完整性与数据一致性
- Property 6: FDW 外部表完整性与数据一致性
- 遍历 ETL 库
appSchema 所有视图,验证fdw_etl中存在对应外部表且可查询;在相同site_id下对比数据一致性 - Validates: Requirements 3.4, 3.5, 3.6
-
-
4. Checkpoint — 迁移脚本验证
- 确保三个迁移脚本均可在测试环境中成功执行(按顺序:ETL 库 → 业务库 Schema → 业务库 FDW)
- 验证重复执行不报错(幂等性)
- 如有问题请告知用户
-
5. 编写端到端验证脚本
-
5.1 创建
scripts/ops/validate_p1_db_foundation.py- 通过
load_dotenv()加载根.env,读取PG_DSN和APP_DB_DSN,缺失时RuntimeError终止 - 检查业务库中
auth、bizSchema 存在性 - 检查 ETL 库中
appSchema 及所有 RLS 视图存在性(对照设计文档中的 35 张视图清单) - 检查业务库中
fdw_etlSchema 及所有外部表存在性 - 对每张外部表执行
SELECT count(*)验证可查询性 - 设置
app.current_site_id后验证 RLS 视图过滤正确性 - 验证
app_user和app_reader角色权限配置 - 输出结构化验证结果(通过/失败/跳过),失败项附带错误信息
- Requirements: 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8
- 通过
-
5.2 编写属性测试:RLS 过滤正确性
- Property 4: RLS 过滤正确性
- 使用 hypothesis 生成随机
site_id,设置app.current_site_id后查询含site_id的 RLS 视图,验证返回结果中所有行的site_id等于设置值 - Validates: Requirements 2.5
-
5.3 编写属性测试:环境变量缺失报错
- Property 9: 环境变量缺失时验证脚本报错
- 使用 hypothesis 生成
PG_DSN/APP_DB_DSN的缺失组合,验证脚本抛出RuntimeError - Validates: Requirements 5.8
-
5.4 编写属性测试:迁移脚本结构合规性
- Property 7: 迁移脚本结构合规性
- 遍历本次新增的迁移脚本文件,验证文件名匹配
YYYY-MM-DD__*.sql模式,且内容包含回滚语句注释 - Validates: Requirements 4.3, 4.4
-
5.5 编写属性测试:迁移脚本幂等性
- Property 8: 迁移脚本幂等性
- 对每个迁移脚本连续执行两次,验证第二次执行无错误
- Validates: Requirements 4.5
-
-
6. Final checkpoint — 全量验证
- 运行验证脚本
python scripts/ops/validate_p1_db_foundation.py,确认所有检查项通过 - 运行属性测试
cd C:\Project\NeoZQYY && pytest tests/ -v -k p1,确认所有属性测试通过 - 如有问题请告知用户
- 运行验证脚本
说明
- 标记
*的子任务为可选,可跳过以加速 MVP - 每个任务引用具体的需求编号,确保可追溯
- Checkpoint 确保增量验证
- 属性测试使用 Python hypothesis 框架,测试文件放在根目录
tests/下 - 迁移脚本中的数据库连接参数(host/dbname/port/password)均使用占位符,按环境替换