feat: 素材处理管线——自动处理、审核流程、6状态机

This commit is contained in:
2026-06-07 22:50:05 +08:00
parent a389888eb4
commit 90fdb44b20
30 changed files with 1452 additions and 55 deletions

View File

@@ -37,7 +37,7 @@ SQLite + bun:sqlite + Drizzle ORM。
| `providers.ts` | createProvider、getProvider、listProviders、listProviderOptions、updateProvider、deleteProvider |
| `models.ts` | createModel、getModel、listModels、getModelWithProvider、getModelsByProviderId、updateModel、deleteModel |
| `conversations.ts` | createConversation、getConversation、listConversations、updateConversation、updateConversationTimestamp、deleteConversation、createMessage、createMessages、listMessages |
| `materials.ts` | createMaterial、getMaterial、listMaterials、deleteMaterial |
| `materials.ts` | createMaterial、getMaterial、listMaterials、deleteMaterial、approveMaterial、discardMaterial、retryMaterial |
输入输出类型来自 `src/shared/api.ts`
@@ -66,14 +66,31 @@ SQLite + bun:sqlite + Drizzle ORM。
## 素材 API
| 方法 | 路径 | 说明 |
| ------ | ---------------------------------- | ---------------------- |
| GET | `/api/projects/:id/materials` | 列出项目下素材(分页) |
| POST | `/api/projects/:id/materials` | 创建素材 |
| GET | `/api/projects/:id/materials/:mid` | 获取素材详情 |
| DELETE | `/api/projects/:id/materials/:mid` | 删除素材(软删除) |
| 方法 | 路径 | 说明 |
| ------ | ------------------------------------------ | ------------------------------- |
| GET | `/api/projects/:id/materials` | 列出项目下素材(分页+状态筛选 |
| POST | `/api/projects/:id/materials` | 创建素材 |
| GET | `/api/projects/:id/materials/:mid` | 获取素材详情 |
| DELETE | `/api/projects/:id/materials/:mid` | 删除素材(软删除) |
| POST | `/api/projects/:id/materials/:mid/approve` | 审核通过(需 review 状态) |
| POST | `/api/projects/:id/materials/:mid/discard` | 审核放弃(需 review 状态) |
| POST | `/api/projects/:id/materials/:mid/retry` | 重试处理(需 failed 状态) |
校验description 必填非空associatedDate 必填 YYYY-MM-DD项目须存在且 active 且未删除,素材归属校验不匹配返回 403
素材状态流转:`pending → processing → review → approved/discarded`,失败分支 `processing → failed`,用户重试 `failed → pending`。共 6 种状态:`pending``processing``review``approved``discarded``failed`
素材类型:`general`(通用)和 `meeting`(会议),创建时可选,默认 `general`
校验description 必填非空associatedDate 必填 YYYY-MM-DD项目须存在且 active 且未删除,素材归属校验不匹配返回 403。processing 状态禁止删除409。approve/discard 仅限 review 状态409retry 仅限 failed 状态409
## 素材处理引擎
`src/server/processing/`
- `processor.ts``MaterialProcessor` 类 — 后台定时扫描 pending 素材,按 FIFO 顺序处理(每 5 秒扫描一次),每次处理最多重试 3 次,成功后 status=review 并设置 processedContent全部失败后 status=failed。启动时自动恢复所有 processing 状态的素材为 pending`recoverStuckMaterials`)。
- `templates/`:处理模板目录 — `general.ts`(通用模板)和 `meeting.ts`(会议模板),当前为占位实现(原样回显 description`index.ts` 导出 `ProcessingTemplate` 类型和 `getTemplate(type)` 映射函数。
- `index.ts``startMaterialProcessor(db, logger)` — 工厂函数,创建并启动处理器实例。
处理器在 `bootstrap.ts` 中启动shutdown 时先停止处理器再关闭数据库。
## 聊天 API