package logic import ( "github.com/zeromicro/go-zero/core/logx" "gitlink.org.cn/jcce-pcm/pcm-coordinator/model" "gitlink.org.cn/jcce-pcm/pcm-coordinator/rpc/internal/svc" "gorm.io/gorm" "strings" ) func InitCron(svc *svc.ServiceContext) { svc.Cron.Start() svc.Cron.AddFunc("*/5 * * * * ?", func() { var tasks []model.Task svc.DbEngin.Not("status = ?", "Completed").Find(&tasks) for _, task := range tasks { var allStatus string tx := svc.DbEngin.Raw("SELECT CONCAT_WS(',',GROUP_CONCAT(DISTINCT h.status) ,GROUP_CONCAT(DISTINCT a.status) ,GROUP_CONCAT(DISTINCT c.status))as status from task t left join hpc h on t.id = h.task_id left join cloud c on t.id = c.task_id left join ai a on t.id = a.task_id where t.id = ?", task.Id).Scan(&allStatus) if tx.Error != nil { logx.Error(tx.Error) } // 子状态统一则修改主任务状态 statusArray := strings.Split(allStatus, ",") if len(RemoveRepeatedElement(statusArray)) == 1 { updateTask(svc.DbEngin, &task, statusArray[0]) continue } // 子任务包含失败状态 主任务则失败 if strings.Contains(allStatus, "Failed") { updateTask(svc.DbEngin, &task, "Failed") continue } if strings.Contains(allStatus, "Running") { updateTask(svc.DbEngin, &task, "Running") } } }) } func updateTask(dbEngin *gorm.DB, task *model.Task, status string) { if task.Status != status { task.Status = status dbEngin.Updates(&task) } } func RemoveRepeatedElement(arr []string) (newArr []string) { newArr = make([]string, 0) for i := 0; i < len(arr); i++ { repeat := false for j := i + 1; j < len(arr); j++ { if arr[i] == arr[j] { repeat = true break } } if !repeat { newArr = append(newArr, arr[i]) } } return }