From c579e53ad16ff15e0d3f81eae111c058f15ab819 Mon Sep 17 00:00:00 2001 From: liangzai <2440983361@qq.com> Date: Tue, 2 Sep 2025 20:46:10 +0800 Subject: [PATCH] fix --- .../dto/commands/schedule_publish_command.go | 9 ++---- internal/infrastructure/task/asynq_client.go | 28 +++++++++---------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/internal/application/article/dto/commands/schedule_publish_command.go b/internal/application/article/dto/commands/schedule_publish_command.go index 2beef81..c27f094 100644 --- a/internal/application/article/dto/commands/schedule_publish_command.go +++ b/internal/application/article/dto/commands/schedule_publish_command.go @@ -26,12 +26,9 @@ func (cmd *SchedulePublishCommand) GetScheduledTime() (time.Time, error) { } for _, format := range formats { - if t, err := time.Parse(format, cmd.ScheduledTime); err == nil { - // 如果解析的时间没有时区信息,则设置为中国东八区 - if t.Location() == time.UTC { - t = t.In(cst) - } - return t, nil + if t, err := time.ParseInLocation(format, cmd.ScheduledTime, cst); err == nil { + // 确保返回的时间是东八区时区 + return t.In(cst), nil } } diff --git a/internal/infrastructure/task/asynq_client.go b/internal/infrastructure/task/asynq_client.go index 708f021..bc6ae0d 100644 --- a/internal/infrastructure/task/asynq_client.go +++ b/internal/infrastructure/task/asynq_client.go @@ -35,42 +35,42 @@ func (c *AsynqClient) ScheduleArticlePublish(ctx context.Context, articleID stri payload := map[string]interface{}{ "article_id": articleID, } - + payloadBytes, err := json.Marshal(payload) if err != nil { c.logger.Error("序列化任务载荷失败", zap.Error(err)) return "", fmt.Errorf("创建任务失败: %w", err) } - + task := asynq.NewTask(TaskTypeArticlePublish, payloadBytes) - + // 计算延迟时间 delay := publishTime.Sub(time.Now()) if delay <= 0 { return "", fmt.Errorf("定时发布时间不能早于当前时间") } - + // 设置任务选项 opts := []asynq.Option{ asynq.ProcessIn(delay), asynq.MaxRetry(3), asynq.Timeout(5 * time.Minute), } - + info, err := c.client.Enqueue(task, opts...) if err != nil { - c.logger.Error("调度定时发布任务失败", + c.logger.Error("调度定时发布任务失败", zap.String("article_id", articleID), zap.Time("publish_time", publishTime), zap.Error(err)) return "", fmt.Errorf("调度任务失败: %w", err) } - + c.logger.Info("定时发布任务调度成功", zap.String("article_id", articleID), zap.Time("publish_time", publishTime), zap.String("task_id", info.ID)) - + return info.ID, nil } @@ -80,12 +80,12 @@ func (c *AsynqClient) CancelScheduledTask(ctx context.Context, taskID string) er // 这里我们记录日志,实际取消需要在数据库中标记 c.logger.Info("请求取消定时任务", zap.String("task_id", taskID)) - + // 在实际应用中,你可能需要: // 1. 在数据库中标记任务为已取消 // 2. 在任务执行时检查取消状态 // 3. 或者使用Redis的TTL机制 - + return nil } @@ -93,22 +93,22 @@ func (c *AsynqClient) CancelScheduledTask(ctx context.Context, taskID string) er func (c *AsynqClient) RescheduleArticlePublish(ctx context.Context, articleID string, oldTaskID string, newPublishTime time.Time) (string, error) { // 1. 取消旧任务(标记为已取消) if err := c.CancelScheduledTask(ctx, oldTaskID); err != nil { - c.logger.Warn("取消旧任务失败", + c.logger.Warn("取消旧任务失败", zap.String("old_task_id", oldTaskID), zap.Error(err)) } - + // 2. 创建新任务 newTaskID, err := c.ScheduleArticlePublish(ctx, articleID, newPublishTime) if err != nil { return "", fmt.Errorf("重新调度任务失败: %w", err) } - + c.logger.Info("重新调度定时发布任务成功", zap.String("article_id", articleID), zap.String("old_task_id", oldTaskID), zap.String("new_task_id", newTaskID), zap.Time("new_publish_time", newPublishTime)) - + return newTaskID, nil }