|
@@ -0,0 +1,102 @@
|
|
|
+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 AutoTask() error {
|
|
|
+ // 新建一个定时任务对象
|
|
|
+ crontab := cron.New(cron.WithSeconds()) // 精确到秒
|
|
|
+ spec := "0 */1 * * * ?" //cron表达式,每10h一次
|
|
|
+ // "0 0 12 * * ?" 每天中午12点执行
|
|
|
+
|
|
|
+ // 添加定时任务
|
|
|
+ // 定时任务1 品牌种草失效自动处理
|
|
|
+ _, err1 := crontab.AddFunc(spec, AutoInvalidTask)
|
|
|
+ if err1 != nil {
|
|
|
+ return err1
|
|
|
+ }
|
|
|
+ // 定时任务2 电商带货失效自动处理
|
|
|
+ _, err2 := crontab.AddFunc(spec, AutoSelectionInvalidTask)
|
|
|
+ if err2 != nil {
|
|
|
+ return err2
|
|
|
+ }
|
|
|
+
|
|
|
+ // 启动定时器
|
|
|
+ crontab.Start()
|
|
|
+ // 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
|
|
|
+ //select {} //阻塞主线程停止
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// 定时任务1 品牌种草失效自动处理
|
|
|
+func AutoInvalidTask() {
|
|
|
+ log.Println("AutoInvalidTask running Start, Time :", time.Now())
|
|
|
+ var projectInfos []*entity.Project
|
|
|
+ projectInfos, _ = dao.ProjectDAO{}.GetProjectList(6, "project_status")
|
|
|
+ // 对于所有未支付的品牌种草项目进行处理
|
|
|
+ for _, projectInfo := range projectInfos {
|
|
|
+ projectId := projectInfo.ProjectId
|
|
|
+ autoTaskId := projectInfo.AutoTaskID
|
|
|
+ autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid")
|
|
|
+ dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h")
|
|
|
+ // 失效时间计算:任务截止时间 + 设置的失效自动执行时间
|
|
|
+ timeInvalid := projectInfo.RecruitDdl.Add(dd)
|
|
|
+ if projectInfo.AutoFailAt.IsZero() {
|
|
|
+ dao.Db.Model(&entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{AutoFailAt: timeInvalid})
|
|
|
+ }
|
|
|
+ projectNeedMod := entity.Project{}
|
|
|
+ dao.Db.Where("project_id = ?", projectId).First(&projectNeedMod)
|
|
|
+ fmt.Println("品牌种草项目失效自动处理时间为:", projectNeedMod.AutoFailAt)
|
|
|
+ // 如果失效自动处理的时间不为空
|
|
|
+ if !projectNeedMod.AutoFailAt.IsZero() {
|
|
|
+ timeNow := time.Now()
|
|
|
+ // 如果 未失效 && 已经过了失效自动处理的时间
|
|
|
+ if projectNeedMod.ProjectStatus < 8 && projectNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
|
|
|
+ dao.Db.Model(entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{ProjectStatus: 8, FinishAt: timeInvalid, FailReason: 1})
|
|
|
+ fmt.Println("已更新品牌种草项目状态为超时未支付的失效状态")
|
|
|
+ dao.Db.Model(entity.ProjectTaskInfo{}).Where("project_id = ?", projectId).Updates(entity.ProjectTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Println("AutoInvalidTask 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")
|
|
|
+ // 失效时间计算:任务截止时间 + 设置的失效自动执行时间
|
|
|
+ timeInvalid := selectionInfo.PassAt.Add(dd)
|
|
|
+ if selectionInfo.AutoFailAt.IsZero() {
|
|
|
+ dao.Db.Model(&entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(&entity.SelectionInfo{AutoFailAt: timeInvalid})
|
|
|
+ }
|
|
|
+ selectionInfoNeedMod := entity.SelectionInfo{}
|
|
|
+ dao.Db.Where("selection_id = ?", selectionId).First(&selectionInfoNeedMod)
|
|
|
+ fmt.Println("电商带货项目失效自动处理时间为:", selectionInfoNeedMod.AutoFailAt)
|
|
|
+ // 如果失效自动处理的时间不为空
|
|
|
+ if !selectionInfoNeedMod.AutoFailAt.IsZero() {
|
|
|
+ timeNow := time.Now()
|
|
|
+ // 如果 未失效 && 已经过了失效自动处理的时间
|
|
|
+ if selectionInfoNeedMod.SelectionStatus < 5 && selectionInfoNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
|
|
|
+ dao.Db.Model(entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(&entity.SelectionInfo{SelectionStatus: 7, FinishAt: timeInvalid, FailReason: 1})
|
|
|
+ fmt.Println("已更新电商带货项目状态为超时未支付的失效状态")
|
|
|
+ dao.Db.Model(entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(entity.SelectionTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Println("AutoSelectionInvalidTask running End, Time :", time.Now())
|
|
|
+}
|