package task import ( "context" "github.com/hibiken/asynq" "go.uber.org/zap" packagesilenceapp "github.com/break/junhong_cmp_fiber/internal/application/packagesilence" "github.com/break/junhong_cmp_fiber/pkg/auditcontext" "github.com/break/junhong_cmp_fiber/pkg/constants" ) // PackageSilenceScanHandler 处理沉默期扫描任务 package:silence:scan(每 10 分钟)。 // 总开关关闭时直接返回;判定使用条件更新,重复执行幂等。 type PackageSilenceScanHandler struct { resolver *packagesilenceapp.Resolver logger *zap.Logger } // NewPackageSilenceScanHandler 创建沉默期扫描任务处理器。 func NewPackageSilenceScanHandler(resolver *packagesilenceapp.Resolver, logger *zap.Logger) *PackageSilenceScanHandler { return &PackageSilenceScanHandler{resolver: resolver, logger: logger} } // Handle 执行一轮沉默期扫描。 func (h *PackageSilenceScanHandler) Handle(ctx context.Context, _ *asynq.Task) error { if h.resolver == nil { return nil } ctx = auditcontext.With(ctx, auditcontext.Context{ ActorKind: constants.AuditActorScheduledJob, ActorID: constants.TaskTypePackageSilenceScan, ActorName: "沉默期扫描任务", Source: constants.AuditSourceScheduler, }) result, err := h.resolver.Scan(ctx) if err != nil { h.logger.Error("沉默期扫描失败", zap.Error(err)) return err } if result.Scanned > 0 { h.logger.Info("沉默期扫描完成", zap.Int("scanned", result.Scanned), zap.Int("expired", result.Expired), zap.Int("ended", result.Ended)) } return nil } // PackageSilenceOrderRecoverHandler 处理延期订单查单恢复任务(每 5 分钟):查单、超时关闭、异常订单原路退款。 type PackageSilenceOrderRecoverHandler struct { extensions *packagesilenceapp.ExtensionService logger *zap.Logger } // NewPackageSilenceOrderRecoverHandler 创建延期订单恢复任务处理器。 func NewPackageSilenceOrderRecoverHandler(extensions *packagesilenceapp.ExtensionService, logger *zap.Logger) *PackageSilenceOrderRecoverHandler { return &PackageSilenceOrderRecoverHandler{extensions: extensions, logger: logger} } // Handle 执行一轮延期订单恢复。 func (h *PackageSilenceOrderRecoverHandler) Handle(ctx context.Context, _ *asynq.Task) error { if h.extensions == nil { return nil } ctx = auditcontext.With(ctx, auditcontext.Context{ ActorKind: constants.AuditActorScheduledJob, ActorID: constants.TaskTypePackageSilenceOrderRecover, ActorName: "沉默期延期订单恢复任务", Source: constants.AuditSourceScheduler, }) result, err := h.extensions.Recover(ctx) if err != nil { h.logger.Error("沉默期延期订单恢复失败", zap.Error(err)) return err } if result.Confirmed+result.Closed+result.Refunded > 0 { h.logger.Info("沉默期延期订单恢复完成", zap.Int("confirmed", result.Confirmed), zap.Int("closed", result.Closed), zap.Int("refunded", result.Refunded)) } return nil }