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

@@ -323,3 +323,56 @@
- **WHEN** 后台创建订单
- **THEN** Handler 层使用 `CreateAdminOrderRequest` DTO仅允许 wallet/offlineH5 端使用 `CreateOrderRequest` DTO允许 wallet/wechat/alipay
---
### Requirement: 订单取消与钱包余额解冻
系统 SHALL 根据支付方式正确处理订单支付,包括钱包扣款、在线支付、混合支付等。**新增订单取消(手动或自动)时的钱包余额解冻逻辑。**
**钱包支付流程**
1. 检查钱包可用余额是否充足
2. 冻结钱包余额(`frozen_balance` 增加)
3. 创建订单,状态为"待支付"
4. 订单完成后,扣减钱包余额(`balance` 减少,`frozen_balance` 减少),创建钱包明细记录
5. 订单取消时(手动或自动),解冻钱包余额(`frozen_balance` 减少)
**在线支付流程**
1. 创建订单,状态为"待支付"
2. 调用第三方支付接口
3. 用户完成支付后,订单状态变更为"已支付"
4. 订单完成后,订单状态变更为"已完成"
**混合支付流程**
1. 检查钱包可用余额是否充足(钱包支付部分)
2. 冻结钱包余额
3. 创建订单,状态为"待支付"
4. 调用第三方支付接口(在线支付部分)
5. 用户完成在线支付后,扣减钱包余额,订单状态变更为"已支付"
6. 订单完成后,订单状态变更为"已完成"
7. 订单取消时(手动或自动),解冻钱包余额
#### Scenario: 订单手动取消,解冻钱包余额
- **WHEN** 用户使用钱包支付创建订单,订单金额为 3000 分,然后手动取消订单
- **THEN** 系统解冻钱包余额 3000 分(`frozen_balance` 减少 3000订单状态变更为"已取消"
#### Scenario: 订单超时自动取消,解冻钱包余额
- **WHEN** 用户使用混合支付创建订单,钱包预扣 2000 分30 分钟后订单超时
- **THEN** 系统自动取消订单,解冻钱包余额 2000 分(`frozen_balance` 减少 2000订单状态变更为"已取消"
#### Scenario: 订单取消(纯在线支付),无需解冻
- **WHEN** 用户使用纯在线支付创建订单30 分钟后订单超时
- **THEN** 系统自动取消订单,不执行钱包解冻操作(因为没有钱包预扣)
#### Scenario: 钱包解冻事务保证
- **WHEN** 订单取消涉及钱包解冻
- **THEN** 订单状态更新(`payment_status = 3``expires_at = NULL`)和钱包余额解冻在同一事务中完成,任一失败则全部回滚
#### Scenario: 钱包解冻失败回滚
- **WHEN** 订单取消时,钱包解冻失败(如钱包不存在、冻结余额不足)
- **THEN** 事务回滚,订单状态不变,返回错误信息"订单取消失败"