analysisLogsAnalysis.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package userAnalysis
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/util/gconv"
  7. "time"
  8. )
  9. func (ua *UserAnalysis) GetAnalysisLogRes(ctx context.Context, runTime time.Time) ([]*AnalysisRes, error) {
  10. var (
  11. sourceArr = []string{"pc", "wx", "app"}
  12. unActiveTime = []int{1, 30, 90}
  13. returnData = []*AnalysisRes{}
  14. )
  15. //活跃用户分析
  16. for _, day := range unActiveTime {
  17. if day == 30 { //30天活跃用户各端
  18. for _, source := range sourceArr {
  19. if res, err := ua.ActiveUserLoad(ctx, runTime.AddDate(0, 0, -day), source); err == nil && len(res) > 0 {
  20. returnData = append(returnData, &AnalysisRes{Name: fmt.Sprintf("30天%s活跃用户", source), Code: fmt.Sprintf("active_%s_%d", source, 30), Data: res})
  21. }
  22. }
  23. }
  24. if res, err := ua.ActiveUserLoad(ctx, runTime.AddDate(0, 0, -day), ""); err == nil && len(res) > 0 {
  25. returnData = append(returnData, &AnalysisRes{Name: fmt.Sprintf("%d天活跃用户", day), Code: fmt.Sprintf("active_%d", day), Data: res})
  26. }
  27. }
  28. //标讯详情页访问
  29. if res, err := ua.ArticleVisit(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
  30. returnData = append(returnData, res...)
  31. }
  32. if res, err := ua.SearchVisit(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
  33. returnData = append(returnData, res...)
  34. }
  35. //标讯详情页访问
  36. if res, err := ua.ArticleVisit1Day(ctx, runTime.AddDate(0, 0, -1)); err == nil && len(res) > 0 {
  37. returnData = append(returnData, res...)
  38. }
  39. // 已访问过
  40. if res, err := ua.Visited(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
  41. returnData = append(returnData, &AnalysisRes{Name: "访问过剑鱼产品", Code: "visited", Data: res, SaveOldData: true})
  42. }
  43. //活跃天数
  44. return returnData, nil
  45. }
  46. // ActiveUserLoad 活跃用户
  47. func (ua *UserAnalysis) ActiveUserLoad(ctx context.Context, start time.Time, source string) (map[BaseUserId]bool, error) {
  48. var (
  49. execSql = "SELECT DISTINCT(baseUserId) as baseUserId FROM user_log_byHour WHERE create_time > ? "
  50. values = []interface{}{start.Format(time.DateTime)}
  51. )
  52. if source == "wx" || source == "pc" || source == "app" {
  53. execSql += " AND s_source =? "
  54. values = append(values, source)
  55. }
  56. rPc, err := g.DB().Query(ctx, execSql, values...)
  57. if err != nil {
  58. return nil, err
  59. }
  60. activeUser := map[BaseUserId]bool{}
  61. for _, m := range rPc.List() {
  62. // 插入pc30天活跃用户
  63. activeUser[BaseUserId(gconv.Int64(m["baseUserId"]))] = true
  64. }
  65. return activeUser, nil
  66. }
  67. func (ua *UserAnalysis) ActiveDayNum(ctx context.Context, runTime time.Time, day, actDayNum int) ([]*AnalysisRes, error) {
  68. rPc, err := g.DB().Query(ctx, `SELECT baseUserId,COUNT(DISTINCT toDate(create_time)) AS acDayNum
  69. FROM
  70. pub_tags.user_log_byHour
  71. WHERE
  72. create_time >= ?
  73. GROUP BY
  74. baseUserId
  75. having acDayNum >=?`, runTime.AddDate(0, 0, -day).Format(time.DateTime), actDayNum)
  76. if err != nil {
  77. g.Log().Errorf(ctx, "UserAnalysis.ActiveDayNum")
  78. }
  79. var m1 = map[BaseUserId]bool{}
  80. for _, m := range rPc.List() {
  81. var baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  82. if baseUserId > 0 {
  83. m1[baseUserId] = true
  84. }
  85. }
  86. return []*AnalysisRes{
  87. {"近7天活跃天数≥3次", "activeDay_gte3day_7day", m1, false},
  88. }, nil
  89. }
  90. // ArticleVisit 指定时间内访问详情页数量大于num次的用户
  91. func (ua *UserAnalysis) ArticleVisit(ctx context.Context, start time.Time) ([]*AnalysisRes, error) {
  92. var (
  93. d1, d2, d3 = map[BaseUserId]bool{}, map[BaseUserId]bool{}, map[BaseUserId]bool{}
  94. d4, d5 = map[BaseUserId]bool{}, map[BaseUserId]bool{}
  95. )
  96. rPc, err := g.DB().Query(ctx, `SELECT sum(article) as articleCount,baseUserId FROM pub_tags.user_log_byHour WHERE create_time > ? GROUP BY baseUserId HAVING articleCount >5 `, start.Format(time.DateTime))
  97. if err != nil {
  98. return nil, err
  99. }
  100. for _, m := range rPc.List() {
  101. var (
  102. baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  103. count = gconv.Int64(m["articleCount"])
  104. )
  105. if baseUserId <= 0 {
  106. continue
  107. }
  108. if count > 5 {
  109. d1[baseUserId] = true
  110. }
  111. if count >= 7 {
  112. d2[baseUserId] = true
  113. }
  114. if count >= 10 {
  115. d3[baseUserId] = true
  116. }
  117. if count >= 15 {
  118. d4[baseUserId] = true
  119. }
  120. if count >= 20 {
  121. d5[baseUserId] = true
  122. }
  123. }
  124. return []*AnalysisRes{
  125. {"7天内访问详情页次数>5", "7day_article_gt_5", d1, false},
  126. {"7天内访问详情页次数>=7", "7day_article_gte_7", d2, false},
  127. {"7天内访问详情页次数>=10", "7day_article_gte_10", d3, false},
  128. {"7天内访问详情页次数>=15", "7day_article_gte_15", d4, false},
  129. {"7天内访问详情页次数>=20", "7day_article_gte_20", d5, false},
  130. }, nil
  131. }
  132. func (ua *UserAnalysis) SearchVisit(ctx context.Context, start time.Time) ([]*AnalysisRes, error) {
  133. var (
  134. d1 = map[BaseUserId]bool{}
  135. )
  136. rPc, err := g.DB().Query(ctx, `SELECT sum(search) as searchCount,baseUserId FROM pub_tags.user_log_byHour WHERE create_time > ? GROUP BY baseUserId HAVING searchCount >=3 `, start.Format(time.DateTime))
  137. if err != nil {
  138. return nil, err
  139. }
  140. for _, m := range rPc.List() {
  141. var (
  142. baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  143. )
  144. if baseUserId <= 0 {
  145. continue
  146. }
  147. d1[baseUserId] = true
  148. }
  149. return []*AnalysisRes{
  150. {"7天内访问详情页次数>5", "7day_article_gt_5", d1, false},
  151. }, nil
  152. }
  153. func (ua *UserAnalysis) ArticleVisit1Day(ctx context.Context, start time.Time) ([]*AnalysisRes, error) {
  154. var (
  155. d0 = map[BaseUserId]bool{}
  156. )
  157. rPc, err := g.DB().Query(ctx, `SELECT sum(article) as articleCount,baseUserId FROM pub_tags.user_log_byHour WHERE create_time > ? GROUP BY baseUserId HAVING articleCount >=10 `, start.Format(time.DateTime))
  158. if err != nil {
  159. return nil, err
  160. }
  161. for _, m := range rPc.List() {
  162. var (
  163. baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  164. //count = gconv.Int64(m["articleCount"])
  165. )
  166. if baseUserId <= 0 {
  167. continue
  168. }
  169. d0[baseUserId] = true
  170. }
  171. return []*AnalysisRes{
  172. {"1天内访问详情页次数>=10", "1day_article_gte_10", d0, false},
  173. }, nil
  174. }
  175. // Visited 指定日期内访问过剑鱼
  176. func (ua *UserAnalysis) Visited(ctx context.Context, start time.Time) (map[BaseUserId]bool, error) {
  177. rPc, err := g.DB().Query(ctx, `SELECT sum(article)+sum(search)+sum(portrait)+sum(other) as allCount,baseUserId FROM pub_tags.user_log_byHour WHERE create_time >? GROUP BY baseUserId`, start.Format(time.DateTime))
  178. if err != nil {
  179. return nil, err
  180. }
  181. visitedUser := map[BaseUserId]bool{}
  182. for _, m := range rPc.List() {
  183. // 插入pc30天活跃用户
  184. visitedUser[BaseUserId(gconv.Int64(m["baseUserId"]))] = true
  185. }
  186. return visitedUser, nil
  187. }