## MODIFIED Requirements

### Requirement: 订单状态流转

系统 SHALL 管理订单的状态流转,确保状态变更符合业务规则。**新增订单超时自动取消的详细场景。**

**状态定义**:
- **1-待支付**: 订单已创建,等待用户支付
- **2-已支付**: 用户已支付,等待系统处理
- **3-已完成**: 订单已完成(激活/发货等)
- **4-已取消**: 订单已取消
- **5-已退款**: 订单已退款

**状态流转规则**:
- 待支付(1) → 已支付(2): 用户完成支付
- 待支付(1) → 已取消(4): 用户手动取消订单或订单超时（30 分钟）
- 已支付(2) → 已完成(3): 系统完成订单处理(激活/发货)
- 已支付(2) → 已退款(5): 用户申请退款且审核通过
- 已完成(3) → 已退款(5): 用户申请退款且审核通过(特殊情况)

#### Scenario: 用户支付订单

- **WHEN** 用户支付待支付订单(ID 为 10001),支付金额为 30.00 元
- **THEN** 系统将订单状态从 1(待支付) 变更为 2(已支付),`paid_at` 记录支付时间

#### Scenario: 单卡套餐订单完成

- **WHEN** 系统处理完单卡套餐订单(ID 为 10001),激活 IoT 卡并分配套餐
- **THEN** 系统将订单状态从 2(已支付) 变更为 3(已完成),`completed_at` 记录完成时间

#### Scenario: 设备级套餐订单完成

- **WHEN** 系统处理完设备级套餐订单(ID 为 10002),为设备绑定的所有 IoT 卡分配套餐
- **THEN** 系统将订单状态从 2(已支付) 变更为 3(已完成),`completed_at` 记录完成时间

#### Scenario: 用户手动取消订单

- **WHEN** 用户手动取消待支付订单(ID 为 10003)
- **THEN** 系统将订单状态从 1(待支付) 变更为 4(已取消),`expires_at` 设置为 NULL，如有钱包预扣则解冻余额

#### Scenario: 订单超时自动取消

- **WHEN** 订单创建后 30 分钟未支付，定时任务扫描到该订单
- **THEN** 系统自动将订单状态从 1(待支付) 变更为 4(已取消),`expires_at` 设置为 NULL，如有钱包预扣则解冻余额

#### Scenario: 订单超时自动取消（混合支付）

- **WHEN** 混合支付订单创建后 30 分钟未完成在线支付，钱包已预扣 2000 分
- **THEN** 系统自动取消订单，解冻钱包余额 2000 分

#### Scenario: 订单超时自动取消（纯在线支付）

- **WHEN** 纯在线支付订单创建后 30 分钟未支付
- **THEN** 系统自动取消订单，无需钱包解冻操作
