# 变更审计记录:多模块累积变更 — AI 应用骨架 + 任务队列防卡死 + 小程序页面迁移 | 字段 | 值 | |------|-----| | 日期 | 2026-03-10 00:16:50 | | Prompt-ID | P20260310-000851 | | 风险标签 | dir:backend, dir:etl, dir:miniprogram, dir:db, db-schema-change | | 变更规模 | 145 files changed, 6965 insertions(+), 3396 deletions(-) | ## 操作摘要 本次审计覆盖多轮对话的累积变更,涉及三大模块: 1. **后端 AI 应用骨架(P5-A 阶段)**:新增 8 个 AI 应用模块(app1_chat ~ app8_consolidation)、dispatcher 路由、prompt 模板、缓存/对话路由,构建完整的 AI 应用框架 2. **任务队列防卡死机制**:在 `task_queue.py` 中新增 `_ensure_not_stuck_running` 和 `_recover_zombie_tasks` 两个防御函数,防止任务因异常被静默吞掉后永远卡在 running 状态 3. **小程序页面迁移(H5 → 微信原生)**:大量小程序页面的 UI 重构和功能增强,包括看板页面、聊天页面、教练/客户详情页、任务列表/详情页等 4. **ETL DWS 任务优化**:`base_dws_task.py` 和 `assistant_order_contribution_task.py` 的调整,BD 手册文档更新 ## 本次对话文件变更 ### 新增文件 - `docs/audit/prompt_logs/prompt_log_20260310_000851.md` - `docs/audit/session_logs/2026-03/09/51_413948ee_141806/sub_01_b45509d2.md` - `docs/audit/session_logs/_system_prompts/sp_6b01e1f4.md` ## 改动注解 ### 后端 — AI 应用骨架(新增) ### `apps/backend/app/ai/apps/app1_chat.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现通用对话应用,支持 SSE 流式返回 - 思路分析:每次进入 chat 页面新建 ai_conversations 记录(不复用),首条消息注入页面上下文(source_page、page_context、screen_content),通过 BailianClient.chat_stream 流式获取回复,逐 chunk yield SSEEvent - 修改结果:完整的流式对话入口,包含 conversation 创建、消息写入、system prompt 构建、异常处理。app_id = "app1_chat" ### `apps/backend/app/ai/apps/app2_finance.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现财务洞察应用,8 个时间维度独立调用 - 思路分析:定义 8 个时间维度编码(this_month/last_month/this_week 等),实现 `compute_time_range` 计算日期范围,营业日分界点 08:00(BUSINESS_DAY_START_HOUR 环境变量)。调用百炼后结果写入 ai_cache + ai_conversations - 修改结果:完整的财务洞察调用链路。app_id = "app2_finance" ### `apps/backend/app/ai/apps/app3_clue.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现客户数据维客线索分析骨架 - 思路分析:线索 category 限定 3 个枚举值(客户基础/消费习惯/玩法偏好),使用 items_sum 口径禁止 consume_money。Prompt reference 包含 App6 备注分析线索 + 最近 2 套 App8 历史 - 修改结果:骨架实现,data 字段标注"待 P9-T1 补充"。app_id = "app3_clue" ### `apps/backend/app/ai/apps/app4_analysis.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现关系分析/任务建议骨架 - 思路分析:助教参与新结算或被分配召回任务时自动触发。Prompt reference 包含 App8 最新 + 最近 2 套历史(附 generated_at),缓存不存在时标注"暂无历史线索" - 修改结果:骨架实现,data 字段标注"待 P6-T4 补充"。app_id = "app4_analysis" ### `apps/backend/app/ai/apps/app5_tactics.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现维客话术生成骨架 - 思路分析:基于 App3 线索和 App4 分析结果生成维客话术建议 - 修改结果:骨架实现。app_id = "app5_tactics" ### `apps/backend/app/ai/apps/app6_note.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现备注分析骨架 - 思路分析:分析助教/教练的备注内容,提取客户线索 - 修改结果:骨架实现。app_id = "app6_note" ### `apps/backend/app/ai/apps/app7_customer.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现客户画像骨架 - 思路分析:综合客户消费数据生成客户画像 - 修改结果:骨架实现。app_id = "app7_customer" ### `apps/backend/app/ai/apps/app8_consolidation.py` - 变更类型:新增 - 原始原因:P5-A 阶段实现维客线索整理骨架 - 思路分析:整合 App3/App6 线索,去重合并,生成最终维客线索集 - 修改结果:骨架实现。app_id = "app8_consolidation" ### `apps/backend/app/ai/dispatcher.py` - 变更类型:新增 - 原始原因:AI 应用路由分发器,根据 app_id 路由到对应应用 - 思路分析:统一入口,根据 app_id 字符串匹配调用对应 app 模块的 run 函数 - 修改结果:8 个应用的路由分发逻辑 ### `apps/backend/app/ai/prompts/app2_finance_prompt.py` - 变更类型:新增 - 原始原因:App2 财务洞察的 Prompt 模板 - 思路分析:构建包含时间维度、当前数据、历史数据的结构化 Prompt - 修改结果:build_prompt 函数,返回 system + user 消息列表 ### `apps/backend/app/ai/prompts/app8_consolidation_prompt.py` - 变更类型:新增 - 原始原因:App8 维客线索整理的 Prompt 模板 - 思路分析:整合多源线索的 Prompt 构建 - 修改结果:build_prompt 函数 ### `apps/backend/app/routers/xcx_ai_cache.py` - 变更类型:新增 - 原始原因:AI 缓存查询路由,小程序端读取 AI 分析结果 - 思路分析:提供 GET 接口查询 ai_cache 表中的缓存结果 - 修改结果:缓存查询 API 路由 ### `apps/backend/app/routers/xcx_ai_chat.py` - 变更类型:新增 - 原始原因:AI 对话路由,小程序端发起 AI 对话 - 思路分析:SSE 流式接口,调用 app1_chat 的 chat_stream - 修改结果:流式对话 API 路由 ### `apps/backend/app/main.py` - 变更类型:修改 - 原始原因:注册新增的 AI 路由 - 思路分析:在 FastAPI app 中 include 新增的 xcx_ai_cache 和 xcx_ai_chat 路由 - 修改结果:后端启动时自动加载 AI 相关路由 ### 后端 — 任务队列防卡死机制 ### `apps/backend/app/services/task_queue.py` - 变更类型:修改 - 原始原因:task_queue 中的任务因 `task_execution_log.duration_ms` 的 integer 溢出异常被静默吞掉,导致 task_queue 永远卡在 running 状态,后续任务全部排队。`duration_ms` 列已迁移为 bigint,本次增加兜底防御 - 思路分析:新增两个防御函数:(1) `_ensure_not_stuck_running(queue_id)` 在 `_execute_and_update` 的 finally 块中调用,检查 task_queue 是否仍为 running 并强制标记 failed;(2) `_recover_zombie_tasks(max_running_minutes=180)` 在 `_process_once` 开头调用,回收超过 3 小时仍为 running 的僵尸任务 - 修改结果:双重防御确保任务队列不会因异常卡死。即使单次执行异常未被捕获,finally 块兜底;即使 finally 也失败,定期扫描回收僵尸任务 ### `apps/backend/app/services/task_executor.py` - 变更类型:修改 - 原始原因:配合任务队列防卡死机制的调整 - 思路分析:与 task_queue.py 的防御机制协同工作 - 修改结果:执行器层面的适配 ### `apps/backend/app/services/task_registry.py` - 变更类型:修改 - 原始原因:任务注册表小幅调整 - 思路分析:配合新增 AI 应用的任务注册 - 修改结果:新增任务类型注册 ### `apps/backend/tests/test_task_queue.py` - 变更类型:修改 - 原始原因:更新测试以适配新的防卡死逻辑 - 思路分析:修复 dequeue mock 元组缺少 schedule_id(第 11 列)的 bug,更新 3 个 `_process_once` 测试的 mock 增加 `_recover_zombie_tasks` 的 get_connection 调用 - 修改结果:25 个测试全部通过 ### `apps/backend/pyproject.toml` - 变更类型:修改 - 原始原因:添加 `asyncio_mode = "auto"` 到 pytest 配置 - 思路分析:使 async 测试在 uv run 环境下正常运行,无需逐个标注 `@pytest.mark.asyncio` - 修改结果:pytest 配置优化 ### ETL — DWS 任务优化 ### `apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py` - 变更类型:修改 - 原始原因:DWS 基础任务类调整 - 思路分析:优化 DWS 任务的通用逻辑 - 修改结果:影响所有继承 BaseDWSTask 的任务 ### `apps/etl/connectors/feiqiu/tasks/dws/assistant_order_contribution_task.py` - 变更类型:修改 - 原始原因:助教订单贡献任务调整 - 思路分析:配合 base_dws_task 的变更 - 修改结果:任务逻辑适配 ### ETL — 文档更新 - `apps/etl/connectors/feiqiu/docs/database/DWD/main/BD_manual_dwd_settlement_head.md` — 结算单 BD 手册更新 - `apps/etl/connectors/feiqiu/docs/database/DWS/main/BD_manual_cfg_area_category.md` — 台区分类 BD 手册更新(+139 行) - `apps/etl/connectors/feiqiu/docs/database/DWS/main/BD_manual_dws_finance_income_structure.md` — 财务收入结构 BD 手册更新 - `apps/etl/connectors/feiqiu/docs/etl_tasks/dws_tasks.md` — DWS 任务文档更新 ### 小程序 — H5 → 微信原生迁移(简要注解) 大量小程序页面的 UI 重构和功能增强,属于 H5 → 微信小程序原生迁移的持续工作: - `app.wxss` — 全局样式新增 +165 行(通用组件样式) - `board-coach/` — 教练看板页面(json/ts/wxml/wxss 全部更新) - `board-customer/` — 客户看板页面(json/ts/wxml/wxss 全部更新) - `board-finance/` — 财务看板页面(ts +131, wxml +57, wxss +101) - `chat/` — AI 对话页面(json/ts/wxml/wxss 全部更新) - `chat-history/` — 对话历史页面(json/ts/wxml/wxss 全部更新) - `coach-detail/` — 教练详情页(ts +280, wxml +206, wxss +701) - `customer-detail/` — 客户详情页(ts +182, wxml +160, wxss +408) - `customer-service-records/` — 客户服务记录页 - `my-profile/` — 个人中心页 - `notes/` — 备注页面 - `performance/` — 业绩页面 - `performance-records/` — 业绩记录页 - `task-list/` — 任务列表页(ts +389, wxml +305, wxss +562) - `task-detail/` — 任务详情页(ts +182, wxml +171, wxss +815) - `task-detail-callback/` — 回访任务详情页 - `task-detail-priority/` — 优先级任务详情页 - `task-detail-relationship/` — 关系任务详情页 - `assets/icons/ai-robot-sm.svg` — AI 机器人小图标(新增) ### 数据库 — DDL 基线与种子数据 - `db/etl_feiqiu/seeds/seed_dws_config.sql` — DWS 配置种子数据更新(+148/-) - `docs/database/ddl/etl_feiqiu__dws.sql` — ETL DWS DDL 基线微调 - `docs/database/ddl/zqyy_app__public.sql` — 业务库 DDL 基线微调 ### 其他 - `docs/h5_ui/anchors/board-finance-mp-instructions.json` — 删除(H5 锚点文件,迁移后不再需要) - `docs/h5_ui/anchors/board-finance.json` — 删除 - `docs/h5_ui/screenshots/*.png` — 批量删除 H5 截图(迁移到小程序后原始截图不再需要) - `docs/h5_ui/icon-mapping.md` — 图标映射更新 - `docs/prd/specs/P8-miniapp-fe-boards.md` — PRD spec 微调 - `docs/prd/specs/P9-miniapp-fe-details.md` — PRD spec 微调 - `scripts/ops/_daily_revenue_0305.py` — 日营收脚本微调 - `scripts/ops/daily_revenue_report.py` — 日营收报告脚本微调 - `scripts/ops/screenshot_h5_pages.py` — H5 截图脚本调整 ## DDL/迁移检查 - 新增迁移 SQL:无(`new_migration_sql` 为空) - DDL 基线已更新:`etl_feiqiu__dws.sql` 和 `zqyy_app__public.sql` 有微调 - ⚠️ DDL 基线状态:`has_ddl_baseline` 为 false,基线文件虽有变更但未标记为已合并 ## 合规检查 - 文档同步缺失:无(`code_without_docs` 为空) - API 接口变更:无(`api_changed` 为 false) - OpenAPI spec:无需同步