userBehavior.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package service
  2. import (
  3. "designs/global"
  4. "designs/utils"
  5. "time"
  6. )
  7. // 获取新增用户的时段信息
  8. func GetRegisterTimeDistribution(pf string, gid string) (map[int]int, map[int]int, int64, int64, int64, error) {
  9. now := time.Now()
  10. today := now.Format("2006-01-02")
  11. hours := utils.GetDayHour(now)
  12. var todayRegister []time.Time
  13. //计算今日曲线
  14. err := global.App.DB.Table("user").
  15. Where("pf", pf).
  16. Where("gid", gid).
  17. Where("createdAt", ">", today).
  18. Pluck("createdAt", &todayRegister).Error
  19. if err != nil {
  20. global.App.Log.Error(err.Error())
  21. return nil, nil, 0, 0, 0, err
  22. }
  23. todayCount := len(todayRegister)
  24. todayTimeDistribution := getTimeDistribution(todayRegister, hours)
  25. //计算昨日曲线
  26. var yesterdayRegister []time.Time
  27. yesterdayHours := utils.GetDayHour(now.AddDate(0, 0, -1))
  28. yesterday := now.AddDate(0, 0, -1).Format("2006-01-02")
  29. yesterdayThisTime := now.AddDate(0, 0, -1).Format("2006-01-02 15:04:05")
  30. err = global.App.DB.Table("user").
  31. Where("pf", pf).
  32. Where("gid", gid).
  33. Where("createdAt", ">", yesterday).
  34. Where("createdAt", "<=", today).
  35. Pluck("createdAt", &yesterdayRegister).Error
  36. if err != nil {
  37. global.App.Log.Error(err.Error())
  38. return nil, nil, 0, 0, 0, err
  39. }
  40. yesterdayCount := len(yesterdayRegister)
  41. yesterdayTimeDistribution := getTimeDistribution(yesterdayRegister, yesterdayHours)
  42. var yesterdayThisTimeCount int64
  43. err = global.App.DB.Table("user").
  44. Where("pf", pf).
  45. Where("gid", gid).
  46. Where("createdAt", ">", yesterday).
  47. Where("createdAt", "<=", yesterdayThisTime).
  48. Count(&yesterdayThisTimeCount).Error
  49. if err != nil {
  50. global.App.Log.Error(err.Error())
  51. return nil, nil, 0, 0, 0, err
  52. }
  53. return todayTimeDistribution, yesterdayTimeDistribution, int64(yesterdayCount), int64(todayCount), yesterdayThisTimeCount, nil
  54. }
  55. // 活跃用户的时段信息
  56. func GetActiveTimeDistribution(pf string, gid string) (map[int]int, map[int]int, int64, int64, int64, error) {
  57. now := time.Now()
  58. today := now.Format("2006-01-02")
  59. hours := utils.GetDayHour(now)
  60. var todayRegister []time.Time
  61. //计算今日曲线
  62. err := global.App.DB.Table("user_login").
  63. Where("pf", pf).
  64. Where("gid", gid).
  65. Where("loginTime", ">", today).
  66. Pluck("loginTime", &todayRegister).Error
  67. if err != nil {
  68. global.App.Log.Error(err.Error())
  69. return nil, nil, 0, 0, 0, err
  70. }
  71. var todayCount int64
  72. err = global.App.DB.Table("user_login").
  73. Where("pf", pf).
  74. Where("gid", gid).
  75. Where("loginTime", ">", today).
  76. Group("userId").Count(&todayCount).Error
  77. if err != nil {
  78. global.App.Log.Error(err.Error())
  79. return nil, nil, 0, 0, 0, err
  80. }
  81. todayTimeDistribution := getTimeDistribution(todayRegister, hours)
  82. //计算昨日曲线
  83. var yesterdayRegister []time.Time
  84. yesterdayHours := utils.GetDayHour(now.AddDate(0, 0, -1))
  85. yesterday := now.AddDate(0, 0, -1).Format("2006-01-02")
  86. yesterdayThisTime := now.AddDate(0, 0, -1).Format("2006-01-02 15:04:05")
  87. err = global.App.DB.Table("user_login").
  88. Where("pf", pf).
  89. Where("gid", gid).
  90. Where("loginTime", ">", yesterday).
  91. Where("loginTime", "<=", today).
  92. Pluck("loginTime", &yesterdayRegister).Error
  93. if err != nil {
  94. global.App.Log.Error(err.Error())
  95. return nil, nil, 0, 0, 0, err
  96. }
  97. var yesterdayCount int64
  98. err = global.App.DB.Table("user_login").
  99. Where("pf", pf).
  100. Where("gid", gid).
  101. Where("loginTime", ">", yesterday).
  102. Where("loginTime", "<=", today).
  103. Group("userId").Count(&yesterdayCount).Error
  104. if err != nil {
  105. global.App.Log.Error(err.Error())
  106. return nil, nil, 0, 0, 0, err
  107. }
  108. var yesterdayThisTimeCount int64
  109. err = global.App.DB.Table("user_login").
  110. Where("pf", pf).
  111. Where("gid", gid).
  112. Where("loginTime", ">", yesterday).
  113. Where("loginTime", "<=", yesterdayThisTime).
  114. Group("userId").Count(&yesterdayCount).Error
  115. if err != nil {
  116. global.App.Log.Error(err.Error())
  117. return nil, nil, 0, 0, 0, err
  118. }
  119. yesterdayTimeDistribution := getTimeDistribution(yesterdayRegister, yesterdayHours)
  120. return todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, nil
  121. }
  122. // 新增设备日趋势图
  123. func GetRegisterDayDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int, float32, error) {
  124. var registerDays []time.Time
  125. err := global.App.DB.Table("user").
  126. Where("gid", gid).
  127. Where("pf", pf).
  128. Where("createdAt", ">=", startTime).
  129. Where("createdAt", "<=", endTime).
  130. Pluck("createdAt", &registerDays).Error
  131. if err != nil {
  132. return nil, 0, 0, err
  133. }
  134. days := utils.GetTimeDay(startTime, endTime)
  135. todayTimeDistribution := getTimeDistribution(registerDays, days)
  136. return todayTimeDistribution, len(registerDays), float32(len(registerDays) / len(days)), nil
  137. }
  138. // 活跃用户趋势图
  139. func GetActiveDayDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int64, float32, error) {
  140. var activeDays []time.Time
  141. err := global.App.DB.Table("user_login").
  142. Where("gid", gid).
  143. Where("pf", pf).
  144. Where("loginTime", ">=", startTime).
  145. Where("loginTime", "<=", endTime).
  146. Pluck("loginTime", &activeDays).Error
  147. if err != nil {
  148. return nil, 0, 0, err
  149. }
  150. //查询总数(去重)
  151. var count int64
  152. err = global.App.DB.Table("user_login").
  153. Where("gid", gid).
  154. Where("pf", pf).
  155. Where("loginTime", ">=", startTime).
  156. Where("loginTime", "<=", endTime).
  157. Distinct("userId").Count(&count).Error
  158. if err != nil {
  159. return nil, 0, 0, err
  160. }
  161. days := utils.GetTimeDay(startTime, endTime)
  162. todayTimeDistribution := getTimeDistribution(activeDays, days)
  163. return todayTimeDistribution, count, float32(len(activeDays) / len(days)), nil
  164. }
  165. // 活跃用户周趋势图
  166. func GetActiveWeekDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int64, float32, error) {
  167. var activeDays []time.Time
  168. err := global.App.DB.Table("user_login").
  169. Where("gid", gid).
  170. Where("pf", pf).
  171. Where("loginTime", ">=", startTime).
  172. Where("loginTime", "<=", endTime).
  173. Pluck("loginTime", &activeDays).Error
  174. if err != nil {
  175. return nil, 0, 0, err
  176. }
  177. days := utils.GetTimeDay(startTime, endTime)
  178. todayTimeDistribution := getTimeDistribution(activeDays, days)
  179. return todayTimeDistribution, 0, float32(len(activeDays) / len(days)), nil
  180. }
  181. // 活跃用户月趋势图
  182. func GetActiveMouthDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, int64, float32, error) {
  183. var activeDays []time.Time
  184. err := global.App.DB.Table("user_login").
  185. Where("gid", gid).
  186. Where("pf", pf).
  187. Where("loginTime", ">=", startTime).
  188. Where("loginTime", "<=", endTime).
  189. Pluck("loginTime", &activeDays).Error
  190. if err != nil {
  191. return nil, 0, 0, err
  192. }
  193. days := utils.GetTimeDay(startTime, endTime)
  194. todayTimeDistribution := getTimeDistribution(activeDays, days)
  195. return todayTimeDistribution, 0, float32(len(activeDays) / len(days)), nil
  196. }
  197. func GetLoginDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, float32, error) {
  198. var activeDays []time.Time
  199. err := global.App.DB.Table("user_login").
  200. Where("gid", gid).
  201. Where("pf", pf).
  202. Where("loginTime", ">=", startTime).
  203. Where("loginTime", "<=", endTime).
  204. Pluck("loginTime", &activeDays).Error
  205. if err != nil {
  206. return nil, 0, err
  207. }
  208. days := utils.GetTimeDay(startTime, endTime)
  209. todayTimeDistribution := getTimeDistribution(activeDays, days)
  210. return todayTimeDistribution, float32(len(activeDays) / len(days)), nil
  211. }
  212. // 根据时间求出时段信息
  213. func getTimeDistribution(todayRegister []time.Time, hours []int64) map[int]int {
  214. var todayRegisterUnix []int64
  215. for _, t := range todayRegister {
  216. todayRegisterUnix = append(todayRegisterUnix, t.Unix())
  217. }
  218. todayRegisterSum := make(map[int]int)
  219. for k := range hours {
  220. todayRegisterSum[k] = 0
  221. }
  222. for _, t := range todayRegisterUnix {
  223. for k := range hours {
  224. if k == 0 {
  225. if t < hours[k+1] {
  226. todayRegisterSum[0]++
  227. }
  228. } else if k == len(hours)-1 {
  229. if t > hours[k] {
  230. todayRegisterSum[len(hours)-1]++
  231. }
  232. } else {
  233. if t > hours[k] && t <= hours[k+1] {
  234. todayRegisterSum[k]++
  235. }
  236. }
  237. }
  238. }
  239. return todayRegisterSum
  240. }
  241. //// 根据日期求出分天信息
  242. //func getDayDistribution(mouthRegister []time.Time, days []int64) {
  243. // var mouthRegisterUnix []int64
  244. // for _, t := range mouthRegister {
  245. // mouthRegisterUnix = append(mouthRegisterUnix, t.Unix())
  246. // }
  247. //
  248. // mouthRegisterSum := make(map[int]int)
  249. // for k := range days {
  250. // mouthRegisterSum[k] = 0
  251. // }
  252. //
  253. // for _, t := range mouthRegisterUnix {
  254. // for k := range days {
  255. // if k == 0 {
  256. // if t < days[k+1] {
  257. // todayRegisterSum[0]++
  258. // }
  259. // } else if k == {
  260. // if t > days[k] {
  261. // todayRegisterSum[23]++
  262. // }
  263. // } else {
  264. // if t > days[k] && t <= days[k+1] {
  265. // todayRegisterSum[k]++
  266. // }
  267. // }
  268. // }
  269. // }
  270. //
  271. //
  272. //}