This commit is contained in:
@@ -19,7 +19,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
TaskTypeArticlePublish = "article:publish"
|
||||
TaskTypeArticlePublish = "article:publish"
|
||||
TaskTypeAnnouncementPublish = "announcement_publish"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -78,6 +79,9 @@ func main() {
|
||||
mux.HandleFunc(TaskTypeArticlePublish, func(ctx context.Context, t *asynq.Task) error {
|
||||
return handleArticlePublish(ctx, t, db, logger)
|
||||
})
|
||||
mux.HandleFunc(TaskTypeAnnouncementPublish, func(ctx context.Context, t *asynq.Task) error {
|
||||
return handleAnnouncementPublish(ctx, t, db, logger)
|
||||
})
|
||||
|
||||
// 启动 Worker
|
||||
go func() {
|
||||
@@ -135,3 +139,55 @@ func handleArticlePublish(ctx context.Context, t *asynq.Task, db *gorm.DB, logge
|
||||
logger.Info("定时发布文章成功", zap.String("article_id", articleID))
|
||||
return nil
|
||||
}
|
||||
|
||||
// handleAnnouncementPublish 处理公告定时发布任务
|
||||
func handleAnnouncementPublish(ctx context.Context, t *asynq.Task, db *gorm.DB, logger *zap.Logger) error {
|
||||
var payload map[string]interface{}
|
||||
if err := json.Unmarshal(t.Payload(), &payload); err != nil {
|
||||
logger.Error("解析任务载荷失败", zap.Error(err))
|
||||
return fmt.Errorf("解析任务载荷失败: %w", err)
|
||||
}
|
||||
|
||||
announcementID, ok := payload["announcement_id"].(string)
|
||||
if !ok {
|
||||
logger.Error("任务载荷中缺少公告ID")
|
||||
return fmt.Errorf("任务载荷中缺少公告ID")
|
||||
}
|
||||
|
||||
// 获取公告
|
||||
var announcement entities.Announcement
|
||||
if err := db.WithContext(ctx).First(&announcement, "id = ?", announcementID).Error; err != nil {
|
||||
logger.Error("获取公告失败", zap.String("announcement_id", announcementID), zap.Error(err))
|
||||
return fmt.Errorf("获取公告失败: %w", err)
|
||||
}
|
||||
|
||||
// 检查是否已取消定时发布
|
||||
if !announcement.IsScheduled() {
|
||||
logger.Info("公告定时发布已取消,跳过执行",
|
||||
zap.String("announcement_id", announcementID),
|
||||
zap.String("status", string(announcement.Status)))
|
||||
return nil // 静默返回,不报错
|
||||
}
|
||||
|
||||
// 检查定时发布时间是否匹配
|
||||
if announcement.ScheduledAt == nil {
|
||||
logger.Info("公告没有定时发布时间,跳过执行",
|
||||
zap.String("announcement_id", announcementID))
|
||||
return nil
|
||||
}
|
||||
|
||||
// 发布公告
|
||||
if err := announcement.Publish(); err != nil {
|
||||
logger.Error("发布公告失败", zap.String("announcement_id", announcementID), zap.Error(err))
|
||||
return fmt.Errorf("发布公告失败: %w", err)
|
||||
}
|
||||
|
||||
// 保存更新
|
||||
if err := db.WithContext(ctx).Save(&announcement).Error; err != nil {
|
||||
logger.Error("保存公告失败", zap.String("announcement_id", announcementID), zap.Error(err))
|
||||
return fmt.Errorf("保存公告失败: %w", err)
|
||||
}
|
||||
|
||||
logger.Info("定时发布公告成功", zap.String("announcement_id", announcementID))
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user