Files
Neo-ZQYY/docs/specs/01-miniapp-db-foundation/tasks.md
Neo 2a7a5d68aa feat: 2026-04-15~04-20 累积变更基线 — 多主线合流
主线 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>
2026-04-20 06:32:07 +08:00

6.4 KiB
Raw Blame History

实现计划小程序数据库基础设施层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

      • 创建 app SchemaCREATE 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_indexdws_assistant_order_contribution
      • 授予 app_readerapp Schema 的 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 过滤
      • 遍历 app Schema 所有视图,查询 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

      • 创建 auth SchemaCREATE SCHEMA IF NOT EXISTS auth
      • 创建 biz SchemaCREATE SCHEMA IF NOT EXISTS biz
      • 授予 app_userauth/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_serverhost/dbname/port 使用占位符 '***',按环境替换)
      • 创建 app_userapp_reader 用户映射
      • 创建 fdw_etl Schema
      • 执行 IMPORT FOREIGN SCHEMA app FROM SERVER etl_feiqiu_server INTO fdw_etl
      • 授予 app_userfdw_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 库 app Schema 所有视图,验证 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_DSNAPP_DB_DSN,缺失时 RuntimeError 终止
      • 检查业务库中 authbiz Schema 存在性
      • 检查 ETL 库中 app Schema 及所有 RLS 视图存在性(对照设计文档中的 35 张视图清单)
      • 检查业务库中 fdw_etl Schema 及所有外部表存在性
      • 对每张外部表执行 SELECT count(*) 验证可查询性
      • 设置 app.current_site_id 后验证 RLS 视图过滤正确性
      • 验证 app_userapp_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均使用占位符按环境替换