|
@@ -0,0 +1,309 @@
|
|
|
+package service
|
|
|
+
|
|
|
+import (
|
|
|
+ "designs/global"
|
|
|
+ "designs/utils"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+// 获取新增用户的时段信息
|
|
|
+func GetRegisterTimeDistribution(pf string, gid string) (map[int]int, map[int]int, int64, int64, int64, error) {
|
|
|
+ now := time.Now()
|
|
|
+ today := now.Format("2006-01-02")
|
|
|
+
|
|
|
+ hours := utils.GetDayHour(now)
|
|
|
+ var todayRegister []time.Time
|
|
|
+
|
|
|
+ //计算今日曲线
|
|
|
+ err := global.App.DB.Table("user").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("createdAt", ">", today).
|
|
|
+ Pluck("createdAt", &todayRegister).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+ todayCount := len(todayRegister)
|
|
|
+
|
|
|
+ todayTimeDistribution := getTimeDistribution(todayRegister, hours)
|
|
|
+
|
|
|
+ //计算昨日曲线
|
|
|
+ var yesterdayRegister []time.Time
|
|
|
+ yesterdayHours := utils.GetDayHour(now.AddDate(0, 0, -1))
|
|
|
+ yesterday := now.AddDate(0, 0, -1).Format("2006-01-02")
|
|
|
+ yesterdayThisTime := now.AddDate(0, 0, -1).Format("2006-01-02 15:04:05")
|
|
|
+ err = global.App.DB.Table("user").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("createdAt", ">", yesterday).
|
|
|
+ Where("createdAt", "<=", today).
|
|
|
+ Pluck("createdAt", &yesterdayRegister).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+ yesterdayCount := len(yesterdayRegister)
|
|
|
+ yesterdayTimeDistribution := getTimeDistribution(yesterdayRegister, yesterdayHours)
|
|
|
+ var yesterdayThisTimeCount int64
|
|
|
+ err = global.App.DB.Table("user").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("createdAt", ">", yesterday).
|
|
|
+ Where("createdAt", "<=", yesterdayThisTime).
|
|
|
+ Count(&yesterdayThisTimeCount).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return todayTimeDistribution, yesterdayTimeDistribution, int64(yesterdayCount), int64(todayCount), yesterdayThisTimeCount, nil
|
|
|
+}
|
|
|
+
|
|
|
+// 活跃用户的时段信息
|
|
|
+func GetActiveTimeDistribution(pf string, gid string) (map[int]int, map[int]int, int64, int64, int64, error) {
|
|
|
+ now := time.Now()
|
|
|
+ today := now.Format("2006-01-02")
|
|
|
+
|
|
|
+ hours := utils.GetDayHour(now)
|
|
|
+ var todayRegister []time.Time
|
|
|
+
|
|
|
+ //计算今日曲线
|
|
|
+ err := global.App.DB.Table("user_login").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("loginTime", ">", today).
|
|
|
+ Pluck("loginTime", &todayRegister).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+
|
|
|
+ var todayCount int64
|
|
|
+ err = global.App.DB.Table("user_login").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("loginTime", ">", today).
|
|
|
+ Group("userId").Count(&todayCount).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+ todayTimeDistribution := getTimeDistribution(todayRegister, hours)
|
|
|
+
|
|
|
+ //计算昨日曲线
|
|
|
+ var yesterdayRegister []time.Time
|
|
|
+ yesterdayHours := utils.GetDayHour(now.AddDate(0, 0, -1))
|
|
|
+ yesterday := now.AddDate(0, 0, -1).Format("2006-01-02")
|
|
|
+ yesterdayThisTime := now.AddDate(0, 0, -1).Format("2006-01-02 15:04:05")
|
|
|
+ err = global.App.DB.Table("user_login").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("loginTime", ">", yesterday).
|
|
|
+ Where("loginTime", "<=", today).
|
|
|
+ Pluck("loginTime", &yesterdayRegister).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+ var yesterdayCount int64
|
|
|
+ err = global.App.DB.Table("user_login").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("loginTime", ">", yesterday).
|
|
|
+ Where("loginTime", "<=", today).
|
|
|
+ Group("userId").Count(&yesterdayCount).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+
|
|
|
+ var yesterdayThisTimeCount int64
|
|
|
+ err = global.App.DB.Table("user_login").
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("loginTime", ">", yesterday).
|
|
|
+ Where("loginTime", "<=", yesterdayThisTime).
|
|
|
+ Group("userId").Count(&yesterdayCount).Error
|
|
|
+ if err != nil {
|
|
|
+ global.App.Log.Error(err.Error())
|
|
|
+ return nil, nil, 0, 0, 0, err
|
|
|
+ }
|
|
|
+
|
|
|
+ yesterdayTimeDistribution := getTimeDistribution(yesterdayRegister, yesterdayHours)
|
|
|
+
|
|
|
+ return todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, nil
|
|
|
+}
|
|
|
+
|
|
|
+// 新增设备日趋势图
|
|
|
+func GetRegisterDayDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int, float32, error) {
|
|
|
+ var registerDays []time.Time
|
|
|
+ err := global.App.DB.Table("user").
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("createdAt", ">=", startTime).
|
|
|
+ Where("createdAt", "<=", endTime).
|
|
|
+ Pluck("createdAt", ®isterDays).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, 0, 0, err
|
|
|
+ }
|
|
|
+ days := utils.GetTimeDay(startTime, endTime)
|
|
|
+
|
|
|
+ todayTimeDistribution := getTimeDistribution(registerDays, days)
|
|
|
+
|
|
|
+ return todayTimeDistribution, len(registerDays), float32(len(registerDays) / len(days)), nil
|
|
|
+}
|
|
|
+
|
|
|
+// 活跃用户趋势图
|
|
|
+func GetActiveDayDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int64, float32, error) {
|
|
|
+ var activeDays []time.Time
|
|
|
+ err := global.App.DB.Table("user_login").
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("loginTime", ">=", startTime).
|
|
|
+ Where("loginTime", "<=", endTime).
|
|
|
+ Pluck("loginTime", &activeDays).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, 0, 0, err
|
|
|
+ }
|
|
|
+ //查询总数(去重)
|
|
|
+ var count int64
|
|
|
+ err = global.App.DB.Table("user_login").
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("loginTime", ">=", startTime).
|
|
|
+ Where("loginTime", "<=", endTime).
|
|
|
+ Distinct("userId").Count(&count).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, 0, 0, err
|
|
|
+ }
|
|
|
+
|
|
|
+ days := utils.GetTimeDay(startTime, endTime)
|
|
|
+
|
|
|
+ todayTimeDistribution := getTimeDistribution(activeDays, days)
|
|
|
+
|
|
|
+ return todayTimeDistribution, count, float32(len(activeDays) / len(days)), nil
|
|
|
+}
|
|
|
+
|
|
|
+// 活跃用户周趋势图
|
|
|
+func GetActiveWeekDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int64, float32, error) {
|
|
|
+ var activeDays []time.Time
|
|
|
+ err := global.App.DB.Table("user_login").
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("loginTime", ">=", startTime).
|
|
|
+ Where("loginTime", "<=", endTime).
|
|
|
+ Pluck("loginTime", &activeDays).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, 0, 0, err
|
|
|
+ }
|
|
|
+
|
|
|
+ days := utils.GetTimeDay(startTime, endTime)
|
|
|
+
|
|
|
+ todayTimeDistribution := getTimeDistribution(activeDays, days)
|
|
|
+
|
|
|
+ return todayTimeDistribution, 0, float32(len(activeDays) / len(days)), nil
|
|
|
+}
|
|
|
+
|
|
|
+// 活跃用户月趋势图
|
|
|
+func GetActiveMouthDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int64, float32, error) {
|
|
|
+ var activeDays []time.Time
|
|
|
+ err := global.App.DB.Table("user_login").
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("loginTime", ">=", startTime).
|
|
|
+ Where("loginTime", "<=", endTime).
|
|
|
+ Pluck("loginTime", &activeDays).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, 0, 0, err
|
|
|
+ }
|
|
|
+
|
|
|
+ days := utils.GetTimeDay(startTime, endTime)
|
|
|
+
|
|
|
+ todayTimeDistribution := getTimeDistribution(activeDays, days)
|
|
|
+
|
|
|
+ return todayTimeDistribution, 0, float32(len(activeDays) / len(days)), nil
|
|
|
+}
|
|
|
+
|
|
|
+func GetLoginDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, float32, error) {
|
|
|
+ var activeDays []time.Time
|
|
|
+ err := global.App.DB.Table("user_login").
|
|
|
+ Where("gid", gid).
|
|
|
+ Where("pf", pf).
|
|
|
+ Where("loginTime", ">=", startTime).
|
|
|
+ Where("loginTime", "<=", endTime).
|
|
|
+ Pluck("loginTime", &activeDays).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, 0, err
|
|
|
+ }
|
|
|
+ days := utils.GetTimeDay(startTime, endTime)
|
|
|
+
|
|
|
+ todayTimeDistribution := getTimeDistribution(activeDays, days)
|
|
|
+
|
|
|
+ return todayTimeDistribution, float32(len(activeDays) / len(days)), nil
|
|
|
+}
|
|
|
+
|
|
|
+// 根据时间求出时段信息
|
|
|
+func getTimeDistribution(todayRegister []time.Time, hours []int64) map[int]int {
|
|
|
+ var todayRegisterUnix []int64
|
|
|
+ for _, t := range todayRegister {
|
|
|
+ todayRegisterUnix = append(todayRegisterUnix, t.Unix())
|
|
|
+ }
|
|
|
+
|
|
|
+ todayRegisterSum := make(map[int]int)
|
|
|
+ for k := range hours {
|
|
|
+ todayRegisterSum[k] = 0
|
|
|
+ }
|
|
|
+ for _, t := range todayRegisterUnix {
|
|
|
+ for k := range hours {
|
|
|
+ if k == 0 {
|
|
|
+ if t < hours[k+1] {
|
|
|
+ todayRegisterSum[0]++
|
|
|
+ }
|
|
|
+ } else if k == len(hours)-1 {
|
|
|
+ if t > hours[k] {
|
|
|
+ todayRegisterSum[len(hours)-1]++
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if t > hours[k] && t <= hours[k+1] {
|
|
|
+ todayRegisterSum[k]++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return todayRegisterSum
|
|
|
+}
|
|
|
+
|
|
|
+//// 根据日期求出分天信息
|
|
|
+//func getDayDistribution(mouthRegister []time.Time, days []int64) {
|
|
|
+// var mouthRegisterUnix []int64
|
|
|
+// for _, t := range mouthRegister {
|
|
|
+// mouthRegisterUnix = append(mouthRegisterUnix, t.Unix())
|
|
|
+// }
|
|
|
+//
|
|
|
+// mouthRegisterSum := make(map[int]int)
|
|
|
+// for k := range days {
|
|
|
+// mouthRegisterSum[k] = 0
|
|
|
+// }
|
|
|
+//
|
|
|
+// for _, t := range mouthRegisterUnix {
|
|
|
+// for k := range days {
|
|
|
+// if k == 0 {
|
|
|
+// if t < days[k+1] {
|
|
|
+// todayRegisterSum[0]++
|
|
|
+// }
|
|
|
+// } else if k == {
|
|
|
+// if t > days[k] {
|
|
|
+// todayRegisterSum[23]++
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// if t > days[k] && t <= days[k+1] {
|
|
|
+// todayRegisterSum[k]++
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+//}
|