123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- 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
- }
|