feat: 实现订单超时自动取消功能,支持钱包余额解冻和 Asynq Scheduler 统一调度
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m58s
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:
43
internal/task/order_expire.go
Normal file
43
internal/task/order_expire.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package task
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/hibiken/asynq"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// OrderExpirer 订单超时取消接口(局部定义,避免循环依赖)
|
||||
type OrderExpirer interface {
|
||||
CancelExpiredOrders(ctx context.Context) (int, error)
|
||||
}
|
||||
|
||||
// OrderExpireHandler 订单超时自动取消任务处理器
|
||||
type OrderExpireHandler struct {
|
||||
orderExpirer OrderExpirer
|
||||
logger *zap.Logger
|
||||
}
|
||||
|
||||
// NewOrderExpireHandler 创建订单超时处理器
|
||||
func NewOrderExpireHandler(orderExpirer OrderExpirer, logger *zap.Logger) *OrderExpireHandler {
|
||||
return &OrderExpireHandler{
|
||||
orderExpirer: orderExpirer,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// HandleOrderExpire 处理订单超时取消任务
|
||||
// 由 Asynq Scheduler 每分钟触发,扫描并取消所有已超时的待支付订单
|
||||
func (h *OrderExpireHandler) HandleOrderExpire(ctx context.Context, _ *asynq.Task) error {
|
||||
cancelled, err := h.orderExpirer.CancelExpiredOrders(ctx)
|
||||
if err != nil {
|
||||
h.logger.Error("订单超时自动取消失败", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
if cancelled > 0 {
|
||||
h.logger.Info("订单超时自动取消完成", zap.Int("cancelled", cancelled))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user