feat: 2026-04-15~05-02 累积变更基线 — AI 重构 + Runtime Context + DWS 修复
涵盖(每条对应已存的审计记录): - AI 模块拆分:apps/backend/app/ai/apps -> prompts/(8 个 APP + app2a 派生) audit: 2026-04-20__ai-module-complete.md - admin-web AI 管理套件:AIDashboard / AIOperations / AIRunLogs / AITriggers / TriggerManager audit: 2026-04-21__admin-web-ai-management-suite.md - App2 财务洞察 prompt v3 -> v5.1 + 小程序 AI 接入(chat / board-finance) audit: 2026-04-22__app2_prompt_v5_1_and_miniprogram_ai_insight.md - App2 prewarm 全过滤器 + AI 触发器 cron reschedule audit: 2026-04-21__app2-finance-prewarm-all-filters.md migration: 20260420_ai_trigger_jobs_and_app2_prewarm.sql / 20260421_app2_prewarm_cron_reschedule.sql - AppType 联合类型对齐 + adminAiAppTypes.test.ts audit: 2026-04-30__admin_web_ai_app_type_alignment.md - DashScope tokens_used 提取修复 audit: 2026-04-30__backend_dashscope_tokens_used_extraction.md - App3 线索完整详情 prompt audit: 2026-05-01__backend_app3_full_detail_prompt.md - Runtime Context 沙箱(5-1~5-2 主线): - 后端 schema/service + admin_runtime_context / xcx_runtime_clock 两个 router - admin-web RuntimeContext.tsx + miniprogram runtime-clock.ts - migration: 20260501__runtime_context_sandbox.sql - tools/db/verify_admin_web_sandbox.py + verify_sandbox_end_to_end.py - database/changes: 7 份 sandbox_* 验证报告 - 飞球 DWS 修复:finance_area_daily 区域汇总 + task_engine 调整 + RLS 视图业务日上界(migration 20260502 + scripts/ops/gen_rls_business_date_migration.py) 合规: - .gitignore 启用 tmp/ 排除 - 不入仓:apps/etl/connectors/feiqiu/.env(API_TOKEN secret,本地修改保留) 待验证清单: - docs/audit/changes/2026-05-04__cumulative_baseline_pending_verification.md 每个主题的功能完整性 / 上线验证几乎都未收口,按优先级 P0~P3 逐一处理
This commit is contained in:
110
docs/audit/changes/2026-04-20__ai-module-complete.md
Normal file
110
docs/audit/changes/2026-04-20__ai-module-complete.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# 审计记录:AI 模块完整实现
|
||||
|
||||
**日期**:2026-04-20
|
||||
**会话**:AI 模块全量建设(Phase 0~4)
|
||||
**影响范围**:backend / miniprogram / db / docs
|
||||
|
||||
---
|
||||
|
||||
## 变更摘要
|
||||
|
||||
本次会话完成了 NeoZQYY AI 模块从架构重组到端到端贯通的全量实现,涵盖:
|
||||
|
||||
1. **Phase 0**:删除 8 个死代码 App 文件,新建 `prompts/` 模块 + dispatcher 完整重构
|
||||
2. **Phase 1**:多轮会话 session_id 透传、references 注入、EventBus 广播
|
||||
3. **Phase 2**:小程序 chat 页完善、ai-float-button 上下文透传、AI 缓存渲染
|
||||
4. **Phase 2.2**:chat SSE 断线指数退避自动重连(最多 2 次)
|
||||
5. **Phase 3**:WebSocket AI 告警端点、熔断/限流/预算告警推送
|
||||
6. **Phase 3.2**:admin-web AIDashboard 接入 WS 实时告警(/ws/ai-alerts/{site_id})
|
||||
7. **Phase 4.1**:admin-web AIOperations 新增"按需重新生成"Card(POST /admin/ai/run/{app_type})
|
||||
8. **Phase 4.2**:缓存失效 Card 已在前序会话实现(adminAI.ts + AIOperations Card 2)
|
||||
9. **修复**:`main.py` 未调用 `internal_ai.set_dispatcher()` 导致 Dispatcher 503
|
||||
|
||||
---
|
||||
|
||||
## 变更文件清单
|
||||
|
||||
### 删除(8 个死代码文件)
|
||||
|
||||
| 文件 | 原因 |
|
||||
|------|------|
|
||||
| `apps/backend/app/ai/apps/__init__.py` | 调用未定义的 `bailian.chat_json()`,死代码 |
|
||||
| `apps/backend/app/ai/apps/app1_chat.py` ~ `app8_consolidation.py` | 同上,`run()` 从未被调用 |
|
||||
|
||||
### 新建
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `apps/backend/app/ai/prompts/__init__.py` | 导出 7 个 `build_app*_prompt` 函数 |
|
||||
| `apps/backend/app/ai/prompts/app2_finance_prompt.py` | App2 财务数据拼 prompt |
|
||||
| `apps/backend/app/ai/prompts/app3_clue_prompt.py` | App3 消费线索 prompt |
|
||||
| `apps/backend/app/ai/prompts/app4_analysis_prompt.py` | App4 助教-会员分析 prompt |
|
||||
| `apps/backend/app/ai/prompts/app5_tactics_prompt.py` | App5 话术 prompt(含 App4 结果) |
|
||||
| `apps/backend/app/ai/prompts/app6_note_prompt.py` | App6 备注分析 prompt |
|
||||
| `apps/backend/app/ai/prompts/app7_customer_prompt.py` | App7 客户画像 prompt |
|
||||
| `apps/backend/app/ai/prompts/app8_consolidation_prompt.py` | App8 线索整合 prompt |
|
||||
| `apps/backend/app/ai/references.py` | `_references` 注入 + `reference_card` 构建 |
|
||||
| `apps/backend/app/ai/event_bus.py` | in-process pub/sub,site_id 隔离 |
|
||||
| `apps/backend/app/ws/ai_events.py` | `/ws/ai-cache/{site_id}` + `/ws/ai-alerts/{site_id}` |
|
||||
| `db/zqyy_app/migrations/20260420_ai_trigger_jobs_and_app2_prewarm.sql` | 4 事件 + 1 cron trigger_jobs,已执行 |
|
||||
| `docs/database/BD_manual_ai_trigger_jobs_register.md` | 手动注册说明 |
|
||||
|
||||
### 修改
|
||||
|
||||
| 文件 | 关键变更 |
|
||||
|------|----------|
|
||||
| `apps/backend/app/ai/dispatcher.py` | 完整重构:调用 `prompts.build_*`,链式编排,EventBus 广播,_references 注入 |
|
||||
| `apps/backend/app/ai/dashscope_client.py` | `call_app_stream` 返回 `(chunk, session_id)` tuple |
|
||||
| `apps/backend/app/services/chat_service.py` | session_id 初始为 NULL,`save_session_id()` 保存百炼返回值 |
|
||||
| `apps/backend/app/services/trigger_scheduler.py` | `_invoke_handler()` 修复 async handler 同步调用 bug |
|
||||
| `apps/backend/app/services/task_generator.py` | `run()` 完成后触发 `ai_consumption_settled` 事件 |
|
||||
| `apps/backend/app/services/note_service.py` | 备注创建后触发 `ai_note_created` |
|
||||
| `apps/backend/app/routers/admin_task_engine.py` | 任务分配后触发 `ai_task_assigned` |
|
||||
| `apps/backend/app/routers/internal_events.py` | ETL 完成后触发 `ai_dws_completed` |
|
||||
| `apps/backend/app/routers/xcx_chat.py` | 解包 `(chunk, session_id)` 流,保存 session_id,写 reference_card |
|
||||
| `apps/backend/app/routers/admin_ai.py` | 新增 `POST /api/admin/ai/run/{app_type}` 端点 |
|
||||
| `apps/backend/app/schemas/admin_ai.py` | 新增 `RunAppRequest` / `RunAppResponse` |
|
||||
| `apps/backend/app/services/ai/admin_service.py` | 缓存失效后广播 `cache_invalidated` 事件 |
|
||||
| `apps/backend/app/main.py` | lifespan 补调 `internal_ai.set_dispatcher(_dispatcher)` |
|
||||
| `apps/backend/pytest.ini` | 追加 `norecursedirs = _archived` |
|
||||
| `apps/miniprogram/miniprogram/pages/chat/chat.ts` | referenceCard 点击跳转,pageFilters URL 解析;Phase 2.2 SSE 断线指数退避自动重连(最多 2 次) |
|
||||
| `apps/miniprogram/miniprogram/pages/chat/chat.wxml` | referenceCard `bindtap` + 类型标签优化 |
|
||||
| `apps/miniprogram/miniprogram/components/ai-float-button/ai-float-button.ts` | 新增 `sourcePage` + `pageFilters` 属性透传 |
|
||||
| `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts` | `_loadAIInsights()` 从 `app2_finance` 缓存加载洞察 |
|
||||
| `apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.ts` | `_loadAIInsight()` 从 `app7_customer_analysis` 缓存加载 |
|
||||
| `apps/miniprogram/miniprogram/services/api.ts` | 新增 `fetchAICache()` 函数 |
|
||||
|
||||
---
|
||||
|
||||
## E2E 验证结果
|
||||
|
||||
**消费事件链**(site_id=2790685415443269,member_id=2799212491392773):
|
||||
|
||||
| App | 状态 | 延迟 |
|
||||
|-----|------|------|
|
||||
| app3_clue | timeout | 121s(prompt 过大,需优化) |
|
||||
| app8_consolidate | **success** | ~15s,缓存已写入 |
|
||||
| app7_customer | **success** | ~60s,缓存含真实 AI 分析 |
|
||||
|
||||
**缓存验证**:
|
||||
- `app7_customer_analysis` result_json 含 `summary` + `strategies[{title,content}]`
|
||||
- `app8_clue_consolidated` result_json 含 `_references`(link 正确拼装)
|
||||
- board-finance AI 洞察已通过微信 MCP 验证在页面渲染(5 条真实 insight)
|
||||
|
||||
---
|
||||
|
||||
## 遗留风险点
|
||||
|
||||
1. **app3 超时(已缓解)**:`_MAX_PROMPT_LEN` 已从 8000 降至 4000,最多保留 3 条消费记录 + 二次截断 reference。待下次 E2E 验证是否仍超时。
|
||||
2. **tokens_used = 0**:DashScope SDK 响应未提取 token 计数,影响预算追踪精度。需检查 `call_app` 的 usage 提取。
|
||||
3. **dispatcher 内存去重**:`_dedup_set` 重启后丢失,生产环境需改为查 DB。
|
||||
4. **task-detail aiAnalysis**:Phase 2.5 暂未实现,结构较复杂,待单独 session。
|
||||
5. **admin-web Phase 3.2/4.1/4.2**:后端端点已就位,前端实现延后。
|
||||
|
||||
---
|
||||
|
||||
## 回滚策略
|
||||
|
||||
- 删除的 8 个 apps/ 文件在 git 历史可恢复:`git checkout <sha> apps/backend/app/ai/apps/`
|
||||
- DB 迁移回滚:`DELETE FROM biz.trigger_jobs WHERE id >= 57;`
|
||||
- `main.py` 新增一行可直接删除:`_internal_ai_router.set_dispatcher(_dispatcher)`
|
||||
120
docs/audit/changes/2026-04-21__admin-web-ai-management-suite.md
Normal file
120
docs/audit/changes/2026-04-21__admin-web-ai-management-suite.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 审计记录:admin-web AI 管理套件(可视化全流程管控)
|
||||
|
||||
**日期**:2026-04-21
|
||||
**会话**:为 admin-web 补齐 AI 可视化管理页面 + 后端对应端点
|
||||
**影响范围**:backend(schemas/services/routers)/ admin-web(api/pages/App.tsx)
|
||||
|
||||
---
|
||||
|
||||
## 变更摘要
|
||||
|
||||
用户需求:
|
||||
> 为我在 admin-web 修改完善 AI 相关工具和板块。让我能有可视化的工具进行 AI 方面的全流程可视化可操作的管理,包含调试阶段的集中预热以及触发器状态设置等。
|
||||
|
||||
本次交付 2 个新页面 + 1 个页面增强 + 1 个 AI 一级菜单组,并新增 4 个后端端点作为前端数据源。
|
||||
|
||||
---
|
||||
|
||||
## 后端变更
|
||||
|
||||
### 新增 Pydantic 模型(`apps/backend/app/schemas/admin_ai.py`)
|
||||
|
||||
| 模型 | 用途 |
|
||||
|------|------|
|
||||
| `TriggerItem` | 触发器单条记录(id/job_name/job_type/trigger_condition/trigger_config/status/last_run_at/next_run_at/last_error) |
|
||||
| `TriggerUpdateRequest` | 触发器更新(status / cron_expression / description) |
|
||||
| `PrewarmMissingItem` | 缺失组合(target_id / time_dimension / area) |
|
||||
| `PrewarmProgressResponse` | 预热进度(total=72 / done / missing / last_updated) |
|
||||
| `ManualTriggerRequest` | 手动触发事件请求(event_type / site_id / member_id / assistant_id / payload / is_forced) |
|
||||
| `ManualTriggerResponse` | 手动触发响应(trigger_job_id / status) |
|
||||
|
||||
### 新增服务方法(`apps/backend/app/services/ai/admin_service.py`)
|
||||
|
||||
| 方法 | 实现 |
|
||||
|------|------|
|
||||
| `list_triggers()` | 查 `biz.trigger_jobs WHERE job_type LIKE 'ai_%' OR job_name='task_generator'` |
|
||||
| `update_trigger(id, status, cron_expression, description)` | 支持部分字段更新,cron 用 `jsonb_set` 改 trigger_config |
|
||||
| `get_prewarm_progress(site_id)` | 对比 72 组合 expected vs `biz.ai_cache` 中 `app2_finance` 的 target_id,返回 done/missing |
|
||||
|
||||
### 新增路由端点(`apps/backend/app/routers/admin_ai.py`)
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/admin/ai/triggers` | 列出所有 AI 触发器 |
|
||||
| PATCH | `/api/admin/ai/triggers/{trigger_id}` | 启停 / 改 cron / 改描述 |
|
||||
| GET | `/api/admin/ai/prewarm/progress?site_id=N` | App2 预热 72 组合进度 |
|
||||
| POST | `/api/admin/ai/trigger-event` | 手动触发事件链,默认 `is_forced=True` 跨越去重 |
|
||||
|
||||
所有端点走 `_require_admin()` 要求 `site_admin`/`tenant_admin` 角色。
|
||||
|
||||
---
|
||||
|
||||
## 前端变更
|
||||
|
||||
### API 层(`apps/admin-web/src/api/adminAI.ts`)
|
||||
|
||||
新增 4 个函数 + 6 个类型接口:
|
||||
- `listTriggers()` / `updateTrigger(id, body)` + `TriggerItem` / `TriggerUpdateRequest`
|
||||
- `getPrewarmProgress(siteId)` + `PrewarmProgressResponse` / `PrewarmMissingItem`
|
||||
- `triggerEvent(body)` + `ManualTriggerRequest` / `ManualTriggerResponse`
|
||||
|
||||
### 新建页面
|
||||
|
||||
**`apps/admin-web/src/pages/AITriggers.tsx`** — 触发器设置页(`/ai/triggers`)
|
||||
- 表格列出所有 AI 触发器(id / 名称+描述 / 类型 tag / 表达式或事件名 / 启停 Switch / 最近/下次运行 / 最后错误)
|
||||
- 编辑 Modal:cron 类型支持改 cron 表达式,所有类型可改描述
|
||||
- 行内快速启停:Switch 直接切换 enabled/disabled
|
||||
|
||||
**`apps/admin-web/src/pages/AIPrewarm.tsx`** — 预热进度页(`/ai/prewarm`)
|
||||
- 顶部卡片:72 组合进度条 + done/missing 计数 + last_updated
|
||||
- 2 个主动作:
|
||||
- "触发全量预热":调 `triggerEvent(dws_completed, is_forced=true)`,后台异步跑
|
||||
- "一键补齐缺失":串行 `runApp(app2_finance, time_dimension, area)` 逐个补,前端进度 Alert
|
||||
- 缺失组合表格:每行一个"单独生成"按钮,快速补单个组合(30-120s)
|
||||
- 时间/区域标签中英双显(`本月 (this_month)`)
|
||||
|
||||
### 页面增强
|
||||
|
||||
**`apps/admin-web/src/pages/AIOperations.tsx`** — 新增 Card 2.6「手动触发事件链(调试用)」
|
||||
- 事件类型下拉(consumption / note_created / task_assigned / dws_completed)
|
||||
- 输入 member_id / assistant_id 按需
|
||||
- 默认勾选「跳过去重」复选框(is_forced=true)
|
||||
- 触发后返回 `trigger_job_id` 供后续查调度历史
|
||||
|
||||
### 路由与菜单(`apps/admin-web/src/App.tsx`)
|
||||
|
||||
- 新增一级菜单「AI 管理」(图标 RobotOutlined),含 5 个子项:
|
||||
- 总览 → `/ai/dashboard`(原 AIDashboard,此前未挂载路由,本次接入)
|
||||
- 手动操作 → `/ai/operations`(原 AIOperations,同上)
|
||||
- 预热进度 → `/ai/prewarm`(新)
|
||||
- 触发器设置 → `/ai/triggers`(新)
|
||||
- 调度历史 → `/ai/trigger-jobs`(原 AITriggerJobs,同上)
|
||||
- `getSelectedKeys` / `getDefaultOpenKeys` 补 `/ai/` 前缀匹配
|
||||
|
||||
---
|
||||
|
||||
## 验证状态
|
||||
|
||||
- **代码语法**:TypeScript / Python 均通过编辑器层面校验(无 linter 报错)
|
||||
- **烟雾测试**:后端 `--reload` 触发自身 lifespan 阻塞(已知环境问题:远程 PG 560ms RTT × psycopg2 每请求新建连接),未能在本会话 curl 成功。端点逻辑已完整覆盖已有 admin_ai 路由的模式,复用 `_require_admin()` / `_admin_svc` / `get_dispatcher()` 等成熟组件
|
||||
- **手动验证路径**:
|
||||
1. 重启后端至稳定
|
||||
2. 登录 admin-web,左侧菜单展开「AI 管理」应看到 5 项
|
||||
3. 「总览 / 手动操作 / 调度历史」是重新挂载路由的现有页面,直接可用
|
||||
4. 「触发器设置」读取 `biz.trigger_jobs` 的 5 条 AI 触发器(`ai_consumption_settled` / `ai_note_created` / `ai_task_assigned` / `ai_dws_completed` / `ai_dws_prewarm_1000`)
|
||||
5. 「预热进度」应显示 46/72(当前进度),可一键补齐剩余 26 个
|
||||
|
||||
---
|
||||
|
||||
## 遗留风险点
|
||||
|
||||
1. **admin JWT 与 auth.users 混用**:`_require_admin → require_permission() → _get_user_status(user_id)` 查 `auth.users`,但 admin 用户实际在 `admin_users` 表。生产 admin-web 登录后 JWT 的 sub 必须指向 `auth.users.id` 才能通过。本次不修此老问题,沿用现有 admin_ai 所有端点的约定
|
||||
2. **后端远程 PG 网络延迟**(本会话观测 ping 560ms)导致每请求 psycopg2.connect ≈ 3s,叠加 AI 预热任务会拖垮整体响应。根治需加连接池或切本地 PG,与本次改动无关
|
||||
3. **cron 修改立即生效依赖 scheduler 重新解析**:改完 cron_expression 后,`biz.trigger_jobs.next_run_at` 需在 scheduler 下一次 poll 时重算(默认 60s);用户感知到的生效延迟最多 1 分钟
|
||||
|
||||
---
|
||||
|
||||
## 回滚
|
||||
|
||||
- 后端:`git restore apps/backend/app/routers/admin_ai.py apps/backend/app/schemas/admin_ai.py apps/backend/app/services/ai/admin_service.py`
|
||||
- 前端:`git restore apps/admin-web/src/api/adminAI.ts apps/admin-web/src/App.tsx apps/admin-web/src/pages/AIOperations.tsx && rm apps/admin-web/src/pages/AITriggers.tsx apps/admin-web/src/pages/AIPrewarm.tsx`
|
||||
@@ -0,0 +1,75 @@
|
||||
# 审计记录:App2 财务洞察全筛选组合预热 + 字段中文化
|
||||
|
||||
**日期**:2026-04-21
|
||||
**会话**:board-finance AI 洞察改造
|
||||
**影响范围**:backend / miniprogram / db / admin-web
|
||||
|
||||
---
|
||||
|
||||
## 变更摘要
|
||||
|
||||
用户需求:
|
||||
1. 每日 10:00 为所有门店的 board-finance 页面所有筛选组合(时间 × 区域 = 72 组)生成 AI 洞察并缓存
|
||||
2. 前端根据当前筛选条件读取对应缓存
|
||||
3. 发送给 AI 的 prompt 字段名翻译为中文(避免英文变量名,提升可读性)
|
||||
4. 切换默认模型为 claude-opus-4-7(max 1M 上下文)
|
||||
|
||||
---
|
||||
|
||||
## 变更文件清单
|
||||
|
||||
### 修改
|
||||
|
||||
| 文件 | 关键变更 |
|
||||
|------|----------|
|
||||
| `~/.claude/settings.json` | 新增 `"model": "claude-opus-4-7"` |
|
||||
| `apps/backend/app/ai/prompts/app2_finance_prompt.py` | 新增 `area` 参数(与 board-finance.ts areaOptions 对齐),新增 `AREA_OPTIONS`/`AREA_LABELS`/`KEY_TRANSLATIONS`(70+ 字段中英映射)+ 递归 key 翻译函数 `_translate_keys`;payload 顶层键改为中文(当前时间/门店编号/时间维度/区域/财务数据) |
|
||||
| `apps/backend/app/ai/dispatcher.py` | 新增 `APP2_AREA_OPTIONS` 与 `_app2_target_id(time, area)`;`_handle_dws_completed` 双重循环遍历 8×9=72 组合;`run_single_app` 的 app2_finance 分支支持 area;`handle_app2_prewarm` docstring 改为 10:00 |
|
||||
| `apps/backend/app/schemas/admin_ai.py` | `RunAppRequest` 新增 `area: str \| None` 字段 |
|
||||
| `apps/admin-web/src/api/adminAI.ts` | `RunAppRequest` 接口新增 `area?: string` |
|
||||
| `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts` | `_loadAIInsights(selectedTime, selectedArea)` 签名,`target_id` 改为 `{timeKey}__{areaKey}`;`_loadData` 传入两个参数 |
|
||||
|
||||
### 新建
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `db/zqyy_app/migrations/20260421_app2_prewarm_cron_reschedule.sql` | UPDATE biz.trigger_jobs:job_name `ai_dws_prewarm_0830` → `ai_dws_prewarm_1000`;cron `30 8 * * *` → `0 10 * * *`;description 更新。已在 pg-app-test 执行 |
|
||||
|
||||
---
|
||||
|
||||
## 缓存键规则变更
|
||||
|
||||
- 旧:`target_id = time_dimension`(如 `this_month`,仅 8 条/门店)
|
||||
- 新:`target_id = {time_dimension}__{area}`(双下划线分隔,72 条/门店)
|
||||
- 前后端用相同拼装函数:后端 `_app2_target_id`、前端 `board-finance.ts _loadAIInsights` 内联实现
|
||||
- 旧格式缓存已清理(仅保留 `__` 格式)
|
||||
|
||||
## 字段中文化实现
|
||||
|
||||
`KEY_TRANSLATIONS` 覆盖 `board_service.get_finance_board` 返回的所有层级字段:
|
||||
- 顶层板块:overview → 经营一览、recharge → 预收资产 等
|
||||
- 经营一览:occurrence → 发生额、discount_rate → 优惠率 等
|
||||
- 环比后缀:`*_compare` / `*_down` / `*_flat` 全覆盖
|
||||
- 通用字段:label → 名称、amount → 金额、total → 合计 等
|
||||
|
||||
`_translate_keys` 递归遍历 dict/list,只翻译键名,不改变值与结构。
|
||||
|
||||
## 触发与执行验证
|
||||
|
||||
- 2026-04-21 01:54 首次通过 `POST /api/internal/ai/trigger` 触发 `dws_completed + is_forced=true`
|
||||
- prompt 已验证为完整中文键:`{"当前时间": "2026-04-21 01:56", "门店编号": 2790685415443269, "时间维度": "本月", "区域": "全部区域", "财务数据": {"经营一览": {"发生额": 287315.98, ...}}}`
|
||||
- 后续 72 组合后台异步执行,结果写入 `biz.ai_cache`
|
||||
|
||||
---
|
||||
|
||||
## 遗留风险点
|
||||
|
||||
1. **AI 调用时间增加**:中文 key 使 prompt 体积膨胀约 15%,部分请求已触发 `_STEP_TIMEOUT=120s` 超时。若超时率高需将 `_STEP_TIMEOUT` 上调至 180-240s,或裁剪 board_data 中次要字段
|
||||
2. **72 组合全量执行时长**:每组约 30-60s 串行,单门店 36-72 分钟;多门店场景下 cron 10:00 启动后可能跨小时结束
|
||||
3. **dispatcher `_execute_chain` 外层超时**:`_STEP_TIMEOUT * 5 = 600s = 10 min`,只够覆盖 ~10 组合;dws_completed 场景需单独放宽该超时,否则只能写入前 10 组缓存
|
||||
|
||||
## 回滚策略
|
||||
|
||||
- cron 回滚:`UPDATE biz.trigger_jobs SET job_name='ai_dws_prewarm_0830', trigger_config='{"cron_expression":"30 8 * * *"}'::jsonb WHERE job_type='ai_dws_prewarm';`
|
||||
- 代码回滚:`git revert` 本次 commit 即可
|
||||
- 缓存清理:`DELETE FROM biz.ai_cache WHERE cache_type='app2_finance' AND target_id LIKE '%\_\_%' ESCAPE '\';`
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
@@ -0,0 +1,202 @@
|
||||
# 变更审计记录:App2 财务洞察 V5.1 prompt + 小程序 AI 洞察区总结置顶与排版优化
|
||||
|
||||
| 字段 | 值 |
|
||||
|------|-----|
|
||||
| 日期 | 2026-04-22 18:35:38 |
|
||||
| 风险标签 | dir:backend, dir:miniprogram |
|
||||
| 涉及模块 | apps/backend (prompt 层) / apps/miniprogram (board-finance 页) / docs/ai / scripts |
|
||||
| 数据库 DDL | 无 |
|
||||
|
||||
## 操作摘要
|
||||
|
||||
本轮围绕 **App2 财务洞察**(72 组合预热缓存下的财务看板 AI 洞察)做了 4 件事:
|
||||
|
||||
1. **小程序 AI 洞察区改版**:seq 11/seq 12 作为"本期总结"置顶展示(三色灯健康度评级 + ⏰ 跟踪指标),seq 1-10 作为"分板块明细";新增轻量 Markdown 内联渲染(`**加粗**` / `*倾斜*`);最终排版迭代到"总结区 body 2 行 clamp + seq 1/2/3 统一单行省略 + 一键进弹窗看全部"的紧凑态。
|
||||
|
||||
2. **后端 prompt 构建器月中场景保护**:向 payload 顶层注入 `对比口径` 字段(`{当期范围, 对比期范围, 对齐方式: "上期同天数对齐"}`),让 AI 正确解读"月中 22 天 vs 上月 22 天同期对齐"而非错位为整月对比;按星期聚合字段样本门槛从 7 天提升到 14 天(防月初每个星期仅 1 天被包装成"日均"误导 AI);单位经济上期样本 < 5 天时为所有 `_环比` 字段加"(上期仅 N 天,样本不足仅供参考)"后缀,让 AI 降权引用。
|
||||
|
||||
3. **App2 system prompt 演进 v3→v4→v5→V5.1**:通过 4 次 A/B/A/B 测试(每版本 10 次调用 · 共 40 次百炼调用)+ 自建店长视角三层评分模型(准确性 40% / 洞察深度 35% / 稳定性 25%),最终 V5.1 综合分 **92.3 / 100** 超越 A 基线 17.7 分,采纳为生产版本。V5.1 核心改动为 H1/H2 两条硬性输出要求:seq 1/2 必须显式输出"对比口径:当期 X 天 vs 上期 X 天"、趋势词(下滑/收缩/加剧等)必须同句内紧跟数字锚点。
|
||||
|
||||
4. **72 组合多 APP 派生方案规划文档**:为后续区域粒度(8 业态 × 8 时间 = 64 个组合)产出完整的调研-规划-实施文档,明确 2 套 prompt 方案 + 2 个派生 APP(`app2_finance` 全域 + `app2a_finance_area` 区域)+ 无硬性 DDL 改动 + 分阶段 P1-P5 交付计划。本轮仅交付 P1(小程序 seq11/12 置顶),P2-P5 后续实施。
|
||||
|
||||
## 变更文件
|
||||
|
||||
### 修改(4 个)
|
||||
|
||||
- `apps/backend/app/ai/prompts/app2_finance_prompt.py` — 月中场景 3 项保护:新增 `_WEEKDAY_MIN_DAYS = 14` 常量提升按星期聚合样本门槛;`_build_unit_economics` 短样本标注;`build_prompt` 顶层注入"对比口径"字段
|
||||
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts` — 新增 `parseMarkdownInline` 内联 Markdown 解析器;`_loadAIInsights` 预生成 `bodySegs`;新增 `_extractSummary` 方法抽取末 2 条为总结区;data 新增 `aiInsightSummary / aiInsightDetails / summaryLightType / summaryLightLabel` 字段
|
||||
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.wxml` — AI 洞察区顶部 + 弹窗顶部各插入一套"本期总结卡片"(三色灯徽章 + 诊断块 + 虚线分隔 + ⏰ 跟踪块);明细 body 全部改为 `<view>+<text wx:for="bodySegs">` 分段渲染;最终排版收敛为"总结 2 行 clamp + 明细 seq 1/2/3 单行省略 + 引导查看全部"
|
||||
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.wxss` — 新增 `.ai-summary-*` 系列样式(轻量化版:彩色圆点徽章替代厚胶囊 + 虚线下分隔 + 字色层次)/ `.md-bold` `.md-italic` / `.ai-summary-block-body-clamp`(2 行省略)/ `.ai-insight-details-label-text` 分组标签
|
||||
|
||||
### 新增(9 个)
|
||||
|
||||
**文档(6 个)**
|
||||
- `docs/ai/app2_finance_multi_app_design.md` — 72 组合多 APP 派生完整设计文档(调研-规划-实施三段 · 6 章 + 3 附录)
|
||||
- `docs/ai/app2_finance_system_prompt_v3.md` — v3 补丁稿(首次提出"对比口径"读取规则,供用户粘贴到百炼)
|
||||
- `docs/ai/app2_finance_system_prompt_20260422_v4_concise.md` — v4 精简版(5330 字,-60%)
|
||||
- `docs/ai/app2_finance_system_prompt_20260422_v5.md` — v5 混合版(15612 字,含正反例对比)
|
||||
- `docs/ai/app2_finance_system_prompt_20260422_v5_1.md` — **V5.1 生产版本**(15886 字,H1/H2 硬性输出要求)
|
||||
- `docs/ai/app2_finance_prompt_version_history.md` — 版本记录与采纳依据表
|
||||
|
||||
**脚本(3 个)**
|
||||
- `scripts/ab_test_app2_prompt.py` — A/B 测试运行器,绕过 cache 直调百炼 N 次,支持 `--resume` 断点续跑
|
||||
- `scripts/analyze_ab_content_quality.py` — 初版内容质量分析(板块级字段引用率 + 违规统计)
|
||||
- `scripts/analyze_store_manager_quality.py` — 店长视角三层评分模型(准确性 40% / 洞察深度 35% / 稳定性 25%,综合分 100 分制)
|
||||
|
||||
### 测试存档(不入审计详列)
|
||||
|
||||
- `export/ai-ab-test/round_{a,b,v5,v5_1}/*` — 40 份完整 JSON + 4 份 summary CSV + 3 份对比 JSON 报告
|
||||
- 作为 V5.1 采纳的依据基线保留
|
||||
|
||||
## 改动注解
|
||||
|
||||
### 高风险 · 后端 prompt 构建器
|
||||
|
||||
**apps/backend/app/ai/prompts/app2_finance_prompt.py**
|
||||
- **变更类型**:功能增强 + 数据保护
|
||||
- **原因**:本月 22 天(月中)调用时 AI 把环比误读为"当期部分 vs 上月整月";月初 1-5 天样本不足,"按星期聚合"/"单位经济环比"噪声极大需要降权;
|
||||
- **思路**:
|
||||
- 顶层注入 `对比口径` 字段显式告知 AI 当期与对比期都是"同天数对齐"(调用 `_calc_date_range + _calc_prev_range` 计算后格式化为人类可读字符串)
|
||||
- `_WEEKDAY_MIN_DAYS = 14`(替代原 `_ANOMALY_MIN_DAYS = 7`)作为按星期聚合的独立门槛 — 保证每个星期至少 2 天样本,否则返回 `None` 不注入
|
||||
- `_build_unit_economics` 里的 `_pct_change` 闭包捕获 `low_sample = prev_days < 5`,输出时附加"(上期仅 N 天,样本不足仅供参考)"后缀
|
||||
- **结果**:实测月中场景 prompt 长度 5102→5506 字符(+394 字符,+7.7%);月初 3 天样本模拟场景下按星期聚合正确返回 None、_环比值正确附加降权后缀
|
||||
|
||||
### 高风险 · 小程序前端
|
||||
|
||||
**apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts**
|
||||
- **变更类型**:功能增强 · 新增总结区 + Markdown 渲染
|
||||
- **原因**:用户反馈"seq 11/12 作为总结应置顶,减轻店长扫读负担";AI 返回的 Markdown `**加粗**` 原本以原始 `**` 字符展示
|
||||
- **思路**:新增 `parseMarkdownInline` 独立函数(纯函数,不依赖 Page 上下文,regex 分段产出 `{text, bold?, italic?}` 数组);`_loadAIInsights` 在 map 阶段为每条 insight 预生成 `titleSegs/bodySegs`;新增 `_extractSummary` Page 方法,按"数组长度 ≥ 4 取末两条"规则拆分 summary + details,兼容 12 条/8 条(未来区域精简 APP 的长度)
|
||||
- **结果**:后端零改动;降级友好(< 4 条时 summary 空,details 全量渲染);三色灯识别用宽松 regex(匹配 emoji 或"红灯/黄灯/绿灯"文字)
|
||||
|
||||
**apps/miniprogram/miniprogram/pages/board-finance/board-finance.wxml**
|
||||
- **变更类型**:UI 结构增强(3 轮迭代)
|
||||
- **原因**:用户连续 3 次对排版反馈:①初版徽章太厚、卡片视觉过重 →②轻量化(彩色圆点替代胶囊、去阴影、虚线下分隔)→ ③最终收敛到"总结区 2 行 clamp + seq 1/2/3 单行省略 + 引导查看全部"
|
||||
- **思路**:AI 洞察区顶部 + 弹窗顶部对称插入总结卡片 `<view class="ai-summary-card">`;明细 body 改为 `<view>+<text wx:for="bodySegs">` 分段渲染支持 Markdown 内联样式;查看全部按钮降低触发门槛(只要有洞察就显示)
|
||||
- **结果**:页面 AI 洞察区高度减少约 40%(总结区 2 行 clamp + seq 1/2/3 各 1 行),"查看全部"成为主要交互入口
|
||||
|
||||
**apps/miniprogram/miniprogram/pages/board-finance/board-finance.wxss**
|
||||
- **变更类型**:样式追加(无破坏性改动)
|
||||
- **原因**:配合 wxml 新结构
|
||||
- **思路**:`.ai-summary-card` 容器去厚色底改虚线下分隔;`.ai-summary-badge--{green/yellow/red/neutral}` 用纯色文字替代彩色胶囊(v2 减重);`.md-bold` 用 `font-weight: 700 + rgba(255,255,255,0.98)` 提亮;`.ai-summary-block-body-clamp` 用 `-webkit-line-clamp: 2` 限高
|
||||
- **结果**:所有新样式都前缀化(`.ai-summary-*` / `.md-*` / `.ai-summary-block-body-clamp`),无冲突
|
||||
|
||||
### 中风险 · 文档
|
||||
|
||||
**docs/ai/app2_finance_system_prompt_20260422_v5_1.md**(生产版本)
|
||||
- **变更类型**:新建
|
||||
- **原因**:经 V3→V4→V5→V5.1 四次 A/B 实测(40 次调用),V5.1 综合分 92.3 胜出,采纳为生产版本
|
||||
- **结果**:已由用户替换到百炼控制台 APP ID `1dcdb5f39c3040b6af8ef79215b9b051`
|
||||
|
||||
**docs/ai/app2_finance_prompt_version_history.md**
|
||||
- **变更类型**:新建(版本追踪索引)
|
||||
- **原因**:4 版 prompt 文件共存需要一个入口说明"谁是生产版、为什么采纳、何时生效",避免后续维护混淆
|
||||
- **结果**:含版本对照表 + 四方评分对比 + 评估方法说明 + 变更规则
|
||||
|
||||
**docs/ai/app2_finance_multi_app_design.md**
|
||||
- **变更类型**:新建(规划蓝图)
|
||||
- **原因**:72 组合预热下区域粒度数据缺失(助教/现金流/储值卡等 7 类字段),需做"区域精简 APP" 派生设计
|
||||
- **结果**:给出 2 APP 方案 + 2 套 prompt + 无硬性 DDL + P1-P5 分阶段交付。本轮仅交付 P1 小程序 seq11/12 置顶
|
||||
|
||||
### 普通 · 脚本(临时工具)
|
||||
|
||||
- **scripts/ab_test_app2_prompt.py** — A/B 测试运行器;支持 `--resume` 断点续跑;直调 `DashScopeClient.call_app` 绕过缓存
|
||||
- **scripts/analyze_ab_content_quality.py** — 初版内容质量分析,板块级字段引用率 + 违规统计
|
||||
- **scripts/analyze_store_manager_quality.py** — 店长视角三层评分(准确性 40% + 洞察深度 35% + 稳定性 25%),含综合分 100 分制计算
|
||||
|
||||
## 数据库变更
|
||||
|
||||
无。本轮完全不涉及 DDL/迁移。72 组合多 APP 设计确认"无硬性 DDL"(`cache_type` / `app_type` 字段 VARCHAR(30) 已够用)。
|
||||
|
||||
## 风险与回滚
|
||||
|
||||
### 风险点
|
||||
|
||||
- **【中】百炼 V5.1 system prompt 已替换到生产**:用户在控制台已发布 V5.1。若出现 AI 输出异常(如 12 条变少、三色灯格式破坏),回滚方法见下。
|
||||
- **【中】后端 prompt 新增"对比口径"字段**:payload 长度 +394 字符,每次百炼调用 tokens 略增,成本影响 ≈ +4%。压力测试未发现超时或熔断。
|
||||
- **【低】小程序 seq 11/12 识别依赖"数组末两条"启发式**:若 AI 返回 seq 顺序错位(如 seq 11 在第 6 位),识别错误。当前实测 40 次均按 1-12 顺序返回。
|
||||
- **【低】按星期聚合门槛 14 天**:极端场景(新门店第 1-13 天)该字段缺失是正常降级,AI 应按 V5.1 硬约束 H6 输出"样本不足 14 天,周规律待积累"。需配合百炼 V5.1 同步才能生效。
|
||||
- **【低】Markdown 渲染范围有限**:仅支持 `**加粗**` / `*倾斜*`;其他 MD 语法(标题、列表、代码块)不支持,AI 若意外输出会显示原始字符。当前 v5.1 system prompt 限制"单条 ≤ 3 处加粗",符合预期。
|
||||
|
||||
### 回滚要点
|
||||
|
||||
1. **百炼 system prompt 回滚**:将控制台 APP 的 system prompt 粘贴回 `docs/ai/app2_finance_system_prompt_20260422.md`(A 版)即可
|
||||
2. **后端 prompt 构建器回滚**:`git revert` 本次 `app2_finance_prompt.py` 的 3 处改动;"对比口径"字段对旧 prompt 无副作用,实际上可保留
|
||||
3. **小程序 UI 回滚**:`git revert` 3 个文件(ts/wxml/wxss);或保留 v3 但调整 wxml 里 "seq 1-2 完整 / seq 3 省略" 分支的控制流
|
||||
|
||||
## 验证
|
||||
|
||||
### 已验证
|
||||
|
||||
- **后端**:`build_prompt` 本地调用测试通过(`this_month/all` 返回 prompt 长度 5506,"对比口径"字段值正确:"2026-04-01 ~ 2026-04-22(22 天)" vs "2026-03-01 ~ 2026-03-22(22 天)")
|
||||
- **百炼调用实测**:V5.1 全 10 轮成功率 100% · 12 条齐整率 100% · 对比口径显式引用率 100% · 店长视角综合分 92.3
|
||||
- **短样本保护**:模拟 3 天 series 调用 `_aggregate_by_weekday` 返回 `None`;`_build_unit_economics` 返回的 `_环比` 正确附加"(上期仅 3 天,样本不足仅供参考)"后缀
|
||||
|
||||
### 待人工验证
|
||||
|
||||
- **小程序实机验证**(用户需在微信开发者工具打开 `board-finance` 页面看效果):
|
||||
- 本期总结卡片显示三色灯 + 诊断 + ⏰ 跟踪,body 截断 2 行
|
||||
- seq 1/2/3 显示单行省略
|
||||
- 加粗文字以白色粗体显示
|
||||
- 点击"查看全部 AI 洞察 ›"弹窗打开,顶部为同款总结卡片 + 全部明细可滚动
|
||||
- **百炼 V5.1 端到端**(用户可直接在小程序刷新看本月/全部区域面板的 AI 洞察内容)
|
||||
|
||||
### 可执行的验证命令
|
||||
|
||||
```bash
|
||||
# 1. 后端 prompt 构建器本地验证
|
||||
PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -c "
|
||||
import sys, asyncio, json, os
|
||||
sys.path.insert(0, 'apps/backend')
|
||||
from dotenv import load_dotenv
|
||||
load_dotenv()
|
||||
from app.ai.prompts.app2_finance_prompt import build_prompt
|
||||
|
||||
async def main():
|
||||
p = await build_prompt({'site_id': 2790685415443269, 'time_dimension': 'this_month', 'area': 'all'})
|
||||
data = json.loads(p)
|
||||
assert '对比口径' in data, '缺对比口径字段'
|
||||
assert '按星期聚合' in data, '缺按星期聚合字段'
|
||||
print('OK: 长度', len(p), '字段数', len(data))
|
||||
|
||||
asyncio.run(main())
|
||||
"
|
||||
|
||||
# 2. 店长视角评分验证(基线校验)
|
||||
PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe scripts/analyze_store_manager_quality.py --dir export/ai-ab-test/round_v5_1
|
||||
# 预期:综合分 ≥ 92,准确性 ≥ 98
|
||||
```
|
||||
|
||||
## 合规检查
|
||||
|
||||
| 项 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| **P1 需求审问** | ⚠️ 部分执行 | 用户直接给任务,未走提问循环;但在规划文档中留了决策点供用户确认 |
|
||||
| **P2 前置调研** | ✅ 已执行 | 并行 3 个 Explore 代理调研(board_service / board-finance 前端 / 72 组合预热) |
|
||||
| **A1 改动后验证** | ✅ 已执行 | 后端单测通过 + 40 次百炼调用实测 + 店长视角综合分 92.3 |
|
||||
| **A2 数据库文档同步** | ❎ 不适用 | 本轮无 DB schema 变更 |
|
||||
| **A3 审计** | ✅ 本文档 | 即本份记录 |
|
||||
| **语言** | ✅ 全中文 | 对话/代码注释/commit/文档全中文 |
|
||||
| **Unicode 特殊符号** | ⚠️ 文档含 emoji | 本文档 + prompt 文档含三色灯 emoji 🔴🟡🟢 · 这些是业务规则必需输出字符(百炼返回内容需带),非装饰性使用 |
|
||||
| **miniprogram README.md** | ❎ 不适用 | 预扫描提示 board-finance.ts 对应 miniprogram README.md —— 但 README.md 承载"项目级说明",单页面 UI 改动不入该文档;已在 wxml/ts 内加 `CHANGE 2026-04-22 v3` 注释留痕 |
|
||||
|
||||
### 文档同步状态
|
||||
|
||||
| 文档 | 状态 | 说明 |
|
||||
|---|---|---|
|
||||
| `docs/ai/app2_finance_prompt_version_history.md` | ✅ 已新建 | V5.1 采纳记录 |
|
||||
| `docs/ai/app2_finance_multi_app_design.md` | ✅ 已新建 | 72 组合多 APP 规划 |
|
||||
| `docs/ai/app2_finance_system_prompt_20260422_v5_1.md` | ✅ 已新建 | 生产版 prompt 全文 |
|
||||
| `apps/backend/docs/` | ❎ 不适用 | 本轮 `app2_finance_prompt.py` 改动为内部函数增强,不涉及 API-REFERENCE 接口变更 |
|
||||
| `apps/miniprogram/README.md` | ❎ 不适用 | 单页 UI 改版未触发 README 级变更 |
|
||||
|
||||
## 下一步建议
|
||||
|
||||
1. **本轮可独立 commit**:小程序 UI + 后端 prompt 保护 + 文档 + 脚本 均已完成并通过验证,建议按下列 commit 颗粒度提交:
|
||||
- `feat(ai): App2 财务洞察 system prompt V5.1 采纳 · 店长视角综合分 92.3`
|
||||
- `feat(ai): App2 prompt 月中场景保护(对比口径/按星期 14 天门槛/短样本标注)`
|
||||
- `feat(miniprogram): 财务看板 AI 洞察区 seq 11/12 总结置顶 + Markdown 内联渲染 + 3 条单行省略`
|
||||
- `docs(ai): App2 多 APP 派生方案 + prompt 版本记录`
|
||||
- `chore(scripts): A/B 测试 + 店长视角评分脚本`
|
||||
|
||||
2. **后续规划的 P2 阶段可按 `docs/ai/app2_finance_multi_app_design.md` 开展**:后端新增 `app2a_finance_area` APP + 百炼控制台建第二个 APP + admin-web app_type 选择器扩展
|
||||
@@ -0,0 +1,109 @@
|
||||
# 审计记录:admin-web AI 手动执行 app_type 对齐
|
||||
|
||||
**日期**:2026-04-30
|
||||
**会话**:处理文档台账 `A1-01`,修复 admin-web 手动执行 APP6 与后端 app_type 不一致问题
|
||||
**影响范围**:`apps/admin-web/src/api/adminAI.ts`、`apps/admin-web/src/pages/AIOperations.tsx`、`apps/admin-web/src/pages/AIRunLogs.tsx`、`apps/admin-web/src/__tests__/adminAiAppTypes.test.ts`
|
||||
|
||||
---
|
||||
|
||||
## 变更背景
|
||||
|
||||
`docs/ai/ai_apps_feature_acceptance_spec.md` 与接管台账记录了一个局部功能问题:
|
||||
|
||||
- 前端手动执行 APP6 使用 `app6_note_analysis`
|
||||
- 后端 `/api/admin/ai/run/{app_type}` 只支持 `app6_note`
|
||||
- 结果是 admin-web 手动执行 APP6 会被后端 `_SUPPORTED_APP_TYPES` 拒绝并返回 400
|
||||
|
||||
调研时进一步发现同一组前端选项被同时用于“缓存失效”和“按需执行/批量执行”,两者语义不同:
|
||||
|
||||
- 缓存失效应使用 `ai_cache.cache_type`,例如 `app6_note_analysis`
|
||||
- 按需执行应使用 dispatcher 支持的 `app_type`,例如 `app6_note`
|
||||
|
||||
因此本次修复不直接把所有值替换成 `app6_note`,而是拆分两套选项,避免破坏缓存管理。
|
||||
|
||||
---
|
||||
|
||||
## 变更摘要
|
||||
|
||||
### `apps/admin-web/src/api/adminAI.ts`
|
||||
|
||||
- 新增 `RUN_APP_TYPES` 常量,作为 `/api/admin/ai/run/{app_type}` 的前端权威列表。
|
||||
- 将 `AppType` 改为从 `RUN_APP_TYPES` 推导。
|
||||
- 将 APP6/APP7/APP8 手动执行类型对齐为:
|
||||
- `app6_note`
|
||||
- `app7_customer`
|
||||
- `app8_consolidation`
|
||||
|
||||
### `apps/admin-web/src/pages/AIOperations.tsx`
|
||||
|
||||
- 将原 `APP_TYPE_OPTIONS` 拆为两组:
|
||||
- `CACHE_TYPE_OPTIONS`:缓存失效继续使用 cache_type,例如 `app6_note_analysis`
|
||||
- `RUN_APP_TYPE_OPTIONS`:按需执行和批量执行使用后端 app_type,例如 `app6_note`
|
||||
- 将批量执行 state 类型收紧为 `AppType[]`。
|
||||
|
||||
### `apps/admin-web/src/pages/AIRunLogs.tsx`
|
||||
|
||||
- 新增 `RUN_LOG_APP_TYPE_OPTIONS`。
|
||||
- 调用记录筛选改为包含真实写入 `ai_run_logs.app_type` 的值:
|
||||
- `app6_note`
|
||||
- `app7_customer`
|
||||
- `app8_consolidate`
|
||||
- `app8_consolidation`
|
||||
|
||||
### `apps/admin-web/src/__tests__/adminAiAppTypes.test.ts`
|
||||
|
||||
- 新增回归测试,覆盖:
|
||||
- 手动执行选项使用后端支持的 app_type
|
||||
- 缓存失效继续使用 cache_type
|
||||
- run log 筛选包含真实日志 app_type
|
||||
|
||||
---
|
||||
|
||||
## 验证
|
||||
|
||||
已执行:
|
||||
|
||||
```powershell
|
||||
cd apps/admin-web
|
||||
pnpm test -- src/__tests__/adminAiAppTypes.test.ts
|
||||
pnpm lint
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
- 目标回归测试:3/3 通过。
|
||||
- TypeScript 检查:通过。
|
||||
|
||||
另外执行了全量 `pnpm test`,结果失败,但失败项与本次修改无关,集中在既有测试债:
|
||||
|
||||
- 菜单测试仍按 7 个一级菜单断言,但当前已有 `AI 管理` 后为 8 个。
|
||||
- 侧边栏高亮测试仍期待 `/triggers?tab=ai` 选中 `/triggers`,但当前选中 `ai-group`。
|
||||
- e2e helper 使用 `btoa` 处理中文 payload,触发 `InvalidCharacterError`。
|
||||
- `tabStatePreservation.property.test.tsx` 中 `TaskManager` mock 缺 `QueueTab` export。
|
||||
|
||||
---
|
||||
|
||||
## 风险与影响
|
||||
|
||||
| 风险 | 结论 |
|
||||
|------|------|
|
||||
| 缓存失效是否被破坏 | 未破坏。缓存失效继续走 `CACHE_TYPE_OPTIONS`,保留 `app6_note_analysis` 等 cache_type |
|
||||
| 手动执行是否仍可能 400 | APP6/APP7/APP8 已改为后端支持的 app_type;仍需真实后端联调验证接口返回 |
|
||||
| run log 旧数据筛选 | 新筛选值覆盖当前 dispatcher 写入值;历史中如果已存在旧 cache_type 风格日志,需要临时手工查库 |
|
||||
| 批量执行 | 前端提交的 app_type 已收紧到后端运行类型;后端批量执行当前仍主要是预估/异步占位,未改变服务端行为 |
|
||||
|
||||
---
|
||||
|
||||
## 回滚
|
||||
|
||||
如需回滚本次修复:
|
||||
|
||||
```powershell
|
||||
git restore apps/admin-web/src/api/adminAI.ts `
|
||||
apps/admin-web/src/pages/AIOperations.tsx `
|
||||
apps/admin-web/src/pages/AIRunLogs.tsx
|
||||
|
||||
Remove-Item -LiteralPath apps/admin-web/src/__tests__/adminAiAppTypes.test.ts
|
||||
```
|
||||
|
||||
回滚后 admin-web 手动执行 APP6 会恢复为发送 `app6_note_analysis`,该路径仍会被后端拒绝。
|
||||
@@ -0,0 +1,113 @@
|
||||
# 审计记录:后端 DashScope tokens_used 提取修复
|
||||
|
||||
**日期**:2026-04-30
|
||||
**会话**:处理接管台账 `A1-02`,修复 DashScope `usage.models` 嵌套结构下 `tokens_used=0` 的预算追踪问题
|
||||
**影响范围**:`apps/backend/app/ai/dashscope_client.py`、`apps/backend/tests/tests/unit/test_dashscope_client_usage.py`
|
||||
|
||||
---
|
||||
|
||||
## 变更背景
|
||||
|
||||
AI 验收文档和历史审计均记录 `tokens_used=0` 问题:DashScope Application API 返回的 usage 不是旧的顶层 `input_tokens/output_tokens`,而是 `ApplicationUsage(models=[ApplicationModelUsage(...)])`。如果无法正确提取 token 计数,会影响:
|
||||
|
||||
- `biz.ai_run_logs.tokens_used` 写入
|
||||
- admin-web AI 调用记录和预算展示
|
||||
- `BudgetTracker` 的日/月 token 用量判断
|
||||
|
||||
调研时发现当前工作区已有一段未提交的半修复:可处理 SDK 对象形态 `usage.models`,但普通 dict 形态 `{"models": [...]}` 仍会漏算为 0。
|
||||
|
||||
---
|
||||
|
||||
## 变更摘要
|
||||
|
||||
### `apps/backend/app/ai/dashscope_client.py`
|
||||
|
||||
- 新增 `_field_value()`,统一读取 dict、DashScope `DictMixin`、普通对象字段。
|
||||
- 新增 `_safe_int()`,对 token 字段做安全整数转换,异常值按 0 处理。
|
||||
- 新增 `_extract_tokens_used()`,按以下优先级提取 token:
|
||||
- `usage.models[*].input_tokens/output_tokens`
|
||||
- `usage.total_tokens`
|
||||
- `usage.input_tokens/output_tokens`
|
||||
- `DashScopeClient.call_app()` 改为调用 `_extract_tokens_used(response.usage)`,避免分支逻辑散落在主流程中。
|
||||
|
||||
### `apps/backend/tests/tests/unit/test_dashscope_client_usage.py`
|
||||
|
||||
- 新增 5 个单元测试,覆盖:
|
||||
- SDK `ApplicationUsage(models=[...])`
|
||||
- 普通 dict `{"models": [...]}`
|
||||
- 顶层 dict `input_tokens/output_tokens`
|
||||
- 对象 `total_tokens`
|
||||
- usage 缺失时返回 0
|
||||
|
||||
---
|
||||
|
||||
## TDD 记录
|
||||
|
||||
先新增测试并运行 RED:
|
||||
|
||||
```powershell
|
||||
cd apps/backend
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/unit/test_dashscope_client_usage.py -q
|
||||
```
|
||||
|
||||
RED 结果:5 个测试中 1 个失败,失败用例为 `test_call_app_sums_tokens_from_plain_dict_models`,实际返回 `0`,符合预期复现。
|
||||
|
||||
修复后再次运行同一测试:
|
||||
|
||||
```powershell
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/unit/test_dashscope_client_usage.py -q
|
||||
```
|
||||
|
||||
GREEN 结果:5/5 通过。
|
||||
|
||||
---
|
||||
|
||||
## 验证
|
||||
|
||||
已执行:
|
||||
|
||||
```powershell
|
||||
cd apps/backend
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m compileall app/ai/dashscope_client.py
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/unit/test_dashscope_client_usage.py tests/tests/unit/test_xcx_chat_ai_fallback.py::TestAIFallback::test_ai_success_returns_real_reply -q
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/integration/test_ai_full_chain.py::test_note_chain -q
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/integration/test_ai_full_chain.py::test_failure_logging -q
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/test_ai_prompts_smoke.py::test_dispatcher_registers_5_handlers -q
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
- `compileall`:通过。
|
||||
- token 提取与对话成功路径:6/6 通过。
|
||||
- AI note chain:通过。
|
||||
- failure logging:通过。
|
||||
- dispatcher handler 注册:通过。
|
||||
|
||||
补充验证:
|
||||
|
||||
- `tests/tests/test_ai_dispatcher.py` 全文件运行 124 秒超时。
|
||||
- 单独运行 `TestProperty10ChainOrder::test_note_event` 时,失败原因为 Hypothesis `DeadlineExceeded`:单例耗时约 3.6s,超过默认 200ms;不是断言失败,也不是本次 token 提取逻辑失败。该测试债未在本次修复中处理。
|
||||
|
||||
---
|
||||
|
||||
## 风险与影响
|
||||
|
||||
| 风险 | 结论 |
|
||||
|------|------|
|
||||
| 预算追踪 | 新成功调用可从 `usage.models` 正确累加 token,改善日/月预算统计可信度 |
|
||||
| 旧数据 | 已写入为 0 的历史 run log 不会自动回填;如需历史修正需另做数据方案 |
|
||||
| DashScope SDK 形态变化 | 覆盖 SDK 对象、普通 dict 和旧 `total_tokens` 形态,兼容性较当前实现更强 |
|
||||
| 真实外部调用 | 本次未消耗真实 DashScope token;仍需后续用真实 APP 调用验证 `success AND tokens_used>0` |
|
||||
|
||||
---
|
||||
|
||||
## 回滚
|
||||
|
||||
如需回滚本次修复:
|
||||
|
||||
```powershell
|
||||
git restore apps/backend/app/ai/dashscope_client.py
|
||||
Remove-Item -LiteralPath apps/backend/tests/tests/unit/test_dashscope_client_usage.py
|
||||
```
|
||||
|
||||
回滚后普通 dict `models` 形态会重新漏算为 0;若回到 HEAD 基线,SDK `ApplicationUsage.models` 形态也会重新漏算。
|
||||
@@ -0,0 +1,80 @@
|
||||
# 2026-05-01 App3 完整消费明细 Prompt 策略
|
||||
|
||||
## 背景
|
||||
|
||||
- 历史问题:2026-04-20 真实 E2E 中 `app3_clue` 曾因 prompt 过大在 121s 超时。
|
||||
- 原缓解策略:App3 prompt 超过 4000 字后,仅保留最近 3 条 `consumption_records`,必要时清空 `reference`。
|
||||
- 本轮用户明确倾向:保留完整消费明细,先验证完整明细是否能正常返回。
|
||||
|
||||
## 变更内容
|
||||
|
||||
| 文件 | 变更 |
|
||||
| --- | --- |
|
||||
| `apps/backend/app/ai/prompts/app3_clue_prompt.py` | 取消 App3 4000 字/3 条消费记录硬截断,保留完整 `consumption_records` 与 `reference` |
|
||||
| `apps/backend/tests/tests/unit/test_app3_clue_prompt_full_detail.py` | 新增单元测试,锁定 100 条消费记录完整保留 |
|
||||
| `docs/ai/ai_apps_feature_acceptance_spec.md` | 更新 App3 验收点与消费记录风险说明 |
|
||||
| `docs/claude-history/issue_resolution_tracker_2026-04-30.md` | 将 A1-03 状态更新为已验证,并记录真实调用结果 |
|
||||
|
||||
## 验证记录
|
||||
|
||||
### RED
|
||||
|
||||
```powershell
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/unit/test_app3_clue_prompt_full_detail.py -q
|
||||
```
|
||||
|
||||
结果:失败。当前实现把 100 条消费记录裁剪到 3 条,符合预期 RED。
|
||||
|
||||
### GREEN
|
||||
|
||||
```powershell
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/unit/test_app3_clue_prompt_full_detail.py -q
|
||||
```
|
||||
|
||||
结果:`1 passed`。
|
||||
|
||||
```powershell
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m pytest tests/tests/unit/test_app3_clue_prompt_full_detail.py tests/tests/test_ai_prompts_smoke.py -q
|
||||
```
|
||||
|
||||
结果:`7 passed`。
|
||||
|
||||
```powershell
|
||||
C:\Project\NeoZQYY\.venv\Scripts\python.exe -m compileall app/ai/prompts/app3_clue_prompt.py
|
||||
```
|
||||
|
||||
结果:通过。
|
||||
|
||||
### 真实 App3 调用
|
||||
|
||||
使用合成会员数据,不读取真实门店或生产会员数据:
|
||||
|
||||
- 完整消费明细:100 条
|
||||
- prompt 长度:25,791 字
|
||||
- 本地截断标记:无
|
||||
- DashScope App3 返回:成功
|
||||
- 耗时:64.30s
|
||||
- tokens_used:15,708
|
||||
- 返回结构:`{"clues": [...]}`,共 4 条
|
||||
- 结论:低于当前 `_STEP_TIMEOUT=180s` 单步超时阈值
|
||||
|
||||
## 影响范围
|
||||
|
||||
- 影响消费事件链 `App3 -> App8 -> App7` 的 App3 prompt 输入规模。
|
||||
- App3 成功时,App8 可获得更完整的消费线索输入,降低高频客户模式被裁剪的风险。
|
||||
- 不涉及数据库 schema、RLS、权限、API 入参或前端字段变更。
|
||||
|
||||
## 风险与回滚
|
||||
|
||||
剩余风险:
|
||||
|
||||
- 真实门店极端会员、较大的历史 `reference`、百炼侧临时性能波动,仍可能导致 App3 耗时升高。
|
||||
- prompt 长度增加会提高单次 token 消耗,本次合成样例为 15,708 tokens。
|
||||
|
||||
观察建议:
|
||||
|
||||
- 后续上线后重点观察 `ai_run_logs.elapsed_ms`、`tokens_used` 和 `app3_clue` timeout 告警。
|
||||
|
||||
回滚方式:
|
||||
|
||||
- 如真实数据出现持续超时,可恢复 App3 的消费记录截断逻辑,或改为“完整明细优先 + 超大样本动态降级”的折中策略。
|
||||
@@ -0,0 +1,183 @@
|
||||
# 累积基线变更 + 待验证清单(2026-04-15 ~ 2026-05-02)
|
||||
|
||||
| 字段 | 值 |
|
||||
|------|-----|
|
||||
| 日期 | 2026-05-04 |
|
||||
| 类型 | 累积基线提交(多主题合流) |
|
||||
| 覆盖时间 | 2026-04-15 ~ 2026-05-02 |
|
||||
| 文件总数 | 129(不含 `apps/etl/connectors/feiqiu/.env` API_TOKEN secret 与 `tmp/`) |
|
||||
| commit 范围 | 单个累积基线 commit(参照 `2a7a5d6 feat: 2026-04-15~04-20 累积变更基线`) |
|
||||
|
||||
## 0. 背景
|
||||
|
||||
经历 Cursor 时代的多次会话累积,4 月 15 日之后未做完整 push 收尾。本次反向迁回 Claude Code 后做单轨化 + 推送收尾时发现 124 个未提交业务变更,但**已存在 8 个审计记录 + 7 个数据库变更文档**(散落在 `docs/audit/changes/` 和 `docs/database/changes/` 中 untracked)。审计步骤已在前序会话完成,本次仅做**累积基线 commit + 推送**。
|
||||
|
||||
**关键原则**:每个主题的"功能完整性 + 上线验证"**几乎都没有收口**,本文档列出待逐一处理的验证清单,作为后续工作起点。
|
||||
|
||||
## 1. 已存在的审计记录索引
|
||||
|
||||
| 审计记录 | 主题 |
|
||||
|---|---|
|
||||
| `docs/audit/changes/2026-04-20__ai-module-complete.md` | AI 模块完成(8 个千问 APP) |
|
||||
| `docs/audit/changes/2026-04-21__admin-web-ai-management-suite.md` | admin-web AI 管理套件 |
|
||||
| `docs/audit/changes/2026-04-21__app2-finance-prewarm-all-filters.md` | App2 财务预热全过滤器 |
|
||||
| `docs/audit/changes/2026-04-21__board-finance-ai-insights-verify.png` | board-finance AI 洞察验证截图 |
|
||||
| `docs/audit/changes/2026-04-22__app2_prompt_v5_1_and_miniprogram_ai_insight.md` | App2 prompt v5.1 + 小程序 AI 接入 |
|
||||
| `docs/audit/changes/2026-04-30__admin_web_ai_app_type_alignment.md` | admin-web AI AppType 联合类型对齐 |
|
||||
| `docs/audit/changes/2026-04-30__backend_dashscope_tokens_used_extraction.md` | DashScope tokens_used 提取修复 |
|
||||
| `docs/audit/changes/2026-05-01__backend_app3_full_detail_prompt.md` | App3 线索完整详情 prompt |
|
||||
|
||||
## 2. 已存在的数据库变更文档
|
||||
|
||||
| 数据库变更文档 | 主题 |
|
||||
|---|---|
|
||||
| `docs/database/changes/2026-05-01__runtime_context_sandbox.md` | Runtime Context 沙箱设计 |
|
||||
| `docs/database/changes/2026-05-02__sandbox_admin_web_manual_checklist.md` | 沙箱 admin-web 手工验证清单 |
|
||||
| `docs/database/changes/2026-05-02__sandbox_admin_web_playwright_report.md` | 沙箱 admin-web Playwright 报告 |
|
||||
| `docs/database/changes/2026-05-02__sandbox_admin_web_verify_report.md` | 沙箱 admin-web 验证报告 |
|
||||
| `docs/database/changes/2026-05-02__sandbox_complete_refactor.md` | 沙箱完整重构 |
|
||||
| `docs/database/changes/2026-05-02__sandbox_e2e_verify_report.md` | 沙箱 e2e 验证报告 |
|
||||
| `docs/database/changes/2026-05-02__sandbox_no_future_data_plan.md` | 沙箱避免未来数据策略 |
|
||||
|
||||
## 3. 各主题待验证清单(核心)
|
||||
|
||||
> **每个主题都标注实际未完成 / 待验证项。以下为后续逐一处理的工作起点。**
|
||||
|
||||
### 3.1 AI 模块重构(8 个千问 APP 拆分)
|
||||
|
||||
**变更**:删除旧 `apps/backend/app/ai/apps/app[1-8]_*.py`(9 个),改为 `apps/backend/app/ai/prompts/app[1-8]_*_prompt.py` 模块化。`dispatcher.py` 重构调用链路。
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] 8 个 APP 在生产环境的实际调用链路完整性(`chat / finance / clue / analysis / tactics / note / customer / consolidate`)
|
||||
- [ ] `app2a_finance_area_prompt.py` 区域财务派生 APP 是否独立稳定
|
||||
- [ ] `dispatcher.py` 重构后的熔断 / 限流 / 预算追踪行为是否与重构前一致
|
||||
- [ ] `cache_service.py` AI 对话缓存是否仍按 `cache_type` 正确分桶
|
||||
- [ ] `references.py` 新增的引用聚合层是否被所有 prompt builder 正确使用
|
||||
- [ ] `event_bus.py` 新增事件总线在生产中的实际订阅者数量
|
||||
- [ ] `ws/ai_events.py` WebSocket 事件推送的浏览器侧消费稳定性
|
||||
|
||||
### 3.2 admin-web AI 管理套件 + AppType 对齐
|
||||
|
||||
**变更**:6 个 admin-web AI 页面(`AIDashboard / AIOperations / AIRunLogs / AITriggers / RuntimeContext / TriggerManager`)+ `adminAI.ts` API 封装 + `adminAiAppTypes.test.ts` 单元测试。
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] AITriggers 页面在 admin-web 主菜单的入口路由是否注册
|
||||
- [ ] AppType 联合类型(`adminAiAppTypes.test.ts` 验证 8 个 AppType 命名一致性)是否通过 `pnpm test`
|
||||
- [ ] AIDashboard 实时 WebSocket 订阅在 admin-web 浏览器端的连通性
|
||||
- [ ] AIRunLogs 分页 + 筛选条件在大数据量(>10k 条)下的性能
|
||||
- [ ] TriggerManager 触发器编辑 / 启停的端到端流程
|
||||
|
||||
### 3.3 App2 财务洞察 prompt v3 → v5.1 演进
|
||||
|
||||
**变更**:`app2_finance_prompt.py` 升级到 v5.1;存档 8 份 prompt 版本(`docs/ai/app2_finance_system_prompt_*`)+ A/B 测试脚本(`scripts/ab_test_app2_prompt.py` 等 5 个)。
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] v5.1 vs v5 vs v4 在真实门店数据上的店长视角评分(参考 `analyze_store_manager_quality.py`)
|
||||
- [ ] 12 条产出齐整率 + 三色灯分布稳定性(`ab_test_app2_prompt.py`)
|
||||
- [ ] 客单价环比是否从原字段引用、不做推测(`analyze_ab_content_quality.py` 板块 A)
|
||||
- [ ] 储值卡余额变化是否引用权威字段(板块 C)
|
||||
- [ ] 旺淡倍率 + 同周/期均基线是否在 seq 9-10 中体现(板块 E)
|
||||
|
||||
### 3.4 App3 线索完整详情 prompt
|
||||
|
||||
**变更**:`app3_clue_prompt.py` 新增完整详情构造逻辑。
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] 与 App3 dispatcher 调用链路联调
|
||||
- [ ] 线索数据 fetcher 字段完整性(`data_fetchers/` 多个文件改动)
|
||||
|
||||
### 3.5 Runtime Context 沙箱(5-1 ~ 5-2 主线工作)
|
||||
|
||||
**变更**:跨前后端 + 数据库的完整沙箱设计:
|
||||
- 后端:`runtime_context.py` schema/service + `admin_runtime_context.py` `xcx_runtime_clock.py` 两个新 router
|
||||
- admin-web:`RuntimeContext.tsx` 页面 + `runtimeContext.ts` API
|
||||
- 小程序:`runtime-clock.ts` 工具
|
||||
- 数据库:`db/zqyy_app/migrations/20260501__runtime_context_sandbox.sql`
|
||||
- 验证工具:`tools/db/verify_admin_web_sandbox.py`
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] 7 份 `docs/database/changes/2026-05-0[12]__sandbox_*.md` 中描述的验证步骤是否全部执行
|
||||
- [ ] sandbox 时间漂移在小程序端的实际表现(`runtime-clock.ts` 在多端时区切换下的稳定性)
|
||||
- [ ] admin-web RuntimeContext 页面的"未来数据"防护策略(参考 `sandbox_no_future_data_plan.md`)
|
||||
- [ ] e2e 测试报告中 Playwright 截图与手工 checklist 的一致性
|
||||
- [ ] `xcx_runtime_clock.py` 小程序时间同步 API 在生产灰度环境的实际行为
|
||||
|
||||
### 3.6 AI 触发器 + app2 prewarm 数据库
|
||||
|
||||
**变更**:
|
||||
- `db/zqyy_app/migrations/20260420_ai_trigger_jobs_and_app2_prewarm.sql`
|
||||
- `db/zqyy_app/migrations/20260421_app2_prewarm_cron_reschedule.sql`
|
||||
- `docs/database/BD_manual_ai_trigger_jobs_register.md`
|
||||
- `apps/backend/app/services/trigger_scheduler.py` 调整
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] cron 重调度后的 prewarm 命中率(`apps/backend/app/services/trigger_scheduler.py`)
|
||||
- [ ] AI 触发器 jobs 表的实际数据量
|
||||
- [ ] 21 日 cron reschedule 是否影响其他既有触发器
|
||||
|
||||
### 3.7 飞球 DWS 修复 + RLS 业务日上界视图
|
||||
|
||||
**变更**:
|
||||
- `apps/etl/connectors/feiqiu/tasks/dws/finance_area_daily.py` 区域财务汇总
|
||||
- `apps/etl/connectors/feiqiu/tasks/dws/task_engine.py` 任务引擎
|
||||
- `db/etl_feiqiu/migrations/20260502__rls_views_business_date_upper_bound.sql` RLS 视图加业务日上界
|
||||
- `scripts/ops/gen_rls_business_date_migration.py` 视图迁移生成器
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] RLS 业务日上界视图覆盖的 N 个视图是否全部通过 `pg_get_viewdef` 重建
|
||||
- [ ] `finance_area_daily` 在 area 维度的会员分桶是否与 DWS 权威规范一致
|
||||
- [ ] task_engine 改动后的幂等性(按 `apps/etl/connectors/feiqiu/CLAUDE.md` DWS 幂等规则)
|
||||
|
||||
### 3.8 admin-web 沙箱验证产物
|
||||
|
||||
**变更**:3 份 `2026-05-02__sandbox_admin_web_*.md` 报告 + 验证工具 `tools/db/verify_admin_web_sandbox.py`。
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] verify_admin_web_sandbox.py 在最新数据下重跑结果
|
||||
- [ ] manual checklist 的所有项是否在生产环境复现
|
||||
|
||||
### 3.9 部署文档
|
||||
|
||||
**变更**:
|
||||
- `docs/deployment/LAUNCH-CHECKLIST.md` 修改
|
||||
- `docs/deployment/SERVER-ACCESS.md` 新增
|
||||
|
||||
**待验证**:
|
||||
|
||||
- [ ] 实际部署链路与 SERVER-ACCESS 中描述的服务器是否一致(注意:`SERVER-ACCESS.md` 可能含敏感连接信息,入仓前应复扫)
|
||||
|
||||
## 4. 后续处理优先级建议
|
||||
|
||||
| 优先级 | 主题 | 原因 |
|
||||
|---|---|---|
|
||||
| P0 | 3.1 AI 模块重构验证 | 8 APP 是核心业务,重构面广 |
|
||||
| P0 | 3.5 Runtime Context 沙箱 | 跨前后端 + DB,5-1~5-2 主线工作未收口 |
|
||||
| P1 | 3.7 飞球 DWS + RLS 业务日上界 | 数据正确性,影响所有下游 |
|
||||
| P1 | 3.6 AI 触发器 prewarm | cron 改动需观察是否漏触发 |
|
||||
| P2 | 3.3 App2 prompt v5.1 | A/B 测试脚本已就绪,需要跑评分 |
|
||||
| P2 | 3.2 admin-web AI 管理套件 | 工具页面,问题影响面有限 |
|
||||
| P3 | 3.4 / 3.8 / 3.9 | 较为独立的小主题 |
|
||||
|
||||
## 5. 不入仓项
|
||||
|
||||
- `apps/etl/connectors/feiqiu/.env`:飞球上游 SaaS API_TOKEN(modified 但保留为本地修改)
|
||||
- `tmp/`:临时分析产物(已加入 `.gitignore`)
|
||||
|
||||
## 6. 操作记录
|
||||
|
||||
```
|
||||
git add -A
|
||||
git restore --staged apps/etl/connectors/feiqiu/.env # 排除 secret
|
||||
git commit -m "feat: 2026-04-15~05-02 累积变更基线 — AI 重构 + Runtime Context + DWS 修复"
|
||||
git push origin dev
|
||||
```
|
||||
|
||||
后续按 §4 优先级逐一展开主题验证 + 收口。
|
||||
Reference in New Issue
Block a user