task.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package scheduler
  2. import (
  3. "context"
  4. "eta/eta_mini_crm/models"
  5. "eta/eta_mini_crm/utils"
  6. "fmt"
  7. "time"
  8. "github.com/beego/beego/v2/task"
  9. )
  10. func InitJob() {
  11. fmt.Println("消息推送任务开启。。。")
  12. // 每天凌晨1点检测, 发送消息
  13. tk1 := task.NewTask("SendReminderMsg", "0 0 1 * * *", SendReminderMsg)
  14. task.AddTask("发送消息提醒", tk1)
  15. // 每天凌晨1点检测, 修改用户状态
  16. tk2 := task.NewTask("ModifyUserStatus", "0 0 1 * * *", ModifyUser)
  17. task.AddTask("定时修改用户状态", tk2)
  18. task.StartTask()
  19. }
  20. func ModifyUser(ctx context.Context) (err error) {
  21. defer func() {
  22. if err != nil {
  23. utils.ApiLog.Warn("userPermission 定时任务出错,Err: %s", err.Error())
  24. }
  25. }()
  26. curTime := time.Now()
  27. var pars []interface{}
  28. condition := ` AND valid_end_time<? AND status=? `
  29. pars = append(pars, curTime, 2)
  30. err = models.UpdateUserStatus(condition, pars)
  31. return
  32. }
  33. func ModifyUserStatus() (err error) {
  34. curTime := time.Now()
  35. condition := ` AND valid_end_time<?`
  36. var pars []interface{}
  37. pars = append(pars, curTime)
  38. condition += ` AND status=? `
  39. pars = append(pars, 2)
  40. err = models.UpdateUserStatus(condition, pars)
  41. return
  42. }
  43. func SendReminderMsg(ctx context.Context) (err error) {
  44. defer func() {
  45. if err := recover(); err != nil {
  46. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err)
  47. }
  48. }()
  49. var userPars7 []interface{}
  50. var userPars15 []interface{}
  51. var userPars30 []interface{}
  52. var userPars60 []interface{}
  53. var msgPars7 []interface{}
  54. var msgPars15 []interface{}
  55. var msgPars30 []interface{}
  56. var msgPars60 []interface{}
  57. userTime7 := time.Now().AddDate(0, 0, 7)
  58. userTime15 := time.Now().AddDate(0, 0, 15)
  59. userTime30 := time.Now().AddDate(0, 0, 30)
  60. userTime60 := time.Now().AddDate(0, 0, 60)
  61. msgTime7 := time.Now().AddDate(0, 0, -7)
  62. msgTime15 := time.Now().AddDate(0, 0, -15)
  63. msgTime30 := time.Now().AddDate(0, 0, -30)
  64. msgTime60 := time.Now().AddDate(0, 0, -60)
  65. userCondition1 := ` AND valid_end_time<? `
  66. userCondition2 := ` AND valid_end_time<? AND valid_end_time>? `
  67. msgCondition := ` AND create_time>? `
  68. userPars7 = append(userPars7, userTime7)
  69. userPars15 = append(userPars15, userTime15, userTime7)
  70. userPars30 = append(userPars30, userTime30, userTime15)
  71. userPars60 = append(userPars60, userTime60, userTime30)
  72. msgPars7 = append(msgPars7, msgTime7)
  73. msgPars15 = append(msgPars15, msgTime15)
  74. msgPars30 = append(msgPars30, msgTime30)
  75. msgPars60 = append(msgPars60, msgTime60)
  76. err = SendMsgToSysUser(userCondition1, msgCondition, userPars7, msgPars7, 7)
  77. if err != nil {
  78. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  79. }
  80. err = SendMsgToSysUser(userCondition2, msgCondition, userPars15, msgPars15, 15)
  81. if err != nil {
  82. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  83. }
  84. err = SendMsgToSysUser(userCondition2, msgCondition, userPars30, msgPars30, 30)
  85. if err != nil {
  86. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  87. }
  88. err = SendMsgToSysUser(userCondition2, msgCondition, userPars60, msgPars60, 60)
  89. if err != nil {
  90. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  91. }
  92. return
  93. }
  94. func SendMsgToSysUser(userCondition, msgCondition string, userPars, msgPars []interface{}, messagetType int) (err error) {
  95. total, err := models.GetUserCount(userCondition, userPars)
  96. if err != nil {
  97. utils.ApiLog.Warn("获取用户列表失败 task err: %s", err.Error())
  98. }
  99. if total == 0 {
  100. return
  101. }
  102. // 获得待发送用户的列表
  103. userList, err := models.GetUserList(userCondition, userPars, 0, total)
  104. if err != nil {
  105. return
  106. }
  107. // 获得待通知系统用户的列表
  108. sysUserIds, err := models.GetSysUserIdList()
  109. if err != nil {
  110. return
  111. }
  112. messageList, err := models.GetSysMessageReportByCondition(msgCondition, msgPars)
  113. if err != nil {
  114. return
  115. }
  116. layout := "【%s】到期%d天提醒,请及时跟进"
  117. messageMap := make(map[int]map[int]struct{})
  118. for _, v := range messageList {
  119. if mv, ok := messageMap[v.ReceiveSysUserId]; ok {
  120. mv[v.UserId] = struct{}{}
  121. } else {
  122. messageMap[v.ReceiveSysUserId] = make(map[int]struct{})
  123. messageMap[v.ReceiveSysUserId][v.UserId] = struct{}{}
  124. }
  125. }
  126. sendMsg := make([]*models.SysMessageReport, 0)
  127. for _, v := range sysUserIds {
  128. if userMap, ok := messageMap[v]; ok {
  129. for _, u := range userList {
  130. if _, ok := userMap[u.UserId]; !ok {
  131. sendMsg = append(sendMsg, &models.SysMessageReport{
  132. UserId: u.UserId,
  133. ReceiveSysUserId: v,
  134. MessageType: messagetType,
  135. IsRead: false,
  136. CreateTime: time.Now(),
  137. ModifyTime: time.Now(),
  138. Content: fmt.Sprintf(layout, u.RealName, messagetType),
  139. })
  140. }
  141. }
  142. } else {
  143. for _, u := range userList {
  144. sendMsg = append(sendMsg, &models.SysMessageReport{
  145. UserId: u.UserId,
  146. ReceiveSysUserId: v,
  147. MessageType: messagetType,
  148. IsRead: false,
  149. CreateTime: time.Now(),
  150. ModifyTime: time.Now(),
  151. Content: fmt.Sprintf(layout, u.RealName, messagetType),
  152. })
  153. }
  154. }
  155. }
  156. if len(sendMsg) > 0 {
  157. err = models.InsertMultiSysMessageReport(sendMsg)
  158. }
  159. return
  160. }