userBehavior.go 11 KB

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