package schedule import ( "fmt" "github.com/caixw/lib.go/conv" "github.com/robfig/cron/v3" "log" "time" "youngee_b_api/app/dao" "youngee_b_api/app/entity" ) func AutoTaskInvalid() error { // 新建一个定时任务对象 crontab := cron.New(cron.WithSeconds()) // 精确到秒 spec := "0 */5 * * * ?" //cron表达式,每5分钟一次 // "0 0 12 * * ?" 每天中午12点执行 // 添加定时任务 // 定时任务1 品牌种草失效自动处理 _, err1 := crontab.AddFunc(spec, AutoProjectInvalidTask) if err1 != nil { return err1 } // 定时任务2 电商带货失效自动处理 _, err2 := crontab.AddFunc(spec, AutoSelectionInvalidTask) if err2 != nil { return err2 } // 定时任务3 本地生活失效自动处理 _, err3 := crontab.AddFunc(spec, AutoLocalLifeInvalidTask) if err3 != nil { return err3 } // 启动定时器 crontab.Start() // 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制 //select {} //阻塞主线程停止 return nil } // 定时任务1 品牌种草失效自动处理 func AutoProjectInvalidTask() { log.Println("AutoProjectInvalidTask running Start, Time :", time.Now()) var projectInfos []*entity.Project _ = dao.Db.Model(entity.Project{}).Where("project_status <= ?", 6).Select("project_id,project_status,recruit_ddl,auto_task_id,auto_fail_at").Find(&projectInfos).Error // 对于所有未支付的品牌种草项目进行处理 for _, projectInfo := range projectInfos { projectId := projectInfo.ProjectId if time.Now().After(projectInfo.RecruitDdl) && projectInfo.ProjectStatus < 4 { // 变成失效 _ = dao.ProjectDAO{}.UpdateProject(entity.Project{ ProjectId: projectId, ProjectStatus: 9, FailReason: 1, FailAt: time.Now(), }) continue } if projectInfo.ProjectStatus == 4 && time.Now().After(projectInfo.RecruitDdl) { // 变成待支付 _ = dao.ProjectDAO{}.UpdateProject(entity.Project{ ProjectId: projectId, ProjectStatus: 6, }) continue } autoTaskId := projectInfo.AutoTaskID autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid") dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h") // 失效时间计算:任务截止时间 + 设置的失效自动执行时间 if projectInfo.AutoFailAt.IsZero() { timeInvalid := projectInfo.RecruitDdl.Add(dd) dao.Db.Model(&entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{AutoFailAt: timeInvalid}) projectInfo.AutoFailAt = timeInvalid } // 超时未支付则变为失效 if time.Now().After(projectInfo.AutoFailAt) && projectInfo.ProjectStatus == 6 { _ = dao.ProjectDAO{}.UpdateProject(entity.Project{ ProjectId: projectId, ProjectStatus: 9, FailReason: 1, FailAt: time.Now(), }) fmt.Println(fmt.Sprintf("已更新品牌种草项目 %s 状态为超时未支付的失效状态", projectId)) dao.Db.Model(entity.ProjectTaskInfo{}).Where("project_id = ?", projectId).Updates(entity.ProjectTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: time.Now()}) } } log.Println("AutoProjectInvalidTask running End, Time :", time.Now()) } // 定时任务2 电商带货失效自动处理 func AutoSelectionInvalidTask() { log.Println("AutoSelectionInvalidTask running Start, Time :", time.Now()) var selectionInfos []*entity.SelectionInfo selectionInfos, _ = dao.SelectionInfoDAO{}.GetSelectionInfoList(4, "selection_status") // 对于所有未支付的电商带货项目进行处理 for _, selectionInfo := range selectionInfos { selectionId := selectionInfo.SelectionID autoTaskId := selectionInfo.AutoTaskID autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "selection_invalid") dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.SelectionInvalid, "") + "h") if selectionInfo.AutoFailAt.IsZero() { timeInvalid := selectionInfo.PassAt.Add(dd) dao.Db.Model(&entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(&entity.SelectionInfo{AutoFailAt: timeInvalid}) selectionInfo.AutoFailAt = timeInvalid } // 超时未支付则变为失效 if time.Now().After(selectionInfo.AutoFailAt) && selectionInfo.SelectionStatus == 4 { _ = dao.SelectionInfoDAO{}.UpdateSelectionInfo(entity.SelectionInfo{ SelectionID: selectionId, SelectionStatus: 7, FailReason: 1, FailAt: time.Now(), }) fmt.Println(fmt.Sprintf("已更新电商带货项目 %s 状态为超时未支付的失效状态", selectionId)) dao.Db.Model(entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(entity.SelectionTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: time.Now()}) } } log.Println("AutoSelectionInvalidTask running End, Time :", time.Now()) } // 定时任务3 本地生活失效自动处理 func AutoLocalLifeInvalidTask() { log.Println("AutoLocalLifeInvalidTask running Start, Time :", time.Now()) var localLifeInfos []*entity.LocalLifeInfo _ = dao.Db.Model(entity.LocalLifeInfo{}).Where("task_status <= ?", 6).Select("local_id,task_status,recruit_ddl,auto_task_id,auto_fail_at").Find(&localLifeInfos).Error // 对于所有未支付的本地生活项目进行处理 for _, localLifeInfo := range localLifeInfos { localId := localLifeInfo.LocalID if time.Now().After(localLifeInfo.RecruitDdl) && localLifeInfo.TaskStatus < 4 { // 变成失效 _ = dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{ LocalID: localId, TaskStatus: 9, FailReason: 1, FailAt: time.Now(), }) continue } if time.Now().After(localLifeInfo.RecruitDdl) && localLifeInfo.TaskStatus == 4 { // 变成待支付 _ = dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{ LocalID: localId, TaskStatus: 6, }) continue } autoTaskId := localLifeInfo.AutoTaskID autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid") dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h") // 失效时间计算:任务截止时间 + 设置的失效自动执行时间 if localLifeInfo.AutoFailAt.IsZero() { timeInvalid := localLifeInfo.RecruitDdl.Add(dd) dao.Db.Model(&entity.LocalLifeInfo{}).Where("local_id = ?", localId).Updates(&entity.LocalLifeInfo{AutoFailAt: timeInvalid}) localLifeInfo.AutoFailAt = timeInvalid } // 超时未支付则变为失效 if time.Now().After(localLifeInfo.AutoFailAt) && localLifeInfo.TaskStatus == 6 { _ = dao.LocalLifeDao{}.UpdateLocal(entity.LocalLifeInfo{ LocalID: localId, TaskStatus: 9, FailReason: 1, FailAt: time.Now(), }) fmt.Println(fmt.Sprintf("已更新本地生活项目 %s 状态为超时未支付的失效状态", localId)) dao.Db.Model(entity.LocalLifeTaskInfo{}).Where("local_id = ?", localId).Updates(entity.LocalLifeTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: time.Now()}) } } log.Println("AutoLocalLifeInvalidTask running End, Time :", time.Now()) }