auto_task_invalid.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package schedule
  2. import (
  3. "fmt"
  4. "github.com/caixw/lib.go/conv"
  5. "github.com/robfig/cron/v3"
  6. "log"
  7. "time"
  8. "youngee_b_api/app/dao"
  9. "youngee_b_api/app/entity"
  10. )
  11. func AutoTaskInvalid() error {
  12. // 新建一个定时任务对象
  13. crontab := cron.New(cron.WithSeconds()) // 精确到秒
  14. spec := "0 */5 * * * ?" //cron表达式,每5分钟一次
  15. // "0 0 12 * * ?" 每天中午12点执行
  16. // 添加定时任务
  17. // 定时任务1 品牌种草失效自动处理
  18. _, err1 := crontab.AddFunc(spec, AutoSelectionInvalidTask)
  19. if err1 != nil {
  20. return err1
  21. }
  22. // 定时任务2 电商带货失效自动处理
  23. _, err2 := crontab.AddFunc(spec, AutoSelectionInvalidTask)
  24. if err2 != nil {
  25. return err2
  26. }
  27. // 定时任务3 本地生活失效自动处理
  28. _, err3 := crontab.AddFunc(spec, AutoLocalLifeInvalidTask)
  29. if err3 != nil {
  30. return err3
  31. }
  32. // 启动定时器
  33. crontab.Start()
  34. // 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
  35. //select {} //阻塞主线程停止
  36. return nil
  37. }
  38. // 定时任务1 品牌种草失效自动处理
  39. func AutoProjectInvalidTask() {
  40. log.Println("AutoProjectInvalidTask running Start, Time :", time.Now())
  41. var projectInfos []*entity.Project
  42. projectInfos, _ = dao.ProjectDAO{}.GetProjectList(6, "project_status")
  43. // 对于所有未支付的品牌种草项目进行处理
  44. for _, projectInfo := range projectInfos {
  45. projectId := projectInfo.ProjectId
  46. autoTaskId := projectInfo.AutoTaskID
  47. autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid")
  48. dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h")
  49. // 失效时间计算:任务截止时间 + 设置的失效自动执行时间
  50. timeInvalid := projectInfo.RecruitDdl.Add(dd)
  51. if projectInfo.AutoFailAt.IsZero() {
  52. dao.Db.Model(&entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{AutoFailAt: timeInvalid})
  53. }
  54. projectNeedMod := entity.Project{}
  55. dao.Db.Where("project_id = ?", projectId).First(&projectNeedMod)
  56. //fmt.Println(fmt.Sprintf("品牌种草项目 %s 失效自动处理时间为:%s", projectId, projectNeedMod.AutoFailAt))
  57. // 如果失效自动处理的时间不为空
  58. if !projectNeedMod.AutoFailAt.IsZero() {
  59. timeNow := time.Now()
  60. // 如果 未失效 && 已经过了失效自动处理的时间
  61. if projectNeedMod.ProjectStatus < 9 && projectNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
  62. dao.Db.Model(entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{ProjectStatus: 9, FinishAt: timeInvalid, FailReason: 1})
  63. fmt.Println(fmt.Sprintf("已更新品牌种草项目 %s 状态为超时未支付的失效状态", projectId))
  64. dao.Db.Model(entity.ProjectTaskInfo{}).Where("project_id = ?", projectId).Updates(entity.ProjectTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
  65. }
  66. }
  67. }
  68. log.Println("AutoProjectInvalidTask running End, Time :", time.Now())
  69. }
  70. // 定时任务2 电商带货失效自动处理
  71. func AutoSelectionInvalidTask() {
  72. log.Println("AutoSelectionInvalidTask running Start, Time :", time.Now())
  73. var selectionInfos []*entity.SelectionInfo
  74. selectionInfos, _ = dao.SelectionInfoDAO{}.GetSelectionInfoList(4, "selection_status")
  75. // 对于所有未支付的电商带货项目进行处理
  76. for _, selectionInfo := range selectionInfos {
  77. selectionId := selectionInfo.SelectionID
  78. autoTaskId := selectionInfo.AutoTaskID
  79. autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "selection_invalid")
  80. dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.SelectionInvalid, "") + "h")
  81. // 失效时间计算:任务截止时间 + 设置的失效自动执行时间
  82. timeInvalid := selectionInfo.PassAt.Add(dd)
  83. if selectionInfo.AutoFailAt.IsZero() {
  84. dao.Db.Model(&entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(&entity.SelectionInfo{AutoFailAt: timeInvalid})
  85. }
  86. selectionInfoNeedMod := entity.SelectionInfo{}
  87. dao.Db.Where("selection_id = ?", selectionId).First(&selectionInfoNeedMod)
  88. //fmt.Println(fmt.Sprintf("电商带货项目 %s 失效自动处理时间为:%s", selectionId, selectionInfoNeedMod.AutoFailAt))
  89. // 如果失效自动处理的时间不为空
  90. if !selectionInfoNeedMod.AutoFailAt.IsZero() {
  91. timeNow := time.Now()
  92. // 如果 未失效 && 已经过了失效自动处理的时间
  93. if selectionInfoNeedMod.SelectionStatus < 5 && selectionInfoNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
  94. dao.Db.Model(entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(&entity.SelectionInfo{SelectionStatus: 7, FinishAt: timeInvalid, FailReason: 1})
  95. fmt.Println(fmt.Sprintf("已更新电商带货项目 %s 状态为超时未支付的失效状态", selectionId))
  96. dao.Db.Model(entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(entity.SelectionTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
  97. }
  98. }
  99. }
  100. log.Println("AutoSelectionInvalidTask running End, Time :", time.Now())
  101. }
  102. // 定时任务3 本地生活失效自动处理
  103. func AutoLocalLifeInvalidTask() {
  104. log.Println("AutoLocalLifeInvalidTask running Start, Time :", time.Now())
  105. var localLifeInfos []*entity.LocalLifeInfo
  106. localLifeInfos, _ = dao.LocalLifeDao{}.GetLocalLifeList(6, "task_status")
  107. // 对于所有未支付的本地生活项目进行处理
  108. for _, localLifeInfo := range localLifeInfos {
  109. localId := localLifeInfo.LocalID
  110. autoTaskId := localLifeInfo.AutoTaskID
  111. autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid")
  112. dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h")
  113. // 失效时间计算:任务截止时间 + 设置的失效自动执行时间
  114. timeInvalid := localLifeInfo.RecruitDdl.Add(dd)
  115. if localLifeInfo.AutoFailAt.IsZero() {
  116. dao.Db.Model(&entity.LocalLifeInfo{}).Where("local_id = ?", localId).Updates(&entity.LocalLifeInfo{AutoFailAt: timeInvalid})
  117. }
  118. localLifeNeedMod := entity.LocalLifeInfo{}
  119. dao.Db.Where("local_id = ?", localId).First(&localLifeNeedMod)
  120. //fmt.Println(fmt.Sprintf("本地生活项目 %s 失效自动处理时间为:%s", localId, localLifeNeedMod.AutoFailAt))
  121. // 如果失效自动处理的时间不为空
  122. if !localLifeNeedMod.AutoFailAt.IsZero() {
  123. timeNow := time.Now()
  124. // 如果 未失效 && 已经过了失效自动处理的时间
  125. if localLifeNeedMod.TaskStatus < 9 && localLifeNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
  126. dao.Db.Model(entity.LocalLifeInfo{}).Where("local_id = ?", localId).Updates(&entity.LocalLifeInfo{TaskStatus: 9, FinishAt: timeInvalid, FailReason: 1})
  127. fmt.Println(fmt.Sprintf("已更新本地生活项目 %s 状态为超时未支付的失效状态", localId))
  128. dao.Db.Model(entity.LocalLifeTaskInfo{}).Where("local_id = ?", localId).Updates(entity.LocalLifeTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
  129. }
  130. }
  131. }
  132. log.Println("AutoLocalLifeInvalidTask running End, Time :", time.Now())
  133. }