jobFrontLogs.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  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. "github.com/pkg/errors"
  8. "time"
  9. "workTasks/userSign/match"
  10. )
  11. // GetBuryPointRes 分析埋点数据
  12. func (ua *UserAnalysis) GetBuryPointRes(ctx context.Context, runTime time.Time) (fData []*AnalysisRes, err error) {
  13. // 访问过指定页面
  14. if res, err := ua.GetVisitUserAnalysis(ctx, runTime.AddDate(0, 0, -45)); err == nil && len(res) > 0 {
  15. for _, t := range res {
  16. fData = append(fData, t)
  17. }
  18. }
  19. //7天留资用户
  20. rData, err := ua.clickShareRes(ctx, runTime.AddDate(0, 0, -7))
  21. if err != nil {
  22. g.Log().Errorf(ctx, "init clickShareRes err:%v", err)
  23. }
  24. for _, datum := range rData {
  25. fData = append(fData, datum)
  26. }
  27. visitBuyData, visitBuyErr := ua.visitBuyPageRes(ctx, runTime)
  28. if visitBuyErr != nil {
  29. g.Log().Errorf(ctx, "init visitBuyErr err:%v", visitBuyErr)
  30. }
  31. for _, datum := range visitBuyData {
  32. fData = append(fData, datum)
  33. }
  34. return
  35. }
  36. func (ua *UserAnalysis) GetVisitUserAnalysis(ctx context.Context, t time.Time) ([]*AnalysisRes, error) {
  37. var (
  38. visitedVipBuyPage = map[BaseUserId]bool{}
  39. )
  40. res, err := g.DB("ckLogs").Query(ctx, "SELECT user_id,count(*) as total FROM dwd_f_personnel_behavior WHERE `date` > ? and user_id!='' AND (url like '%jy_mobile/order/create/svip%' or url like '%/swordfish/page_big_pc/free/svip/buy%') group by user_id order BY total desc", t.Format(time.DateTime))
  41. if err != nil {
  42. return nil, errors.Wrap(err, "查询超级订阅购买页访问数据异常")
  43. }
  44. for _, m := range res.List() {
  45. userId := gconv.String(m["user_id"])
  46. baseUserId, ok := ua.UserMapping[userId]
  47. if !ok {
  48. continue
  49. }
  50. visitedVipBuyPage[baseUserId] = true
  51. }
  52. return []*AnalysisRes{{Name: "近45天浏览超级订阅购买页", Code: "visitedVipBuyPage", Data: visitedVipBuyPage}}, nil
  53. }
  54. func (ua *UserAnalysis) clickShareRes(ctx context.Context, t time.Time) (returnData []*AnalysisRes, err error) {
  55. //分析点击分享 近7天点击标讯分享按钮>=2
  56. var (
  57. rData = map[BaseUserId]bool{}
  58. tData = map[BaseUserId]int{}
  59. )
  60. res, err := g.DB("ckLogs").Query(ctx, "SELECT position_id FROM dwd_f_personnel_behavior WHERE page_id ='article_content' AND breaker_name in ('QQ','朋友圈','微信') AND `date` > ? ", t.Format(time.DateTime))
  61. if err != nil {
  62. return nil, errors.Wrap(err, "查询超级订阅购买页访问数据异常")
  63. }
  64. for _, m := range res.List() {
  65. var (
  66. position_id = gconv.String(m["position_id"])
  67. )
  68. if baseUserId, ok := ua.UserMapping[position_id]; ok {
  69. tData[baseUserId]++
  70. }
  71. }
  72. for bid, datum := range tData {
  73. if datum >= 2 {
  74. rData[bid] = true
  75. }
  76. }
  77. return []*AnalysisRes{
  78. {"近7天高频分享用户", "buryPoint_share_7_day_gte2", rData, false},
  79. }, nil
  80. }
  81. type (
  82. countObj struct {
  83. Seven map[BaseUserId]int
  84. One map[BaseUserId]int
  85. LoadUrl []string
  86. MiniCode string //小程序code
  87. }
  88. cVisit struct {
  89. fullData map[string]*countObj
  90. matchObj *match.TrieNode
  91. now time.Time
  92. }
  93. )
  94. func getVisitStatic(t time.Time) *cVisit {
  95. rData := &cVisit{}
  96. rData.matchObj = &match.TrieNode{}
  97. rData.fullData = map[string]*countObj{
  98. // 超级订阅购买页单未提交订单
  99. "visit_buypage_vip": &countObj{
  100. Seven: map[BaseUserId]int{},
  101. One: map[BaseUserId]int{},
  102. LoadUrl: []string{"/swordfish/page_big_pc/free/svip/buy", "/jy_mobile/common/order/create/svip", "/jy_mobile/order/create/svip"},
  103. },
  104. "visit_buypage_member": &countObj{
  105. Seven: map[BaseUserId]int{},
  106. One: map[BaseUserId]int{},
  107. LoadUrl: []string{"/big/pc/page/buy_commit", "/jy_mobile/common/order/create/bigmember"},
  108. },
  109. "visit_buypage_areavip": &countObj{
  110. Seven: map[BaseUserId]int{},
  111. One: map[BaseUserId]int{},
  112. LoadUrl: []string{"/jy_mobile/common/order/create/areapack"},
  113. },
  114. "visit_buypage_buyer_report_package": &countObj{
  115. Seven: map[BaseUserId]int{},
  116. One: map[BaseUserId]int{},
  117. LoadUrl: []string{"/swordfish/page_big_pc/order/download-pack/prop", "/jy_mobile/order/create/owneranalysis"},
  118. },
  119. "visit_buypage_winner_report_package": &countObj{
  120. Seven: map[BaseUserId]int{},
  121. One: map[BaseUserId]int{},
  122. LoadUrl: []string{"/swordfish/page_big_pc/order/download-pack/ent", "/jy_mobile/order/create/enterpriseanalysis"},
  123. },
  124. "visit_buypage_market_report_package": &countObj{
  125. Seven: map[BaseUserId]int{},
  126. One: map[BaseUserId]int{},
  127. LoadUrl: []string{"/swordfish/page_big_pc/order/download-pack/market", "/jy_mobile/order/create/marketanalysis"},
  128. },
  129. "visit_buypage_buyer_portrait_package": &countObj{
  130. Seven: map[BaseUserId]int{},
  131. One: map[BaseUserId]int{},
  132. LoadUrl: []string{"/jy_mobile/common/order/create/buyerpack", "/page_big_pc/order/buyer-pack"},
  133. },
  134. "visit_buypage_attach_package": &countObj{
  135. Seven: map[BaseUserId]int{},
  136. One: map[BaseUserId]int{},
  137. LoadUrl: []string{"/jy_mobile/common/order/create/filepack"},
  138. },
  139. "visit_buypage_ent_credit_report": &countObj{
  140. Seven: map[BaseUserId]int{},
  141. One: map[BaseUserId]int{},
  142. LoadUrl: []string{"/jy_mobile/order/create/creditreport", "/swordfish/page_big_pc/order/credit-report"},
  143. },
  144. "visit_buypage_applet_wy": &countObj{
  145. Seven: map[BaseUserId]int{},
  146. One: map[BaseUserId]int{},
  147. LoadUrl: []string{"pages/order/create/index"},
  148. MiniCode: "wy",
  149. },
  150. "visit_buypage_applet_clzl": &countObj{
  151. Seven: map[BaseUserId]int{},
  152. One: map[BaseUserId]int{},
  153. LoadUrl: []string{"pages/order/create/index"},
  154. MiniCode: "clzl",
  155. },
  156. "visit_buypage_applet_ywsj": &countObj{
  157. Seven: map[BaseUserId]int{},
  158. One: map[BaseUserId]int{},
  159. LoadUrl: []string{"pages/order/create/index"},
  160. MiniCode: "ywsj",
  161. },
  162. "visit_buypage_applet_hjcg": &countObj{
  163. Seven: map[BaseUserId]int{},
  164. One: map[BaseUserId]int{},
  165. LoadUrl: []string{"pages/order/create/index"},
  166. MiniCode: "hjcg",
  167. },
  168. "visit_buypage_applet_jjztb": &countObj{
  169. Seven: map[BaseUserId]int{},
  170. One: map[BaseUserId]int{},
  171. LoadUrl: []string{"pages/order/create/index"},
  172. MiniCode: "jjztb",
  173. },
  174. "visit_buypage_applet_af": &countObj{
  175. Seven: map[BaseUserId]int{},
  176. One: map[BaseUserId]int{},
  177. LoadUrl: []string{"pages/order/create/index"},
  178. MiniCode: "af",
  179. },
  180. "visit_buypage_applet_gcsjzx": &countObj{
  181. Seven: map[BaseUserId]int{},
  182. One: map[BaseUserId]int{},
  183. LoadUrl: []string{"pages/order/create/index"},
  184. MiniCode: "gcsjzx",
  185. },
  186. "visit_buypage_applet_fw": &countObj{
  187. Seven: map[BaseUserId]int{},
  188. One: map[BaseUserId]int{},
  189. LoadUrl: []string{"pages/order/create/index"},
  190. MiniCode: "fw",
  191. },
  192. "visit_buypage_applet_bx": &countObj{
  193. Seven: map[BaseUserId]int{},
  194. One: map[BaseUserId]int{},
  195. LoadUrl: []string{"pages/order/create/index"},
  196. MiniCode: "bx",
  197. },
  198. "visit_buypage_applet_cwsj": &countObj{
  199. Seven: map[BaseUserId]int{},
  200. One: map[BaseUserId]int{},
  201. LoadUrl: []string{"pages/order/create/index"},
  202. MiniCode: "cwsj",
  203. },
  204. "visit_buypage_applet_zbdl": &countObj{
  205. Seven: map[BaseUserId]int{},
  206. One: map[BaseUserId]int{},
  207. LoadUrl: []string{"pages/order/create/index"},
  208. MiniCode: "zbdl",
  209. },
  210. "visit_buypage_applet_glzx": &countObj{
  211. Seven: map[BaseUserId]int{},
  212. One: map[BaseUserId]int{},
  213. LoadUrl: []string{"pages/order/create/index"},
  214. MiniCode: "glzx",
  215. },
  216. }
  217. rData.now = t
  218. return rData
  219. }
  220. func (cv *cVisit) addCount(url, miniCode, dataStr string, uid BaseUserId) {
  221. matchUrl := cv.matchObj.FindOneMaxStr(url)
  222. if matchUrl != "" {
  223. var insertOne bool
  224. if createTime, tErr := time.ParseInLocation(time.DateTime, dataStr, time.Local); tErr != nil {
  225. if cv.now.AddDate(0, 0, -1).Before(createTime) {
  226. insertOne = true
  227. }
  228. }
  229. obj, ok := cv.fullData[matchUrl]
  230. if ok && obj != nil {
  231. obj.Seven[uid]++
  232. if insertOne {
  233. obj.Seven[uid]++
  234. }
  235. return
  236. }
  237. //小程序
  238. if matchUrl == "pages/order/create/index" {
  239. if miniObj, miniOk := cv.fullData[fmt.Sprintf("visit_buypage_applet_%s", miniCode)]; miniOk && miniObj != nil {
  240. miniObj.Seven[uid]++
  241. if insertOne {
  242. miniObj.Seven[uid]++
  243. }
  244. }
  245. }
  246. }
  247. }
  248. func (cv *cVisit) getAnalysisRes() []*AnalysisRes {
  249. var (
  250. rData = []*AnalysisRes{}
  251. sevenTotal = map[BaseUserId]int{}
  252. )
  253. for code, obj := range cv.fullData {
  254. var (
  255. dataOne map[BaseUserId]bool
  256. dataSeven map[BaseUserId]bool
  257. )
  258. for basUserId, _ := range obj.One {
  259. dataOne[basUserId] = true
  260. }
  261. for basUserId, num := range obj.Seven {
  262. dataSeven[basUserId] = true
  263. sevenTotal[basUserId] += num
  264. }
  265. rData = append(rData, &AnalysisRes{fmt.Sprintf("近1天进入%s购买页单", code), fmt.Sprintf("%s_1_day", code), dataOne, false})
  266. rData = append(rData, &AnalysisRes{fmt.Sprintf("近7天进入%s购买页单", code), fmt.Sprintf("%s_7_day", code), dataSeven, false})
  267. }
  268. //统计7天访问大于7次
  269. var sevenData = map[BaseUserId]bool{}
  270. for basUserId, count := range sevenTotal {
  271. if count >= 7 {
  272. sevenData[basUserId] = true
  273. }
  274. }
  275. rData = append(rData, &AnalysisRes{"近7天进入进入购买页大于等于7次", "visit_buypage_7day_gte7", sevenData, false})
  276. return rData
  277. //[]*AnalysisRes{
  278. //{"近1天进入超级订阅购买页单未提交订单", "visit_buypage_vip_1_day", rData, false},
  279. //{"近1天进入大会员购买页单未提交订单", "visit_buypage_member_1_day", rData, false},
  280. //{"近1天进入省份订阅包购买页单未提交订单", "visit_buypage_areavip_1_day", rData, false},
  281. //{"近1天进入业主采购分析报告下载包购买页单未提交订单", "visit_buypage_buyer_report_package_1_day", rData, false},
  282. //{"近1天进入企业中标分析报告下载包购买页单未提交订单", "visit_buypage_winner_report_package_1_day", rData, false},
  283. //{"近1天进入市场分析定制报告下载包购买页单未提交订单", "visit_buypage_market_report_package_1_day", rData, false},
  284. //{"近1天进入采购单位画像包购买页单未提交订单", "visit_buypage_buyer_portrait_package_1_day", rData, false},
  285. //{"近1天进入附件下载包购买页单未提交订单", "visit_buypage_attach_package_1_day", rData, false},
  286. //{"近1天进入投标企业信用报告购买页单未提交订单", "visit_buypage_ent_credit_report_1_day", rData, false},
  287. //
  288. //{"近1天进入物业碎片化小程序购买页单未提交订单", "visit_buypage_applet_wy_1_day", rData, false},
  289. //{"近1天进入车辆租赁碎片化小程序购买页单未提交订单", "visit_buypage_applet_clzl_1_day", rData, false},
  290. //{"近1天进入印务碎片化小程序购买页单未提交订单", "visit_buypage_applet_ywsj_1_day", rData, false},
  291. //{"近1天进入环境碎片化小程序购买页单未提交订单", "visit_buypage_applet_hjcg_1_day", rData, false},
  292. //{"近1天进入家具碎片化小程序购买页单未提交订单", "visit_buypage_applet_jjztb_1_day", rData, false},
  293. //{"近1天进入安防碎片化小程序购买页单未提交订单", "visit_buypage_applet_af_1_day", rData, false},
  294. //{"近1天进入投招服工程设计咨询碎片化小程序购买页单未提交订单", "visit_buypage_applet_gcsjzx_1_day", rData, false},
  295. //{"近1天进入法务碎片化小程序购买页单未提交订单", "visit_buypage_applet_fw_1_day", rData, false},
  296. //
  297. //{"近1天进入保服碎片化小程序购买页单未提交订单", "visit_buypage_applet_bx_1_day", rData, false},
  298. //{"近1天进入招服财审碎片化小程序购买页单未提交订单", "visit_buypage_applet_cwsj_1_day", rData, false},
  299. //{"近1天进入招服代理服务碎片化小程序购买页单未提交订单", "visit_buypage_applet_zbdl_1_day", rData, false},
  300. //{"近1天进入招服管理咨询碎片化小程序购买页单未提交订单", "visit_buypage_applet_glzx_1_day", rData, false},
  301. //}
  302. }
  303. // 访问购买页面
  304. func (ua *UserAnalysis) visitBuyPageRes(ctx context.Context, t time.Time) (returnData []*AnalysisRes, err error) {
  305. visitStatic := getVisitStatic(t)
  306. res, err := g.DB("ckLogs").Query(ctx, "SELECT position_id,mini_program_code,url,date FROM dwd_f_personnel_behavior WHERE `date` > ? ", t.AddDate(0, 0, -7).Format(time.DateTime))
  307. if err != nil {
  308. return nil, errors.Wrap(err, "查询超级订阅购买页访问数据异常")
  309. }
  310. for _, m := range res.List() {
  311. var (
  312. position_id = gconv.String(m["position_id"])
  313. urlStr = gconv.String(m["url"])
  314. mini_program_code = gconv.String(m["mini_program_code"])
  315. dataStr = gconv.String(m["date"])
  316. )
  317. if position_id == "" {
  318. continue
  319. }
  320. if baseUserId, ok := ua.UserMapping[position_id]; ok {
  321. visitStatic.addCount(urlStr, mini_program_code, dataStr, baseUserId)
  322. }
  323. }
  324. return visitStatic.getAnalysisRes(), nil
  325. }