## ADDED Requirements

### Requirement: 手动触发单卡检查

系统 SHALL 允许管理员手动触发单张卡的立即检查。

#### Scenario: 手动触发实名检查

- **WHEN** 管理员请求手动触发卡ID为 12345 的实名检查
- **THEN** 系统将卡ID加入 Redis List（polling:manual:realname），返回成功，提示将在 10 秒内执行

#### Scenario: 手动触发流量检查

- **WHEN** 管理员请求手动触发卡ID为 12345 的流量检查
- **THEN** 系统将卡ID加入 Redis List（polling:manual:carddata），返回成功

#### Scenario: 手动触发套餐检查

- **WHEN** 管理员请求手动触发套餐ID为 678 的套餐检查
- **THEN** 系统将套餐ID加入 Redis List（polling:manual:package），返回成功

#### Scenario: 手动触发所有检查

- **WHEN** 管理员请求手动触发卡ID为 12345 的所有检查（实名、流量、套餐）
- **THEN** 系统将卡ID加入所有手动触发队列，返回成功

#### Scenario: 卡不存在

- **WHEN** 管理员请求手动触发不存在的卡ID
- **THEN** 系统返回错误，提示卡不存在

#### Scenario: 卡未启用轮询

- **WHEN** 管理员请求手动触发卡ID为 12345，但该卡 enable_polling=false
- **THEN** 系统返回警告，提示卡未启用轮询，但仍允许手动触发

### Requirement: 手动触发批量卡检查

系统 SHALL 允许管理员手动触发批量卡的立即检查。

#### Scenario: 批量触发实名检查

- **WHEN** 管理员请求批量触发 100 张卡的实名检查，提供卡ID列表
- **THEN** 系统将所有卡ID批量加入 Redis List（使用 RPUSH），返回成功，提示将在 10 秒内执行

#### Scenario: 批量触发流量检查

- **WHEN** 管理员请求批量触发 50 张卡的流量检查
- **THEN** 系统将所有卡ID批量加入手动触发队列

#### Scenario: 批量数量限制

- **WHEN** 管理员请求批量触发超过 1000 张卡
- **THEN** 系统返回错误，提示批量数量超过限制（最多 1000 张）

#### Scenario: 部分卡不存在

- **WHEN** 管理员请求批量触发，100 张卡中有 5 张不存在
- **THEN** 系统返回警告，列出不存在的卡ID，其余 95 张卡加入队列

#### Scenario: 异步处理批量请求

- **WHEN** 管理员请求批量触发 1000 张卡
- **THEN** 系统异步处理请求（Goroutine），立即返回任务ID，管理员可查询进度

### Requirement: 手动触发条件筛选

系统 SHALL 支持按条件筛选卡进行批量手动触发。

#### Scenario: 按卡状态筛选

- **WHEN** 管理员请求触发所有未实名卡的实名检查
- **THEN** 系统查询符合条件的卡（real_name_status=0），将卡ID批量加入队列

#### Scenario: 按运营商筛选

- **WHEN** 管理员请求触发所有中国移动卡的流量检查
- **THEN** 系统查询符合条件的卡（carrier_id=1），批量触发

#### Scenario: 按卡类型筛选

- **WHEN** 管理员请求触发所有行业卡的流量检查
- **THEN** 系统查询符合条件的卡（card_category='industry'），批量触发

#### Scenario: 组合条件筛选

- **WHEN** 管理员请求触发所有"未实名+中国移动"的卡
- **THEN** 系统查询符合多个条件的卡，批量触发

#### Scenario: 预览筛选结果

- **WHEN** 管理员请求预览筛选条件将触发多少张卡
- **THEN** 系统返回符合条件的卡数量，不实际触发

#### Scenario: 筛选结果过多

- **WHEN** 筛选条件匹配超过 10000 张卡
- **THEN** 系统返回警告，建议缩小筛选范围或分批触发

### Requirement: 手动触发优先级

系统 SHALL 确保手动触发的任务优先于定时任务执行。

#### Scenario: 调度器先处理手动队列

- **WHEN** 调度循环执行，手动触发队列有 10 张卡，定时队列有 1000 张卡到期
- **THEN** 系统先从手动触发队列取出所有卡，生成高优先级任务（ProcessIn(0)），再处理定时队列

#### Scenario: 手动触发立即生成任务

- **WHEN** 手动触发请求完成，卡加入手动队列
- **THEN** 系统在下个调度周期（最多 10 秒）生成 Asynq 任务并执行

#### Scenario: 清空手动队列

- **WHEN** 调度器处理完手动触发队列
- **THEN** 系统清空手动触发队列（LTRIM 或 DEL）

### Requirement: 手动触发去重

系统 SHALL 对手动触发进行去重，避免重复执行。

#### Scenario: 同卡重复触发

- **WHEN** 管理员对同一张卡连续触发两次实名检查
- **THEN** 系统检查手动队列，如果卡ID已存在则不重复加入

#### Scenario: 使用 Redis Set 去重

- **WHEN** 批量触发 100 张卡，其中有 10 张重复
- **THEN** 系统使用 Redis Set 临时存储卡ID，去重后再加入队列

#### Scenario: 手动触发与定时任务去重

- **WHEN** 卡A在手动队列中，同时定时队列也到期
- **THEN** 系统优先执行手动触发，定时队列检测到卡已在执行则跳过

### Requirement: 手动触发状态查询

系统 SHALL 提供接口查询手动触发的状态和进度。

#### Scenario: 查询手动队列长度

- **WHEN** 管理员查询手动触发队列状态
- **THEN** 系统返回各类型手动队列的长度（LLEN polling:manual:realname 等）

#### Scenario: 查询批量任务进度

- **WHEN** 管理员查询批量触发任务的进度
- **THEN** 系统返回任务ID、总卡数、已处理数、进度百分比、预计完成时间

#### Scenario: 查询任务详情

- **WHEN** 管理员查询批量触发任务的详情
- **THEN** 系统返回已成功的卡、已失败的卡、正在处理的卡列表

#### Scenario: 任务已完成

- **WHEN** 管理员查询已完成的批量触发任务
- **THEN** 系统返回总结信息，包含成功数、失败数、总耗时

### Requirement: 手动触发历史记录

系统 SHALL 记录手动触发的历史。

#### Scenario: 记录触发请求

- **WHEN** 管理员手动触发检查
- **THEN** 系统插入记录到 tb_polling_manual_trigger_log 表，包含操作人、卡ID列表、触发类型、请求时间

#### Scenario: 记录触发结果

- **WHEN** 手动触发任务完成
- **THEN** 系统更新记录，包含成功数、失败数、完成时间

#### Scenario: 查询触发历史

- **WHEN** 管理员查询手动触发历史
- **THEN** 系统返回历史记录，支持筛选（时间范围、操作人、触发类型）

#### Scenario: 历史记录保留 30 天

- **WHEN** 数据清理任务执行
- **THEN** 系统清理 30 天前的手动触发历史记录

### Requirement: 手动触发权限控制

系统 SHALL 控制手动触发的权限。

#### Scenario: 普通管理员触发自己管理的卡

- **WHEN** 代理账号请求手动触发卡ID为 12345，该卡属于代理管理的店铺
- **THEN** 系统验证权限通过，允许触发

#### Scenario: 普通管理员触发其他卡

- **WHEN** 代理账号请求手动触发卡ID为 99999，该卡不属于代理管理的店铺
- **THEN** 系统返回错误，提示无权限操作该卡

#### Scenario: 超级管理员触发任意卡

- **WHEN** 超级管理员请求手动触发任意卡
- **THEN** 系统允许触发，无权限限制

#### Scenario: 企业账号触发企业卡

- **WHEN** 企业账号请求手动触发卡ID为 12345，该卡属于企业
- **THEN** 系统验证权限通过，允许触发

### Requirement: 手动触发限流

系统 SHALL 对手动触发进行限流，防止滥用。

#### Scenario: 单次批量限制

- **WHEN** 管理员单次批量触发超过 1000 张卡
- **THEN** 系统拒绝请求，提示超过单次限制

#### Scenario: 频率限制

- **WHEN** 管理员在 1 分钟内触发超过 10 次
- **THEN** 系统拒绝请求，提示操作过于频繁，建议稍后再试

#### Scenario: 每日限制

- **WHEN** 管理员当日累计触发超过 10000 张卡
- **THEN** 系统拒绝请求，提示已达每日限制

#### Scenario: 超级管理员无限制

- **WHEN** 超级管理员手动触发
- **THEN** 系统不应用限流规则

### Requirement: 手动触发取消

系统 SHALL 支持取消未执行的手动触发任务。

#### Scenario: 取消手动队列中的卡

- **WHEN** 管理员请求取消卡ID为 12345 的手动触发
- **THEN** 系统从手动触发队列中移除该卡ID（LREM）

#### Scenario: 取消批量任务

- **WHEN** 管理员请求取消批量触发任务
- **THEN** 系统停止添加新卡到队列，已加入队列的卡继续执行

#### Scenario: 无法取消正在执行的任务

- **WHEN** 管理员请求取消已在执行的任务
- **THEN** 系统返回提示，无法取消正在执行的任务

### Requirement: 手动触发通知

系统 SHALL 在手动触发完成后通知管理员。

#### Scenario: 批量触发完成通知

- **WHEN** 批量触发任务完成
- **THEN** 系统发送通知（邮件、站内消息），包含成功数、失败数、总耗时

#### Scenario: 失败率高时告警

- **WHEN** 批量触发任务完成，失败率超过 20%
- **THEN** 系统发送告警通知，建议检查失败原因

#### Scenario: 单卡触发不通知

- **WHEN** 单张卡手动触发完成
- **THEN** 系统不发送通知，管理员可主动查询结果

### Requirement: 日志记录

系统 SHALL 记录手动触发的详细日志。

#### Scenario: 记录触发请求日志

- **WHEN** 管理员手动触发检查
- **THEN** 系统记录 Info 日志，包含操作人、卡ID、触发类型

#### Scenario: 记录批量触发进度日志

- **WHEN** 批量触发任务处理中
- **THEN** 系统每处理 100 张卡记录一次 Debug 日志，包含进度

#### Scenario: 记录触发完成日志

- **WHEN** 手动触发任务完成
- **THEN** 系统记录 Info 日志，包含成功数、失败数、耗时

#### Scenario: 记录权限拒绝日志

- **WHEN** 管理员因权限不足被拒绝
- **THEN** 系统记录 Warn 日志，包含操作人、被拒绝原因
