Files
Neo-ZQYY/docs/audit/changes/2026-03-24__p18-task-engine-dashboard.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

127 lines
7.6 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.
# 变更审计记录P18 任务引擎运营看板实施
| 字段 | 值 |
|------|-----|
| 日期 | 2026-03-24 07:44:01 |
| Prompt-ID | P20260324-072446 |
| Session-ID | — |
| Session 路径 | — |
## 操作摘要
基于已评审通过的 P18 PRDv2.1-reviewed实施管理后台任务引擎运营看板。新增 3 个前端页面转移日志、待审核任务、参数管理、9 个后端 API 端点、12 个 Pydantic Schema、1 个 DDL 迁移trigger_jobs.last_stats + cfg_task_generator_params.updated_by
## 变更文件清单
### DDL 迁移
- `db/zqyy_app/migrations/2026-03-24__p18_task_engine_dashboard.sql` — trigger_jobs 新增 last_stats JSONBcfg_task_generator_params 新增 updated_by BIGINT
- `docs/database/ddl/zqyy_app__biz.sql` — DDL 基线合并
### 后端(新建)
- `apps/backend/app/schemas/admin_task_engine.py` — 12 个 Pydantic v2 模型
- `apps/backend/app/routers/admin_task_engine.py` — 9 个端点(转移日志分页+历史、待审核任务分页+重新分配+关闭、参数管理 CRUD
### 后端(修改)
- `apps/backend/app/main.py` — 追加 admin_task_engine router 注册
### 前端(新建)
- `apps/admin-web/src/api/taskEngine.ts` — API 调用模块(类型定义 + 9 个 API 函数)
- `apps/admin-web/src/pages/TransferLog.tsx` — 客户转移日志页面
- `apps/admin-web/src/pages/PendingReview.tsx` — 待审核任务页面
- `apps/admin-web/src/pages/TaskEngineConfig.tsx` — 参数管理页面
### 前端(修改)
- `apps/admin-web/src/App.tsx` — 新增任务引擎菜单组 + 3 个路由 + defaultOpenKeys
### 一次性脚本
- `scripts/ops/_p18_migrate.py` — DDL 迁移执行脚本(已执行完毕)
## 本次对话文件变更
### 新增文件
- `docs/audit/prompt_logs/prompt_log_20260324_072446.md`
- `docs/audit/session_logs/2026-03/24/29_3bf23309_071526/main_01_83361313.md`
## 风险点与待办
1. ⚠️ sites 表 JOIN 条件已修复(`s.site_id = t.site_id`),但需联调验证
2. ⚠️ FDW 姓名关联member_name/assistant_name尚未实现当前返回空字符串前端降级显示 ID
3. ⚠️ 权重参数联合校验依赖数据库事务,需验证并发场景
4. ⚠️ DDL 基线已合并(`docs/database/ddl/zqyy_app__biz.sql`
## DDL/迁移状态
- 迁移文件:`db/zqyy_app/migrations/2026-03-24__p18_task_engine_dashboard.sql`
- 新增字段:`biz.trigger_jobs.last_stats` (JSONB)、`biz.cfg_task_generator_params.updated_by` (BIGINT)
- 迁移脚本使用 `ADD COLUMN IF NOT EXISTS`,幂等安全
- DDL 基线:已合并到 `docs/database/ddl/zqyy_app__biz.sql`
## 改动注解
### `db/zqyy_app/migrations/2026-03-24__p18_task_engine_dashboard.sql`
- 变更类型:新增
- 原始原因P18 运营看板需要 trigger_jobs 表记录最近一次执行统计last_stats JSONB以及 cfg_task_generator_params 表记录修改人updated_by BIGINT用于审计追溯
- 思路分析:使用 `ADD COLUMN IF NOT EXISTS` 保证幂等性last_stats 为 JSONB 类型,灵活存储 created/replaced/skipped/transferred 等统计数字updated_by 为 BIGINT 对应 user_id
- 修改结果trigger_jobs 表新增 1 字段cfg_task_generator_params 表新增 1 字段,均可空,不影响现有查询
### `apps/backend/app/schemas/admin_task_engine.py`
- 变更类型:新增
- 原始原因P18 运营看板 9 个 API 端点需要请求/响应数据模型
- 思路分析12 个 Pydantic v2 模型,按功能分组(转移日志 2 个、待审核任务 6 个、参数管理 4 个)。所有模型使用 `str | None` 联合类型语法,字段默认值合理(如 member_name 默认空字符串,兼容 FDW 姓名未关联场景)
- 修改结果:为 admin_task_engine router 提供完整的类型安全数据模型
### `apps/backend/app/routers/admin_task_engine.py`
- 变更类型:新增
- 原始原因P18 运营看板需要 9 个管理端 API 端点,覆盖转移日志查看、待审核任务管理、参数配置 CRUD
- 思路分析:路由前缀 `/api/admin/task-engine`,写操作通过 `_require_super_admin()` 限制仅超级管理员;读操作通过 `_filter_site_id()` 实现门店管理员数据隔离。SQL 使用参数化查询防注入sites 表 JOIN 使用 `s.site_id`(已修复原 `s.id` 错误。权重参数更新后做联合校验w_rs + w_ms + w_ml = 1.0
- 修改结果9 个端点全部注册,含完整的权限校验、门店隔离、事务管理和错误处理
### `apps/backend/app/main.py`
- 变更类型:修改
- 原始原因:新增的 admin_task_engine router 需要在 FastAPI 应用中注册
- 思路分析:在 import 行和 `app.include_router()` 调用中追加 admin_task_engine保持与现有 router 注册模式一致
- 修改结果admin_task_engine router 已注册9 个端点可通过 /docs 访问
### `apps/admin-web/src/api/taskEngine.ts`
- 变更类型:新增
- 原始原因:前端 3 个页面需要与后端 9 个 API 端点通信
- 思路分析:定义 TypeScript 接口TransferLogItem/Page、PendingReviewItem/Page、ConfigParam/List和 9 个 API 函数,使用 apiClientAxios 实例)统一处理 JWT 认证和错误
- 修改结果:前端 API 层完整覆盖后端所有端点
### `apps/admin-web/src/pages/TransferLog.tsx`
- 变更类型:新增
- 原始原因:运营团队需要查看客户转移日志,按门店/时间/助教筛选
- 思路分析Ant Design Table 分页表格 + RangePicker 日期筛选 + InputNumber 门店/助教 ID 筛选。guard_checks JSON 渲染为彩色标签(通过/未通过。transfer_reason 映射中文标签
- 修改结果转移日志页面完整可用支持分页、筛选、guard_checks 可视化
### `apps/admin-web/src/pages/PendingReview.tsx`
- 变更类型:新增
- 原始原因:运营团队需要审核 pending_review 状态的任务,执行重新分配或关闭操作
- 思路分析:分页表格 + 重新分配弹窗(输入目标助教 ID+ 关闭弹窗(填写原因)+ 转移历史抽屉(点击客户名查看)。操作列仅超级管理员可见(`isSuperAdmin` 判断)
- 修改结果:待审核任务页面完整可用,含权限控制和完整的操作流程
### `apps/admin-web/src/pages/TaskEngineConfig.tsx`
- 变更类型:新增
- 原始原因:运营团队需要按门店调整任务生成参数,监控参数配置
- 思路分析:全局默认 + 门店覆盖参数表格行内编辑单个参数值。权重参数w_rs/w_ms/w_ml使用独立的卡片编辑弹窗前端预校验三者之和 = 1.0。新增门店覆盖通过 Select 选择参数名 + InputNumber 输入值。全局默认参数禁止删除
- 修改结果:参数管理页面完整可用,含行内编辑、权重卡片编辑、新增/删除门店覆盖
### `apps/admin-web/src/App.tsx`
- 变更类型:修改
- 原始原因:新增的 3 个页面需要在侧边栏导航和路由中注册
- 思路分析:新增 ApartmentOutlined 图标 import、3 个页面 import、task-engine-group 菜单组(含 3 个子菜单、3 个 Route、defaultOpenKeys 补充 task-engine-group当路径以 /task-engine/ 开头时自动展开)
- 修改结果侧边栏新增「任务引擎」菜单组3 个子页面路由正常工作
### `scripts/ops/_p18_migrate.py`
- 变更类型:新增
- 原始原因DDL 迁移需要执行脚本
- 思路分析:一次性脚本,连接测试库执行迁移 SQL
- 修改结果:迁移已执行完毕,脚本保留用于记录
## 验证建议
1. 启动后端 `uvicorn app.main:app --reload`,访问 /docs 确认 9 个端点注册
2. 启动前端 `pnpm dev`,验证侧边栏「任务引擎」菜单组和 3 个页面路由
3. 用 super_admin JWT 测试写操作,用 site_admin JWT 验证 403