baodan/docs/workspace-implementation-log.md

98 lines
4.8 KiB
Markdown
Raw Normal View History

# 工作区改造实施记录
## 实施日期
2026-07-28
## 已完成内容(阶段 1 + 阶段 2 核心)
### 1. 数据库迁移(阶段 1
- **文件**: `api/insurance/db/migrate_022.py`
- 扩展 `insurance_ppt_sessions` 表:新增 title、workflow_step、draft_options_json、draft_revision、generated_revision、latest_task_id、latest_output_path、archived_at 字段
- 扩展 `poster_records` 表:新增 title、workflow_step、draft_status、draft_revision、generated_revision、latest_task_id、archived_at 字段
- 新建 `insurance_generation_tasks` 表:统一任务执行表,含状态机、进度、快照、幂等键等
### 2. 数据模型更新(阶段 1
- **PptSession** (`api/insurance/models/ppt_session.py`):添加工作区字段和 to_dict 输出
- **PosterRecord** (`api/insurance/models/poster_record.py`):添加工作区字段和 to_dict 输出,修复 Integer 导入
- **GenerationTask** (`api/insurance/models/generation_task.py`):新建统一任务模型
### 3. Celery 任务模块(阶段 2
- **celery_tasks.py** (`api/insurance/generation/celery_tasks.py`)
- `parse_ppt_task`: PPT PDF 解析任务
- `generate_ppt_task`: PPT 生成任务
- `parse_poster_task`: 海报计划书解析任务
- `generate_poster_task`: 海报图片生成任务
- 所有任务通过数据库状态机保证幂等queued → running → done/failed
- 使用 `@shared_task` 装饰器自动注册到 Celery
- **task_service.py** (`api/insurance/generation/task_service.py`)
- `create_task()`: 创建任务并提交到 Celery含幂等检查和并发控制
- `list_active_tasks()`: 查询活跃任务(任务坞用)
- `list_tasks()`: 查询任务列表(任务中心用)
- `get_task()`: 获取任务详情
- `cancel_task()`: 取消排队中的任务
- `hide_task_from_dock()`: 从任务坞隐藏任务
### 4. 工作区 API阶段 1 + 2
- **routes.py** (`api/insurance/generation/routes.py`)
- PPT 工作区:列表、详情、重命名、归档、取消归档
- 海报工作区:列表、详情、重命名、归档
- 统一任务:列表、活跃任务(坞)、详情、取消、隐藏
### 5. 路由注册
- **routes.py** (`api/insurance/routes.py`)
- 注册 workspace Blueprint 到 `/insurance/workspace` 前缀
- 添加 Celery 任务注册函数 `_register_celery_tasks()`
### 6. 服务层改造
- **PPT routes** (`api/insurance/ppt/routes.py`)
- `parse_session`: 改为通过 task_service 创建异步任务
- `generate_ppt`: 改为异步任务,返回 202 Accepted + taskId
- **Poster service** (`api/insurance/poster/service.py`)
- `generate_poster`: 改为通过 task_service 创建 Celery 任务
## 待完成内容
### 阶段 2 补全
- [x] Worker 心跳更新_update_task_status 每次更新 heartbeat_at
- [x] 过期任务自动恢复recover_stale_tasks 启动时调用)
### 阶段 3前端刷新恢复与多工作区3-4 人日)
- [x] 新增工作区路由(/ppt/:sessionId, /poster/:recordId
- [x] 状态驱动当前步骤(根据 workflow_step 自动跳转)
- [x] 恢复草稿和解析结果usePptWorkspace / usePosterWorkspace composable
- [x] 工作区列表入口页WorkspaceListPage.vue + /ppt/workspaces, /poster/workspaces
- [x] 任务复制(后端 copy 接口 + 前端复制操作)
### 阶段 4全局任务坞与任务中心2-3 人日)
- [x] 新增 GenerationTaskDock 组件浮动面板5s 轮询)
- [x] 新增任务中心页面TasksPage.vue
- [x] 侧边栏添加"任务中心"入口
- [x] 未读完成和失败提示el-badge 通知气泡)
- [x] 移动端抽屉适配(已在 App.vue 移动端菜单中添加任务中心入口)
### 阶段 5版本化编辑2-3 人日)
- [x] 草稿自动保存useAutoSave composable + 后端 PATCH 接口)
- [x] 乐观锁expected_revision 冲突检测)
- [x] 输入快照(已在 GenerationTask 模型中实现)
- [x] 草稿版本和成品版本draft_revision / generated_revision
- [x] 未生成修改提示DraftIndicator 组件)
- [x] 输出文件按 task 隔离PPT: outputs/ppt/{uid}/{task_id}/, 海报: outputs/posters/{task_id}/
### 阶段 6测试与灰度2-3 人日)
- [ ] 单元测试
- [ ] Celery 集成测试
- [ ] 多任务端到端测试
- [ ] Worker 中断测试
- [ ] 多标签页测试
- [ ] 权限和文件安全测试
- [ ] 数据迁移和旧历史兼容测试
## 注意事项
1. **Celery Worker 启动验证**:部署后需要验证 `insurance.parse_ppt`、`insurance.generate_ppt`、`insurance.parse_poster`、`insurance.generate_poster` 四个任务是否已注册到 Worker
2. **数据库迁移**:部署前需要执行 `migrate_022.py` 迁移
3. **向后兼容**:旧的 PPT 解析parse_worker.py和海报任务poster/tasks.py保留作为降级方案
4. **前端适配**:前端需要适配新的 202 响应和任务轮询逻辑