feat: add task management and progress reporting
- Implemented task and subtask structures with progress tracking. - Added reporting functionality to log progress at various stages in hotel room status management scripts. - Created a task store to manage tasks and their states, including persistence to local storage. - Updated UI components to display task lists and handle task actions (retry, remove). - Removed deprecated TaskCard and TaskList components, replacing them with a new structure for better maintainability. - Enhanced script execution service to emit progress events for UI updates.
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
| 模块 | 当前状态 | 关键文件 |
|
||||
|---|---|---|
|
||||
| 脚本执行 | 通过 `utilityProcess.fork` 串行执行,**阻塞式返回结果**,无实时推送 | `electron/service/execute-script-service/index.ts` |
|
||||
| 任务列表 UI | 使用 `@constant/task` **静态假数据** | `src/components/TaskList/List.vue`、`Card.vue` |
|
||||
| 任务列表 UI | 使用 `@constant/task` **静态假数据** | `src/pages/home/components/TaskList.vue`、`TaskCard.vue` |
|
||||
| 脚本触发入口 | `TaskOperationDialog.vue` 中调用 `window.api.executeScript(options)` | `src/pages/home/components/TaskOperationDialog.vue` |
|
||||
| 状态管理 | 已有 `store/script.ts` 管理脚本元数据,**缺少任务(Task)生命周期管理** | `src/store/script.ts` |
|
||||
| IPC 通信 | 只有 Request/Response 模式(invoke/handle),**无主进程主动推送** | `electron/preload/index.ts` |
|
||||
@@ -52,6 +52,7 @@ interface Task {
|
||||
dateRange: [string, string];
|
||||
status: TaskStatus;
|
||||
subTasks: SubTask[];
|
||||
roomList: any[]; // 保留原始房型列表,用于重试时重新传参
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
@@ -177,7 +178,7 @@ interface Task {
|
||||
### Phase 4:UI 组件改造
|
||||
**目标**:将假数据替换为真实任务数据,支持 tab 切换与操作。
|
||||
|
||||
9. **`src/components/TaskList/Card.vue`**(修改)
|
||||
9. **`src/pages/home/components/TaskCard.vue`**(修改)
|
||||
- `props` 改为接收 `Task` 或 `SubTask` 对象
|
||||
- 根据 `status` 渲染不同状态标签(`warning` 运行中 / `error` 失败 / `success` 成功)
|
||||
- 按钮逻辑:
|
||||
@@ -186,10 +187,11 @@ interface Task {
|
||||
- `success` → "移除"(emit `remove`)
|
||||
- 显示进度条(`el-progress` 或自定义 div)
|
||||
|
||||
10. **`src/components/TaskList/List.vue`**(修改)
|
||||
10. **`src/pages/home/components/TaskList.vue`**(修改)
|
||||
- 从 `useTaskStore()` 读取任务列表
|
||||
- "待处理" tab 显示 `pendingTasks`,"已处理" tab 显示 `completedTasks`
|
||||
- 动态计算 `total` 数量
|
||||
- 顶部日期时间实时动态化("今天"/"昨天"/具体日期 + `HH:mm:ss`)
|
||||
- 处理 `retry-failed`(调用 `taskStore.retryFailedSubTasks(taskId)`)/ `remove` 事件
|
||||
|
||||
---
|
||||
@@ -259,13 +261,15 @@ List.vue / Card.vue 响应式更新 UI
|
||||
List.vue 调用 taskStore.retryFailedSubTasks(taskId)
|
||||
├─ 将该 Task 下所有 failed 的 SubTask 重置为 pending
|
||||
├─ Task 状态回退为 pending / running
|
||||
└─ 重新调用 window.api.executeScript({ taskId, ... })
|
||||
└─ 重新调用 window.api.executeScript({ taskId, roomType, startTime, endTime, operation, roomList })
|
||||
↓
|
||||
主进程只执行 status === pending 的 SubTask(串行排队)
|
||||
↓
|
||||
执行完成后更新 Task 状态,移回"已处理" Tab
|
||||
```
|
||||
|
||||
> **注意**:重试时需要 `roomList` 参数。`createTask` 会将 `options.roomList` 存入 `Task.roomList` 并随任务列表一起持久化到 `electron-store`,确保刷新后重试仍能拿到完整参数。
|
||||
|
||||
---
|
||||
|
||||
## 五、文件变更清单汇总
|
||||
@@ -282,17 +286,60 @@ List.vue 调用 taskStore.retryFailedSubTasks(taskId)
|
||||
| `global.d.ts` | 更新 `WindowApi` 类型 |
|
||||
| `electron/service/execute-script-service/index.ts` | 解析进度并 emit 事件 |
|
||||
| `electron/process/runTaskOperationService.ts` | 绑定 taskId 并推送 IPC |
|
||||
| `src/components/TaskList/List.vue` | 接入真实数据与 tab 过滤 |
|
||||
| `src/components/TaskList/Card.vue` | 动态状态、进度、操作按钮 |
|
||||
| `src/pages/home/components/TaskList.vue` | 接入真实数据、tab 过滤、日期时间动态化 |
|
||||
| `src/pages/home/components/TaskCard.vue` | 动态状态、进度、操作按钮 |
|
||||
| `src/pages/home/components/TaskOperationDialog.vue` | 执行前创建 Task |
|
||||
| `electron/scripts/*.js` | 插入 `__ZN_PROGRESS__` 输出(可选) |
|
||||
|
||||
---
|
||||
|
||||
## 六、调整说明(2026-04-14)
|
||||
## 六、调整说明(2026-04-16)
|
||||
|
||||
针对实现边界补充以下确认:
|
||||
|
||||
1. **排队机制**:一个 Task 内的多个 SubTask(各渠道脚本)在主进程中**串行排队执行**,不会并发启动多个浏览器实例。
|
||||
2. **重试粒度**:"重试"操作仅针对该 Task 下 `status === 'failed'` 的 SubTask,成功的 SubTask 保持原结果不变。
|
||||
3. **Store 方法**:`src/store/task.ts` 中增加 `retryFailedSubTasks(taskId)` 方法,用于批量重置并重新触发失败子任务。
|
||||
4. **视觉 UI 延用当前**:`TaskList.vue` 与 `TaskCard.vue` 保持现有样式和布局,仅将数据来源从 `@constant/task` 静态假数据替换为 `useTaskStore`,并在现有样式框架内绑定状态、进度与操作按钮。
|
||||
5. **日期时间动态化**:`TaskList.vue` 顶部原有的静态日期("今天")和时间("02:32:05")改为响应式实时显示:
|
||||
- 左侧日期标签根据当前日期自动判断显示 **"今天"**、**"昨天"** 或具体日期(如 `04/16`)。
|
||||
- 右侧时间通过 `setInterval` 每秒更新,格式为 `HH:mm:ss`。
|
||||
- 组件卸载时自动清理定时器。
|
||||
6. **数据持久化使用 `electron-store`**:
|
||||
- 渲染层 Store `useTaskStore` 通过 IPC (`GET_CONFIG` / `SET_CONFIG`) 读写任务列表,避免主进程直接暴露 Store 实例到渲染层。
|
||||
- 主进程在 `config-service` 的 `DEFAULT_CONFIG` 中新增 `CONFIG_KEYS.TASK_LIST`,默认值为空数组 `[]`。
|
||||
- `useTaskStore` 初始化时异步加载已持久化的任务列表;每次 `createTask`、`completeSubTask`、`removeTask` 等变更操作后,通过 `window.api.invoke(IPC_EVENTS.SET_CONFIG, CONFIG_KEYS.TASK_LIST, tasks.value)` 同步到 `electron-store`。
|
||||
- 注意:持久化数据为任务列表(含 SubTask 状态),实时进度更新(`task:progress`)频繁变化时可**仅更新内存状态**,待 `task:completed` 后再统一持久化,以减少写盘次数。
|
||||
|
||||
---
|
||||
|
||||
## 七、Sub-agent 开发分工
|
||||
|
||||
共启动 **4 个 sub-agent** 按流水线并行开发。
|
||||
|
||||
| Sub-agent | 负责阶段 | 关键文件 | 依赖 |
|
||||
|---|---|---|---|
|
||||
| **SA-1 主进程** | Phase 1 + Phase 2 | `src/lib/task-types.ts`、`src/lib/constants.ts`、`electron/preload/index.ts`、`global.d.ts`、`electron/service/execute-script-service/index.ts`、`electron/process/runTaskOperationService.ts` | 无 |
|
||||
| **SA-2 状态管理** | Phase 3 | `src/store/task.ts`(新建)、`src/App.vue`(挂载监听) | 需 SA-1 的类型与 IPC 契约 |
|
||||
| **SA-3 前端 UI** | Phase 4 + Phase 5 | `src/pages/home/components/TaskList.vue`、`TaskCard.vue`、`TaskOperationDialog.vue` | 需 SA-2 的 Store API(可按本计划接口契约先行开发) |
|
||||
| **SA-4 脚本进度** | Phase 6 | `electron/scripts/mt_trace.js`、`fg_trace.js`、`dy_hotel_trace.js`、`dy_hot_spring_trace.js` | 无 |
|
||||
|
||||
### 各 Sub-agent 验收标准
|
||||
|
||||
**SA-1**:
|
||||
- `executeScriptService` 继承 `EventEmitter`,能解析 `__ZN_PROGRESS__` 前缀并触发 `progress`/`stdout`/`stderr` 事件。
|
||||
- `runTaskOperationService` 的 `EXECUTE_SCRIPT` handler 接收 `options.taskId`,为每个脚本生成 `subTaskId`,串行执行并推送 `task:started` / `task:progress` / `task:completed` IPC 事件。
|
||||
|
||||
**SA-2**:
|
||||
- `useTaskStore` 通过 `electron-store` 持久化任务列表(IPC 读写)。
|
||||
- 提供 `createTask`、`updateSubTaskProgress`、`completeSubTask`、`retryFailedSubTasks`、`removeTask`。
|
||||
- `pendingTasks` / `completedTasks` computed 正确过滤。
|
||||
|
||||
**SA-3**:
|
||||
- `TaskList.vue` / `TaskCard.vue` 接入 `useTaskStore`,Tab 数量和任务数量动态计算。
|
||||
- `running` 状态显示进度条和最新日志展开;`failed` / `partial_failed` 显示"重试失败项";`success` 显示"移除"。
|
||||
- `TaskOperationDialog.vue` 确认时先 `taskStore.createTask(options)`,再 `window.api.executeScript(options)`。
|
||||
|
||||
**SA-4**:
|
||||
- 每个脚本在关键步骤输出 `__ZN_PROGRESS__{"step":"...","percent":N}`。
|
||||
- 不影响原有脚本逻辑。
|
||||
|
||||
Reference in New Issue
Block a user