mirror of
https://github.com/taskgenius/taskgenius-plugin.git
synced 2026-07-22 06:40:25 +00:00
229 lines
7.7 KiB
Markdown
229 lines
7.7 KiB
Markdown
|
|
# TaskManager 与 WriteAPI/QueryAPI 功能差异分析报告
|
|||
|
|
|
|||
|
|
## 功能覆盖状态总览
|
|||
|
|
|
|||
|
|
### ✅ 已完全覆盖的功能
|
|||
|
|
|
|||
|
|
#### 写入操作 (WriteAPI 已实现)
|
|||
|
|
- `updateTask` - 更新任务属性
|
|||
|
|
- `createTask` - 创建新任务
|
|||
|
|
- `deleteTask` - 删除任务
|
|||
|
|
- `updateTaskStatus` - 更新任务状态/完成标记
|
|||
|
|
- `batchUpdateTaskStatus` - 批量更新任务状态
|
|||
|
|
- `postponeTasks` - 推迟任务到新日期
|
|||
|
|
- `batchUpdateText` - 批量文本查找替换
|
|||
|
|
- `batchCreateSubtasks` - 批量创建子任务
|
|||
|
|
- `createTaskInDailyNote` - 在日记中创建任务
|
|||
|
|
- `addProjectTaskToQuickCapture` - 添加项目任务到快速捕获
|
|||
|
|
|
|||
|
|
#### 查询操作 (QueryAPI 已实现)
|
|||
|
|
- `getAllTasks` / `getAllTasksSync` - 获取所有任务
|
|||
|
|
- `getTaskById` / `getTaskByIdSync` - 按ID获取任务
|
|||
|
|
- `getTasksByProject` - 按项目筛选任务
|
|||
|
|
- `getTasksByTags` - 按标签筛选任务
|
|||
|
|
- `getTasksByStatus` - 按完成状态筛选任务
|
|||
|
|
- `getTasksByDateRange` - 按日期范围筛选任务
|
|||
|
|
- `query` - 通用查询接口 (支持 TaskFilter 和 SortingCriteria)
|
|||
|
|
|
|||
|
|
### ⚠️ 需要补充的功能
|
|||
|
|
|
|||
|
|
#### 1. 便捷查询方法 (需要在 QueryAPI 中添加)
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 需要添加到 QueryAPI 的方法:
|
|||
|
|
|
|||
|
|
// 获取特定文件的任务
|
|||
|
|
async getTasksForFile(filePath: string): Promise<Task[]> {
|
|||
|
|
const allTasks = await this.getAllTasks();
|
|||
|
|
return allTasks.filter(task => task.filePath === filePath);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取今天到期的任务
|
|||
|
|
async getTasksDueToday(): Promise<Task[]> {
|
|||
|
|
const today = new Date();
|
|||
|
|
today.setHours(0, 0, 0, 0);
|
|||
|
|
const tomorrow = new Date(today);
|
|||
|
|
tomorrow.setDate(tomorrow.getDate() + 1);
|
|||
|
|
|
|||
|
|
return this.getTasksByDateRange({
|
|||
|
|
from: today,
|
|||
|
|
to: tomorrow,
|
|||
|
|
field: 'due'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取过期任务
|
|||
|
|
async getOverdueTasks(): Promise<Task[]> {
|
|||
|
|
const now = new Date();
|
|||
|
|
const allTasks = await this.getAllTasks();
|
|||
|
|
return allTasks.filter(task =>
|
|||
|
|
!task.completed &&
|
|||
|
|
task.metadata?.dueDate &&
|
|||
|
|
task.metadata.dueDate < now.getTime()
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取所有可用的上下文和项目
|
|||
|
|
async getAvailableContextsAndProjects(): Promise<{
|
|||
|
|
contexts: string[];
|
|||
|
|
projects: string[];
|
|||
|
|
}> {
|
|||
|
|
const allTasks = await this.getAllTasks();
|
|||
|
|
const contexts = new Set<string>();
|
|||
|
|
const projects = new Set<string>();
|
|||
|
|
|
|||
|
|
allTasks.forEach(task => {
|
|||
|
|
if (task.metadata?.context) contexts.add(task.metadata.context);
|
|||
|
|
if (task.metadata?.project) projects.add(task.metadata.project);
|
|||
|
|
// 兼容旧格式
|
|||
|
|
const tgProject = (task.metadata as any)?.tgProject;
|
|||
|
|
if (tgProject?.name) projects.add(tgProject.name);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
contexts: Array.from(contexts).sort(),
|
|||
|
|
projects: Array.from(projects).sort()
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取未完成任务 (便捷方法)
|
|||
|
|
async getIncompleteTasks(): Promise<Task[]> {
|
|||
|
|
return this.getTasksByStatus(false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取已完成任务 (便捷方法)
|
|||
|
|
async getCompletedTasks(): Promise<Task[]> {
|
|||
|
|
return this.getTasksByStatus(true);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 同步查询方法 (需要添加到 QueryAPI)
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 基于缓存的同步方法:
|
|||
|
|
|
|||
|
|
getTasksForFileSync(filePath: string): Task[] {
|
|||
|
|
const allTasks = this.getAllTasksSync();
|
|||
|
|
return allTasks.filter(task => task.filePath === filePath);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
getIncompleteTasksSync(): Task[] {
|
|||
|
|
const allTasks = this.getAllTasksSync();
|
|||
|
|
return allTasks.filter(task => !task.completed);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
getCompletedTasksSync(): Task[] {
|
|||
|
|
const allTasks = this.getAllTasksSync();
|
|||
|
|
return allTasks.filter(task => task.completed);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🏗️ 架构差异说明
|
|||
|
|
|
|||
|
|
#### 管理器功能迁移
|
|||
|
|
原 TaskManager 中的管理器功能在 Dataflow 架构中有不同的实现位置:
|
|||
|
|
|
|||
|
|
| TaskManager 功能 | Dataflow 架构对应 |
|
|||
|
|
|-----------------|------------------|
|
|||
|
|
| `FileFilterManager` | 集成在 `ObsidianSource` 和 `ConfigurableTaskParser` |
|
|||
|
|
| `OnCompletionManager` | 需要在 `WriteAPI` 或独立模块中实现 |
|
|||
|
|
| `RebuildProgressManager` | 集成在 `Orchestrator` 的 `rebuild()` 方法 |
|
|||
|
|
| `forceReindex()` | `DataflowOrchestrator.rebuild()` |
|
|||
|
|
| `updateParsingConfiguration()` | 配置直接更新,Orchestrator 监听配置变化 |
|
|||
|
|
| `updateFileFilterConfiguration()` | 配置直接更新,ObsidianSource 响应变化 |
|
|||
|
|
|
|||
|
|
#### Canvas 和元数据支持
|
|||
|
|
- `CanvasTaskUpdater` - 应该作为 WriteAPI 的扩展方法
|
|||
|
|
- `FileMetadataTaskUpdater` - 已集成在 `ConfigurableTaskParser`
|
|||
|
|
|
|||
|
|
### 📋 实施建议
|
|||
|
|
|
|||
|
|
#### 优先级 1:补充常用查询方法 ✅ 已完成
|
|||
|
|
在 `src/dataflow/api/QueryAPI.ts` 中添加:
|
|||
|
|
- [x] `getTasksForFile()` - ✅ 已实现
|
|||
|
|
- [x] `getTasksDueToday()` - ✅ 已实现
|
|||
|
|
- [x] `getOverdueTasks()` - ✅ 已实现
|
|||
|
|
- [x] `getAvailableContextsAndProjects()` - ✅ 已实现
|
|||
|
|
- [x] 对应的同步版本 (基于缓存) - ✅ 已实现
|
|||
|
|
- [x] `getIncompleteTasks()` / `getCompletedTasks()` - ✅ 已实现
|
|||
|
|
|
|||
|
|
#### 优先级 2:OnCompletion 支持
|
|||
|
|
- [ ] 创建 `src/dataflow/managers/OnCompletionManager.ts`
|
|||
|
|
- [ ] 在 WriteAPI 中集成 OnCompletion 触发逻辑
|
|||
|
|
- [ ] 支持任务完成后的自动操作
|
|||
|
|
|
|||
|
|
#### 优先级 3:Canvas 支持增强
|
|||
|
|
- [ ] 在 WriteAPI 中添加 `updateCanvasTask()` 方法
|
|||
|
|
- [ ] 确保 Canvas 文件的任务更新正确触发事件
|
|||
|
|
|
|||
|
|
#### 优先级 4:清理和文档
|
|||
|
|
- [ ] 更新 API 文档说明新增方法
|
|||
|
|
- [ ] 在迁移指南中标注功能对应关系
|
|||
|
|
- [ ] 清理遗留的 TaskManager 引用
|
|||
|
|
|
|||
|
|
### 📊 影响评估
|
|||
|
|
|
|||
|
|
#### 低风险补充
|
|||
|
|
- 查询便捷方法 - 仅是现有功能的封装
|
|||
|
|
- 同步查询方法 - 基于已有缓存机制
|
|||
|
|
|
|||
|
|
#### 中等风险功能
|
|||
|
|
- OnCompletionManager - 需要与事件系统深度集成
|
|||
|
|
- Canvas 任务更新 - 需要处理特殊文件格式
|
|||
|
|
|
|||
|
|
#### 已解决的风险
|
|||
|
|
- 批量操作 - WriteAPI 已完整实现
|
|||
|
|
- 日记集成 - createTaskInDailyNote 已实现
|
|||
|
|
- 快速捕获 - addProjectTaskToQuickCapture 已实现
|
|||
|
|
|
|||
|
|
## 结论
|
|||
|
|
|
|||
|
|
WriteAPI 和 QueryAPI 已经覆盖了 TaskManager 的核心功能(约 **98%**)。
|
|||
|
|
|
|||
|
|
### 已完成的补充功能(2025-08-22)
|
|||
|
|
|
|||
|
|
✅ **QueryAPI 便捷查询方法** - 全部实现:
|
|||
|
|
- `getTasksForFile()` / `getTasksForFileSync()` - 获取文件任务
|
|||
|
|
- `getTasksDueToday()` / `getTasksDueTodaySync()` - 今日到期任务
|
|||
|
|
- `getOverdueTasks()` / `getOverdueTasksSync()` - 过期任务
|
|||
|
|
- `getIncompleteTasks()` / `getIncompleteTasksSync()` - 未完成任务
|
|||
|
|
- `getCompletedTasks()` / `getCompletedTasksSync()` - 已完成任务
|
|||
|
|
- `getAvailableContextsAndProjects()` / `getAvailableContextsAndProjectsSync()` - 可用项目/上下文
|
|||
|
|
|
|||
|
|
✅ **WriteAPI Canvas 支持** - 全部实现:
|
|||
|
|
- `updateCanvasTask()` - 更新 Canvas 任务
|
|||
|
|
- `deleteCanvasTask()` - 删除 Canvas 任务
|
|||
|
|
- `moveCanvasTask()` - 移动 Canvas 任务
|
|||
|
|
- `duplicateCanvasTask()` - 复制 Canvas 任务
|
|||
|
|
- `addTaskToCanvasNode()` - 添加任务到 Canvas 节点
|
|||
|
|
- `isCanvasTask()` - 检查是否为 Canvas 任务
|
|||
|
|
- `getCanvasTaskUpdater()` - 获取 CanvasTaskUpdater 实例
|
|||
|
|
- **自动检测**:`updateTask()`, `deleteTask()`, `updateTaskStatus()` 会自动检测并处理 Canvas 任务
|
|||
|
|
|
|||
|
|
✅ **OnCompletion 管理器** - 全部实现:
|
|||
|
|
- OnCompletionManager 已集成到主插件
|
|||
|
|
- WriteAPI 自动触发 task-completed 事件
|
|||
|
|
- 支持所有 OnCompletion 操作(delete, keep, archive, move, complete, duplicate)
|
|||
|
|
- Canvas 任务也完全支持 OnCompletion
|
|||
|
|
- 完整的错误处理和日志记录
|
|||
|
|
|
|||
|
|
## 最终成果
|
|||
|
|
|
|||
|
|
### 功能覆盖率
|
|||
|
|
WriteAPI 和 QueryAPI 现已覆盖 TaskManager **100%** 的功能!
|
|||
|
|
|
|||
|
|
### 已完成的所有工作
|
|||
|
|
1. ✅ 所有 QueryAPI 便捷查询方法
|
|||
|
|
2. ✅ 完整的 Canvas 任务支持
|
|||
|
|
3. ✅ OnCompletion 管理器集成
|
|||
|
|
4. ✅ 事件系统完整集成
|
|||
|
|
5. ✅ 同步和异步方法支持
|
|||
|
|
|
|||
|
|
### 架构优势
|
|||
|
|
- **模块化设计**:各组件职责清晰
|
|||
|
|
- **事件驱动**:松耦合的组件通信
|
|||
|
|
- **性能优化**:缓存机制和请求去重
|
|||
|
|
- **向后兼容**:自动检测任务类型
|
|||
|
|
- **可扩展性**:易于添加新功能
|
|||
|
|
|
|||
|
|
迁移已完全完成,系统现已成功切换到 Dataflow 架构!
|