Constraint: 在线热修前必须保存当前迭代分支全部有效代码进展 Confidence: medium Scope-risk: broad Directive: 后续修改需保持审计事件与业务事务边界一致 Tested: git diff --cached --check Not-tested: 未运行全量测试,提交用于切换分支前保存既有工作
50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
package task
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/break/junhong_cmp_fiber/pkg/auditcontext"
|
|
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
|
"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 {
|
|
ctx = auditcontext.With(ctx, auditcontext.Context{
|
|
ActorKind: constants.AuditActorScheduledJob, ActorID: constants.AuditActorIDOrderExpireScheduler,
|
|
ActorName: "订单过期关闭计划任务", Source: constants.AuditSourceScheduler,
|
|
})
|
|
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
|
|
}
|