baodan/docs/workspace-implementation-log.md
wsb1224 c7df34d0cd 07-27 阶段 状态 进度
阶段 1:数据库与工作区	 完成	100%
阶段 2:Celery 后台任务	 完成	100%
阶段 3:前端刷新恢复与多工作区	 完成	100%
阶段 4:任务坞与任务中心	 完成	100%
阶段 5:版本化编辑	 完成	100%
阶段 6:测试与灰度	 未开始	0%
2026-07-28 17:53:14 +08:00

98 lines
4.8 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.

# 工作区改造实施记录
## 实施日期
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 响应和任务轮询逻辑