package task import ( "context" "fmt" "time" "github.com/bytedance/sonic" "github.com/hibiken/asynq" "go.uber.org/zap" "github.com/break/junhong_cmp_fiber/internal/application/auditarchive" "github.com/break/junhong_cmp_fiber/pkg/constants" ) // AuditDailyArchivePayload 是人工补档时可选的任务载荷。 type AuditDailyArchivePayload struct { ArchiveDate string `json:"archive_date"` } // AuditDailyArchiveHandler 处理统一审计每日冷归档任务。 type AuditDailyArchiveHandler struct { service *auditarchive.Service logger *zap.Logger } // NewAuditDailyArchiveHandler 创建统一审计每日冷归档任务处理器。 func NewAuditDailyArchiveHandler(service *auditarchive.Service, logger *zap.Logger) *AuditDailyArchiveHandler { return &AuditDailyArchiveHandler{service: service, logger: logger} } // Handle 执行前一完整自然日归档,或按任务载荷补档指定自然日。 func (h *AuditDailyArchiveHandler) Handle(ctx context.Context, task *asynq.Task) error { if h.service == nil { return fmt.Errorf("统一审计归档服务未配置") } var err error if len(task.Payload()) == 0 { err = h.service.ArchivePreviousDay(ctx) } else { var payload AuditDailyArchivePayload if unmarshalErr := sonic.Unmarshal(task.Payload(), &payload); unmarshalErr != nil { return fmt.Errorf("解析统一审计归档任务载荷失败: %w", unmarshalErr) } location, locationErr := time.LoadLocation(constants.AuditArchiveTimezone) if locationErr != nil { return fmt.Errorf("加载统一审计归档时区失败: %w", locationErr) } archiveDate, parseErr := time.ParseInLocation(time.DateOnly, payload.ArchiveDate, location) if parseErr != nil { return fmt.Errorf("解析统一审计归档日期失败: %w", parseErr) } err = h.service.ArchiveDate(ctx, archiveDate) } if err != nil { h.logger.Error("统一审计每日冷归档失败", zap.Error(err)) return err } h.logger.Info("统一审计每日冷归档完成") return nil }