## ADDED Requirements

### Requirement: query_json 筛选条件真正生效

系统 SHALL 将创建任务时传入的 `query.filters` 解析为 `ExportParams.Filters`，并在每次调用 `DataSource.Count` 和 `DataSource.Fetch` 时一并传入；DataSource 实现 MUST 读取 `Filters` 并应用到 SQL WHERE 条件中。

#### Scenario: 按店铺筛选导出 IoT 卡

- **WHEN** 用户创建任务时传入 `query: {"filters": {"shop_id": 5}}`
- **THEN** `Fetch` 调用收到 `ExportParams.Filters["shop_id"] = 5`，生成的 SQL 包含 `WHERE shop_id = 5`，导出结果仅含该店铺数据

#### Scenario: 按时间范围筛选

- **WHEN** 用户创建任务时传入 `query: {"filters": {"created_at_start": "2024-01-01", "created_at_end": "2024-12-31"}}`
- **THEN** `Fetch` 生成的 SQL 包含 `WHERE created_at >= '2024-01-01' AND created_at <= '2024-12-31'`

#### Scenario: 不传 filters 时全量导出

- **WHEN** 用户创建任务时 `query` 字段为空或 `filters` 为空对象
- **THEN** DataSource 不附加额外 WHERE 条件，仅应用数据权限过滤（`ScopeShopIDs`）

#### Scenario: 筛选条件在整个任务生命周期内不变

- **WHEN** 任务创建后进入 dispatch → shard → finalize 各阶段
- **THEN** 各阶段均从 `task.QueryJSON` 重新解析出相同的 `ExportParams.Filters`，筛选条件不发生漂移

---

### Requirement: ExportParams 包含权限快照

系统 SHALL 将任务创建时记录的 `scope_shop_ids`、`creator_user_type` 构造进 `ExportParams`，DataSource 实现通过 `ExportParams.ScopeShopIDs` 和 `ExportParams.UserType` 应用数据权限，不得通过 context 获取实时权限（避免权限变更影响已创建任务）。

#### Scenario: 代理账号导出时使用权限快照

- **WHEN** 代理账号创建任务时 `scope_shop_ids = [10, 11, 12]`，任务执行时该代理已被移除店铺 12 的权限
- **THEN** DataSource 仍使用快照中的 `[10, 11, 12]` 过滤，不受权限变更影响

#### Scenario: 平台账号导出不附加店铺过滤

- **WHEN** `ExportParams.UserType` 为平台类型
- **THEN** DataSource 不附加 `shop_id IN (...)` 条件，可导出全量数据
