重启系统时清零计数器
This commit is contained in:
@@ -192,6 +192,30 @@ func (app *Application) initializePendingTasks(
|
|||||||
// 阶段二:清理所有待执行任务和相关日志
|
// 阶段二:清理所有待执行任务和相关日志
|
||||||
logger.Info("阶段二:开始清理所有待执行任务和相关日志...")
|
logger.Info("阶段二:开始清理所有待执行任务和相关日志...")
|
||||||
|
|
||||||
|
// --- 新增逻辑:处理因崩溃导致状态不一致的计划主表状态 ---
|
||||||
|
// 1. 查找所有未完成的计划执行日志 (状态为 Started 或 Waiting)
|
||||||
|
incompletePlanLogs, err := executionLogRepo.FindIncompletePlanExecutionLogs()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("查找未完成的计划执行日志失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 收集所有受影响的唯一 PlanID
|
||||||
|
affectedPlanIDs := make(map[uint]struct{})
|
||||||
|
for _, log := range incompletePlanLogs {
|
||||||
|
affectedPlanIDs[log.PlanID] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 对于每个受影响的 PlanID,重置其 execute_count 并将其状态设置为 Failed
|
||||||
|
for planID := range affectedPlanIDs {
|
||||||
|
logger.Warnf("检测到计划 #%d 在应用崩溃前处于未完成状态,将重置其计数并标记为失败。", planID)
|
||||||
|
// 使用 UpdatePlanStateAfterExecution 来更新主表状态,避免影响关联数据
|
||||||
|
if err := planRepo.UpdatePlanStateAfterExecution(planID, 0, models.PlanStatusFailed); err != nil {
|
||||||
|
logger.Errorf("重置计划 #%d 计数并标记为失败时出错: %v", planID, err)
|
||||||
|
// 这是一个非阻塞性错误,继续处理其他计划
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.Info("阶段二:计划主表状态修正完成。")
|
||||||
|
|
||||||
// 直接调用新的方法来更新计划执行日志状态为失败
|
// 直接调用新的方法来更新计划执行日志状态为失败
|
||||||
if err := executionLogRepo.FailAllIncompletePlanExecutionLogs(); err != nil {
|
if err := executionLogRepo.FailAllIncompletePlanExecutionLogs(); err != nil {
|
||||||
logger.Errorf("更新所有未完成计划执行日志状态为失败失败: %v", err)
|
logger.Errorf("更新所有未完成计划执行日志状态为失败失败: %v", err)
|
||||||
|
|||||||
Reference in New Issue
Block a user