remainData.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package service
  2. import (
  3. "designs/global"
  4. "designs/model"
  5. "designs/utils"
  6. "github.com/pkg/errors"
  7. "time"
  8. )
  9. func RemainDataBydDay(types int, pf string, gid string, startTime string, endTime string) (map[string]map[string]interface{}, error) {
  10. var err error
  11. //对于传过来的endTime ,做一个处理
  12. t, _ := time.Parse("2006-01-02", endTime)
  13. endTimeData := t.AddDate(0, 0, 1).Format("2006-01-02")
  14. UsersBydDay := utils.GetTimeDayDate(startTime, endTime) //用户分别是在哪天注册的
  15. UserLoginBydDay := utils.GetTimeDayDate(startTime, endTime) //用户分别是在哪天注册的
  16. var UsersId []int
  17. userIdMap := make(map[int]bool)
  18. if types == 1 {
  19. //先计算出这个时间内 ,每天的注册用户数量
  20. var users []model.User
  21. err = global.App.DB.Table("user").
  22. Where("pf", pf).Where("gid", gid).
  23. Where("createdAt", ">=", startTime).
  24. Where("createdAt", "<=", endTimeData).
  25. Scan(&users).Error
  26. if err != nil {
  27. return nil, err
  28. }
  29. for _, user := range users {
  30. userIdMap[user.UserId] = true
  31. UsersBydDay[user.CreatedAt.Format("2006-01-02")] = append(UsersBydDay[user.CreatedAt.Format("2006-01-02")], user.UserId)
  32. }
  33. for user := range userIdMap {
  34. UsersId = append(UsersId, user)
  35. }
  36. users = nil //用完后清空内存
  37. } else if types == 2 {
  38. var users []model.UserLogin
  39. err = global.App.DB.Table("user_login").
  40. Where("pf", pf).Where("gid", gid).
  41. Where("loginTime", ">=", startTime).
  42. Where("loginTime", "<=", endTimeData).
  43. Group("userId").
  44. Scan(&users).Error
  45. if err != nil {
  46. return nil, err
  47. }
  48. for _, user := range users {
  49. UsersId = append(UsersId, user.UserId)
  50. UsersBydDay[user.LoginTime.Format("2006-01-02")] = append(UsersBydDay[user.LoginTime.Format("2006-01-02")], user.UserId)
  51. }
  52. } else {
  53. return nil, errors.New("type 参数错误")
  54. }
  55. //把每天的注册用户进行集合,查出后面所有天数的活跃情况
  56. var UserLogin []model.UserOnline
  57. err = global.App.DB.Table("user_online").
  58. Where("pf", pf).Where("gid", gid).
  59. WhereIn("userId", UsersId).
  60. Where("logTime", ">=", startTime).
  61. Select("logTime", "userId").
  62. Group("date,userId").
  63. Scan(&UserLogin).Error
  64. if err != nil {
  65. return nil, err
  66. }
  67. //对这些数据进行整理
  68. for _, v := range UserLogin {
  69. //根据天进行分组,得出总共有多少
  70. times := v.LogTime.Format("2006-01-02")
  71. UserLoginBydDay[times] = append(UserLoginBydDay[times], v.UserId)
  72. }
  73. res := make(map[string]map[string]interface{})
  74. //逐天比较注册的数据和留存的数据,得出每天的活跃比例和人数
  75. for day, v := range UsersBydDay {
  76. remain := make(map[string]interface{})
  77. remain["count"] = len(v)
  78. remain["date"] = day
  79. //分别比较每一天的数据
  80. for dayDate, loginDay := range UserLoginBydDay {
  81. ok, remainDays := utils.CompareDates(dayDate, day)
  82. if !ok {
  83. continue
  84. }
  85. remain[remainDays] = int(utils.IntersectionRate(v, loginDay) * 100)
  86. }
  87. res[day] = remain
  88. }
  89. return res, nil
  90. }