## MODIFIED Requirements

### Requirement: 支付成功后自动入队佣金计算任务

系统 SHALL 在订单首次进入“已支付”或自动完单后的待计算状态时自动 enqueue 佣金计算异步任务（`commission:calculate`），确保所有适用订单都进入佣金计算流程。系统 MUST NOT 预先根据操作者类型推断“这单没有佣金所以不用算”。

**触发条件**：
- 订单从"待支付"变为"已支付"，或订单创建后即自动完单
- 订单佣金流程状态为待计算
- 订单属于差价佣金适用范围

**任务参数**：
- 任务类型：`commission:calculate`
- Payload：`{"order_id": <订单ID>}`

#### Scenario: 首次支付成功触发计算
- **WHEN** 订单支付成功，订单状态从"待支付"变为"已支付"
- **THEN** 系统自动 enqueue `commission:calculate` 任务，payload 包含订单 ID
- **AND** 订单佣金流程状态保持为待计算，直到 worker 写回最终结果

#### Scenario: 自动完单订单触发计算
- **WHEN** 订单创建后即自动完单（如平台代购、适用的后台即时支付场景）
- **THEN** 系统同样自动 enqueue `commission:calculate` 任务

#### Scenario: 平台代扣顶级代理订单仍然入队
- **WHEN** 平台代扣顶级代理钱包订单，系统尚未知道最终是否有佣金
- **THEN** 系统仍然 enqueue `commission:calculate` 任务
- **AND** 由 worker 最终判定该订单结果为“无佣金”或其他结果

#### Scenario: 重复支付不重复触发
- **WHEN** 订单已经是"已支付"状态，再次收到支付成功通知（幂等场景）
- **THEN** 系统不重复 enqueue 佣金计算任务
- **AND** 日志记录"订单已支付，跳过重复入队"

#### Scenario: 已完成佣金流程的订单不触发
- **WHEN** 订单佣金流程状态已为“已完成”或“待人工处理”
- **THEN** 系统跳过入队操作
- **AND** 日志记录"订单佣金流程已结束，跳过入队"

---

### Requirement: 佣金计算任务幂等性

系统 SHALL 确保佣金计算任务可重复执行，不重复发放佣金；worker 完成后 MUST 明确写回订单的佣金流程状态和业务结果。

**幂等检查**：
- 任务执行前检查订单佣金流程状态
- 如果流程已结束，则跳过计算并返回成功

**状态更新**：
- 计算完成后将订单写为“已完成 + 有佣金/无佣金”或“待人工处理 + 链路异常”
- 状态更新与佣金记录创建在同一事务中

#### Scenario: 任务重复执行跳过计算
- **WHEN** 佣金计算任务执行时，订单佣金流程状态已为“已完成”
- **THEN** 系统跳过佣金计算和钱包入账操作
- **AND** 任务返回成功（避免 Asynq 重试）

#### Scenario: 并发任务只有一个成功
- **WHEN** 同一订单的佣金计算任务被重复入队，两个 worker 并发执行
- **THEN** 第一个任务成功完成计算并写回最终状态
- **AND** 第二个任务检查到流程已结束后跳过计算

#### Scenario: 无佣金订单也写回完成状态
- **WHEN** worker 执行完毕，确认该订单没有任何应发差价佣金
- **THEN** worker MUST 将订单写回“已完成 + 无佣金”
- **AND** 不允许订单继续停留在“待计算”

#### Scenario: 任务失败可安全重试
- **WHEN** 佣金计算任务执行失败（数据库异常、钱包服务不可用）
- **THEN** Asynq 自动重试任务
- **AND** 重试时幂等检查确保不重复发放佣金
