## ADDED Requirements

### Requirement: 全局导出任务中心

系统 SHALL 提供统一的全局导出任务中心，覆盖任务创建、任务列表、任务详情、任务取消四类接口，并使用统一响应格式 `{code, msg, data, timestamp}`。

#### Scenario: 创建导出任务成功
- **WHEN** 已认证用户调用创建导出任务接口并提交合法参数
- **THEN** 系统返回 `task_id`、`task_no`、初始任务状态和创建成功提示

#### Scenario: 查询全局任务列表并按场景过滤
- **WHEN** 用户调用任务列表接口并传入 `scene=device`
- **THEN** 系统仅返回 `device` 场景任务，且结果按创建时间倒序分页返回

#### Scenario: 查询任务详情
- **WHEN** 用户调用任务详情接口并传入存在的任务 ID
- **THEN** 系统返回任务状态、进度、格式、场景、错误信息、产物信息等完整详情

---

### Requirement: 导出任务创建参数与格式选择

导出任务创建接口 SHALL 支持用户选择导出格式，且 `format` MUST 仅允许 `xlsx` 或 `csv`；`scene` MUST 支持首批 `device`、`iot_card`。

#### Scenario: 选择 xlsx 格式创建任务
- **WHEN** 用户创建任务时传入 `format=xlsx`
- **THEN** 系统创建任务成功并记录任务格式为 `xlsx`

#### Scenario: 选择 csv 格式创建任务
- **WHEN** 用户创建任务时传入 `format=csv`
- **THEN** 系统创建任务成功并记录任务格式为 `csv`

#### Scenario: 非法格式被拒绝
- **WHEN** 用户创建任务时传入 `format=pdf`
- **THEN** 系统返回参数错误，不创建任务

#### Scenario: 非法场景被拒绝
- **WHEN** 用户创建任务时传入未注册的 `scene`
- **THEN** 系统返回参数错误，不创建任务

---

### Requirement: 导出任务异步分片执行

系统 SHALL 使用 Asynq 异步任务执行导出流程，并采用 `dispatch -> shard -> finalize` 三段式处理；大数据量导出 MUST 支持分片并行执行。

#### Scenario: 创建任务后异步执行
- **WHEN** 导出任务创建成功
- **THEN** 系统将主任务入队，任务状态从“待处理”推进到“处理中”

#### Scenario: 分片任务并行处理
- **WHEN** dispatch 阶段根据查询规模生成多个分片
- **THEN** 系统并行执行多个 shard 任务并按分片回写进度

#### Scenario: 分片失败触发重试
- **WHEN** 某个 shard 任务因临时错误失败
- **THEN** 系统按 Asynq 重试策略重试该分片，且不影响其他分片状态

#### Scenario: finalize 收敛任务结果
- **WHEN** 所有分片任务完成（成功或失败）
- **THEN** 系统执行 finalize 汇总并更新主任务最终状态

---

### Requirement: 导出结果 OSS 交付与详情下载链接

系统 SHALL 将导出产物上传至 OSS，并在任务详情接口返回可直接下载的 `download_url`；该下载链接默认有效期 MUST 为 24 小时。

#### Scenario: 已完成任务详情返回下载链接
- **WHEN** 任务状态为“已完成”且产物上传成功
- **THEN** 任务详情接口返回 `file_key` 与可直接下载的 `download_url`

#### Scenario: 未完成任务不返回下载链接
- **WHEN** 任务状态为“待处理”或“处理中”
- **THEN** 任务详情接口不返回可用的 `download_url`

#### Scenario: 下载链接过期后可重新获取
- **WHEN** 用户在 URL 过期后再次调用任务详情接口
- **THEN** 系统重新生成新的 24 小时有效下载链接

---

### Requirement: 导出任务取消能力

系统 SHALL 支持取消任务，取消操作 MUST 支持待处理与处理中任务；已完成/已失败/已取消任务 MUST 不可重复取消。

#### Scenario: 取消待处理任务
- **WHEN** 用户取消处于待处理状态的任务
- **THEN** 系统将任务状态更新为“已取消”，且不再调度执行

#### Scenario: 取消处理中任务
- **WHEN** 用户取消处于处理中状态的任务
- **THEN** 系统记录取消请求并在 Worker 检查点协作停止，最终状态为“已取消”

#### Scenario: 取消已完成任务被拒绝
- **WHEN** 用户取消处于已完成状态的任务
- **THEN** 系统返回业务错误，提示该状态不可取消

---

### Requirement: 导出任务数据权限与可见性

系统 SHALL 对导出任务应用数据权限控制：用户仅可查看有权限的任务与导出结果；跨角色/跨租户越权访问 MUST 被拒绝。

#### Scenario: 用户查看自己创建的任务
- **WHEN** 用户查询其本人创建的任务
- **THEN** 系统返回任务数据

#### Scenario: 用户查看无权限任务
- **WHEN** 用户查询不属于其数据权限范围的任务
- **THEN** 系统返回无权限错误，不泄露任务存在性细节

#### Scenario: 场景导出遵循原业务数据权限
- **WHEN** 用户创建 `scene=iot_card` 或 `scene=device` 导出任务
- **THEN** 系统按对应场景既有数据权限规则导出可见数据，不导出越权数据

---

### Requirement: 导出任务性能基线

系统 MUST 面向大数据量导出实现稳定性能，查询与写出流程 SHALL 采用可扩展方案（如 Keyset 分页、流式写出、批量进度回写）。

#### Scenario: 超大数据量导出不发生单次全量加载
- **WHEN** 导出数据规模超过单批次内存可承受范围
- **THEN** 系统按分批/分片方式处理，不进行单次全量加载

#### Scenario: 进度可观测
- **WHEN** 任务正在执行
- **THEN** 列表与详情可查看当前进度与处理状态，便于用户感知导出进展
