analysisLogsAnalysis.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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. //*特殊1-90天活跃
  29. if activeRes, err := ua.ActiveUserLoad(ctx, runTime.AddDate(0, 0, -90), "", runTime.AddDate(0, 0, -1)); err != nil || len(activeRes) > 0 {
  30. returnData = append(returnData, &AnalysisRes{Name: fmt.Sprintf("除了昨天90天活跃用户"), Code: fmt.Sprintf("active_1_90"), Data: activeRes})
  31. }
  32. //标讯详情页访问
  33. if res, err := ua.ArticleVisit(ctx, runTime, 7, []int{5}, []int{7, 10, 15, 20}); err == nil && len(res) > 0 {
  34. returnData = append(returnData, res...)
  35. }
  36. if res, err := ua.ArticleVisit(ctx, runTime, 3, []int{}, []int{5}); err == nil && len(res) > 0 {
  37. returnData = append(returnData, res...)
  38. }
  39. if res, err := ua.SearchVisit(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
  40. returnData = append(returnData, res...)
  41. }
  42. //标讯详情页访问
  43. if res, err := ua.ArticleVisit1Day(ctx, runTime.AddDate(0, 0, -1)); err == nil && len(res) > 0 {
  44. returnData = append(returnData, res...)
  45. }
  46. //标讯详情页访问
  47. if res, err := ua.ActiveDayNum(ctx, runTime, 7, 3); err == nil && len(res) > 0 {
  48. returnData = append(returnData, res...)
  49. }
  50. // 已访问过
  51. if res, err := ua.Visited(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
  52. returnData = append(returnData, &AnalysisRes{Name: "访问过剑鱼产品", Code: "visited", Data: res, SaveOldData: true})
  53. }
  54. //活跃天数
  55. return returnData, nil
  56. }
  57. // ActiveUserLoad 活跃用户
  58. func (ua *UserAnalysis) ActiveUserLoad(ctx context.Context, start time.Time, source string, entTime ...time.Time) (map[BaseUserId]bool, error) {
  59. var (
  60. execSql = "SELECT DISTINCT(baseUserId) as baseUserId FROM user_log_byHour WHERE create_time >= ? "
  61. values = []interface{}{start.Format(time.DateTime)}
  62. )
  63. if len(entTime) > 0 {
  64. execSql += " AND create_time < ?"
  65. values = append(values, entTime[0].Format(time.DateTime))
  66. }
  67. if source == "wx" || source == "pc" || source == "app" {
  68. execSql += " AND s_source =? "
  69. values = append(values, source)
  70. }
  71. rPc, err := g.DB().Query(ctx, execSql, values...)
  72. if err != nil {
  73. return nil, err
  74. }
  75. activeUser := map[BaseUserId]bool{}
  76. for _, m := range rPc.List() {
  77. // 插入pc30天活跃用户
  78. activeUser[BaseUserId(gconv.Int64(m["baseUserId"]))] = true
  79. }
  80. return activeUser, nil
  81. }
  82. func (ua *UserAnalysis) ActiveDayNum(ctx context.Context, runTime time.Time, day, actDayNum int) ([]*AnalysisRes, error) {
  83. rPc, err := g.DB().Query(ctx, `SELECT baseUserId,COUNT(DISTINCT toDate(create_time)) AS acDayNum
  84. FROM
  85. pub_tags.user_log_byHour
  86. WHERE
  87. create_time >= ?
  88. GROUP BY
  89. baseUserId
  90. having acDayNum >=?`, runTime.AddDate(0, 0, -day).Format(time.DateTime), actDayNum)
  91. if err != nil {
  92. g.Log().Errorf(ctx, "UserAnalysis.ActiveDayNum")
  93. }
  94. var m1 = map[BaseUserId]bool{}
  95. for _, m := range rPc.List() {
  96. var baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  97. if baseUserId > 0 {
  98. m1[baseUserId] = true
  99. }
  100. }
  101. return []*AnalysisRes{
  102. {fmt.Sprintf("近%d天活跃天数≥%d次", actDayNum, day), fmt.Sprintf("activeDay_gte%dday_%dday", actDayNum, day), m1, false},
  103. }, nil
  104. }
  105. // ArticleVisit 指定时间内访问详情页数量大于num次的用户
  106. func (ua *UserAnalysis) ArticleVisit(ctx context.Context, runTime time.Time, dayNum int, gt, gte []int) ([]*AnalysisRes, error) {
  107. var (
  108. staticGtMap = map[int]map[BaseUserId]bool{}
  109. staticGteMap = map[int]map[BaseUserId]bool{}
  110. result = []*AnalysisRes{}
  111. )
  112. for _, num := range gt {
  113. staticGtMap[num] = map[BaseUserId]bool{}
  114. }
  115. for _, num := range gte {
  116. staticGteMap[num] = map[BaseUserId]bool{}
  117. }
  118. 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 `, runTime.AddDate(0, 0, -dayNum).Format(time.DateTime))
  119. if err != nil {
  120. return nil, err
  121. }
  122. for _, m := range rPc.List() {
  123. var (
  124. baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  125. count = gconv.Int(m["articleCount"])
  126. )
  127. if baseUserId <= 0 {
  128. continue
  129. }
  130. for num, v := range staticGtMap {
  131. if count > num {
  132. v[baseUserId] = true
  133. }
  134. }
  135. for num, v := range staticGteMap {
  136. if count >= num {
  137. v[baseUserId] = true
  138. }
  139. }
  140. }
  141. for i, i2 := range staticGtMap {
  142. result = append(result, &AnalysisRes{
  143. Name: fmt.Sprintf("%d天内访问详情页次数>%d", dayNum, i),
  144. Code: fmt.Sprintf("%dday_article_gt_%d", dayNum, i),
  145. Data: i2,
  146. SaveOldData: false,
  147. })
  148. }
  149. for i, i2 := range staticGteMap {
  150. result = append(result, &AnalysisRes{
  151. Name: fmt.Sprintf("%d天内访问详情页次数>=%d", dayNum, i),
  152. Code: fmt.Sprintf("%dday_article_gte_%d", dayNum, i),
  153. Data: i2,
  154. SaveOldData: false,
  155. })
  156. }
  157. return result, nil
  158. }
  159. func (ua *UserAnalysis) SearchVisit(ctx context.Context, start time.Time) ([]*AnalysisRes, error) {
  160. var (
  161. d1 = map[BaseUserId]bool{}
  162. )
  163. 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))
  164. if err != nil {
  165. return nil, err
  166. }
  167. for _, m := range rPc.List() {
  168. var (
  169. baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  170. )
  171. if baseUserId <= 0 {
  172. continue
  173. }
  174. d1[baseUserId] = true
  175. }
  176. return []*AnalysisRes{
  177. {"近7天搜索次数≥3次", "search_gte3_7day", d1, false},
  178. }, nil
  179. }
  180. func (ua *UserAnalysis) ArticleVisit1Day(ctx context.Context, start time.Time) ([]*AnalysisRes, error) {
  181. var (
  182. d0 = map[BaseUserId]bool{}
  183. )
  184. 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))
  185. if err != nil {
  186. return nil, err
  187. }
  188. for _, m := range rPc.List() {
  189. var (
  190. baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
  191. //count = gconv.Int64(m["articleCount"])
  192. )
  193. if baseUserId <= 0 {
  194. continue
  195. }
  196. d0[baseUserId] = true
  197. }
  198. return []*AnalysisRes{
  199. {"1天内访问详情页次数>=10", "1day_article_gte_10", d0, false},
  200. }, nil
  201. }
  202. // Visited 指定日期内访问过剑鱼
  203. func (ua *UserAnalysis) Visited(ctx context.Context, start time.Time) (map[BaseUserId]bool, error) {
  204. 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))
  205. if err != nil {
  206. return nil, err
  207. }
  208. visitedUser := map[BaseUserId]bool{}
  209. for _, m := range rPc.List() {
  210. // 插入pc30天活跃用户
  211. visitedUser[BaseUserId(gconv.Int64(m["baseUserId"]))] = true
  212. }
  213. return visitedUser, nil
  214. }