docs(任务模块): 任务归档 T-ARC 需求与设计 (T-ARC-01~08)
- 需求文档 §3.15: 手动归档(⋯菜单+连带子任务)/自动归档(项目级档位 3天/一周/一月/永不)/归档排除/游标分页大量查询/恢复/彻底删除/配置入口/权限 - 功能设计 §15: Project.autoArchive + Task.archived/archivedAt/archiveSource、 归档/恢复/归档查询 API、自动归档双保险执行(读时惰性+小时cron)、 边界处理; 覆盖自检表更新为 157 条 - 数据库设计: Project 补 notes/taskKinds/icon/autoArchive 字段, Task 补归档三字段与两索引, 迁移清单标注 20261026000000_task_archive 待实施
This commit is contained in:
@@ -93,6 +93,10 @@
|
||||
| `ownerId` | `INT` | 否 | — | 创建人(可退出项目,故与成员表分离) |
|
||||
| `isPersonal` | `BOOLEAN` | 否 | `false` | 个人默认项目:不可删、不可加成员(T-PJ-02/03) |
|
||||
| `archived` | `BOOLEAN` | 否 | `false` | 归档(T-PJ-09) |
|
||||
| `notes` | `JSON` | 否 | `[]` | 项目信息块 `[{title, content}]`(T-PJ-13) |
|
||||
| `taskKinds` | `JSON` | **是** | `NULL` | 任务类型标签列表;`NULL` 时服务端回落默认四类(T-TK-14) |
|
||||
| `icon` | `TEXT` | **是** | `NULL` | 项目图标 data URL(客户端裁剪 96x96 JPEG) |
|
||||
| `autoArchive` | `VARCHAR(8)` | 否 | `'never'` | 自动归档档位:`3d`/`1w`/`1m`/`never`(T-ARC-02) |
|
||||
| `createdAt` | `DATETIME(3)` | 否 | `now()` | — |
|
||||
| `updatedAt` | `DATETIME(3)` | 否 | — | `@updatedAt` |
|
||||
|
||||
@@ -186,6 +190,9 @@
|
||||
| `creatorId` | `INT` | 否 | — | 创建人;拷贝时为操作者(T-CP-04) |
|
||||
| `extras` | `JSON` | 否 | `[]` | 扩展信息卡片 `[{label,value,url?}]`(T-TK-04/05) |
|
||||
| `sortOrder` | `INT` | 否 | `0` | 列内/列表内排序 |
|
||||
| `archived` | `BOOLEAN` | 否 | `false` | 归档标记;主查询一律 `archived = false`(T-ARC-01/03) |
|
||||
| `archivedAt` | `DATETIME(3)` | **是** | `NULL` | 归档时刻;归档查询的过滤/排序键(T-ARC-04) |
|
||||
| `archiveSource` | `VARCHAR(8)` | **是** | `NULL` | `'manual'` / `'auto'` 溯源(T-ARC-01/02) |
|
||||
| `createdAt` | `DATETIME(3)` | 否 | `now()` | — |
|
||||
| `updatedAt` | `DATETIME(3)` | 否 | — | — |
|
||||
|
||||
@@ -202,6 +209,8 @@
|
||||
| `idx_task_project_status` | `(projectId, status)` | — | 列表/统计 |
|
||||
| `idx_task_parent` | `(parentId)` | — | 取子任务 |
|
||||
| `idx_task_done_at` | `(projectId, doneAt)` | — | 保留窗口计算 |
|
||||
| `idx_task_project_archived` | `(projectId, archived, archivedAt)` | — | 已归档查询(T-ARC-04) |
|
||||
| `idx_task_project_status_arch` | `(projectId, status, archived)` | — | 主列表/看板排除归档(T-ARC-03) |
|
||||
|
||||
> \* `creatorId` 用 Cascade 会丢失"他人创建的任务"的历史;更稳妥的做法是 `Restrict` 并禁止删除有任务的用户。**建议改为 `Restrict`**,与既有 `User` 删除行为保持一致(本期系统无删除用户入口)。
|
||||
|
||||
@@ -214,6 +223,8 @@
|
||||
| 子任务 `projectId` == 父任务 `projectId`(T-EX-12) | 应用层 + 事务内校验 |
|
||||
| `parentId` 不得指向自身或其后代(T-EX-15) | 应用层 |
|
||||
| `status='done'` 时写 `doneAt=now()`;退出 `done` 时置 `NULL` | 应用层(领域统一裁决) |
|
||||
| 归档/恢复父任务连带全部后代,同事务内更新 `archived`/`archivedAt`/`archiveSource`(T-ARC-01/05) | 应用层 |
|
||||
| `autoArchive` 枚举 `3d`/`1w`/`1m`/`never`,非法 400(T-ARC-02) | 应用层 |
|
||||
| `assigneeId` 必须是 `ProjectMember` 中的用户(T-AS-03) | 应用层 |
|
||||
|
||||
### 3.5 `TaskMember` — 任务成员
|
||||
@@ -375,6 +386,7 @@ model User {
|
||||
| 权限校验 | `SELECT 1 FROM ProjectMember WHERE projectId=? AND userId=?` |
|
||||
| 保留窗口过滤 | 服务端可选:`status <> 'done' OR (doneAt >= ?)`;前端另有一份同口径实现 |
|
||||
| 自动归位选列 | 内存中对已加载的 `columns`(按 sortOrder)`find(c => c.boundStatus === status)` |
|
||||
| 已归档查询(T-ARC-04) | `WHERE projectId=? AND archived=1 [AND kind=?] [AND columnId=?] [AND archivedAt BETWEEN ? AND ?] [AND title LIKE ?] ORDER BY archivedAt DESC, id DESC LIMIT ?+1`;多取 1 条判定 `nextCursor` |
|
||||
|
||||
**防 N+1**:一次请求返回 `{ project, columns, members, tasks }`,子任务与父任务同批返回,由前端按 `parentId` 分组。
|
||||
|
||||
@@ -391,6 +403,16 @@ model User {
|
||||
3. 建唯一索引与普通索引;
|
||||
4. **不做数据回填**(本模块为新功能,无历史数据)。
|
||||
|
||||
后续增量迁移:
|
||||
|
||||
| 迁移 | 内容 | 状态 |
|
||||
| --- | --- | --- |
|
||||
| `20261022120000_add_checkin_checklist` | 打卡/清单模块 | 已上线 |
|
||||
| `20261025030000_task_kind` | `Project.taskKinds` / `Task.kind` | 已上线 |
|
||||
| `20261025120000_task_mark_date` | `Task.markDate` | 已上线 |
|
||||
| `20261025130000_project_icon` | `Project.icon` | 已上线 |
|
||||
| `20261026000000_task_archive` | 任务归档三字段 + 两索引(T-ARC,DDL 见 §3.1/§3.4 与功能设计 §15) | **待实施** |
|
||||
|
||||
### 6.2 个人默认项目初始化
|
||||
|
||||
```sql
|
||||
|
||||
Reference in New Issue
Block a user