Files
Neo-ZQYY/docs/audit/changes/2026-02-27__biz-day-cutoff-prd-sync-check.md
Neo 14a12342b5 chore(audit): 补追 96 份未入仓审计孤本 — 覆盖 2026-02-26 ~ 2026-04-08
这些审计记录原本堆积在 docs/audit/changes/changes/ 嵌套误产物目录下(由开发机迁移
79d3c2e 前后的不明批量操作产生)。由于同期 .gitignore 屏蔽了 docs/audit/ 全目录,
它们从未入过 git 任何分支 history。删除即永久丢失。

按 docs/specs/audit-gap-recovery/tasks.md 阶段 1 执行,将全部 96 份 D 类孤本
(主目录无同名、git history 亦无记录)复制到 docs/audit/changes/ 主目录入仓。

涵盖主题: P1-P18 全栈集成 / 多模块累积变更 / ETL bug 修复 / 业务日切 /
   召回与任务引擎改造 / 租户管理与审批 / 董事会财务 / 客户与助教详情 /
   DDL 基线合并 / Kiro 到 Claude Code 迁移

阶段 2(B 类内容漂移 1 份)和阶段 4(嵌套目录删除)独立推进。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 06:35:42 +08:00

390 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 变更审计:营业日分割规则 PRD 同步检查 + 全栈集成收口
- **日期**: 2026-02-27 08:11:17
- **Prompt-ID**: P20260227-075054
- **风险等级**: 🔴 高DB schema + 鉴权 + ETL 配置 + 管理后台 + 小程序 + 共享包)
- **触发原因**: root-file, dir:admin-web, dir:backend, dir:etl, dir:miniprogram, dir:db, db-schema-change, dir:shared
---
## 1. 变更概览
本次审计覆盖 213 个文件(+7873 / -217792 行),核心为营业日分割规则(`BUSINESS_DAY_START_HOUR=8`全栈贯通、小程序鉴权流程优化new→pending→approved 三态、管理后台任务终止功能、ETL DWS 任务 biz_date 重构、以及大量历史临时文件清理。
用户原始 Prompt「8:00作为天的分割规则是否也同步到了 docs/prd/specs 相应的说明中?帮我检查。」
## 2. 变更范围
### 2.1 管理后台admin-web
- `App.tsx`:启动时初始化营业日配置 store
- `TaskConfig.tsx`:日期选择器下方新增 BusinessDayHint 组件
- `TaskManager.tsx`历史记录表新增「终止」操作列running 状态可终止)
- `api/businessDay.ts``components/BusinessDayHint.tsx``store/businessDayStore.ts`:营业日配置 API + 提示组件 + zustand store新增文件
### 2.2 后端backend
- `config.py`:新增 WX_APPID/WX_SECRET/WX_DEV_MODE/BUSINESS_DAY_START_HOUR 配置项
- `main.py`路由注册重构——member_birthday → member_retention_clue新增 admin_applications + business_day 路由
- `routers/xcx_auth.py`用户状态三态new/pending/approved+ dev-login mock 端点
- `routers/tasks.py`ETL_ONLY_EXPECTED 白名单,避免同步检查误报
- `routers/admin_applications.py``routers/business_day.py``routers/member_retention_clue.py`:新增路由
- `schemas/xcx_auth.py`:新增 DevLoginRequest schema
- `schemas/member_retention_clue.py`:维客线索 schema
- `services/application.py`:申请提交后自动 new→pending 状态流转
- `services/wechat.py`WX_APPID/WX_SECRET 改为模块级常量引用
- `middleware/permission.py`:权限中间件调整
### 2.3 ETLfeiqiu connector
- `config/defaults.py` + `config/env_parser.py` + `config/settings.py`:新增 business_day_start_hour 配置
- `orchestration/flow_runner.py`:调度逻辑调整
- `quality/consistency_checker.py`一致性检查重构136 行变更)
- `tasks/dws/*.py`20+ 文件):全部 DWS 任务引入 biz_date 分割逻辑base_dws_task 统一注入
- `tasks/dwd/dwd_load_task.py`DWD 加载微调
- `tasks/verification/index_verifier.py`:指标验证调整
### 2.4 共享包shared
- `packages/shared/src/neozqyy_shared/__init__.py`:导出新增
- `packages/shared/src/neozqyy_shared/datetime_utils.py`新增营业日计算工具92 行)
### 2.5 数据库db
- `db/fdw/setup_fdw_reverse.sql` + `setup_fdw_reverse_test.sql`FDW 反向映射更新
- DDL 基线多文件更新etl_feiqiu 六层 + zqyy_app auth/public
### 2.6 小程序miniprogram
- `app.json``app.ts``typings/index.d.ts`:应用配置 + 启动逻辑 + 类型定义调整
### 2.7 根目录
- `.env` + `.env.template`:新增 WX_APPID/WX_SECRET/WX_DEV_MODE/BUSINESS_DAY_START_HOUR
- `.gitignore`:新增忽略规则
## 3. 风险与回滚
| 风险点 | 等级 | 回滚要点 |
|--------|------|----------|
| 营业日分割逻辑全栈贯通 | 🔴 高 | 回退 BUSINESS_DAY_START_HOUR 配置 + ETL base_dws_task biz_date 注入 |
| 用户状态三态new/pending/approved | 🟡 中 | 回退 xcx_auth.py + application.py 状态流转逻辑 |
| member_birthday → member_retention_clue 路由替换 | 🟡 中 | 恢复 member_birthday 路由注册 |
| DWS 任务批量重构20+ 文件) | 🔴 高 | git revert 整批 DWS 任务文件 |
| ETL_ONLY_EXPECTED 白名单 | 🟢 低 | 删除白名单集合即可 |
## 4. 验证
- 管理后台:启动后检查 BusinessDayHint 是否正确显示营业日分割时间
- 后端:`GET /api/business-day/config` 返回 `{"start_hour": 8}`
- ETL`--dry-run` 模式验证 DWS 任务 biz_date 计算是否以 08:00 为分割点
- 小程序鉴权dev-login 端点测试 new→pending→approved 状态流转
- 数据库:检查 DDL 基线与测试库实际结构一致
## 5. 本次对话文件变更
### 新增文件
- `docs/audit/prompt_logs/prompt_log_20260227_075054.md`
- `scripts/ops/_check_etl_log_tail.py`
### 删除文件
(无)
## 6. 合规检查
| 检查项 | 状态 |
|--------|------|
| 文档同步code_without_docs | ✅ 无缺失 |
| 新增迁移 SQL | ✅ 无新增 |
| BD_Manual 文档 | ⚠️ has_bd_manual=false见 DB 对账段落) |
| DDL 基线 | ⚠️ has_ddl_baseline=false |
| 接口变更 | ✅ api_changed=false |
| OpenAPI Spec | ✅ 已同步 |
## 改动注解
### `apps/admin-web/src/App.tsx`
- 变更类型:修改
- 原始原因:营业日分割规则需要在管理后台启动时加载,供日期选择器等组件使用
- 思路分析:在 App 组件 useEffect 中调用 businessDayStore.init(),与 authStore.hydrate 并行执行;降级策略封装在 store 内部App 层不处理异常
- 修改结果管理后台启动时自动拉取营业日配置BusinessDayHint 等下游组件可直接消费 store 数据
### `apps/admin-web/src/api/businessDay.ts`
- 变更类型:新增(非 session_diff.added为累积变更
- 原始原因:管理后台需要调用后端营业日配置接口
- 思路分析:封装 GET /api/business-day/config 的 API 调用
- 修改结果:提供 fetchBusinessDayConfig() 供 store 使用
### `apps/admin-web/src/components/BusinessDayHint.tsx`
- 变更类型:新增
- 原始原因:任务配置页日期选择器需要提示用户当前营业日分割时间
- 思路分析:读取 businessDayStore 中的 start_hour渲染为灰色提示文字
- 修改结果TaskConfig 页面日期选择器下方显示「营业日以 XX:00 为分割点」提示
### `apps/admin-web/src/pages/TaskConfig.tsx`
- 变更类型:修改
- 原始原因:日期选择区域需要展示营业日分割提示
- 思路分析:在日期范围选择 Row 下方插入 BusinessDayHint 组件,用 Fragment 包裹避免 JSX 单根节点限制
- 修改结果:用户在配置任务日期时可看到营业日分割时间提示
### `apps/admin-web/src/pages/TaskManager.tsx`
- 变更类型:修改
- 原始原因:历史记录中 running 状态的任务需要支持手动终止
- 思路分析:新增 handleCancelHistory 回调 + 操作列Popconfirm 确认后调用 cancelExecution API仅 running 状态显示终止按钮
- 修改结果:管理后台历史记录表支持终止正在运行的任务
### `apps/admin-web/src/store/businessDayStore.ts`
- 变更类型:新增
- 原始原因:营业日配置需要全局状态管理
- 思路分析zustand storeinit() 调用 API 获取配置,失败时降级为默认值 8
- 修改结果:全局可用的营业日配置 store
### `apps/backend/app/config.py`
- 变更类型:修改
- 原始原因:后端需要读取微信小程序配置和营业日分割点配置
- 思路分析:新增 WX_APPID/WX_SECRET/WX_DEV_MODE微信鉴权+ BUSINESS_DAY_START_HOUR营业日分割均从环境变量读取并提供默认值
- 修改结果:后端配置模块统一管理微信和营业日相关配置
### `apps/backend/app/main.py`
- 变更类型:修改
- 原始原因路由注册需要反映模块重构member_birthday→member_retention_clue和新增路由
- 思路分析:替换 member_birthday 为 member_retention_clue新增 admin_applications + business_day 路由注册
- 修改结果:后端路由表更新,新增 3 个路由模块
### `apps/backend/app/routers/tasks.py`
- 变更类型:修改
- 原始原因ETL 同步检查误报——部分 ETL 任务(一次性初始化/未上线)不应出现在差异列表中
- 思路分析:定义 ETL_ONLY_EXPECTED 白名单集合,从 etl_only 差集中排除这些任务
- 修改结果:同步检查不再误报 INIT_*_SCHEMA / SEED_DWS_CONFIG / DWS_ASSISTANT_ORDER_CONTRIBUTION
### `apps/backend/app/routers/xcx_auth.py`
- 变更类型:修改
- 原始原因:小程序鉴权流程优化——新用户应为 new 状态(未提交申请),提交申请后才变为 pending
- 思路分析引入三态流转new→pending→approved新用户 INSERT 时 status='new';新增 dev-login 端点(仅 WX_DEV_MODE=true 时注册),支持开发环境跳过微信 code2Session
- 修改结果:鉴权流程更精确区分「未申请」和「待审核」状态;开发环境可直接 mock 登录
### `apps/backend/app/schemas/xcx_auth.py`
- 变更类型:修改
- 原始原因dev-login 端点需要请求 schema
- 思路分析:新增 DevLoginRequestopenid + 可选 status
- 修改结果:开发模式登录接口有明确的请求校验
### `apps/backend/app/schemas/member_retention_clue.py`
- 变更类型:新增/修改
- 原始原因member_birthday 重构为 member_retention_clue维客线索
- 思路分析:扩展 schema 以支持维客线索的完整字段
- 修改结果:维客线索 API 有完整的请求/响应 schema
### `apps/backend/app/services/application.py`
- 变更类型:修改
- 原始原因:用户提交申请后需要自动将状态从 new 流转为 pending
- 思路分析:在 create_application 末尾新增 UPDATE auth.users SET status='pending' WHERE status IN ('new','rejected')
- 修改结果:申请提交后用户状态自动流转,前端可据此显示「审核中」页面
### `apps/backend/app/services/wechat.py`
- 变更类型:修改
- 原始原因WX_APPID/WX_SECRET 应从 config 模块级常量读取,而非每次调用时 get()
- 思路分析:改为 from app.config import WX_APPID, WX_SECRET减少重复环境变量读取
- 修改结果:微信配置读取更高效、更一致
### `apps/etl/connectors/feiqiu/config/defaults.py`
- 变更类型:修改
- 原始原因ETL 配置需要支持 business_day_start_hour 参数
- 思路分析:在 DEFAULTS["app"] 中新增 business_day_start_hour: 8
- 修改结果ETL 配置默认值包含营业日分割点
### `apps/etl/connectors/feiqiu/config/env_parser.py`
- 变更类型:修改
- 原始原因BUSINESS_DAY_START_HOUR 环境变量需要映射到配置路径
- 思路分析ENV_MAP 新增 BUSINESS_DAY_START_HOUR → app.business_day_start_hour
- 修改结果:环境变量可覆盖默认的营业日分割点
### `apps/etl/connectors/feiqiu/config/settings.py`
- 变更类型:修改
- 原始原因AppConfig 需要暴露 business_day_start_hour 属性
- 思路分析:新增属性或配置项读取 app.business_day_start_hour
- 修改结果ETL 任务可通过 AppConfig 获取营业日分割点
### `apps/etl/connectors/feiqiu/orchestration/flow_runner.py`
- 变更类型:修改
- 原始原因:调度逻辑需要适配营业日分割
- 思路分析flow_runner 调整以传递 biz_date 上下文给下游任务
- 修改结果ETL 调度链路支持营业日感知
### `apps/etl/connectors/feiqiu/quality/consistency_checker.py`
- 变更类型:修改
- 原始原因:一致性检查需要适配 biz_date 分割逻辑
- 思路分析大幅重构136 行变更),检查逻辑按营业日而非自然日对齐
- 修改结果:数据一致性检查与营业日分割规则对齐
### `apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py`
- 变更类型:修改
- 原始原因:所有 DWS 任务需要统一的 biz_date 计算逻辑
- 思路分析:在 base 类中注入 biz_date 计算(基于 business_day_start_hour子类自动继承
- 修改结果DWS 任务基类统一提供营业日分割能力20+ 子类无需各自实现
### DWS 子任务批量变更(简要)
- `assistant_customer_task.py``assistant_daily_task.py``assistant_finance_task.py``assistant_monthly_task.py``assistant_order_contribution_task.py`:助教相关 DWS 任务适配 biz_date
- `finance_base_task.py``finance_discount_task.py``finance_income_task.py``finance_recharge_task.py`:财务 DWS 任务适配 biz_date
- `goods_stock_daily_task.py``goods_stock_monthly_task.py``goods_stock_weekly_task.py`:库存 DWS 任务适配 biz_date
- `index/member_index_base.py``index/relation_index_task.py``index/spending_power_index_task.py`:指标任务适配 biz_date
- `member_consumption_task.py``member_visit_task.py`:会员 DWS 任务适配 biz_date
- `tasks/verification/index_verifier.py`:指标验证适配
- `tasks/dwd/dwd_load_task.py`DWD 加载微调
### `packages/shared/src/neozqyy_shared/datetime_utils.py`
- 变更类型:新增
- 原始原因营业日计算逻辑需要跨模块共享ETL + 后端 + 未来小程序)
- 思路分析:提供 get_business_date() 等工具函数,以 start_hour 为参数计算当前营业日
- 修改结果:共享包提供统一的营业日计算工具,避免各模块重复实现
### `apps/backend/app/middleware/permission.py`
- 变更类型:修改
- 原始原因:权限中间件需要适配新的用户状态三态
- 思路分析:调整权限检查逻辑以识别 new/pending/approved 状态
- 修改结果:权限中间件正确处理三态用户的访问控制
### `apps/backend/app/routers/admin_applications.py`
- 变更类型:新增
- 原始原因:管理端需要审核用户申请的接口
- 思路分析:提供申请列表查询 + 审批/拒绝操作的 REST 端点
- 修改结果:管理端可查看和处理用户申请
### `apps/backend/app/routers/business_day.py`
- 变更类型:新增
- 原始原因:管理后台需要查询营业日配置
- 思路分析GET /api/business-day/config 返回 start_hour
- 修改结果:前端可获取营业日分割配置
### `apps/backend/app/routers/member_retention_clue.py`
- 变更类型:新增(替换 member_birthday
- 原始原因member_birthday 功能重构为更通用的维客线索模块
- 思路分析:扩展原有生日提醒为完整的维客线索管理
- 修改结果:后端提供维客线索 CRUD 接口
### 本次对话新增文件
### `docs/audit/prompt_logs/prompt_log_20260227_075054.md`
- 变更类型:新增
- 原始原因Prompt 审计日志自动记录
- 思路分析agent-on-stop hook 自动生成
- 修改结果:本次对话的 Prompt 已归档
### `scripts/ops/_check_etl_log_tail.py`
- 变更类型:新增
- 原始原因:运维需要快速查看 ETL 最近日志尾部
- 思路分析:一次性运维脚本,读取 ETL 日志文件末尾内容
- 修改结果:提供便捷的 ETL 日志查看工具
## 文件清单Files changed
共 53 个高风险/业务文件(不含 .kiro 内部、docs/prd、tmp 清理等):
| # | 文件 | 变更类型 |
|---|------|----------|
| 1 | `.env` | 修改 |
| 2 | `.env.template` | 修改 |
| 3 | `.gitignore` | 修改 |
| 4 | `apps/admin-web/src/App.tsx` | 修改 |
| 5 | `apps/admin-web/src/api/businessDay.ts` | 新增 |
| 6 | `apps/admin-web/src/components/BusinessDayHint.tsx` | 新增 |
| 7 | `apps/admin-web/src/pages/TaskConfig.tsx` | 修改 |
| 8 | `apps/admin-web/src/pages/TaskManager.tsx` | 修改 |
| 9 | `apps/admin-web/src/store/businessDayStore.ts` | 新增 |
| 10 | `apps/backend/README.md` | 修改 |
| 11 | `apps/backend/app/config.py` | 修改 |
| 12 | `apps/backend/app/main.py` | 修改 |
| 13 | `apps/backend/app/middleware/permission.py` | 修改 |
| 14 | `apps/backend/app/routers/admin_applications.py` | 新增 |
| 15 | `apps/backend/app/routers/business_day.py` | 新增 |
| 16 | `apps/backend/app/routers/member_retention_clue.py` | 新增 |
| 17 | `apps/backend/app/routers/tasks.py` | 修改 |
| 18 | `apps/backend/app/routers/xcx_auth.py` | 修改 |
| 19 | `apps/backend/app/schemas/member_retention_clue.py` | 修改 |
| 20 | `apps/backend/app/schemas/xcx_auth.py` | 修改 |
| 21 | `apps/backend/app/services/application.py` | 修改 |
| 22 | `apps/backend/app/services/wechat.py` | 修改 |
| 23 | `apps/etl/connectors/feiqiu/config/defaults.py` | 修改 |
| 24 | `apps/etl/connectors/feiqiu/config/env_parser.py` | 修改 |
| 25 | `apps/etl/connectors/feiqiu/config/settings.py` | 修改 |
| 26 | `apps/etl/connectors/feiqiu/orchestration/flow_runner.py` | 修改 |
| 27 | `apps/etl/connectors/feiqiu/quality/consistency_checker.py` | 修改 |
| 28 | `apps/etl/connectors/feiqiu/scripts/debug/debug_blackbox.py` | 修改 |
| 29 | `apps/etl/connectors/feiqiu/scripts/run_update.py` | 修改 |
| 30 | `apps/etl/connectors/feiqiu/tasks/dwd/dwd_load_task.py` | 修改 |
| 31 | `apps/etl/connectors/feiqiu/tasks/dws/assistant_customer_task.py` | 修改 |
| 32 | `apps/etl/connectors/feiqiu/tasks/dws/assistant_daily_task.py` | 修改 |
| 33 | `apps/etl/connectors/feiqiu/tasks/dws/assistant_finance_task.py` | 修改 |
| 34 | `apps/etl/connectors/feiqiu/tasks/dws/assistant_monthly_task.py` | 修改 |
| 35 | `apps/etl/connectors/feiqiu/tasks/dws/assistant_order_contribution_task.py` | 修改 |
| 36 | `apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py` | 修改 |
| 37 | `apps/etl/connectors/feiqiu/tasks/dws/finance_base_task.py` | 修改 |
| 38 | `apps/etl/connectors/feiqiu/tasks/dws/finance_discount_task.py` | 修改 |
| 39 | `apps/etl/connectors/feiqiu/tasks/dws/finance_income_task.py` | 修改 |
| 40 | `apps/etl/connectors/feiqiu/tasks/dws/finance_recharge_task.py` | 修改 |
| 41 | `apps/etl/connectors/feiqiu/tasks/dws/goods_stock_daily_task.py` | 修改 |
| 42 | `apps/etl/connectors/feiqiu/tasks/dws/goods_stock_monthly_task.py` | 修改 |
| 43 | `apps/etl/connectors/feiqiu/tasks/dws/goods_stock_weekly_task.py` | 修改 |
| 44 | `apps/etl/connectors/feiqiu/tasks/dws/index/member_index_base.py` | 修改 |
| 45 | `apps/etl/connectors/feiqiu/tasks/dws/index/relation_index_task.py` | 修改 |
| 46 | `apps/etl/connectors/feiqiu/tasks/dws/index/spending_power_index_task.py` | 修改 |
| 47 | `apps/etl/connectors/feiqiu/tasks/dws/member_consumption_task.py` | 修改 |
| 48 | `apps/etl/connectors/feiqiu/tasks/dws/member_visit_task.py` | 修改 |
| 49 | `apps/etl/connectors/feiqiu/tasks/verification/index_verifier.py` | 修改 |
| 50 | `apps/etl/connectors/feiqiu/tests/unit/test_config.py` | 修改 |
| 51 | `packages/shared/src/neozqyy_shared/__init__.py` | 修改 |
| 52 | `packages/shared/src/neozqyy_shared/datetime_utils.py` | 新增 |
| 53 | `scripts/ops/_check_etl_log_tail.py` | 新增 |
## DB 文档全量对账
对账时间2026-02-27 08:11:17测试库test_etl_feiqiu + test_zqyy_app
| 指标 | 数值 |
|------|------|
| 数据库实际表总数 | 131 |
| 已有文档引用数 | 150 |
| 缺失文档的表数 | 57 |
### 缺失文档的表(按 schema 分组)
**core 层7 表)**
- `core.dim_assistant`9 列)、`core.dim_goods_category`5 列)、`core.dim_member`8 列)
- `core.dim_site`6 列)、`core.dim_table`5 列)
- `core.fact_payment`7 列)、`core.fact_settlement`12 列)
**dwd 层16 表)**
- `dwd.dim_goods_category`16 列)、`dwd.dim_groupbuy_package`22 列)、`dwd.dim_groupbuy_package_ex`25 列)
- `dwd.dim_member_card_account_ex`61 列)、`dwd.dim_member_ex`14 列)
- `dwd.dim_site`17 列)、`dwd.dim_site_ex`25 列)
- `dwd.dwd_assistant_trash_event`11 列)、`dwd.dwd_assistant_trash_event_ex`4 列)
- `dwd.dwd_groupbuy_redemption`25 列)、`dwd.dwd_groupbuy_redemption_ex`28 列)
- `dwd.dwd_payment`12 列)、`dwd.dwd_platform_coupon_redemption`20 列)、`dwd.dwd_platform_coupon_redemption_ex`6 列)
- `dwd.dwd_refund`12 列)、`dwd.dwd_refund_ex`20 列)
- `dwd.dwd_settlement_head_ex`30 列)、`dwd.dwd_table_fee_adjust`16 列)
- `dwd.dwd_table_fee_adjust_ex`13 列)、`dwd.dwd_table_fee_log_ex`13 列)
**dws 层4 表)**
- `dws.cfg_area_category`10 列)、`dws.cfg_skill_type`9 列)
- `dws.dws_ml_manual_order_alloc`19 列)、`dws.dws_ml_manual_order_source`27 列)
**meta 层3 表)**
- `meta.etl_cursor`10 列)、`meta.etl_run`23 列)、`meta.etl_task`12 列)
**ods 层11 表)**
- `ods.assistant_cancellation_records`19 列)、`ods.group_buy_packages`43 列)
- `ods.group_buy_redemption_records`57 列)、`ods.member_profiles`26 列)
- `ods.member_stored_value_cards`80 列)、`ods.payment_transactions`17 列)
- `ods.platform_coupon_redemption_records`31 列)、`ods.refund_transactions`37 列)
- `ods.settlement_records`71 列)、`ods.stock_goods_category_tree`16 列)
- `ods.table_fee_discount_records`33 列)、`ods.table_fee_transactions`47 列)
**zqyy_app public 层10 表)**
- `public.admin_users`8 列)、`public.approvals`7 列)、`public.permissions`4 列)
- `public.role_permissions`2 列)、`public.roles`5 列)
- `public.scheduled_tasks`13 列)、`public.task_execution_log`14 列)
- `public.task_queue`10 列)、`public.tasks`9 列)
- `public.user_roles`3 列)、`public.users`8 列)
### 对账结论
- 新增文档数0本次仅记录缺失清单未自动生成
- 更新文档数0
- 废弃标注数0
- ⚠️ 57 张表缺少 BD_Manual 文档建议分批补全优先级core/meta > dws > dwd > ods > public
- ⚠️ DDL 基线has_ddl_baseline=false待合并