# 变更审计记录:多模块累积变更(营业日/核心业务/认证/ETL DWS 重构/参考文档合并) - 日期:2026-02-28 13:53:50 - Prompt-ID:P20260228-134525 - 审计人:Kiro AI - 风险标签:root-file, dir:admin-web, dir:backend, dir:etl, dir:miniprogram, dir:db, db-schema-change, dir:shared ## 变更概览 本次审计覆盖 220 个文件的累积变更(+9,429 / -217,832 行),涉及以下主要模块: | 模块 | 变更文件数 | 主要内容 | |------|-----------|----------| | admin-web | 6 | 营业日提示组件、任务终止操作、BusinessDayStore | | backend | 20 | 微信登录重构(new 状态)、dev-login、核心业务路由(xcx_tasks/xcx_notes)、触发器系统、维客线索、营业日配置 | | etl | 15 | DWS 任务 biz_date 重构、base_dws_task 统一、consistency_checker 重写、config 扩展 | | miniprogram | 4 | 认证流程、app.json 页面注册、app.ts 启动逻辑 | | db | 2 | FDW 反向配置更新 | | shared | 2 | datetime_utils 新增模块 | | 根目录 | 3 | .env / .env.template / .gitignore | | docs/reference | 1 | bailian-agent-v1 + v2 合并为 bailian-agent-guide | ## 本次对话文件变更(session_diff) ### 新增文件 - `docs/audit/prompt_logs/prompt_log_20260228_134525.md` — Prompt 日志 - `docs/reference/bailian-agent-guide.md` — 百炼 Agent 参考指南(由 v1 + v2 合并) ### 删除文件 - `docs/reference/bailian-agent-v1.md` — 已合并至 bailian-agent-guide.md - `docs/reference/bailian-agent-v2.md` — 已合并至 bailian-agent-guide.md ## 高风险文件清单(43 个) ### admin-web(6 个) - `apps/admin-web/src/App.tsx` - `apps/admin-web/src/api/businessDay.ts` - `apps/admin-web/src/components/BusinessDayHint.tsx` - `apps/admin-web/src/pages/TaskConfig.tsx` - `apps/admin-web/src/pages/TaskManager.tsx` - `apps/admin-web/src/store/businessDayStore.ts` ### backend(19 个) - `apps/backend/app/config.py` - `apps/backend/app/main.py` - `apps/backend/app/middleware/permission.py` - `apps/backend/app/routers/admin_applications.py` - `apps/backend/app/routers/business_day.py` - `apps/backend/app/routers/member_retention_clue.py` - `apps/backend/app/routers/tasks.py` - `apps/backend/app/routers/xcx_auth.py` - `apps/backend/app/routers/xcx_notes.py` - `apps/backend/app/routers/xcx_tasks.py` - `apps/backend/app/schemas/member_retention_clue.py` - `apps/backend/app/schemas/xcx_auth.py` - `apps/backend/app/schemas/xcx_notes.py` - `apps/backend/app/schemas/xcx_tasks.py` - `apps/backend/app/services/application.py` - `apps/backend/app/services/note_reclassifier.py` - `apps/backend/app/services/note_service.py` - `apps/backend/app/services/recall_detector.py` - `apps/backend/app/services/task_expiry.py` - `apps/backend/app/services/task_generator.py` - `apps/backend/app/services/task_manager.py` - `apps/backend/app/services/trigger_scheduler.py` - `apps/backend/app/services/wechat.py` ### etl(13 个) - `apps/etl/connectors/feiqiu/config/defaults.py` - `apps/etl/connectors/feiqiu/config/env_parser.py` - `apps/etl/connectors/feiqiu/config/settings.py` - `apps/etl/connectors/feiqiu/orchestration/flow_runner.py` - `apps/etl/connectors/feiqiu/quality/consistency_checker.py` - `apps/etl/connectors/feiqiu/tasks/dwd/dwd_load_task.py` - `apps/etl/connectors/feiqiu/tasks/dws/assistant_customer_task.py` - `apps/etl/connectors/feiqiu/tasks/dws/assistant_daily_task.py` - `apps/etl/connectors/feiqiu/tasks/dws/assistant_finance_task.py` - `apps/etl/connectors/feiqiu/tasks/dws/assistant_monthly_task.py` - `apps/etl/connectors/feiqiu/tasks/dws/assistant_order_contribution_task.py` - `apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py` - `apps/etl/connectors/feiqiu/tasks/dws/finance_base_task.py` ## 合规检查 | 检查项 | 状态 | |--------|------| | 文档同步缺失 | ✅ 无缺失(code_without_docs 为空) | | 新增迁移 SQL | ✅ 无新增(new_migration_sql 为空) | | BD Manual 文档 | ⚠️ 未找到(has_bd_manual=false,历史变更已有对应文档) | | DDL 基线 | ⚠️ DDL 基线待合并(has_ddl_baseline=false) | | 接口变更 | ✅ 无接口变更(api_changed=false) | | OpenAPI Spec | ✅ 已同步(openapi_spec_stale=false) | ## 改动注解 ### `apps/admin-web/src/App.tsx` - 变更类型:修改 - 原始原因:管理后台需要在启动时加载营业日配置,以便日期选择器等组件能感知营业日分割点 - 思路分析:在 App 组件的 useEffect 中新增 `initBusinessDay()` 调用,利用 zustand store 管理营业日状态,降级策略在 store 内部处理 - 修改结果:管理后台启动时自动请求营业日配置 API,所有依赖营业日的组件可通过 store 获取配置 ### `apps/admin-web/src/pages/TaskConfig.tsx` - 变更类型:修改 - 原始原因:任务配置页的日期选择区域需要展示营业日提示,帮助运营人员理解日期分割逻辑 - 思路分析:在日期选择器下方插入 `` 组件,用 Fragment 包裹原有 Row 和新增提示 - 修改结果:日期选择区域下方显示营业日分割点提示信息 ### `apps/admin-web/src/pages/TaskManager.tsx` - 变更类型:修改 - 原始原因:历史任务列表中运行中的任务需要支持手动终止操作 - 思路分析:新增 `handleCancelHistory` 回调和"操作"列,仅对 status=running 的记录显示终止按钮,使用 Popconfirm 二次确认 - 修改结果:历史任务列表新增终止操作列,运行中任务可手动终止 ### `apps/admin-web/src/api/businessDay.ts` - 变更类型:修改(高风险) - 原始原因:新增营业日 API 调用层 - 思路分析:封装后端 /api/business-day 端点的请求方法 - 修改结果:admin-web 可通过 API 获取营业日配置 ### `apps/admin-web/src/components/BusinessDayHint.tsx` - 变更类型:修改(高风险) - 原始原因:新增营业日提示 UI 组件 - 思路分析:从 businessDayStore 读取配置,展示分割点时间提示 - 修改结果:可复用的营业日提示组件,已集成到 TaskConfig 页面 ### `apps/admin-web/src/store/businessDayStore.ts` - 变更类型:修改(高风险) - 原始原因:管理后台需要全局管理营业日配置状态 - 思路分析:使用 zustand 创建 store,init 方法请求 API 并缓存,内置降级策略 - 修改结果:全局营业日状态管理,App 启动时初始化 ### `apps/backend/app/config.py` - 变更类型:修改 - 原始原因:后端需要支持微信小程序配置和营业日分割点配置 - 思路分析:新增 WX_APPID / WX_SECRET / WX_DEV_MODE / BUSINESS_DAY_START_HOUR 四个配置项,从环境变量读取 - 修改结果:后端配置模块支持微信和营业日相关环境变量 ### `apps/backend/app/main.py` - 变更类型:修改 - 原始原因:后端需要注册新路由(维客线索、管理端申请审核、营业日、小程序任务/笔记)和触发器 job handler - 思路分析:替换 member_birthday 为 member_retention_clue,新增 admin_applications / business_day / xcx_tasks / xcx_notes 路由;在 lifespan 中注册 4 个触发器 job handler - 修改结果:后端路由从 13 个扩展到 17 个,触发器系统在启动时自动注册 ### `apps/backend/app/routers/tasks.py` - 变更类型:修改 - 原始原因:ETL/后端任务同步检查存在误报,部分 ETL 专属任务不应出现在差异列表中 - 思路分析:定义 ETL_ONLY_EXPECTED 白名单集合(5 个一次性/未上线任务),从 etl_only 差集中排除 - 修改结果:同步检查不再误报 INIT_*_SCHEMA / SEED_DWS_CONFIG / DWS_ASSISTANT_ORDER_CONTRIBUTION ### `apps/backend/app/routers/xcx_auth.py` - 变更类型:修改 - 原始原因:小程序认证流程需要区分"新用户"和"已提交申请"两个状态,并支持开发模式 mock 登录 - 思路分析:将新用户初始状态从 pending 改为 new(new → 提交申请 → pending → 审核 → approved);新增 dev-login 端点,仅在 WX_DEV_MODE=true 时注册,支持指定 openid 和 status 参数 - 修改结果:认证流程更精细(new/pending/rejected/approved 四态),开发调试效率提升 ### `apps/backend/app/schemas/xcx_auth.py` - 变更类型:修改 - 原始原因:新增 DevLoginRequest schema 支持 dev-login 端点 - 思路分析:定义 openid(必填)和 status(可选)字段 - 修改结果:dev-login 端点有完整的请求验证 ### `apps/backend/app/services/application.py` - 变更类型:修改 - 原始原因:用户提交申请时需要自动将状态从 new 更新为 pending - 思路分析:在 create_application 末尾新增 UPDATE 语句,仅对 new/rejected 状态的用户更新为 pending - 修改结果:申请提交后用户状态自动流转 ### `apps/backend/app/services/wechat.py` - 变更类型:修改 - 原始原因:微信 code2session 服务需要使用集中配置的 APPID/SECRET - 思路分析:从 `config.get()` 改为直接引用 `config.WX_APPID` / `config.WX_SECRET` - 修改结果:配置引用更清晰,与 config.py 中的集中定义一致 ### `apps/backend/app/middleware/permission.py` - 变更类型:修改(高风险) - 原始原因:权限中间件需要适配新的路由和认证状态 - 修改结果:权限检查逻辑更新 ### `apps/backend/app/routers/admin_applications.py` - 变更类型:修改(高风险) - 原始原因:管理端需要审核用户申请的路由 - 修改结果:管理端申请审核 CRUD 端点 ### `apps/backend/app/routers/business_day.py` - 变更类型:修改(高风险) - 原始原因:提供营业日配置查询 API - 修改结果:GET /api/business-day 端点 ### `apps/backend/app/routers/member_retention_clue.py` - 变更类型:修改(高风险) - 原始原因:维客线索重构,替代原 member_birthday 路由 - 修改结果:维客线索 CRUD 端点 ### `apps/backend/app/routers/xcx_notes.py` - 变更类型:修改(高风险) - 原始原因:小程序核心业务——笔记模块路由 - 修改结果:笔记 CRUD + 分类 + 搜索端点 ### `apps/backend/app/routers/xcx_tasks.py` - 变更类型:修改(高风险) - 原始原因:小程序核心业务——任务模块路由 - 修改结果:任务列表/详情/状态流转端点 ### `apps/backend/app/schemas/member_retention_clue.py` - 变更类型:修改(高风险) - 原始原因:维客线索 schema 定义 - 修改结果:请求/响应模型 ### `apps/backend/app/schemas/xcx_notes.py` - 变更类型:修改(高风险) - 原始原因:笔记模块 schema 定义 - 修改结果:笔记请求/响应模型 ### `apps/backend/app/schemas/xcx_tasks.py` - 变更类型:修改(高风险) - 原始原因:任务模块 schema 定义 - 修改结果:任务请求/响应模型 ### `apps/backend/app/services/note_reclassifier.py` - 变更类型:修改(高风险) - 原始原因:笔记自动重分类后台任务 - 修改结果:触发器系统可调度的 note_reclassify_backfill job ### `apps/backend/app/services/note_service.py` - 变更类型:修改(高风险) - 原始原因:笔记业务逻辑服务层 - 修改结果:笔记 CRUD + 分类逻辑 ### `apps/backend/app/services/recall_detector.py` - 变更类型:修改(高风险) - 原始原因:回访完成检测后台任务 - 修改结果:触发器系统可调度的 recall_completion_check job ### `apps/backend/app/services/task_expiry.py` - 变更类型:修改(高风险) - 原始原因:任务过期检查后台任务 - 修改结果:触发器系统可调度的 task_expiry_check job ### `apps/backend/app/services/task_generator.py` - 变更类型:修改(高风险) - 原始原因:任务自动生成后台任务 - 修改结果:触发器系统可调度的 task_generator job ### `apps/backend/app/services/task_manager.py` - 变更类型:修改(高风险) - 原始原因:任务状态管理服务层 - 修改结果:任务状态流转(待处理→进行中→已完成/已过期) ### `apps/backend/app/services/trigger_scheduler.py` - 变更类型:修改(高风险) - 原始原因:触发器调度系统,管理定时 job 的注册和执行 - 修改结果:register_job 接口,lifespan 中注册 4 个核心业务 job ### `apps/backend/app/services/wechat.py` - 变更类型:修改 - 原始原因:微信 code2session 服务配置引用方式统一 - 思路分析:从 config.get() 改为直接引用 config.WX_APPID / config.WX_SECRET - 修改结果:配置引用更清晰 ### `apps/etl/connectors/feiqiu/config/defaults.py` - 变更类型:修改 - 原始原因:ETL 配置默认值扩展 - 修改结果:新增默认配置项 ### `apps/etl/connectors/feiqiu/config/env_parser.py` - 变更类型:修改 - 原始原因:环境变量解析器扩展 - 修改结果:支持新增配置项解析 ### `apps/etl/connectors/feiqiu/config/settings.py` - 变更类型:修改 - 原始原因:ETL 配置类扩展,支持营业日分割点等新配置 - 修改结果:Settings 类新增字段 ### `apps/etl/connectors/feiqiu/orchestration/flow_runner.py` - 变更类型:修改 - 原始原因:流程编排器适配 DWS 任务重构 - 修改结果:flow_runner 调用方式更新 ### `apps/etl/connectors/feiqiu/quality/consistency_checker.py` - 变更类型:修改(+136/-136 行,重写) - 原始原因:数据一致性检查器全面重构 - 思路分析:重写检查逻辑以适配 biz_date 重构后的 DWS 表结构 - 修改结果:一致性检查器与新 DWS 结构对齐 ### `apps/etl/connectors/feiqiu/tasks/dwd/dwd_load_task.py` - 变更类型:修改 - 原始原因:DWD 加载任务微调 - 修改结果:适配上游变更 ### `apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py` - 变更类型:修改(+65/-65 行,重构) - 原始原因:DWS 基类统一 biz_date 逻辑,所有 DWS 任务共享日期分割计算 - 思路分析:将 biz_date 计算从各子任务提取到基类,统一使用 BUSINESS_DAY_START_HOUR 配置 - 修改结果:所有 DWS 任务继承统一的 biz_date 处理逻辑 ### `apps/etl/connectors/feiqiu/tasks/dws/finance_base_task.py` - 变更类型:修改(+58/-58 行,重构) - 原始原因:财务基类适配 biz_date 重构 - 修改结果:财务类 DWS 任务统一使用基类 biz_date 逻辑 ### `apps/etl/connectors/feiqiu/tasks/dws/assistant_customer_task.py` - 变更类型:修改 - 原始原因:助教客户任务适配 biz_date 重构 - 修改结果:使用基类统一的日期分割逻辑 ### `apps/etl/connectors/feiqiu/tasks/dws/assistant_daily_task.py` - 变更类型:修改 - 原始原因:助教日报任务适配 biz_date 重构 - 修改结果:使用基类统一的日期分割逻辑 ### `apps/etl/connectors/feiqiu/tasks/dws/assistant_finance_task.py` - 变更类型:修改 - 原始原因:助教财务任务适配 biz_date 重构 - 修改结果:使用基类统一的日期分割逻辑 ### `apps/etl/connectors/feiqiu/tasks/dws/assistant_monthly_task.py` - 变更类型:修改 - 原始原因:助教月报任务适配 biz_date 重构 - 修改结果:使用基类统一的日期分割逻辑 ### `apps/etl/connectors/feiqiu/tasks/dws/assistant_order_contribution_task.py` - 变更类型:修改 - 原始原因:助教订单贡献任务适配 biz_date 重构 - 修改结果:使用基类统一的日期分割逻辑 ### `docs/reference/bailian-agent-guide.md` - 变更类型:新增 - 原始原因:用户要求将 bailian-agent-v1.md 和 bailian-agent-v2.md 合并为一份文档 - 思路分析:将两份百炼 Agent 参考文档的内容整合,消除重复,统一结构 - 修改结果:单一参考文档替代原有两份,v1 和 v2 已删除 ### `docs/reference/bailian-agent-v1.md` - 变更类型:删除 - 原始原因:已合并至 bailian-agent-guide.md ### `docs/reference/bailian-agent-v2.md` - 变更类型:删除 - 原始原因:已合并至 bailian-agent-guide.md ## 回滚策略 本次变更涉及多个独立功能模块,回滚需按模块分别处理: 1. **营业日功能**:回滚 admin-web 的 BusinessDayHint/Store + backend 的 business_day 路由 + config.py 中 BUSINESS_DAY_START_HOUR 2. **核心业务路由**:回滚 xcx_tasks / xcx_notes 路由 + 对应 services + main.py 中的路由注册和 job 注册 3. **认证重构**:回滚 xcx_auth.py 中 new 状态逻辑 + dev-login 端点 + application.py 状态流转 4. **ETL DWS 重构**:回滚 base_dws_task.py + 所有子任务的 biz_date 相关改动 5. **参考文档合并**:恢复 bailian-agent-v1.md 和 v2.md,删除 bailian-agent-guide.md ## 验证建议 ```bash # 后端启动验证 cd apps/backend && uvicorn app.main:app --reload # ETL 单元测试 cd apps/etl/connectors/feiqiu && pytest tests/unit -v # 属性测试 cd C:\Project\NeoZQYY && pytest tests/ -v # 管理后台构建验证 cd apps/admin-web && pnpm build ``` ## DB 文档全量对账 对账时间:2026-02-28 13:53:50 测试库连接:✅ ETL 测试库(test_etl_feiqiu)+ ✅ App 测试库(test_zqyy_app) ### 数据库实际表统计 | 库 | Schema | 表数 | |----|--------|------| | test_etl_feiqiu | ods | 20 | | test_etl_feiqiu | dwd | 40 | | test_etl_feiqiu | dws | 36 | | test_etl_feiqiu | core | 6 | | test_etl_feiqiu | meta | 3 | | test_zqyy_app | auth | 8 | | test_zqyy_app | biz | 4 | | test_zqyy_app | public | 12 | ### 文档覆盖情况 | 文档类型 | 覆盖范围 | 状态 | |----------|----------|------| | BD_Manual_auth_tables.md | auth Schema 8 张表 | ✅ 已覆盖 | | BD_Manual_biz_tables.md | biz Schema 4 张表(coach_tasks/coach_task_history/notes/trigger_jobs) | ✅ 已覆盖 | | BD_Manual_member_retention_clue.md | public.member_retention_clue | ✅ 已覆盖 | | BD_Manual_fdw_etl_setup.md | FDW 跨库配置 | ✅ 已覆盖 | | BD_Manual_app_schema_rls_views.md | app Schema RLS 视图 | ✅ 已覆盖 | | DDL 基线文件(10 个) | ETL 六层 Schema + App 三个 Schema + FDW | ✅ 已覆盖 | | 各 BD_Manual_*.md(ODS 表) | ODS 层主要表 | ✅ 部分覆盖(通过专题文档) | ### 对账摘要 - 新增文档数:0(无新增表需要单独建文档) - 更新文档数:0(现有文档与数据库结构一致) - 废弃标注数:0(无已删除的表) - ⚠️ DDL 基线待合并(has_ddl_baseline=false):DDL 基线文件已存在但可能未包含最新变更 注:ETL 库的 ods/dwd/dws/core/meta 层表结构由 DDL 基线文件(`docs/database/ddl/`)统一管理,不需要逐表建立 BD_Manual 文档。App 库的 auth/biz/public 表已有对应 BD_Manual 文档覆盖。