123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- package service
- import (
- "designs/global"
- "designs/model"
- "designs/utils"
- "github.com/pkg/errors"
- "math"
- "time"
- )
- func RemainDataBydDay(types int, pf string, gid string, startTime string, endTime string) (map[string]map[string]interface{}, error) {
- var err error
- //对于传过来的endTime ,做一个处理
- t, _ := time.Parse("2006-01-02", endTime)
- endTimeData := t.AddDate(0, 0, 1).Format("2006-01-02")
- UsersBydDay := utils.GetTimeDayDate(startTime, endTime) //用户分别是在哪天注册的
- UserLoginBydDay := utils.GetTimeDayDate(startTime, endTime) //用户分别是在哪天注册的
- var UsersId []int
- userIdMap := make(map[int]bool)
- if types == 1 {
- //先计算出这个时间内 ,每天的注册用户数量
- var users []model.User
- err = global.App.DB.Table("user").
- Where("pf", pf).Where("gid", gid).
- Where("createdAt", ">=", startTime).
- Where("createdAt", "<=", endTimeData).
- Scan(&users).Error
- if err != nil {
- return nil, err
- }
- for _, user := range users {
- userIdMap[user.UserId] = true
- UsersBydDay[user.CreatedAt.Format("2006-01-02")] = append(UsersBydDay[user.CreatedAt.Format("2006-01-02")], user.UserId)
- }
- for user := range userIdMap {
- UsersId = append(UsersId, user)
- }
- users = nil //用完后清空内存
- } else if types == 2 {
- var users []model.UserLogin
- err = global.App.DB.Table("user_login").
- Where("pf", pf).Where("gid", gid).
- Where("loginTime", ">=", startTime).
- Where("loginTime", "<=", endTimeData).
- Group("userId").
- Scan(&users).Error
- if err != nil {
- return nil, err
- }
- for _, user := range users {
- UsersId = append(UsersId, user.UserId)
- UsersBydDay[user.LoginTime.Format("2006-01-02")] = append(UsersBydDay[user.LoginTime.Format("2006-01-02")], user.UserId)
- }
- } else {
- return nil, errors.New("type 参数错误")
- }
- //把每天的注册用户进行集合,查出后面所有天数的活跃情况
- var UserLogin []model.UserOnline
- err = global.App.DB.Table("user_online").
- Where("pf", pf).Where("gid", gid).
- WhereIn("userId", UsersId).
- Where("logTime", ">=", startTime).
- Select("logTime", "userId").
- Group("date,userId").
- Scan(&UserLogin).Error
- if err != nil {
- return nil, err
- }
- //对这些数据进行整理
- for _, v := range UserLogin {
- //根据天进行分组,得出总共有多少
- times := v.LogTime.Format("2006-01-02")
- UserLoginBydDay[times] = append(UserLoginBydDay[times], v.UserId)
- }
- res := make(map[string]map[string]interface{})
- //逐天比较注册的数据和留存的数据,得出每天的活跃比例和人数
- for day, v := range UsersBydDay {
- remain := make(map[string]interface{})
- remain["count"] = len(v)
- remain["date"] = day
- //分别比较每一天的数据
- for dayDate, loginDay := range UserLoginBydDay {
- ok, remainDays := utils.CompareDates(dayDate, day)
- if !ok {
- continue
- }
- remain[remainDays] = math.Round(utils.IntersectionRate(v, loginDay)*100*100) / 100
- }
- res[day] = remain
- }
- return res, nil
- }
|