userRelated.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package crons
  2. import (
  3. "designs/global"
  4. "designs/model"
  5. "designs/service"
  6. "fmt"
  7. "gorm.io/gorm/clause"
  8. "time"
  9. )
  10. func Behavior() {
  11. //先查出所有gid
  12. ActiveGid := service.GetActiveGid()
  13. //现在直接汇总所有的数据(直到前一天的)
  14. now := time.Now()
  15. end := now.AddDate(0, 0, -1)
  16. start, _ := time.Parse("2006-01-02 15:04:05", "2025-05-17 15:04:05")
  17. BehaviorSummary("wx", ActiveGid, start, end)
  18. BehaviorSummary("tt", ActiveGid, start, end)
  19. global.App.Log.Info("重新汇总用户在线时长数据完成")
  20. }
  21. func BehaviorSummary(pf string, ActiveGid []string, start time.Time, end time.Time) {
  22. //循环一下,查出userId 跟相关的在线数据
  23. for _, gid := range ActiveGid {
  24. start1 := time.Now()
  25. fmt.Println("处理数据开始,gid :", gid)
  26. //查询 30天内的在线数据
  27. SummaryData, err := service.UserOnlineSummary(gid, pf, "", start.Format("2006-01-02 15:04:05"), end.Format("2006-01-02 15:04:05"))
  28. if err != nil {
  29. global.App.Log.Error("更新用户在线时长错误(查询汇总信息错误)", err.Error())
  30. return
  31. }
  32. //查询用户的登录次数
  33. var loginData []struct {
  34. UserId int `json:"userId" gorm:"not null;column:userId;"`
  35. LoginCount int `json:"loginCount" gorm:"not null;column:loginCount;"`
  36. }
  37. loginDataMap := make(map[int]int)
  38. err = global.App.DB.Table("user_login").
  39. Where("gid", gid).
  40. Where("pf", pf).
  41. Group("userId").
  42. Select("count(*) as loginCount", "userId").
  43. Scan(&loginData).Error
  44. if err != nil {
  45. global.App.Log.Error("更新用户在线时长错误(查询汇总信息错误)", err.Error())
  46. return
  47. }
  48. for _, login := range loginData {
  49. loginDataMap[login.UserId] = login.LoginCount
  50. }
  51. fmt.Println("查询登录数据完成:", time.Since(start1))
  52. //查询用户的看广告次数,广告看完次数
  53. var seeAdsData []struct {
  54. UserId int `json:"userId" gorm:"not null;column:userId;"`
  55. SeeAdsCount int `json:"seeAdsCount" gorm:"not null;column:seeAdsCount;"`
  56. State2Count int `json:"state2Count" gorm:"not null;column:state2Count;"`
  57. }
  58. seeAdsDataMap := make(map[int]int)
  59. seeAdsDataMap2 := make(map[int]int)
  60. err = global.App.DB.Table("user_see_ads").
  61. Where("gid", gid).
  62. Where("pf", pf).
  63. Group("userId").
  64. Select("count(*) as seeAdsCount", "SUM(CASE WHEN adsState = 2 THEN 1 ELSE 0 END) AS state2Count", "userId").
  65. Scan(&seeAdsData).Error
  66. if err != nil {
  67. global.App.Log.Error("更新用户在线时长错误(查询汇总信息错误)", err.Error())
  68. return
  69. }
  70. for _, ads := range seeAdsData {
  71. seeAdsDataMap[ads.UserId] = ads.SeeAdsCount
  72. seeAdsDataMap2[ads.UserId] = ads.State2Count
  73. }
  74. fmt.Println("查询广告数据完成:", time.Since(start1))
  75. //格式化,存入数据库
  76. var userIdList []model.User
  77. err = global.App.DB.Table("user").Where("gid", gid).
  78. Select("id", "userId").
  79. Where("pf", pf).Scan(&userIdList).Error
  80. if err != nil {
  81. global.App.Log.Error("更新用户在线时长错误(查询userID 错误)", err.Error())
  82. return
  83. }
  84. //fmt.Println(len(userIdList))
  85. userBehavior := make(map[int]model.UserBehavior)
  86. for _, users := range userIdList {
  87. userBehavior[users.UserId] = model.UserBehavior{
  88. ID: users.ID,
  89. Duration: int(SummaryData[users.UserId]),
  90. StartNum: loginDataMap[users.UserId],
  91. AdCount: seeAdsDataMap[users.UserId],
  92. AdExpCount: seeAdsDataMap2[users.UserId],
  93. }
  94. }
  95. var userBehaviorList []model.UserBehavior
  96. for _, Behavior := range userBehavior {
  97. userBehaviorList = append(userBehaviorList, Behavior)
  98. }
  99. err = global.App.DB.Table("user_behavior").Clauses(clause.OnConflict{
  100. Columns: []clause.Column{{Name: "id"}}, // 冲突列(主键)
  101. DoUpdates: clause.AssignmentColumns([]string{"duration", "startNum", "adCount", "adExpCount"}), // 需要更新的列
  102. }).CreateInBatches(&userBehaviorList, 1000).Error
  103. if err != nil {
  104. global.App.Log.Error("更新用户在线时长错误", err.Error())
  105. return
  106. }
  107. fmt.Println("存入汇总完成:", time.Since(start1))
  108. }
  109. }