package userAnalysis import ( "context" "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" "github.com/pkg/errors" "time" "workTasks/userSign/match" ) // GetBuryPointRes 分析埋点数据 func (ua *UserAnalysis) GetBuryPointRes(ctx context.Context, runTime time.Time) (fData []*AnalysisRes, err error) { // 访问过指定页面 if res, err := ua.GetVisitUserAnalysis(ctx, runTime.AddDate(0, 0, -45)); err == nil && len(res) > 0 { for _, t := range res { fData = append(fData, t) } } //7天留资用户 rData, err := ua.clickShareRes(ctx, runTime.AddDate(0, 0, -7)) if err != nil { g.Log().Errorf(ctx, "init clickShareRes err:%v", err) } for _, datum := range rData { fData = append(fData, datum) } visitBuyData, visitBuyErr := ua.visitBuyPageRes(ctx, runTime) if visitBuyErr != nil { g.Log().Errorf(ctx, "init visitBuyErr err:%v", visitBuyErr) } for _, datum := range visitBuyData { fData = append(fData, datum) } return } func (ua *UserAnalysis) GetVisitUserAnalysis(ctx context.Context, t time.Time) ([]*AnalysisRes, error) { var ( visitedVipBuyPage = map[BaseUserId]bool{} ) 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)) if err != nil { return nil, errors.Wrap(err, "查询超级订阅购买页访问数据异常") } for _, m := range res.List() { userId := gconv.String(m["user_id"]) baseUserId, ok := ua.UserMapping[userId] if !ok { continue } visitedVipBuyPage[baseUserId] = true } return []*AnalysisRes{{Name: "近45天浏览超级订阅购买页", Code: "visitedVipBuyPage", Data: visitedVipBuyPage}}, nil } func (ua *UserAnalysis) clickShareRes(ctx context.Context, t time.Time) (returnData []*AnalysisRes, err error) { //分析点击分享 近7天点击标讯分享按钮>=2 var ( rData = map[BaseUserId]bool{} tData = map[BaseUserId]int{} ) 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)) if err != nil { return nil, errors.Wrap(err, "查询超级订阅购买页访问数据异常") } for _, m := range res.List() { var ( position_id = gconv.String(m["position_id"]) ) if baseUserId, ok := ua.UserMapping[position_id]; ok { tData[baseUserId]++ } } for bid, datum := range tData { if datum >= 2 { rData[bid] = true } } return []*AnalysisRes{ {"近7天高频分享用户", "buryPoint_share_7_day_gte2", rData, false}, }, nil } type ( countObj struct { Seven map[BaseUserId]int One map[BaseUserId]int LoadUrl []string MiniCode string //小程序code } cVisit struct { fullData map[string]*countObj matchObj *match.TrieNode now time.Time } ) func getVisitStatic(t time.Time) *cVisit { rData := &cVisit{} rData.matchObj = &match.TrieNode{} rData.fullData = map[string]*countObj{ // 超级订阅购买页单未提交订单 "visit_buypage_vip": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/swordfish/page_big_pc/free/svip/buy", "/jy_mobile/common/order/create/svip", "/jy_mobile/order/create/svip"}, }, "visit_buypage_member": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/big/pc/page/buy_commit", "/jy_mobile/common/order/create/bigmember"}, }, "visit_buypage_areavip": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/jy_mobile/common/order/create/areapack"}, }, "visit_buypage_buyer_report_package": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/swordfish/page_big_pc/order/download-pack/prop", "/jy_mobile/order/create/owneranalysis"}, }, "visit_buypage_winner_report_package": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/swordfish/page_big_pc/order/download-pack/ent", "/jy_mobile/order/create/enterpriseanalysis"}, }, "visit_buypage_market_report_package": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/swordfish/page_big_pc/order/download-pack/market", "/jy_mobile/order/create/marketanalysis"}, }, "visit_buypage_buyer_portrait_package": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/jy_mobile/common/order/create/buyerpack", "/page_big_pc/order/buyer-pack"}, }, "visit_buypage_attach_package": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/jy_mobile/common/order/create/filepack"}, }, "visit_buypage_ent_credit_report": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"/jy_mobile/order/create/creditreport", "/swordfish/page_big_pc/order/credit-report"}, }, "visit_buypage_applet_wy": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "wy", }, "visit_buypage_applet_clzl": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "clzl", }, "visit_buypage_applet_ywsj": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "ywsj", }, "visit_buypage_applet_hjcg": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "hjcg", }, "visit_buypage_applet_jjztb": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "jjztb", }, "visit_buypage_applet_af": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "af", }, "visit_buypage_applet_gcsjzx": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "gcsjzx", }, "visit_buypage_applet_fw": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "fw", }, "visit_buypage_applet_bx": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "bx", }, "visit_buypage_applet_cwsj": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "cwsj", }, "visit_buypage_applet_zbdl": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "zbdl", }, "visit_buypage_applet_glzx": &countObj{ Seven: map[BaseUserId]int{}, One: map[BaseUserId]int{}, LoadUrl: []string{"pages/order/create/index"}, MiniCode: "glzx", }, } rData.now = t return rData } func (cv *cVisit) addCount(url, miniCode, dataStr string, uid BaseUserId) { matchUrl := cv.matchObj.FindOneMaxStr(url) if matchUrl != "" { var insertOne bool if createTime, tErr := time.ParseInLocation(time.DateTime, dataStr, time.Local); tErr != nil { if cv.now.AddDate(0, 0, -1).Before(createTime) { insertOne = true } } obj, ok := cv.fullData[matchUrl] if ok && obj != nil { obj.Seven[uid]++ if insertOne { obj.Seven[uid]++ } return } //小程序 if matchUrl == "pages/order/create/index" { if miniObj, miniOk := cv.fullData[fmt.Sprintf("visit_buypage_applet_%s", miniCode)]; miniOk && miniObj != nil { miniObj.Seven[uid]++ if insertOne { miniObj.Seven[uid]++ } } } } } func (cv *cVisit) getAnalysisRes() []*AnalysisRes { var ( rData = []*AnalysisRes{} sevenTotal = map[BaseUserId]int{} ) for code, obj := range cv.fullData { var ( dataOne map[BaseUserId]bool dataSeven map[BaseUserId]bool ) for basUserId, _ := range obj.One { dataOne[basUserId] = true } for basUserId, num := range obj.Seven { dataSeven[basUserId] = true sevenTotal[basUserId] += num } rData = append(rData, &AnalysisRes{fmt.Sprintf("近1天进入%s购买页单", code), fmt.Sprintf("%s_1_day", code), dataOne, false}) rData = append(rData, &AnalysisRes{fmt.Sprintf("近7天进入%s购买页单", code), fmt.Sprintf("%s_7_day", code), dataSeven, false}) } //统计7天访问大于7次 var sevenData = map[BaseUserId]bool{} for basUserId, count := range sevenTotal { if count >= 7 { sevenData[basUserId] = true } } rData = append(rData, &AnalysisRes{"近7天进入进入购买页大于等于7次", "visit_buypage_7day_gte7", sevenData, false}) return rData //[]*AnalysisRes{ //{"近1天进入超级订阅购买页单未提交订单", "visit_buypage_vip_1_day", rData, false}, //{"近1天进入大会员购买页单未提交订单", "visit_buypage_member_1_day", rData, false}, //{"近1天进入省份订阅包购买页单未提交订单", "visit_buypage_areavip_1_day", rData, false}, //{"近1天进入业主采购分析报告下载包购买页单未提交订单", "visit_buypage_buyer_report_package_1_day", rData, false}, //{"近1天进入企业中标分析报告下载包购买页单未提交订单", "visit_buypage_winner_report_package_1_day", rData, false}, //{"近1天进入市场分析定制报告下载包购买页单未提交订单", "visit_buypage_market_report_package_1_day", rData, false}, //{"近1天进入采购单位画像包购买页单未提交订单", "visit_buypage_buyer_portrait_package_1_day", rData, false}, //{"近1天进入附件下载包购买页单未提交订单", "visit_buypage_attach_package_1_day", rData, false}, //{"近1天进入投标企业信用报告购买页单未提交订单", "visit_buypage_ent_credit_report_1_day", rData, false}, // //{"近1天进入物业碎片化小程序购买页单未提交订单", "visit_buypage_applet_wy_1_day", rData, false}, //{"近1天进入车辆租赁碎片化小程序购买页单未提交订单", "visit_buypage_applet_clzl_1_day", rData, false}, //{"近1天进入印务碎片化小程序购买页单未提交订单", "visit_buypage_applet_ywsj_1_day", rData, false}, //{"近1天进入环境碎片化小程序购买页单未提交订单", "visit_buypage_applet_hjcg_1_day", rData, false}, //{"近1天进入家具碎片化小程序购买页单未提交订单", "visit_buypage_applet_jjztb_1_day", rData, false}, //{"近1天进入安防碎片化小程序购买页单未提交订单", "visit_buypage_applet_af_1_day", rData, false}, //{"近1天进入投招服工程设计咨询碎片化小程序购买页单未提交订单", "visit_buypage_applet_gcsjzx_1_day", rData, false}, //{"近1天进入法务碎片化小程序购买页单未提交订单", "visit_buypage_applet_fw_1_day", rData, false}, // //{"近1天进入保服碎片化小程序购买页单未提交订单", "visit_buypage_applet_bx_1_day", rData, false}, //{"近1天进入招服财审碎片化小程序购买页单未提交订单", "visit_buypage_applet_cwsj_1_day", rData, false}, //{"近1天进入招服代理服务碎片化小程序购买页单未提交订单", "visit_buypage_applet_zbdl_1_day", rData, false}, //{"近1天进入招服管理咨询碎片化小程序购买页单未提交订单", "visit_buypage_applet_glzx_1_day", rData, false}, //} } // 访问购买页面 func (ua *UserAnalysis) visitBuyPageRes(ctx context.Context, t time.Time) (returnData []*AnalysisRes, err error) { visitStatic := getVisitStatic(t) 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)) if err != nil { return nil, errors.Wrap(err, "查询超级订阅购买页访问数据异常") } for _, m := range res.List() { var ( position_id = gconv.String(m["position_id"]) urlStr = gconv.String(m["url"]) mini_program_code = gconv.String(m["mini_program_code"]) dataStr = gconv.String(m["date"]) ) if position_id == "" { continue } if baseUserId, ok := ua.UserMapping[position_id]; ok { visitStatic.addCount(urlStr, mini_program_code, dataStr, baseUserId) } } return visitStatic.getAnalysisRes(), nil }