task.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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. // 每天凌晨12点10分检测, 发送消息
  13. tk1 := task.NewTask("SendReminderMsg", "0 10 0 * * *", SendReminderMsg)
  14. task.AddTask("发送消息提醒", tk1)
  15. // 每天凌晨12点检测, 修改用户状态
  16. tk2 := task.NewTask("ModifyUserStatus", "5 0 0 * * *", ModifyUserStatus)
  17. task.AddTask("定时修改用户状态", tk2)
  18. // 每隔5分钟,同步报告状态
  19. tk3 := task.NewTask("SyncReportPushStatus", "0 0/5 * * * *", SyncReportPushStatus)
  20. task.AddTask("定时同步报告推送状态", tk3)
  21. task.StartTask()
  22. }
  23. func SyncReportPushStatus(ctx context.Context) (err error) {
  24. defer func() {
  25. if err != nil {
  26. utils.FileLog.Info("同步研报推送状态出错,Err: %s", err)
  27. }
  28. if err := recover(); err != nil {
  29. utils.FileLog.Warn("同步研报推送状态出错,定时任务出错,Err: %s", err)
  30. }
  31. }()
  32. // 获取前30分钟修改的数据
  33. startTime := time.Now().Add(-30 * time.Minute).Format(utils.FormatDateTime)
  34. conditon := " AND modify_time >= ?"
  35. var pars []interface{}
  36. pars = append(pars, startTime)
  37. reportList, err := models.GetReportByCondition(conditon, pars)
  38. var reportIds []int
  39. for _, v := range reportList {
  40. reportIds = append(reportIds, v.Id)
  41. }
  42. reportPushList, err := models.GetReportPushStatusByReportIds(utils.ReportTypeEta, reportIds)
  43. if err != nil {
  44. return
  45. }
  46. reportPushMap := make(map[int]*models.ReportPushStatus)
  47. for _, v := range reportPushList {
  48. reportPushMap[v.ReportId] = v
  49. }
  50. var insertReportPushList []*models.ReportPushStatus
  51. for _, v := range reportList {
  52. var updateCols []string
  53. if reportPush, ok := reportPushMap[v.Id]; ok {
  54. if reportPush.Title != v.Title {
  55. reportPush.Title = v.Title
  56. updateCols = append(updateCols, "title")
  57. }
  58. if reportPush.Abstract != v.Abstract {
  59. reportPush.Abstract = v.Abstract
  60. updateCols = append(updateCols, "abstract")
  61. }
  62. if reportPush.Stage != v.Stage {
  63. reportPush.Stage = v.Stage
  64. updateCols = append(updateCols, "stage")
  65. }
  66. if reportPush.ClassifyIdFirst != v.ClassifyIdFirst {
  67. reportPush.ClassifyIdFirst = v.ClassifyIdFirst
  68. updateCols = append(updateCols, "classify_id_first")
  69. }
  70. if reportPush.ClassifyNameFirst != v.ClassifyNameFirst {
  71. reportPush.ClassifyNameFirst = v.ClassifyNameFirst
  72. updateCols = append(updateCols, "classify_name_first")
  73. }
  74. if reportPush.ClassifyIdSecond != v.ClassifyIdSecond {
  75. reportPush.ClassifyIdSecond = v.ClassifyIdSecond
  76. updateCols = append(updateCols, "classify_id_second")
  77. }
  78. if reportPush.ClassifyNameSecond != v.ClassifyNameSecond {
  79. reportPush.ClassifyNameSecond = v.ClassifyNameSecond
  80. updateCols = append(updateCols, "classify_name_second")
  81. }
  82. if reportPush.ClassifyIdThird != v.ClassifyIdThird {
  83. reportPush.ClassifyIdThird = v.ClassifyIdThird
  84. updateCols = append(updateCols, "classify_id_third")
  85. }
  86. if reportPush.ClassifyNameThird != v.ClassifyNameThird {
  87. reportPush.ClassifyNameThird = v.ClassifyNameThird
  88. updateCols = append(updateCols, "classify_name_third")
  89. }
  90. if reportPush.Author != v.Author {
  91. reportPush.Author = v.Author
  92. updateCols = append(updateCols, "author")
  93. }
  94. if reportPush.PublishTime != v.PublishTime {
  95. reportPush.PublishTime = v.PublishTime
  96. updateCols = append(updateCols, "publish_time")
  97. }
  98. if len(updateCols) > 0 {
  99. reportPush.Update(updateCols)
  100. }
  101. } else {
  102. insertReportPushList = append(insertReportPushList, &models.ReportPushStatus{
  103. ReportId: v.Id,
  104. State: 0,
  105. Title: v.Title,
  106. Abstract: v.Abstract,
  107. Stage: v.Stage,
  108. ClassifyIdFirst: v.ClassifyIdFirst,
  109. ClassifyNameFirst: v.ClassifyNameFirst,
  110. ClassifyIdSecond: v.ClassifyIdSecond,
  111. ClassifyNameSecond: v.ClassifyNameSecond,
  112. ClassifyIdThird: v.ClassifyIdThird,
  113. ClassifyNameThird: v.ClassifyNameThird,
  114. Author: v.Author,
  115. ReportType: 1,
  116. PublishTime: v.PublishTime,
  117. CreateTime: time.Now(),
  118. ModifyTime: time.Now(),
  119. })
  120. }
  121. }
  122. err = models.BatchAddReportPushStatus(insertReportPushList)
  123. if err != nil {
  124. return
  125. }
  126. return
  127. }
  128. func ModifyUserStatus(ctx context.Context) (err error) {
  129. defer func() {
  130. if err != nil {
  131. utils.ApiLog.Info("修改用户状态,定时任务出错,Err: %s", err)
  132. }
  133. if err := recover(); err != nil {
  134. utils.ApiLog.Warn("修改用户状态,定时任务出错,Err: %s", err)
  135. }
  136. }()
  137. curTime := time.Now()
  138. var pars []interface{}
  139. condition := ` AND valid_end_time<?`
  140. pars = append(pars, curTime)
  141. condition += ` AND status=? `
  142. pars = append(pars, 2)
  143. userIds, err := models.GetUserIdListByCondition(condition, pars)
  144. if err != nil {
  145. return
  146. }
  147. err = models.UpdateUserStatus(condition, pars)
  148. if err != nil {
  149. return
  150. }
  151. userRecordList := make([]*models.UserChangeRecord, 0)
  152. for _, v := range userIds {
  153. record := &models.UserChangeRecord{}
  154. record.UserId = v
  155. record.SysUserId = 0
  156. record.Content = "有效期到期禁用用户"
  157. record.CreateTime = time.Now()
  158. userRecordList = append(userRecordList, record)
  159. }
  160. if len(userRecordList) > 0 {
  161. err = models.UserChangeRecordMultiInsert(userRecordList)
  162. if err != nil {
  163. return
  164. }
  165. }
  166. return
  167. }
  168. func SendReminderMsg(ctx context.Context) (err error) {
  169. defer func() {
  170. if err != nil {
  171. utils.ApiLog.Info("发送提醒消息,定时任务出错,Err: %s", err)
  172. }
  173. if err := recover(); err != nil {
  174. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err)
  175. }
  176. }()
  177. var userPars7 []interface{}
  178. var userPars15 []interface{}
  179. var userPars30 []interface{}
  180. var userPars60 []interface{}
  181. var msgPars7 []interface{}
  182. var msgPars15 []interface{}
  183. var msgPars30 []interface{}
  184. var msgPars60 []interface{}
  185. userTime7 := time.Now().AddDate(0, 0, 7)
  186. userTime15 := time.Now().AddDate(0, 0, 15)
  187. userTime30 := time.Now().AddDate(0, 0, 30)
  188. userTime60 := time.Now().AddDate(0, 0, 60)
  189. msgTime7 := time.Now().AddDate(0, 0, -7)
  190. msgTime15 := time.Now().AddDate(0, 0, -15)
  191. msgTime30 := time.Now().AddDate(0, 0, -30)
  192. msgTime60 := time.Now().AddDate(0, 0, -60)
  193. userCondition1 := ` AND valid_end_time<? `
  194. userCondition2 := ` AND valid_end_time<? AND valid_end_time>? `
  195. msgCondition := ` AND create_time>? `
  196. userPars7 = append(userPars7, userTime7)
  197. userPars15 = append(userPars15, userTime15, userTime7)
  198. userPars30 = append(userPars30, userTime30, userTime15)
  199. userPars60 = append(userPars60, userTime60, userTime30)
  200. msgPars7 = append(msgPars7, msgTime7)
  201. msgPars15 = append(msgPars15, msgTime15)
  202. msgPars30 = append(msgPars30, msgTime30)
  203. msgPars60 = append(msgPars60, msgTime60)
  204. err = SendMsgToSysUser(userCondition1, msgCondition, userPars7, msgPars7, 7)
  205. if err != nil {
  206. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  207. }
  208. err = SendMsgToSysUser(userCondition2, msgCondition, userPars15, msgPars15, 15)
  209. if err != nil {
  210. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  211. }
  212. err = SendMsgToSysUser(userCondition2, msgCondition, userPars30, msgPars30, 30)
  213. if err != nil {
  214. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  215. }
  216. err = SendMsgToSysUser(userCondition2, msgCondition, userPars60, msgPars60, 60)
  217. if err != nil {
  218. utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
  219. }
  220. return
  221. }
  222. func SendMsgToSysUser(userCondition, msgCondition string, userPars, msgPars []interface{}, messagetType int) (err error) {
  223. total, err := models.GetUserCount(userCondition, userPars)
  224. if err != nil {
  225. utils.ApiLog.Warn("获取用户列表失败 task err: %s", err.Error())
  226. }
  227. if total == 0 {
  228. return
  229. }
  230. // 获得待发送用户的列表
  231. userList, err := models.GetUserList(userCondition, userPars, 0, total)
  232. if err != nil {
  233. return
  234. }
  235. // 获得待通知系统用户的列表
  236. sysUserIds, err := models.GetSysUserIdList()
  237. if err != nil {
  238. return
  239. }
  240. messageList, err := models.GetSysMessageReportByCondition(msgCondition, msgPars)
  241. if err != nil {
  242. return
  243. }
  244. layout := "【%s】到期%d天提醒,请及时跟进"
  245. messageMap := make(map[int]map[int]struct{})
  246. for _, v := range messageList {
  247. if mv, ok := messageMap[v.ReceiveSysUserId]; ok {
  248. mv[v.UserId] = struct{}{}
  249. } else {
  250. messageMap[v.ReceiveSysUserId] = make(map[int]struct{})
  251. messageMap[v.ReceiveSysUserId][v.UserId] = struct{}{}
  252. }
  253. }
  254. sendMsg := make([]*models.SysMessageReport, 0)
  255. for _, v := range sysUserIds {
  256. if userMap, ok := messageMap[v]; ok {
  257. for _, u := range userList {
  258. if _, ok := userMap[u.UserId]; !ok {
  259. sendMsg = append(sendMsg, &models.SysMessageReport{
  260. UserId: u.UserId,
  261. ReceiveSysUserId: v,
  262. MessageType: messagetType,
  263. IsRead: false,
  264. CreateTime: time.Now(),
  265. ModifyTime: time.Now(),
  266. Content: fmt.Sprintf(layout, u.RealName, messagetType),
  267. })
  268. }
  269. }
  270. } else {
  271. for _, u := range userList {
  272. sendMsg = append(sendMsg, &models.SysMessageReport{
  273. UserId: u.UserId,
  274. ReceiveSysUserId: v,
  275. MessageType: messagetType,
  276. IsRead: false,
  277. CreateTime: time.Now(),
  278. ModifyTime: time.Now(),
  279. Content: fmt.Sprintf(layout, u.RealName, messagetType),
  280. })
  281. }
  282. }
  283. }
  284. if len(sendMsg) > 0 {
  285. err = models.InsertMultiSysMessageReport(sendMsg)
  286. }
  287. return
  288. }