userBehavior.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. package service
  2. import (
  3. "designs/global"
  4. "designs/model"
  5. "designs/utils"
  6. "time"
  7. )
  8. var timeDuration = []string{
  9. "00.00",
  10. "01.00",
  11. "02.00",
  12. "03.00",
  13. "04.00",
  14. "05.00",
  15. "06.00",
  16. "07.00",
  17. "08.00",
  18. "09.00",
  19. "10.00",
  20. "11.00",
  21. "12.00",
  22. "13.00",
  23. "14.00",
  24. "15.00",
  25. "16.00",
  26. "17.00",
  27. "18.00",
  28. "19.00",
  29. "20.00",
  30. "21.00",
  31. "22.00",
  32. "23.00",
  33. }
  34. // 获取新增用户的时段信息
  35. func GetRegisterTimeDistribution(pf string, gid string) (map[string]int, map[string]int, int64, int64, int64, error) {
  36. now := time.Now()
  37. today := now.Format("2006-01-02")
  38. hours := utils.GetDayHour(now)
  39. var todayRegister []time.Time
  40. //计算今日曲线
  41. err := global.App.DB.Table("user").
  42. Where("pf", pf).
  43. Where("gid", gid).
  44. Where("createdAt", ">", today).
  45. Pluck("createdAt", &todayRegister).Error
  46. if err != nil {
  47. global.App.Log.Error(err.Error())
  48. return nil, nil, 0, 0, 0, err
  49. }
  50. todayCount := len(todayRegister)
  51. todayTimeDistribution := getTimeDistribution(todayRegister, hours)
  52. //计算昨日曲线
  53. var yesterdayRegister []time.Time
  54. yesterdayHours := utils.GetDayHour(now.AddDate(0, 0, -1))
  55. yesterday := now.AddDate(0, 0, -1).Format("2006-01-02")
  56. yesterdayThisTime := now.AddDate(0, 0, -1).Format("2006-01-02 15:04:05")
  57. err = global.App.DB.Table("user").
  58. Where("pf", pf).
  59. Where("gid", gid).
  60. Where("createdAt", ">", yesterday).
  61. Where("createdAt", "<=", today).
  62. Pluck("createdAt", &yesterdayRegister).Error
  63. if err != nil {
  64. global.App.Log.Error(err.Error())
  65. return nil, nil, 0, 0, 0, err
  66. }
  67. yesterdayCount := len(yesterdayRegister)
  68. yesterdayTimeDistribution := getTimeDistribution(yesterdayRegister, yesterdayHours)
  69. var yesterdayThisTimeCount int64
  70. err = global.App.DB.Table("user").
  71. Where("pf", pf).
  72. Where("gid", gid).
  73. Where("createdAt", ">", yesterday).
  74. Where("createdAt", "<=", yesterdayThisTime).
  75. Count(&yesterdayThisTimeCount).Error
  76. if err != nil {
  77. global.App.Log.Error(err.Error())
  78. return nil, nil, 0, 0, 0, err
  79. }
  80. todayTimeDistributionRes := make(map[string]int)
  81. for k, v := range todayTimeDistribution {
  82. todayTimeDistributionRes[timeDuration[k]] = v
  83. }
  84. yesterdayTimeDistributionRes := make(map[string]int)
  85. for k, v := range yesterdayTimeDistribution {
  86. yesterdayTimeDistributionRes[timeDuration[k]] = v
  87. }
  88. return todayTimeDistributionRes, yesterdayTimeDistributionRes, int64(yesterdayCount), int64(todayCount), yesterdayThisTimeCount, nil
  89. }
  90. // 活跃用户的时段信息
  91. func GetActiveTimeDistribution(pf string, gid string) (map[string]int, map[string]int, int64, int64, int64, error) {
  92. now := time.Now()
  93. today := now.Format("2006-01-02")
  94. hours := utils.GetDayHour(now)
  95. var todayRegisterModel []model.UserLogin
  96. //计算今日曲线
  97. err := global.App.DB.Table("user_login").
  98. Where("pf", pf).
  99. Where("gid", gid).
  100. Where("loginTime", ">", today).
  101. Select("userId", "loginTime").
  102. Scan(&todayRegisterModel).Error
  103. if err != nil {
  104. global.App.Log.Error(err.Error())
  105. return nil, nil, 0, 0, 0, err
  106. }
  107. todayRegister := distinctUserHour(todayRegisterModel)
  108. var todayCount int64
  109. err = global.App.DB.Table("user_login").
  110. Where("pf", pf).
  111. Where("gid", gid).
  112. Where("loginTime", ">", today).
  113. Group("userId").Count(&todayCount).Error
  114. if err != nil {
  115. global.App.Log.Error(err.Error())
  116. return nil, nil, 0, 0, 0, err
  117. }
  118. todayTimeDistribution := getTimeDistribution(todayRegister, hours)
  119. //计算昨日曲线
  120. //var yesterdayRegister []time.Time
  121. var yesterdayRegisterModel []model.UserLogin
  122. yesterdayHours := utils.GetDayHour(now.AddDate(0, 0, -1))
  123. yesterday := now.AddDate(0, 0, -1).Format("2006-01-02")
  124. yesterdayThisTime := now.AddDate(0, 0, -1).Format("2006-01-02 15:04:05")
  125. err = global.App.DB.Table("user_login").
  126. Where("pf", pf).
  127. Where("gid", gid).
  128. Where("loginTime", ">", yesterday).
  129. Where("loginTime", "<=", today).
  130. Pluck("loginTime", &yesterdayRegisterModel).Error
  131. if err != nil {
  132. global.App.Log.Error(err.Error())
  133. return nil, nil, 0, 0, 0, err
  134. }
  135. var yesterdayCount int64
  136. err = global.App.DB.Table("user_login").
  137. Where("pf", pf).
  138. Where("gid", gid).
  139. Where("loginTime", ">", yesterday).
  140. Where("loginTime", "<=", today).
  141. Group("userId").Count(&yesterdayCount).Error
  142. if err != nil {
  143. global.App.Log.Error(err.Error())
  144. return nil, nil, 0, 0, 0, err
  145. }
  146. var yesterdayThisTimeCount int64
  147. err = global.App.DB.Table("user_login").
  148. Where("pf", pf).
  149. Where("gid", gid).
  150. Where("loginTime", ">", yesterday).
  151. Where("loginTime", "<=", yesterdayThisTime).
  152. Group("userId").Count(&yesterdayCount).Error
  153. if err != nil {
  154. global.App.Log.Error(err.Error())
  155. return nil, nil, 0, 0, 0, err
  156. }
  157. yesterdayRegister := distinctUserHour(yesterdayRegisterModel)
  158. yesterdayTimeDistribution := getTimeDistribution(yesterdayRegister, yesterdayHours)
  159. todayTimeDistributionRes := make(map[string]int)
  160. for k, v := range todayTimeDistribution {
  161. todayTimeDistributionRes[timeDuration[k]] = v
  162. }
  163. yesterdayTimeDistributionRes := make(map[string]int)
  164. for k, v := range yesterdayTimeDistribution {
  165. yesterdayTimeDistributionRes[timeDuration[k]] = v
  166. }
  167. return todayTimeDistributionRes, yesterdayTimeDistributionRes, yesterdayCount, todayCount, yesterdayThisTimeCount, nil
  168. }
  169. // 新增设备日趋势图
  170. func GetRegisterDayDistribution(pf string, gid string, startTime string, endTime string) (map[string]int, int, float32, error) {
  171. var registerDays []time.Time
  172. err := global.App.DB.Table("user").
  173. Where("gid", gid).
  174. Where("pf", pf).
  175. Where("createdAt", ">=", startTime).
  176. Where("createdAt", "<=", endTime).
  177. Pluck("createdAt", &registerDays).Error
  178. if err != nil {
  179. return nil, 0, 0, err
  180. }
  181. days := utils.GetTimeDay(startTime, endTime)
  182. todayTimeDistribution := getTimeDistribution(registerDays, days)
  183. daysFormat := utils.GetTimeDayDateFormat(startTime, endTime) //用户分别是在哪天注册的
  184. todayTimeDistributionRes := make(map[string]int)
  185. for k, day := range daysFormat {
  186. todayTimeDistributionRes[day] = todayTimeDistribution[k]
  187. }
  188. return todayTimeDistributionRes, len(registerDays), float32(len(registerDays) / len(days)), nil
  189. }
  190. // 活跃用户趋势图
  191. func GetActiveDayDistribution(pf string, gid string, startTime string, endTime string) (map[string]int, int64, float32, error) {
  192. var activeDays []time.Time
  193. err := global.App.DB.Table("user_login").
  194. Where("gid", gid).
  195. Where("pf", pf).
  196. Where("loginTime", ">=", startTime).
  197. Where("loginTime", "<=", endTime).
  198. Pluck("loginTime", &activeDays).Error
  199. if err != nil {
  200. return nil, 0, 0, err
  201. }
  202. //查询总数(去重)
  203. var count int64
  204. err = global.App.DB.Table("user_login").
  205. Where("gid", gid).
  206. Where("pf", pf).
  207. Where("loginTime", ">=", startTime).
  208. Where("loginTime", "<=", endTime).
  209. Distinct("userId").Count(&count).Error
  210. if err != nil {
  211. return nil, 0, 0, err
  212. }
  213. days := utils.GetTimeDay(startTime, endTime)
  214. todayTimeDistribution := getTimeDistribution(activeDays, days)
  215. daysFormat := utils.GetTimeDayDateFormat(startTime, endTime) //用户分别是在哪天注册的
  216. todayTimeDistributionRes := make(map[string]int)
  217. for k, day := range daysFormat {
  218. todayTimeDistributionRes[day] = todayTimeDistribution[k]
  219. }
  220. return todayTimeDistributionRes, count, float32(len(activeDays) / len(days)), nil
  221. }
  222. // 活跃用户周趋势图
  223. func GetActiveWeekDistribution(pf string, gid string, startTime string, endTime string) (map[string]int, int64, float32, error) {
  224. var activeDays []time.Time
  225. err := global.App.DB.Table("user_login").
  226. Where("gid", gid).
  227. Where("pf", pf).
  228. Where("loginTime", ">=", startTime).
  229. Where("loginTime", "<=", endTime).
  230. Pluck("loginTime", &activeDays).Error
  231. if err != nil {
  232. return nil, 0, 0, err
  233. }
  234. days := utils.GetTimeDay(startTime, endTime)
  235. todayTimeDistribution := getTimeDistribution(activeDays, days)
  236. daysFormat := utils.GetTimeDayDateFormat(startTime, endTime) //用户分别是在哪天注册的
  237. todayTimeDistributionRes := make(map[string]int)
  238. for k, day := range daysFormat {
  239. todayTimeDistributionRes[day] = todayTimeDistribution[k]
  240. }
  241. return todayTimeDistributionRes, 0, float32(len(activeDays) / len(days)), nil
  242. }
  243. // 活跃用户月趋势图
  244. func GetActiveMouthDistribution(pf string, gid string, startTime string, endTime string) (map[string]int, int64, float32, error) {
  245. var activeDays []time.Time
  246. err := global.App.DB.Table("user_login").
  247. Where("gid", gid).
  248. Where("pf", pf).
  249. Where("loginTime", ">=", startTime).
  250. Where("loginTime", "<=", endTime).
  251. Pluck("loginTime", &activeDays).Error
  252. if err != nil {
  253. return nil, 0, 0, err
  254. }
  255. days := utils.GetTimeDay(startTime, endTime)
  256. todayTimeDistribution := getTimeDistribution(activeDays, days)
  257. daysFormat := utils.GetTimeDayDateFormat(startTime, endTime) //用户分别是在哪天注册的
  258. todayTimeDistributionRes := make(map[string]int)
  259. for k, day := range daysFormat {
  260. todayTimeDistributionRes[day] = todayTimeDistribution[k]
  261. }
  262. return todayTimeDistributionRes, 0, float32(len(activeDays) / len(days)), nil
  263. }
  264. func GetLoginDistribution(pf string, gid string, startTime string, endTime string) (map[int]int, float32, error) {
  265. var activeDays []time.Time
  266. err := global.App.DB.Table("user_login").
  267. Where("gid", gid).
  268. Where("pf", pf).
  269. Where("loginTime", ">=", startTime).
  270. Where("loginTime", "<=", endTime).
  271. Pluck("loginTime", &activeDays).Error
  272. if err != nil {
  273. return nil, 0, err
  274. }
  275. days := utils.GetTimeDay(startTime, endTime)
  276. todayTimeDistribution := getTimeDistribution(activeDays, days)
  277. return todayTimeDistribution, float32(len(activeDays) / len(days)), nil
  278. }
  279. // 根据时段对信息进行去重(每个小时只有一条数据是有效的)
  280. func distinctUserHour(data []model.UserLogin) []time.Time {
  281. var result []time.Time
  282. check := make(map[string][]int)
  283. for _, v := range data {
  284. date := v.LoginTime.Format("15")
  285. if !utils.InArray(v.UserId, check[date]) {
  286. check[date] = append(check[date], v.UserId)
  287. result = append(result, v.LoginTime)
  288. }
  289. }
  290. return result
  291. }
  292. // 根据时间求出时段信息
  293. func getTimeDistribution(todayRegister []time.Time, hours []int64) map[int]int {
  294. var todayRegisterUnix []int64
  295. for _, t := range todayRegister {
  296. todayRegisterUnix = append(todayRegisterUnix, t.Unix())
  297. }
  298. todayRegisterSum := make(map[int]int)
  299. for k := range hours {
  300. todayRegisterSum[k] = 0
  301. }
  302. for _, t := range todayRegisterUnix {
  303. for k := range hours {
  304. if k == 0 {
  305. if t < hours[k+1] {
  306. todayRegisterSum[0]++
  307. }
  308. } else if k == len(hours)-1 {
  309. if t > hours[k] {
  310. todayRegisterSum[len(hours)-1]++
  311. }
  312. } else {
  313. if t > hours[k] && t <= hours[k+1] {
  314. todayRegisterSum[k]++
  315. }
  316. }
  317. }
  318. }
  319. return todayRegisterSum
  320. }
  321. //// 根据日期求出分天信息
  322. //func getDayDistribution(mouthRegister []time.Time, days []int64) {
  323. // var mouthRegisterUnix []int64
  324. // for _, t := range mouthRegister {
  325. // mouthRegisterUnix = append(mouthRegisterUnix, t.Unix())
  326. // }
  327. //
  328. // mouthRegisterSum := make(map[int]int)
  329. // for k := range days {
  330. // mouthRegisterSum[k] = 0
  331. // }
  332. //
  333. // for _, t := range mouthRegisterUnix {
  334. // for k := range days {
  335. // if k == 0 {
  336. // if t < days[k+1] {
  337. // todayRegisterSum[0]++
  338. // }
  339. // } else if k == {
  340. // if t > days[k] {
  341. // todayRegisterSum[23]++
  342. // }
  343. // } else {
  344. // if t > days[k] && t <= days[k+1] {
  345. // todayRegisterSum[k]++
  346. // }
  347. // }
  348. // }
  349. // }
  350. //
  351. //
  352. //}