走查发现 manager(店长)进入小程序"任务"tab 收到 403 "权限不足"。
根因不在 require_permission(权限校验通过,missing=set()),而在
task_manager._get_assistant_id() 因 user_assistant_binding 无有效绑定
抛 403 "权限不足"(detail 与权限错误同名,误导走查方向)。
设计层冲突:task-list 是助教个人工作台业务概念,manager 没有"我自己
的任务"业务场景,监督需求由 board-coach 等汇总看板覆盖。
Neo 决策(2026-05-05):
> "任务的 tab 只有助教身份的用户可以进入并查看,让管理身份的用户
> 进入没有意义。因为他们使用业务场景中不存在任务方面的场景。"
→ 选 B 方案:权限矩阵层移除 manager 的 view_tasks。
变更:
- db/zqyy_app/migrations/20260505__remove_manager_view_tasks.sql
DELETE FROM auth.role_permissions WHERE role_id=manager AND permission_id=view_tasks
- docs/database/changes/2026-05-05__remove_manager_view_tasks.md
完整变更说明 + 兼容性 + 4 条校验 SQL + 幂等回滚
测试库执行 + 4 条校验全 PASS:
- manager 改前 5 项权限,改后 4 项(view_board* 保留)
- view_tasks 现绑定到 [coach, head_coach](manager 已剥离)
- coach / head_coach 助教工作台不受影响
- 典型 manager 用户 Neo (8778) 实际权限不再含 view_tasks
双口径走查(weixin-devtools-mcp):
- 4a live: relaunch 后 visibleTabs 从 [task, board, my] → [board, my]
小程序 tabBar"任务"tab 自动隐藏(getVisibleTabs 基于权限自动重算)
- 强制调 GET /api/xcx/tasks 仍 403,但根因从 _get_assistant_id 错位
转为 require_permission 正确拦截,语义清晰
不改的部分:
- task_manager._get_assistant_id() 不动(仍用于 coach/head_coach)
- require_permission("view_tasks") 路由保护不动(仍合理)
- 前端 auth-guard.ts 不改(getVisibleTabs 已基于 permissions 自动)
正式库同步说明:
- 本次仅在测试库执行,生产环境同步时 psql 执行 migration + 跑校验 SQL
审计:
- docs/audit/changes/2026-05-05__wave1_f1_5b_be1_task_list_403_root_cause.md
含完整证据链 + 三方案 ABC 业务影响对比 + B 实施记录
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
db/ — 数据库资产目录
当前状态(2026-04-06 更新)
项目 v1,DDL 不存在迭代更新。完整 schema 定义在 schemas/ 目录(按 schema 分文件,从测试库导出)。
同一份 DDL 也保留在 docs/database/ddl/(文档视角)。
目录结构
db/
├── etl_feiqiu/
│ ├── schemas/ — 六层完整 DDL(meta/ods/dwd/core/dws/app)
│ ├── migrations/ — 未来增量迁移(v1 已全部归档)
│ ├── ods/ — ODS 补充脚本
│ └── scripts/
│ └── create_test_db.sql
├── zqyy_app/
│ ├── schemas/ — 三层完整 DDL(public/auth/biz)
│ ├── migrations/ — 未来增量迁移(v1 已全部归档)
│ └── scripts/
│ └── create_test_db.sql
├── fdw/ — FDW 跨库映射配置
│ ├── setup_fdw.sql — 正向(zqyy_app → etl_feiqiu.app)
│ ├── setup_fdw_test.sql — 正向(测试环境)
│ ├── setup_fdw_reverse.sql — 反向(etl_feiqiu → zqyy_app.member_retention_clue)
│ └── setup_fdw_reverse_test.sql — 反向(测试环境)
└── _archived/ — 归档
├── ddl_baseline_2026-02-22/ — 旧基线
└── migrations_v1_merged/ — v1 全部迁移(39 个,已合并进 schemas/)
├── etl_feiqiu/ — 11 个迁移
└── zqyy_app/ — 28 个迁移
Schema 文件
db/etl_feiqiu/schemas/ 和 db/zqyy_app/schemas/ 是权威的完整 DDL,包含建表、索引、约束、种子数据。
| 文件 | 数据库 | Schema | 对象数 |
|---|---|---|---|
etl_feiqiu/schemas/meta.sql |
etl_feiqiu | meta | 3 表 |
etl_feiqiu/schemas/ods.sql |
etl_feiqiu | ods | 23 表 |
etl_feiqiu/schemas/dwd.sql |
etl_feiqiu | dwd | 42 表 |
etl_feiqiu/schemas/core.sql |
etl_feiqiu | core | 7 表(跨平台统一维度层,由 CORE_DIM_SYNC 任务从 DWD 同步) |
etl_feiqiu/schemas/dws.sql |
etl_feiqiu | dws | 38 表 |
etl_feiqiu/schemas/app.sql |
etl_feiqiu | app | 仅视图 |
zqyy_app/schemas/public.sql |
zqyy_app | public | 12 表 |
zqyy_app/schemas/auth.sql |
zqyy_app | auth | 9 表 |
zqyy_app/schemas/biz.sql |
zqyy_app | biz | 21 表 |
重新生成:PYTHONUTF8=1 python tools/db/gen_consolidated_ddl.py
迁移管理
v1 阶段的 39 个迁移已全部合并进 schemas/ 完整 DDL,原文件归档在 _archived/migrations_v1_merged/。
后续新增迁移放 migrations/,文件名格式 YYYY-MM-DD__描述.sql。
执行后重新运行 DDL 生成脚本刷新 schemas/ 基线。
文档分工
| 位置 | 管辖范围 |
|---|---|
docs/database/ |
业务库(zqyy_app) BD_Manual + 跨模块(FDW/RLS) + DDL 基线副本 |
apps/etl/connectors/feiqiu/docs/database/ |
ETL 专属(ODS/DWD/DWS 表级文档) |
db/(本目录) |
权威 DDL + 运行时资产(迁移/FDW/建库脚本) |
tools/db/ |
数据库工具(DDL 生成/验证/一致性检查) |