feat: 实现订单超时自动取消功能,支持钱包余额解冻和 Asynq Scheduler 统一调度
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m58s

- 新增 expires_at 字段和复合索引,待支付订单 30 分钟超时自动取消
- 实现 cancelOrder/unfreezeWalletForCancel 钱包余额解冻逻辑
- 创建 Asynq 定时任务(order_expire/alert_check/data_cleanup)
- 将原有 time.Ticker 轮询迁移至 Asynq Scheduler 统一调度
- 同步 delta specs 到 main specs 并归档变更
This commit is contained in:
2026-02-28 17:16:15 +08:00
parent 5bb0ff0ddf
commit e661b59bb9
35 changed files with 1157 additions and 314 deletions

View File

@@ -60,7 +60,7 @@ This capability supports:
### Requirement: 订单状态流转
系统 SHALL 管理订单的状态流转,确保状态变更符合业务规则。
系统 SHALL 管理订单的状态流转,确保状态变更符合业务规则。**新增订单超时自动取消的详细场景。**
**状态定义**:
- **1-待支付**: 订单已创建,等待用户支付
@@ -71,7 +71,7 @@ This capability supports:
**状态流转规则**:
- 待支付(1) → 已支付(2): 用户完成支付
- 待支付(1) → 已取消(4): 用户取消订单或订单超时
- 待支付(1) → 已取消(4): 用户手动取消订单或订单超时30 分钟)
- 已支付(2) → 已完成(3): 系统完成订单处理(激活/发货)
- 已支付(2) → 已退款(5): 用户申请退款且审核通过
- 已完成(3) → 已退款(5): 用户申请退款且审核通过(特殊情况)
@@ -91,6 +91,25 @@ This capability supports:
- **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** 系统自动取消订单,无需钱包解冻操作
---
### Requirement: 订单支付方式