userBehavior.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. package v1
  2. import (
  3. "designs/app/common/request"
  4. "designs/app/common/response"
  5. "designs/global"
  6. "designs/service"
  7. "designs/utils"
  8. "github.com/gin-gonic/gin"
  9. "math"
  10. "time"
  11. )
  12. // 总览
  13. func Summary(c *gin.Context) {
  14. form := request.Check(c, &struct {
  15. Gid string `form:"gid" json:"gid" binding:"required"`
  16. Pf string `form:"pf" json:"pf" binding:"required"`
  17. }{})
  18. //查询用户总数
  19. var userCount int64
  20. err := global.App.DB.Table("user").
  21. Where("gid", form.Gid).
  22. Where("pf", form.Pf).
  23. Count(&userCount).Error
  24. if err != nil {
  25. response.Fail(c, 1001, err.Error())
  26. return
  27. }
  28. //查询近七日活跃总数
  29. now := time.Now()
  30. sevenDayAgo := now.AddDate(0, 0, -7)
  31. thirtyDayAgo := now.AddDate(0, 0, -30)
  32. var activeUserCount7 int64
  33. err = global.App.DB.Table("user_login").
  34. Where("gid", form.Gid).
  35. Where("pf", form.Pf).
  36. Where("loginTime", ">=", sevenDayAgo).
  37. Where("loginTime", "<=", now).
  38. Distinct("userId").
  39. Count(&activeUserCount7).Error
  40. if err != nil {
  41. response.Fail(c, 1001, err.Error())
  42. return
  43. }
  44. var activeUserCount30 int64
  45. err = global.App.DB.Table("user_login").
  46. Where("gid", form.Gid).
  47. Where("pf", form.Pf).
  48. Where("loginTime", ">=", thirtyDayAgo).
  49. Where("loginTime", "<=", now).
  50. Distinct("userId").
  51. Count(&activeUserCount30).Error
  52. if err != nil {
  53. response.Fail(c, 1001, err.Error())
  54. return
  55. }
  56. //查询 近7日单设备日均使用时长
  57. res, err := service.UserOnlineSummary(form.Gid, form.Pf, "", sevenDayAgo.Format("2006-01-02 15:04:05"), now.Format("2006-01-02 15:04:05"))
  58. if err != nil {
  59. response.Fail(c, 1001, err.Error())
  60. return
  61. }
  62. var avgTime int
  63. for _, v := range res {
  64. avgTime = avgTime + int(v)
  65. }
  66. var avgTimeString string
  67. if avgTime != 0 {
  68. avgTime = int(math.Round(float64(avgTime / len(res))))
  69. avgTimeString = utils.TimeStampToMDS(avgTime)
  70. } else {
  71. avgTimeString = "00.00"
  72. }
  73. response.Success(c, gin.H{
  74. "data": map[string]interface{}{
  75. "userCount": userCount,
  76. "activeUserCount7": activeUserCount7,
  77. "activeUserCount30": activeUserCount30,
  78. "activeUserCount7Time": avgTimeString,
  79. },
  80. })
  81. }
  82. // 时段分布
  83. func TimeDistributionData(c *gin.Context) {
  84. form := request.Check(c, &struct {
  85. Gid string `form:"gid" json:"gid" binding:"required"`
  86. Pf string `form:"pf" json:"pf" binding:"required"`
  87. Type int `form:"type" json:"type" binding:"required"`
  88. }{})
  89. var data interface{}
  90. if form.Type == 1 {
  91. //新增用户
  92. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetRegisterTimeDistribution(form.Pf, form.Gid)
  93. if err != nil {
  94. response.Fail(c, 1001, err.Error())
  95. return
  96. }
  97. data = map[string]interface{}{
  98. "today": todayTimeDistribution,
  99. "yesterday": yesterdayTimeDistribution,
  100. "yesterdayCount": yesterdayCount,
  101. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  102. "todayCount": todayCount,
  103. }
  104. } else if form.Type == 2 {
  105. //活跃设备
  106. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetActiveTimeDistribution(form.Pf, form.Gid)
  107. if err != nil {
  108. response.Fail(c, 1001, err.Error())
  109. return
  110. }
  111. data = map[string]interface{}{
  112. "today": todayTimeDistribution,
  113. "yesterday": yesterdayTimeDistribution,
  114. "yesterdayCount": yesterdayCount,
  115. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  116. "todayCount": todayCount,
  117. }
  118. } else if form.Type == 3 {
  119. //启动次数
  120. todayTimeDistribution, yesterdayTimeDistribution, yesterdayCount, todayCount, yesterdayThisTimeCount, err := service.GetActiveTimeDistribution(form.Pf, form.Gid)
  121. if err != nil {
  122. response.Fail(c, 1001, err.Error())
  123. return
  124. }
  125. data = map[string]interface{}{
  126. "today": todayTimeDistribution,
  127. "yesterday": yesterdayTimeDistribution,
  128. "yesterdayCount": yesterdayCount,
  129. "yesterdayThisTimeCount": yesterdayThisTimeCount,
  130. "todayCount": todayCount,
  131. }
  132. } else {
  133. response.Fail(c, 1003, "type错误")
  134. return
  135. }
  136. response.Success(c, gin.H{
  137. "data": data,
  138. })
  139. }
  140. // 30日趋势
  141. func MouthDistributionData(c *gin.Context) {
  142. form := request.Check(c, &struct {
  143. Gid string `form:"gid" json:"gid" binding:"required"`
  144. Pf string `form:"pf" json:"pf" binding:"required"`
  145. Type int `form:"type" json:"type" binding:"required"`
  146. }{})
  147. now := time.Now()
  148. EndTime := now.Format("2006-01-02")
  149. StartTime := now.AddDate(0, 0, -29).Format("2006-01-02")
  150. data := make(map[string]interface{})
  151. if form.Type == 1 {
  152. //查询新增设备趋势图
  153. TimeDistribution, count, avg, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, StartTime, EndTime)
  154. if err != nil {
  155. response.Fail(c, 1001, err.Error())
  156. return
  157. }
  158. data["timeDistribution"] = TimeDistribution
  159. data["count"] = count
  160. data["avg"] = avg
  161. } else if form.Type == 2 {
  162. //查询活跃用户趋势图
  163. TimeDistribution, count, avg, err := service.GetActiveDayDistribution(form.Pf, form.Gid, StartTime, EndTime)
  164. if err != nil {
  165. response.Fail(c, 1001, err.Error())
  166. return
  167. }
  168. data["timeDistribution"] = TimeDistribution
  169. data["count"] = count
  170. data["avg"] = avg
  171. } else if form.Type == 3 {
  172. //查询启动次数
  173. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, StartTime, EndTime)
  174. if err != nil {
  175. response.Fail(c, 1001, err.Error())
  176. return
  177. }
  178. data["timeDistribution"] = TimeDistribution
  179. data["count"] = count
  180. data["avg"] = avg
  181. } else if form.Type == 4 {
  182. //查询单用户使用时长
  183. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, StartTime, EndTime)
  184. if err != nil {
  185. response.Fail(c, 1001, err.Error())
  186. return
  187. }
  188. data["timeDistribution"] = TimeDistribution
  189. data["count"] = count
  190. data["avg"] = avg
  191. } else if form.Type == 5 {
  192. //查询用户留存率
  193. //todo
  194. } else {
  195. response.Fail(c, 1003, "type错误")
  196. return
  197. }
  198. response.Success(c, gin.H{
  199. "data": data,
  200. })
  201. }
  202. // 用户趋势 总览
  203. func UserTrendsOverview(c *gin.Context) {
  204. form := request.Check(c, &struct {
  205. Gid string `form:"gid" json:"gid" binding:"required"`
  206. Pf string `form:"pf" json:"pf" binding:"required"`
  207. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  208. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  209. }{})
  210. //查询用户新增
  211. var registerCount int64
  212. err := global.App.DB.Table("user").
  213. Where("gid", form.Gid).
  214. Where("pf", form.Pf).
  215. Where("createdAt", ">=", form.StartTime).
  216. Where("createdAt", "<=", form.EndTime).
  217. Count(&registerCount).Error
  218. if err != nil {
  219. response.Fail(c, 1001, err.Error())
  220. return
  221. }
  222. //查询活跃设备
  223. var activeCount int64
  224. err = global.App.DB.Table("user_online").
  225. Where("gid", form.Gid).
  226. Where("pf", form.Pf).
  227. Where("logTime", ">=", form.StartTime).
  228. Where("logTime", "<=", form.EndTime).
  229. Distinct("userId").Count(&activeCount).Error
  230. if err != nil {
  231. response.Fail(c, 1001, err.Error())
  232. return
  233. }
  234. //查询启动次数
  235. var loginCount int64
  236. err = global.App.DB.Table("user_login").
  237. Where("gid", form.Gid).
  238. Where("pf", form.Pf).
  239. Where("loginTime", ">=", form.StartTime).
  240. Where("loginTime", "<=", form.EndTime).
  241. Count(&loginCount).Error
  242. if err != nil {
  243. response.Fail(c, 1001, err.Error())
  244. return
  245. }
  246. //查询平均启动时长
  247. //查询活跃用户月趋势图
  248. _, _, activeTime, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  249. if err != nil {
  250. response.Fail(c, 1001, err.Error())
  251. return
  252. }
  253. //查询 DAU/MAU
  254. //todo 查询方式需要更新
  255. dauMau := 0.3
  256. response.Success(c, gin.H{
  257. "data": map[string]interface{}{
  258. "registerCount": registerCount,
  259. "activeCount": activeCount,
  260. "loginCount": loginCount,
  261. "activeTime": activeTime,
  262. "dauMau": dauMau,
  263. },
  264. })
  265. }
  266. // 数据趋势
  267. func DataTrades(c *gin.Context) {
  268. form := request.Check(c, &struct {
  269. Gid string `form:"gid" json:"gid" binding:"required"`
  270. Pf string `form:"pf" json:"pf" binding:"required"`
  271. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  272. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  273. Type int `form:"type" json:"type" binding:"required"`
  274. }{})
  275. data := make(map[string]interface{})
  276. if form.Type == 1 {
  277. //查询新增设备趋势图
  278. TimeDistribution, count, avg, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  279. if err != nil {
  280. response.Fail(c, 1001, err.Error())
  281. return
  282. }
  283. data["imeDistribution"] = TimeDistribution
  284. data["count"] = count
  285. data["avg"] = avg
  286. } else if form.Type == 2 {
  287. //查询活跃用户趋势图
  288. TimeDistribution, count, avg, err := service.GetActiveDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  289. if err != nil {
  290. response.Fail(c, 1001, err.Error())
  291. return
  292. }
  293. data["imeDistribution"] = TimeDistribution
  294. data["count"] = count
  295. data["avg"] = avg
  296. } else if form.Type == 3 {
  297. //查询活跃用户周趋势图
  298. TimeDistribution, count, avg, err := service.GetActiveWeekDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  299. if err != nil {
  300. response.Fail(c, 1001, err.Error())
  301. return
  302. }
  303. data["imeDistribution"] = TimeDistribution
  304. data["count"] = count
  305. data["avg"] = avg
  306. } else if form.Type == 4 {
  307. //查询活跃用户月趋势图
  308. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  309. if err != nil {
  310. response.Fail(c, 1001, err.Error())
  311. return
  312. }
  313. data["imeDistribution"] = TimeDistribution
  314. data["count"] = count
  315. data["avg"] = avg
  316. } else if form.Type == 5 {
  317. //查询启动次数
  318. TimeDistribution, count, avg, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  319. if err != nil {
  320. response.Fail(c, 1001, err.Error())
  321. return
  322. }
  323. data["imeDistribution"] = TimeDistribution
  324. data["count"] = count
  325. data["avg"] = avg
  326. } else if form.Type == 6 {
  327. //查询平均启动时间
  328. TimeDistribution, count, avg, err := service.UserOnlineSummaryByDay(form.Gid, form.Pf, form.StartTime, form.EndTime)
  329. if err != nil {
  330. response.Fail(c, 1001, err.Error())
  331. return
  332. }
  333. data["imeDistribution"] = TimeDistribution
  334. data["count"] = count
  335. data["avg"] = avg
  336. } else {
  337. response.Fail(c, 1003, "type 错误")
  338. return
  339. }
  340. response.Success(c, gin.H{
  341. "data": data,
  342. })
  343. }
  344. // 数据趋势的整合
  345. func DataTradesDetail(c *gin.Context) {
  346. form := request.Check(c, &struct {
  347. Gid string `form:"gid" json:"gid" binding:"required"`
  348. Pf string `form:"pf" json:"pf" binding:"required"`
  349. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  350. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  351. }{})
  352. type dayData struct {
  353. NewUser int `json:"newUser"`
  354. ActiveUser int `json:"activeUser"`
  355. ActiveUserWeek int `json:"activeUserWeek"`
  356. ActiveUserMouth int `json:"activeUserMouth"`
  357. ActiveStart int `json:"activeStart"`
  358. AvgTime int `json:"avgTime"`
  359. }
  360. var data = make(map[string]dayData)
  361. //查询新增设备趋势图
  362. NewUser, _, _, err := service.GetRegisterDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  363. if err != nil {
  364. response.Fail(c, 1001, err.Error())
  365. return
  366. }
  367. //查询活跃用户趋势图
  368. ActiveUser, _, _, err := service.GetActiveDayDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  369. if err != nil {
  370. response.Fail(c, 1001, err.Error())
  371. return
  372. }
  373. //查询活跃用户周趋势图
  374. ActiveUserWeek, _, _, err := service.GetActiveWeekDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  375. if err != nil {
  376. response.Fail(c, 1001, err.Error())
  377. return
  378. }
  379. //查询活跃用户月趋势图
  380. ActiveUserMouth, _, _, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  381. if err != nil {
  382. response.Fail(c, 1001, err.Error())
  383. return
  384. }
  385. //查询启动次数
  386. ActiveStart, _, _, err := service.GetActiveMouthDistribution(form.Pf, form.Gid, form.StartTime, form.EndTime)
  387. if err != nil {
  388. response.Fail(c, 1001, err.Error())
  389. return
  390. }
  391. //查询平均启动时间
  392. AvgTime, _, _, err := service.UserOnlineSummaryByDay(form.Gid, form.Pf, form.StartTime, form.EndTime)
  393. if err != nil {
  394. response.Fail(c, 1001, err.Error())
  395. return
  396. }
  397. for k := range AvgTime {
  398. data[k] = dayData{
  399. NewUser: NewUser[k],
  400. ActiveUser: ActiveUser[k],
  401. ActiveUserWeek: ActiveUserWeek[k],
  402. ActiveUserMouth: ActiveUserMouth[k],
  403. ActiveStart: ActiveStart[k],
  404. AvgTime: AvgTime[k],
  405. }
  406. }
  407. response.Success(c, gin.H{
  408. "data": data,
  409. })
  410. }
  411. func RemainDataBydDay(c *gin.Context) {
  412. form := request.Check(c, &struct {
  413. Gid string `form:"gid" json:"gid" binding:"required"`
  414. Pf string `form:"pf" json:"pf" binding:"required"`
  415. StartTime string `form:"startTime" json:"startTime" binding:"required"`
  416. EndTime string `form:"endTime" json:"endTime" binding:"required"`
  417. Type int `form:"type" json:"type" binding:"required"`
  418. }{})
  419. data, err := service.RemainDataBydDay(form.Type, form.Pf, form.Gid, form.StartTime, form.EndTime)
  420. if err != nil {
  421. response.Fail(c, 1001, err.Error())
  422. return
  423. }
  424. response.Success(c, gin.H{
  425. "data": data,
  426. })
  427. }