优化代码
This commit is contained in:
@@ -33,9 +33,9 @@ func (app *Application) initializeState() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// initializeSystemPlans 确保预定义的系统计划在数据库中存在。
|
// initializeSystemPlans 确保预定义的系统计划在数据库中存在并保持最新。
|
||||||
func (app *Application) initializeSystemPlans() error {
|
func (app *Application) initializeSystemPlans() error {
|
||||||
app.Logger.Info("开始检查并创建预定义的系统计划...")
|
app.Logger.Info("开始检查并更新预定义的系统计划...")
|
||||||
|
|
||||||
// 动态构建预定义计划列表
|
// 动态构建预定义计划列表
|
||||||
predefinedSystemPlans := app.getPredefinedSystemPlans()
|
predefinedSystemPlans := app.getPredefinedSystemPlans()
|
||||||
@@ -43,24 +43,39 @@ func (app *Application) initializeSystemPlans() error {
|
|||||||
// 1. 获取所有已存在的系统计划
|
// 1. 获取所有已存在的系统计划
|
||||||
existingPlans, _, err := app.Infra.Repos.PlanRepo.ListPlans(repository.ListPlansOptions{
|
existingPlans, _, err := app.Infra.Repos.PlanRepo.ListPlans(repository.ListPlansOptions{
|
||||||
PlanType: repository.PlanTypeFilterSystem,
|
PlanType: repository.PlanTypeFilterSystem,
|
||||||
}, 1, 999) // 使用一个较大的 pageSize 来获取所有系统计划
|
}, 1, 99999) // 使用一个较大的 pageSize 来获取所有系统计划
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("获取现有系统计划失败: %w", err)
|
return fmt.Errorf("获取现有系统计划失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 为了方便查找, 将现有计划名放入一个 map
|
// 2. 为了方便查找, 将现有计划名放入一个 map
|
||||||
existingPlanNames := make(map[string]bool)
|
existingPlanMap := make(map[string]*models.Plan)
|
||||||
for _, p := range existingPlans {
|
for i := range existingPlans {
|
||||||
existingPlanNames[p.Name] = true
|
existingPlanMap[existingPlans[i].Name] = &existingPlans[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. 遍历预定义的计划列表
|
// 3. 遍历预定义的计划列表
|
||||||
for _, predefinedPlan := range predefinedSystemPlans {
|
for i := range predefinedSystemPlans {
|
||||||
// 4. 如果计划不存在, 则创建
|
predefinedPlan := &predefinedSystemPlans[i] // 获取可修改的指针
|
||||||
if !existingPlanNames[predefinedPlan.Name] {
|
|
||||||
|
if foundExistingPlan, ok := existingPlanMap[predefinedPlan.Name]; ok {
|
||||||
|
// 如果计划存在,则进行无差别更新
|
||||||
|
app.Logger.Infof("预定义计划 '%s' 已存在,正在进行无差别更新...", predefinedPlan.Name)
|
||||||
|
|
||||||
|
// 将数据库中已存在的计划的ID和运行时状态字段赋值给预定义计划
|
||||||
|
predefinedPlan.ID = foundExistingPlan.ID
|
||||||
|
predefinedPlan.ExecuteCount = foundExistingPlan.ExecuteCount
|
||||||
|
predefinedPlan.Status = foundExistingPlan.Status
|
||||||
|
|
||||||
|
if err := app.Infra.Repos.PlanRepo.UpdatePlan(predefinedPlan); err != nil {
|
||||||
|
return fmt.Errorf("更新预定义计划 '%s' 失败: %w", predefinedPlan.Name, err)
|
||||||
|
} else {
|
||||||
|
app.Logger.Infof("成功更新预定义计划 '%s'。", predefinedPlan.Name)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 如果计划不存在, 则创建
|
||||||
app.Logger.Infof("预定义计划 '%s' 不存在,正在创建...", predefinedPlan.Name)
|
app.Logger.Infof("预定义计划 '%s' 不存在,正在创建...", predefinedPlan.Name)
|
||||||
if err := app.Infra.Repos.PlanRepo.CreatePlan(&predefinedPlan); err != nil {
|
if err := app.Infra.Repos.PlanRepo.CreatePlan(predefinedPlan); err != nil {
|
||||||
// 错误现在是致命的
|
|
||||||
return fmt.Errorf("创建预定义计划 '%s' 失败: %w", predefinedPlan.Name, err)
|
return fmt.Errorf("创建预定义计划 '%s' 失败: %w", predefinedPlan.Name, err)
|
||||||
} else {
|
} else {
|
||||||
app.Logger.Infof("成功创建预定义计划 '%s'。", predefinedPlan.Name)
|
app.Logger.Infof("成功创建预定义计划 '%s'。", predefinedPlan.Name)
|
||||||
|
|||||||
@@ -388,12 +388,27 @@ func (s *Scheduler) handlePlanTermination(planLogID uint, reason string) {
|
|||||||
s.logger.Errorf("取消计划 %d 的后续任务日志时出错: %v", planLogID, err)
|
s.logger.Errorf("取消计划 %d 的后续任务日志时出错: %v", planLogID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. 将计划本身的状态更新为失败
|
// 4. 获取计划执行日志以获取顶层 PlanID
|
||||||
planLog, err := s.executionLogRepo.FindPlanExecutionLogByID(planLogID)
|
planLog, err := s.executionLogRepo.FindPlanExecutionLogByID(planLogID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Errorf("无法找到计划执行日志 %d 以更新父计划状态: %v", planLogID, err)
|
s.logger.Errorf("无法找到计划执行日志 %d 以更新父计划状态: %v", planLogID, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 5. 获取顶层计划的详细信息,以检查其类型
|
||||||
|
topLevelPlan, err := s.planRepo.GetBasicPlanByID(planLog.PlanID)
|
||||||
|
if err != nil {
|
||||||
|
s.logger.Errorf("获取顶层计划 %d 的基本信息失败: %v", planLog.PlanID, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 如果是系统任务,则不修改计划状态
|
||||||
|
if topLevelPlan.PlanType == models.PlanTypeSystem {
|
||||||
|
s.logger.Warnf("系统任务 %d (日志ID: %d) 执行失败,但根据策略不修改其计划状态。", topLevelPlan.ID, planLogID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 将计划本身的状态更新为失败 (仅对非系统任务执行)
|
||||||
if err := s.planRepo.UpdatePlanStatus(planLog.PlanID, models.PlanStatusFailed); err != nil {
|
if err := s.planRepo.UpdatePlanStatus(planLog.PlanID, models.PlanStatusFailed); err != nil {
|
||||||
s.logger.Errorf("更新计划 %d 状态为 '失败' 时出错: %v", planLog.PlanID, err)
|
s.logger.Errorf("更新计划 %d 状态为 '失败' 时出错: %v", planLog.PlanID, err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user