1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package service
- import (
- "designs/global"
- "designs/model"
- "designs/utils"
- )
- func RemainDataBydDay(pf string, gid string, startTime string, endTime string) (map[string]map[string]interface{}, error) {
- //先计算出这个时间内 ,每天的注册用户数量
- var users []model.User
- err := global.App.DB.Table("user").
- Where("pf", pf).Where("gid", gid).
- Where("createdAt", ">=", startTime).
- Where("createdAt", "<=", endTime).
- Scan(&users).Error
- if err != nil {
- return nil, err
- }
- var UsersId []int
- UsersBydDay := utils.GetTimeDayDate(startTime, endTime) //用户分别是在哪天注册的
- UserLoginBydDay := UsersBydDay
- for _, user := range users {
- UsersId = append(UsersId, user.UserId)
- UsersBydDay[user.CreatedAt.Format("2006-01-02")] = append(UsersBydDay[user.CreatedAt.Format("2006-01-02")], user.UserId)
- }
- users = nil //用完后清空内存
- //把每天的注册用户进行集合,查出后面所有天数的活跃情况
- var UserLogin []model.UserLogin
- err = global.App.DB.Table("user_login").
- Where("pf", pf).Where("gid", gid).
- WhereIn("userId", UsersId).
- Where("loginTime", ">=", startTime).
- Select("loginTime", "userId").
- Scan(&UserLogin).Error
- if err != nil {
- return nil, err
- }
- //对这些数据进行整理
- for _, v := range UserLogin {
- //根据天进行分组,得出总共有多少
- times := v.LoginTime.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] = int(utils.IntersectionRate(v, loginDay) * 100)
- }
- res[day] = remain
- }
- return res, nil
- }
|