Files
one-pipe-system/openspec/changes/update-unified-async-task-interaction/design.md
luo a0c44ff538
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m59s
feat: 七月迭代公共状态与异步任务交互
2026-07-24 11:48:02 +08:00

3.8 KiB

Context

设备批量分配、批量订购和导出都属于可能耗时的异步操作,但现有页面和任务模型不统一。产品要求以相同的状态语义、进度结构、轮询节奏和恢复行为覆盖这些入口,同时不改变已有业务接口中未涉及的字段。

Goals / Non-Goals

  • Goals: 统一三类页面的公共状态展示、任务进度展示、任务恢复、轮询和错误重试行为。
  • Goals: 为导出任务补齐稳定的任务标识、计数、错误摘要和更新时间字段。
  • Non-Goals: 不在前端实现任务调度、任务执行、失败明细生成或后端状态流转。
  • Non-Goals: 不新增“部分成功”状态,不替换既有业务接口路径,不删除导出接口原字段。

Decisions

  • Decision: 使用固定五态映射:1=待处理2=处理中3=已完成4=已失败5=已取消

  • Rationale: 三类任务使用同一状态语义;部分成功由计数表达,避免增加状态分支。

  • Decision: 将任务轮询实现为可复用的 composable 或等价公共模块,由页面提供任务详情查询函数和终态判断函数。

  • Rationale: 轮询节奏、页面可见性处理和清理逻辑必须只维护一份,避免各页面出现漂移。

  • Decision: 任务恢复使用持久化的业务入口标识与 task_id,恢复时优先查询任务详情;任务进入终态后清理当前入口的活动任务引用。

  • Rationale: 页面刷新后可以继续展示原任务,同时终态任务不会阻止用户创建新的任务。

  • Decision: 轮询采用单次调度而非固定高频定时器,延迟序列为 2 秒、3 秒、5 秒,随后保持 10 秒;页面隐藏时取消待执行调度,重新可见时立即查询一次。

  • Rationale: 降低无效请求,并满足页面恢复后的即时反馈要求。

  • Decision: 任务失败优先使用后端安全字段 error_summary 作为用户文案;error_code 只用于前端分类和日志,不直接展示底层技术错误。

  • Rationale: 保证用户可理解,同时避免泄露内部错误信息。

Data Model

  • task_id: 稳定任务标识,用于持久化和恢复查询。
  • status: 五态任务状态。
  • total_count: 任务总数。
  • success_count: 成功数。
  • failed_count: 失败数。
  • failure_details: 失败明细;具体字段由业务任务详情接口定义。
  • error_code: 稳定错误分类码。
  • error_summary: 可安全展示的中文错误摘要。
  • updated_at: 任务最近更新时间。

Risks / Trade-offs

  • Risk: 不同业务详情接口的失败明细字段不完全一致。

  • Mitigation: 公共交互层只约束失败明细可展示,业务页面负责将各自接口字段映射为统一展示模型。

  • Risk: 页面刷新时本地保存的任务已被删除或无权限访问。

  • Mitigation: 清理失效任务引用,并按 403 或普通接口失败规则展示对应状态,不重新创建任务。

  • Risk: 页面不可见期间任务已进入终态。

  • Mitigation: 页面恢复可见后立即执行一次详情查询,并根据返回状态停止轮询。

Migration Plan

  1. 明确三类任务接口的 task_id 创建响应和详情查询契约。
  2. 实现公共任务状态、进度模型和轮询/恢复逻辑。
  3. 先接入设备批量分配、批量订购和导出页面,保留各业务原有提交参数。
  4. 更新导出任务列表和详情类型,兼容旧字段并优先使用新增统一字段。
  5. 验证状态、重试、权限、页面刷新、页面可见性和部分成功场景。

Open Questions

  • 批量分配和批量订购的任务详情接口路径及失败明细字段,需要以后端实际契约为准补入实施任务。
  • task_id 的存储范围需要按业务入口区分,还是由统一任务中心集中管理,需要实施前确认。