From 74e42de7aaf4ca1e63644466bdba7711306d3e70 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Sat, 20 Sep 2025 22:41:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84AnalysisPlanTaskManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/app/service/task/scheduler.go | 18 ++++++++++++++++-- .../repository/execution_log_repository.go | 7 +++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/internal/app/service/task/scheduler.go b/internal/app/service/task/scheduler.go index 6c8978e..b8e7e05 100644 --- a/internal/app/service/task/scheduler.go +++ b/internal/app/service/task/scheduler.go @@ -266,12 +266,26 @@ func (s *Scheduler) processTask(claimedLog *models.TaskExecutionLog) { // 更新计划的执行计数器 plan.ExecuteCount++ + + // 如果是自动计划且达到执行次数上限,则更新计划状态为已停止 + if (plan.ExecutionType == models.PlanExecutionTypeAutomatic && plan.ExecuteNum > 0 && plan.ExecuteCount >= plan.ExecuteNum) || plan.ExecutionType == models.PlanExecutionTypeManual { + plan.Status = models.PlanStatusStopeed + s.logger.Infof("计划 %d (自动执行) 已达到最大执行次数 %d,状态更新为 '执行完毕'。", planID, plan.ExecuteNum) + } + + // 保存更新后的计划状态和执行计数 if err := s.planRepo.UpdatePlan(plan); err != nil { // UpdatePlan 可以更新整个 Plan 对象 - s.logger.Errorf("更新计划 %d 的执行计数失败: %v", planID, err) + s.logger.Errorf("更新计划 %d 的执行计数和状态失败: %v", planID, err) return } - // 调用共享的 Manager 来处理触发器更新逻辑 + // 更新计划执行日志状态为完成 + if err := s.executionLogRepo.UpdatePlanExecutionLogStatus(claimedLog.PlanExecutionLogID, models.ExecutionStatusCompleted); err != nil { + s.logger.Errorf("更新计划执行日志 %d 状态为 '完成' 失败: %v", claimedLog.PlanExecutionLogID, err) + // 这是一个非阻塞性错误,不中断后续流程 + } + + // 调用共享的 Manager 来处理触发器更新逻辑 (Manager 会根据最新的 Plan 状态决定是否创建新触发器) if err := s.analysisPlanTaskManager.CreateOrUpdateTrigger(planID); err != nil { s.logger.Errorf("为计划 %d 创建/更新触发器失败: %v", planID, err) } diff --git a/internal/infra/repository/execution_log_repository.go b/internal/infra/repository/execution_log_repository.go index d0e4f81..4111901 100644 --- a/internal/infra/repository/execution_log_repository.go +++ b/internal/infra/repository/execution_log_repository.go @@ -16,6 +16,8 @@ type ExecutionLogRepository interface { CreateTaskExecutionLogsInBatch(logs []*models.TaskExecutionLog) error UpdateTaskExecutionLog(log *models.TaskExecutionLog) error FindTaskExecutionLogByID(id uint) (*models.TaskExecutionLog, error) + // UpdatePlanExecutionLogStatus 更新计划执行日志的状态 + UpdatePlanExecutionLogStatus(logID uint, status models.ExecutionStatus) error } // gormExecutionLogRepository 是使用 GORM 的具体实现。 @@ -86,3 +88,8 @@ func (r *gormExecutionLogRepository) FindTaskExecutionLogByID(id uint) (*models. } return &log, nil } + +// UpdatePlanExecutionLogStatus 更新计划执行日志的状态 +func (r *gormExecutionLogRepository) UpdatePlanExecutionLogStatus(logID uint, status models.ExecutionStatus) error { + return r.db.Model(&models.PlanExecutionLog{}).Where("id = ?", logID).Update("status", status).Error +}