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 }