remainData.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package service
  2. import (
  3. "designs/global"
  4. "designs/model"
  5. "designs/utils"
  6. )
  7. func RemainDataBydDay(pf string, gid string, startTime string, endTime string) (map[string]map[string]interface{}, error) {
  8. //先计算出这个时间内 ,每天的注册用户数量
  9. var users []model.User
  10. err := global.App.DB.Table("user").
  11. Where("pf", pf).Where("gid", gid).
  12. Where("createdAt", ">=", startTime).
  13. Where("createdAt", "<=", endTime).
  14. Scan(&users).Error
  15. if err != nil {
  16. return nil, err
  17. }
  18. var UsersId []int
  19. UsersBydDay := utils.GetTimeDayDate(startTime, endTime) //用户分别是在哪天注册的
  20. UserLoginBydDay := UsersBydDay
  21. for _, user := range users {
  22. UsersId = append(UsersId, user.UserId)
  23. UsersBydDay[user.CreatedAt.Format("2006-01-02")] = append(UsersBydDay[user.CreatedAt.Format("2006-01-02")], user.UserId)
  24. }
  25. users = nil //用完后清空内存
  26. //把每天的注册用户进行集合,查出后面所有天数的活跃情况
  27. var UserLogin []model.UserLogin
  28. err = global.App.DB.Table("user_login").
  29. Where("pf", pf).Where("gid", gid).
  30. WhereIn("userId", UsersId).
  31. Where("loginTime", ">=", startTime).
  32. Select("loginTime", "userId").
  33. Scan(&UserLogin).Error
  34. if err != nil {
  35. return nil, err
  36. }
  37. //对这些数据进行整理
  38. for _, v := range UserLogin {
  39. //根据天进行分组,得出总共有多少
  40. times := v.LoginTime.Format("2006-01-02")
  41. UserLoginBydDay[times] = append(UserLoginBydDay[times], v.UserId)
  42. }
  43. res := make(map[string]map[string]interface{})
  44. //逐天比较注册的数据和留存的数据,得出每天的活跃比例和人数
  45. for day, v := range UsersBydDay {
  46. remain := make(map[string]interface{})
  47. remain["count"] = len(v)
  48. remain["date"] = day
  49. //分别比较每一天的数据
  50. for dayDate, loginDay := range UserLoginBydDay {
  51. ok, remainDays := utils.CompareDates(dayDate, day)
  52. if !ok {
  53. continue
  54. }
  55. remain[remainDays] = int(utils.IntersectionRate(v, loginDay) * 100)
  56. }
  57. res[day] = remain
  58. }
  59. return res, nil
  60. }