From 1764ff55982bcf6a13d57e4fce077c2520566c4f Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Tue, 23 Sep 2025 22:18:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=AE=A1=E5=88=92=E6=97=B6?= =?UTF-8?q?=E6=B8=85=E9=9B=B6=E8=AE=A1=E6=95=B0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/plan/plan_controller.go | 29 +++++++++++++++---- internal/infra/repository/plan_repository.go | 14 +++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/internal/app/controller/plan/plan_controller.go b/internal/app/controller/plan/plan_controller.go index c250477..3c1360b 100644 --- a/internal/app/controller/plan/plan_controller.go +++ b/internal/app/controller/plan/plan_controller.go @@ -390,13 +390,32 @@ func (c *Controller) StartPlan(ctx *gin.Context) { return } - // 4. 更新计划状态为“已启动” - if err := c.planRepo.UpdatePlanStatus(plan.ID, models.PlanStatusEnabled); err != nil { - c.logger.Errorf("更新计划 #%d 状态为 '已启动' 失败: %v", plan.ID, err) - controller.SendErrorResponse(ctx, controller.CodeInternalError, "更新计划状态失败") + // 4. 检查并重置执行计数器,然后更新计划状态为“已启动” + // 只有当计划是从非 Enabled 状态(如 Disabled, Stopeed, Failed)启动时,才需要重置计数器 + if plan.Status != models.PlanStatusEnabled { + // 如果计划是从停止或失败状态重新启动,且计数器不为0,则重置执行计数 + if plan.ExecuteCount > 0 { + if err := c.planRepo.UpdateExecuteCount(plan.ID, 0); err != nil { + c.logger.Errorf("重置计划 #%d 执行计数失败: %v", plan.ID, err) + controller.SendErrorResponse(ctx, controller.CodeInternalError, "重置计划执行计数失败") + return + } + c.logger.Infof("计划 #%d 的执行计数器已重置为 0。", plan.ID) + } + + // 更新计划状态为“已启动” + if err := c.planRepo.UpdatePlanStatus(plan.ID, models.PlanStatusEnabled); err != nil { + c.logger.Errorf("更新计划 #%d 状态失败: %v", plan.ID, err) + controller.SendErrorResponse(ctx, controller.CodeInternalError, "更新计划状态失败") + return + } + c.logger.Infof("已成功更新计划 #%d 的状态为 '已启动'。", plan.ID) + } else { + // 如果计划已经处于 Enabled 状态,则无需更新 + c.logger.Infof("计划 #%d 已处于启动状态,无需重复操作。", plan.ID) + controller.SendErrorResponse(ctx, controller.CodeBadRequest, "计划已处于启动状态,无需重复操作") return } - c.logger.Infof("已成功更新计划 #%d 的状态为 '已启动'", plan.ID) // 5. 为计划创建或更新触发器 if err := c.analysisPlanTaskManager.CreateOrUpdateTrigger(plan.ID); err != nil { diff --git a/internal/infra/repository/plan_repository.go b/internal/infra/repository/plan_repository.go index 9df675c..6c6876a 100644 --- a/internal/infra/repository/plan_repository.go +++ b/internal/infra/repository/plan_repository.go @@ -36,6 +36,8 @@ type PlanRepository interface { UpdatePlan(plan *models.Plan) error // UpdatePlanStatus 更新指定计划的状态 UpdatePlanStatus(id uint, status models.PlanStatus) error + // UpdateExecuteCount 更新指定计划的执行计数 + UpdateExecuteCount(id uint, count uint) error // DeletePlan 根据ID删除计划,同时删除其关联的任务(非子任务)或子计划关联 DeletePlan(id uint) error // FlattenPlanTasks 递归展开计划,返回按执行顺序排列的所有任务列表 @@ -745,3 +747,15 @@ func (r *gormPlanRepository) UpdatePlanStateAfterExecution(planID uint, newCount "status": newStatus, }).Error } + +// UpdateExecuteCount 更新指定计划的执行计数 +func (r *gormPlanRepository) UpdateExecuteCount(id uint, count uint) error { + result := r.db.Model(&models.Plan{}).Where("id = ?", id).Update("execute_count", count) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return gorm.ErrRecordNotFound + } + return nil +}