wkyuer 1 tháng trước cách đây
mục cha
commit
060c350670

+ 58 - 3
urlStatic/config.yaml

@@ -3,8 +3,8 @@ runCron:
 
 runOnce:
   isRun: true
-  startDate: "2025-06-20 00:00:00"
-  endDate: "2025-06-25 10:00:00"
+  startDate: "2025-06-25 00:00:00"
+  endDate: "2025-06-27 15:00:00"
 
 database:
   default:
@@ -20,6 +20,15 @@ database_ck:
   maxIdleConns: 5
   maxOpenConns: 5
 
+mongodb:
+  log:
+    address: "172.20.45.129:27002"
+    size: 5
+    dbName: qfw
+    replSet: ""
+    userName: ""
+    password: ""
+
 
 match:
   - name: 超级订阅购买
@@ -32,11 +41,31 @@ match:
     rule:
       action_id: c_jy_open_page
       url: ["/big/pc/page/buy_commit","/jy_mobile/common/order/create/bigmember"]
+  - name: 大会员落地页
+    code: landing_page_member
+    rule:
+      action_id: c_jy_open_page
+      url: [ "/big/wx/page/landingPage","/jyapp/big/page/landingPage","/big/page/index"]
   - name: 省份订阅包购买页
-    code: buy_page_member
+    code: buy_area_pack
     rule:
       action_id: c_jy_open_page
       url: ["/jy_mobile/common/order/create/areapack","/jy_mobile/order/create/areapack"]
+  - name: 数据流量包购买页
+    code: buy_page_data_pack
+    rule:
+      action_id: c_jy_open_page
+      url: [ "/jy_mobile/common/order/create/datapack","/front/dataPack/createOrder"]
+  - name: 数据导出页面
+    code: data_export_page
+    rule:
+      action_id: c_jy_open_page
+      url: [ "/front/dataExport/toSieve","/jy_mobile/dataexport/limitpreview","/front/wx_dataExport/toSieve" ]
+  - name: 数据导出购买页
+    code: buy_data_export
+    rule:
+      action_id: c_jy_open_page
+      url: [ "/front/dataExport/toCreateOrderPage","/jy_mobile/order/create/dataexport" ]
   - name: 业主采购分析报告下载包购买页
     code: buy_page_buyer_report
     rule:
@@ -83,3 +112,29 @@ match:
       page_id: article_content
       action_id: c_jyclick
       breaker_name: 点击下载
+  - name: 点击标讯分享
+    code: content_click_share
+    rule:
+      page_id: article_content
+      action_id: c_jyclick
+      breaker_name: ['QQ','朋友圈','微信']
+  - name: 监控企业
+    code: add_ent_follow
+    mongo_table: bigmember_logs
+    rule:
+      url: "/bigmember/follow/ent/addFollow"
+  - name: 监控业主
+    code: add_buyer_follow
+    mongo_table: publicapply_logs
+    rule:
+      url: "/publicapply/customer/attention"
+  - name: 监控项目
+    code: add_project_follow
+    mongo_table: bigmember_logs
+    rule:
+      url: "/bigmember/follow/project/add"
+  - name: 调整订阅词
+    code: change_subscribe
+    mongo_table: publicapply_logs
+    rule:
+      url: "/publicapply/subscribe/setUserInfo"

+ 105 - 30
urlStatic/job/job.go

@@ -10,27 +10,31 @@ import (
 	"regexp"
 	"strings"
 	"time"
+	"workTasks/common"
 	"workTasks/common/match"
 	"workTasks/urlStatic/clickIterSource"
 )
 
 type (
-	UserId   string
-	UUid     string
-	MatchObj struct {
+	BaseUserId int64
+	UUid       string
+	MatchObj   struct {
 		urlMapping      map[string][]*matchItem
-		result          map[UUid]map[UserId]int64 //统计计算次数
+		result          map[UUid]map[BaseUserId]int64 //统计计算次数
 		uuidCodeMapping map[UUid]string
 		matchObj        *match.TrieNode
+		MongoTableQuery map[string]bool
+		UserMap         map[string]BaseUserId
 	}
 	matchItem struct {
-		UUid UUid
-		Name string
-		Code string
-		Rule map[string]interface{}
+		UUid       UUid
+		Name       string
+		Code       string
+		MongoTable string
+		Rule       map[string]interface{}
 	}
 	dbStruct struct {
-		UserId string    `json:"userId"`
+		UserId int64     `json:"userId"`
 		Code   string    `json:"code"`
 		Num    int64     `json:"num"`
 		Date   time.Time `json:"date"`
@@ -39,18 +43,41 @@ type (
 
 var re = regexp.MustCompile(`\[[^\]]*\]`)
 
+var getUserMapping = func(ctx context.Context) map[string]BaseUserId {
+	data, err := g.DB().Query(ctx, "SELECT mgoUserId,positionId,baseUserId FROM dwd_mgo_position")
+	if err != nil {
+		g.Log().Panic(ctx, err)
+	}
+	var (
+		newMapping = map[string]BaseUserId{}
+	)
+	for _, m := range data.List() {
+		var (
+			mgoUserId  = gconv.String(m["mgoUserId"])
+			positionId = gconv.String(m["positionId"])
+			baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
+		)
+		newMapping[mgoUserId] = baseUserId
+		newMapping[positionId] = baseUserId
+
+	}
+	return newMapping
+}
+
 func NewMatchObj(ctx context.Context) *MatchObj {
 	var (
 		urlMapping      = map[string][]*matchItem{}
 		treeMatch       = &match.TrieNode{}
 		uuidCodeMapping = map[UUid]string{}
-		result          = map[UUid]map[UserId]int64{}
+		result          = map[UUid]map[BaseUserId]int64{}
+		mongoTableQuery = map[string]bool{}
 	)
 	for _, mObj := range g.Cfg().MustGet(ctx, "match").Maps() {
 		var (
-			name = gconv.String(mObj["name"])
-			code = gconv.String(mObj["code"])
-			rule = gconv.Map(mObj["rule"])
+			name       = gconv.String(mObj["name"])
+			code       = gconv.String(mObj["code"])
+			mongoTable = gconv.String(mObj["mongo_table"])
+			rule       = gconv.Map(mObj["rule"])
 
 			urlArr       []string
 			newMatchItem []*matchItem
@@ -58,6 +85,9 @@ func NewMatchObj(ctx context.Context) *MatchObj {
 		for _, s := range gconv.Strings(rule["url"]) {
 			urlArr = append(urlArr, s)
 		}
+		if mongoTable != "" {
+			mongoTableQuery[mongoTable] = true
+		}
 
 		arr := re.FindAllStringSubmatch(code, -1)
 		if len(arr) > 0 {
@@ -77,10 +107,11 @@ func NewMatchObj(ctx context.Context) *MatchObj {
 
 					uuidCodeMapping[uuid] = finalCode
 					newMatchItem = append(newMatchItem, &matchItem{
-						UUid: uuid,
-						Name: name,
-						Code: strings.ReplaceAll(code, rep, val),
-						Rule: ruleItem,
+						UUid:       uuid,
+						Name:       name,
+						Code:       strings.ReplaceAll(code, rep, val),
+						MongoTable: mongoTable,
+						Rule:       ruleItem,
 					})
 				}
 			}
@@ -88,10 +119,11 @@ func NewMatchObj(ctx context.Context) *MatchObj {
 			uuid := UUid(uuid2.New())
 			uuidCodeMapping[uuid] = code
 			newMatchItem = append(newMatchItem, &matchItem{
-				UUid: uuid,
-				Name: name,
-				Code: code,
-				Rule: rule,
+				UUid:       uuid,
+				Name:       name,
+				Code:       code,
+				MongoTable: mongoTable,
+				Rule:       rule,
 			})
 		}
 
@@ -100,26 +132,37 @@ func NewMatchObj(ctx context.Context) *MatchObj {
 				if uStr != "" {
 					treeMatch.Insert(uStr)
 				}
-				urlMapping[uStr] = newMatchItem
+				if _, ok := urlMapping[uStr]; ok {
+					urlMapping[uStr] = append(urlMapping[""], newMatchItem...)
+				} else {
+					urlMapping[uStr] = newMatchItem
+				}
 			}
 		} else {
-			urlMapping[""] = newMatchItem
+			if _, ok := urlMapping[""]; ok {
+				urlMapping[""] = append(urlMapping[""], newMatchItem...)
+			} else {
+				urlMapping[""] = newMatchItem
+			}
 		}
 
 	}
 
 	for uid, _ := range uuidCodeMapping {
-		result[uid] = make(map[UserId]int64)
+		result[uid] = make(map[BaseUserId]int64)
 	}
 	return &MatchObj{
 		matchObj:        treeMatch,
 		urlMapping:      urlMapping,
 		result:          result,
 		uuidCodeMapping: uuidCodeMapping,
+		MongoTableQuery: mongoTableQuery,
+		UserMap:         getUserMapping(ctx),
 	}
 }
 
 func (o *MatchObj) Match(ctx context.Context, start, end time.Time) error {
+	//便利dwd_f_personnel_behavior表
 	rows, err := clickIterSource.Ch_analysis.Query(ctx, "SELECT date,url,user_id,mini_program_code,action_id,breaker_name,page_id FROM dwd_f_personnel_behavior WHERE user_id!='' AND date>=? and date<? ", start.Format(time.DateTime), end.Format(time.DateTime))
 	if err != nil {
 		return errors.Wrap(err, "加载日志数据异常")
@@ -137,6 +180,9 @@ func (o *MatchObj) Match(ctx context.Context, start, end time.Time) error {
 		}
 		for _, str := range append(o.matchObj.FindWords(url), "") {
 			for _, item := range o.urlMapping[str] {
+				if item.MongoTable != "" {
+					continue
+				}
 				var isValid = func() bool {
 					for key, val := range item.Rule {
 						if key == "url" {
@@ -164,10 +210,39 @@ func (o *MatchObj) Match(ctx context.Context, start, end time.Time) error {
 					return true
 				}()
 				if isValid {
-					if _, ok := o.result[item.UUid][UserId(user_id)]; ok {
-						o.result[item.UUid][UserId(user_id)]++
-					} else {
-						o.result[item.UUid][UserId(user_id)] = 1
+					if baseUserId, ok := o.UserMap[user_id]; ok {
+						if _, ok := o.result[item.UUid][baseUserId]; ok {
+							o.result[item.UUid][baseUserId]++
+						} else {
+							o.result[item.UUid][baseUserId] = 1
+						}
+					}
+				}
+			}
+		}
+	}
+	//便利后段数据库
+	sess := common.MG.DB("log").GetMgoConn()
+	defer common.MG.DB("log").DestoryMongoConn(sess)
+	for table, _ := range o.MongoTableQuery {
+		it := sess.DB("qfw").C(table).Find(g.Map{"date": g.Map{"$gte": start.Unix(), "$lt": end.Unix()}}).Select(g.Map{"userid": 1, "url": 1}).Iter()
+		for m := make(map[string]interface{}); it.Next(&m); {
+			var (
+				userId = gconv.String(m["userid"])
+				urlStr = gconv.String(m["url"])
+			)
+
+			for _, str := range o.matchObj.FindWords(urlStr) {
+				for _, item := range o.urlMapping[str] {
+					if item.MongoTable == "" {
+						continue
+					}
+					if baseUserId, ok := o.UserMap[userId]; ok {
+						if _, ok := o.result[item.UUid][baseUserId]; ok {
+							o.result[item.UUid][baseUserId]++
+						} else {
+							o.result[item.UUid][baseUserId] = 1
+						}
 					}
 				}
 			}
@@ -179,7 +254,7 @@ func (o *MatchObj) Match(ctx context.Context, start, end time.Time) error {
 func compareValue(val string, setting interface{}) bool {
 	if v, ok := setting.(string); ok {
 		return v == val
-	} else if v, ok := setting.([]string); ok {
+	} else if v, ok := setting.([]interface{}); ok {
 		for _, s := range v {
 			if s == val {
 				return true
@@ -208,7 +283,7 @@ func (o *MatchObj) Save(ctx context.Context, data time.Time) error {
 	for uuid, mData := range o.result {
 		for userId, num := range mData {
 			r = append(r, &dbStruct{
-				UserId: string(userId),
+				UserId: int64(userId),
 				Code:   o.uuidCodeMapping[uuid],
 				Num:    num,
 				Date:   data,

+ 5 - 0
userSign/main.go

@@ -63,6 +63,7 @@ func runOnce(ctx context.Context) {
 	}
 
 	// 日志标签
+	g.Log().Infof(ctx, "日志标签")
 	logRes, logErr := manager.GetAnalysisLogRes(ctx, nowTime)
 	if logErr != nil {
 		g.Log().Errorf(ctx, "日志标签异常%v", logErr)
@@ -72,6 +73,7 @@ func runOnce(ctx context.Context) {
 	}
 
 	// 后端接口日志分析
+	g.Log().Infof(ctx, "后端接口日志分析")
 	backLogsRes, backLogsErr := manager.GetBackLogsTagsData(ctx, nowTime)
 	if backLogsErr != nil {
 		g.Log().Errorf(ctx, "接口请求日志分析异常%v", backLogsErr)
@@ -81,6 +83,7 @@ func runOnce(ctx context.Context) {
 	}
 
 	// 电销标签
+	g.Log().Infof(ctx, "电销标签")
 	telemarketingRes, telemarketingErr := manager.GetTelemarketingRes(ctx, nowTime)
 	if telemarketingErr != nil {
 		g.Log().Errorf(ctx, "电销标签异常%v", telemarketingErr)
@@ -90,6 +93,7 @@ func runOnce(ctx context.Context) {
 	}
 
 	// 埋点数据分析
+	g.Log().Infof(ctx, "埋点数据分析")
 	buryPointRes, buryPointErr := manager.GetBuryPointRes(ctx, nowTime)
 	if buryPointErr != nil {
 		g.Log().Errorf(ctx, "埋点数据分析异常%v", buryPointErr)
@@ -99,6 +103,7 @@ func runOnce(ctx context.Context) {
 	}
 
 	// 留资数据
+	g.Log().Infof(ctx, "留资数据")
 	saleLeadsRes, saleLeadsErr := manager.GetSaleLeadsData(ctx, nowTime)
 	if saleLeadsErr != nil {
 		g.Log().Errorf(ctx, "留资数据分析异常%v", saleLeadsErr)

+ 24 - 0
userSign/new.sql

@@ -158,4 +158,28 @@ INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, creat
 INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2233, '购买1季超级订阅用户', 'has_3m_vip_order',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2233);
 INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2234, '购买1年超级订阅用户', 'has_12m_vip_order',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2234);
 
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2235, '近7天进入数据流量包购买页', 'visit_buypage_dataPack_7_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2235);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2236, '近45天进入数据流量包购买页', 'visit_buypage_dataPack_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2236);
+
+
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2237, '近45天进入采购单位画像包购买页', 'visit_buypage_buyer_portrait_package_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2237);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2238, '近45天进入业主采购分析报告下载包购买页', 'visit_buypage_buyer_report_package_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2238);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2239, '近45天进入企业中标分析报告下载包购买页', 'visit_buypage_winner_report_package_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2239);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2240, '近45天进入市场分析定制报告下载包购买页', 'visit_buypage_market_report_package_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2240);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2241, '近45天进入投标企业信用报告购买页', 'visit_buypage_ent_credit_report_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2241);
+
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2242, '近45天点击下载投标企业信用报告的用户', 'download_ent_credit_report_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2241);
+
+
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2243, '近7天进入大会员购买页', 'visit_landing_member_7_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2243);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2244, '近45天进入大会员购买页', 'visit_landing_member_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2243);
+
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2244, '近7天访问数据导出页面', 'visit_dataexport_7_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2244);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2245, '近45天访问数据导出页面', 'visit_dataexport_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2245);
+
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2246, '近7天进入数据导出购买页', 'visit_buypage_dataexport_7_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2246);
+INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, created_by, bit_num) VALUES(2247, '近45天进入数据导出购买页', 'visit_buypage_dataexport_45_day',bitmapBuild([toUInt64(0)]) , 2, '2025-06-17 00:00:00', 'wky', 2247);
+
+
+
 

+ 1 - 1
userSign/userAnalysis/backLogs.go

@@ -96,7 +96,7 @@ func (ua *UserAnalysis) bigMemberLog(ctx context.Context, t time.Time) ([]*Analy
 	sess := common.MG.DB("log").GetMgoConn()
 	defer common.MG.DB("log").DestoryMongoConn(sess)
 	nowunix := t.Unix()
-	it := sess.DB("qfw").C("bigmember_logs").Find(g.Map{"date": g.Map{"$gte": t.AddDate(0, 0, -45).Unix()}}).Select(g.Map{"userid": 1, "url": 1, "date": 1}).Iter()
+	it := sess.DB("qfw").C("bigmember_logs").Find(g.Map{"date": g.Map{"$gte": t.AddDate(0, 0, -7).Unix()}}).Select(g.Map{"userid": 1, "url": 1, "date": 1}).Iter()
 	for m := make(map[string]interface{}); it.Next(&m); {
 		var (
 			userId  = gconv.String(m["userid"])

+ 108 - 276
userSign/userAnalysis/jobFrontLogs.go

@@ -10,13 +10,103 @@ import (
 	"workTasks/userSign/match"
 )
 
+type visitParam struct {
+	Code       string
+	BitmapCode string
+	St, Et     time.Time
+	Limit      int
+	Desc       string
+}
+
 // 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)
+	for _, item := range []*visitParam{
+		{"buy_page_vip", "visit_buypage_vip_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入超级订阅购买页"},
+		{"buy_page_vip", "visit_buypage_vip_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入超级订阅购买页"},
+
+		{"buy_page_member", "visit_buypage_member_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入大会员购买页"},
+		{"buy_page_member", "visit_buypage_member_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入大会员购买页"},
+		{"buy_page_member", "visit_buypage_member_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天进入大会员购买页"},
+
+		{"landing_page_member", "visit_landing_member_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近45天进入大会员购买页"},
+		{"landing_page_member", "visit_landing_member_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天进入大会员购买页"},
+
+		{"buy_area_pack", "visit_buypage_areavip_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入省份订阅包购买页"},
+		{"buy_area_pack", "visit_buypage_areavip_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入省份订阅包购买页"},
+
+		{"data_export_page", "visit_dataexport_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天访问数据导出页面"},
+		{"data_export_page", "visit_dataexport_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天访问数据导出页面"},
+
+		{"buy_data_export", "visit_buypage_dataexport_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入数据导出购买页"},
+		{"buy_data_export", "visit_buypage_dataexport_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天进入数据导出购买页"},
+
+		{"buy_page_data_pack", "visit_buypage_dataPack_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近7天进入数据流量包购买页"},
+		{"buy_page_data_pack", "visit_buypage_dataPack_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近45天进入数据流量包购买页"},
+
+		{"buy_page_buyer_report", "visit_buypage_buyer_report_package_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入业主采购分析报告下载包购买页"},
+		{"buy_page_buyer_report", "visit_buypage_buyer_report_package_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入业主采购分析报告下载包购买页"},
+		{"buy_page_buyer_report", "visit_buypage_buyer_report_package_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天进入业主采购分析报告下载包购买页"},
+
+		{"buy_page_winner_report", "visit_buypage_winner_report_package_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入企业中标分析报告下载包购买页"},
+		{"buy_page_winner_report", "visit_buypage_winner_report_package_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入企业中标分析报告下载包购买页"},
+		{"buy_page_winner_report", "visit_buypage_winner_report_package_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天进入企业中标分析报告下载包购买页"},
+
+		{"buy_page_market_report", "visit_buypage_market_report_package_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入市场分析定制报告下载包购买页"},
+		{"buy_page_market_report", "visit_buypage_market_report_package_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入市场分析定制报告下载包购买页"},
+		{"buy_page_market_report", "visit_buypage_market_report_package_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天进入市场分析定制报告下载包购买页"},
+
+		{"buy_page_buyer_portrait_package", "visit_buypage_buyer_portrait_package_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入采购单位画像包购买页"},
+		{"buy_page_buyer_portrait_package", "visit_buypage_buyer_portrait_package_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入采购单位画像包购买页"},
+		{"buy_page_buyer_portrait_package", "visit_buypage_buyer_portrait_package_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天进入采购单位画像包购买页"},
+
+		{"buy_page_attach_package", "visit_buypage_attach_package_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入附件下载包购买页"},
+		{"buy_page_attach_package", "visit_buypage_attach_package_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入附件下载包购买页"},
+
+		{"buy_page_ent_credit_report", "visit_buypage_ent_credit_report_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入投标企业信用报告购买页"},
+		{"buy_page_ent_credit_report", "visit_buypage_ent_credit_report_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入投标企业信用报告购买页"},
+		{"buy_page_ent_credit_report", "visit_buypage_ent_credit_report_45_day", runTime.AddDate(0, 0, -7), runTime, 0, "近45天进入投标企业信用报告购买页"},
+
+		{"buy_page_applet_wy", "visit_buypage_applet_wy_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入物业碎片化小程序购买页"},
+		{"buy_page_applet_wy", "visit_buypage_applet_wy_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入物业碎片化小程序购买页"},
+
+		{"buy_page_applet_clzl", "visit_buypage_applet_clzl_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入车辆租赁碎片化小程序购买页"},
+		{"buy_page_applet_clzl", "visit_buypage_applet_clzl_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入车辆租赁碎片化小程序购买页"},
+
+		{"buy_page_applet_ywsj", "visit_buypage_applet_ywsj_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入印务碎片化小程序购买页"},
+		{"buy_page_applet_ywsj", "visit_buypage_applet_ywsj_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入印务碎片化小程序购买页"},
+
+		{"buy_page_applet_hjcg", "visit_buypage_applet_hjcg_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入环境碎片化小程序购买页"},
+		{"buy_page_applet_hjcg", "visit_buypage_applet_hjcg_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入环境碎片化小程序购买页"},
+
+		{"buy_page_applet_af", "visit_buypage_applet_af_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入安防碎片化小程序购买页"},
+		{"buy_page_applet_af", "visit_buypage_applet_af_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入安防碎片化小程序购买页"},
+
+		{"buy_page_applet_gcsjzx", "visit_buypage_applet_gcsjzx_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入投招服工程设计咨询碎片化小程序购买页"},
+		{"buy_page_applet_gcsjzx", "visit_buypage_applet_gcsjzx_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入投招服工程设计咨询碎片化小程序购买页"},
+
+		{"buy_page_applet_fw", "visit_buypage_applet_fw_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入法务碎片化小程序购买页"},
+		{"buy_page_applet_fw", "visit_buypage_applet_fw_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入法务碎片化小程序购买页"},
+
+		{"buy_page_applet_bx", "visit_buypage_applet_bx_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入保服碎片化小程序购买页"},
+		{"buy_page_applet_bx", "visit_buypage_applet_bx_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入保服碎片化小程序购买页"},
+
+		{"buy_page_applet_cwsj", "visit_buypage_applet_cwsj_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入招服财审碎片化小程序购买页"},
+		{"buy_page_applet_cwsj", "visit_buypage_applet_cwsj_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入招服财审碎片化小程序购买页"},
+
+		{"buy_page_applet_zbdl", "visit_buypage_applet_zbdl_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入招服代理服务碎片化小程序购买页"},
+		{"buy_page_applet_zbdl", "visit_buypage_applet_zbdl_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入招服代理服务碎片化小程序购买页"},
+
+		{"buy_page_applet_glzx", "visit_buypage_applet_glzx_1_day", runTime.AddDate(0, 0, -1), runTime, 0, "近1天进入招服管理咨询碎片化小程序购买页"},
+		{"buy_page_applet_glzx", "visit_buypage_applet_glzx_7_day", runTime.AddDate(0, 0, -7), runTime, 0, "近7天进入招服管理咨询碎片化小程序购买页"},
+
+		{"download_ent_credit_report", "download_ent_credit_report_45_day", runTime.AddDate(0, 0, -45), runTime, 0, "近45天点击下载投标企业信用报告的用户"},
+
+		{"content_click_share", "buryPoint_share_7_day_gte2", runTime.AddDate(0, 0, -7), runTime, 1, "近7天高频分享大于1次"},
+	} {
+		if res := ua.getVisitStatic(ctx, item); res != nil {
+			fData = append(fData, res)
 		}
 	}
 
@@ -29,37 +119,9 @@ func (ua *UserAnalysis) GetBuryPointRes(ctx context.Context, runTime time.Time)
 		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 action_id='c_jy_open_page' and `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 (
@@ -103,253 +165,23 @@ type (
 	}
 )
 
-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", "/jy_mobile/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", "/jy_mobile/order/create/buyerpack"},
-		},
-		"visit_buypage_attach_package": &countObj{
-			Seven:   map[BaseUserId]int{},
-			One:     map[BaseUserId]int{},
-			LoadUrl: []string{"/jy_mobile/common/order/create/filepack", "/swordfish/page_big_pc/order/file-pack", "/jy_mobile/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.mappingData = map[string]*countObj{}
-	for key, obj := range rData.fullData {
-		rData.matchObj.Insert(obj.LoadUrl...)
-		rData.mappingData[key] = obj
-		for _, s := range obj.LoadUrl {
-			if s != "pages/order/create/index" {
-				rData.mappingData[s] = obj
-			}
-		}
-	}
-	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.mappingData[matchUrl]
-		if ok && obj != nil {
-			obj.Seven[uid]++
-			if insertOne {
-				obj.One[uid]++
-			}
-			return
-		}
-
-		//小程序
-		if matchUrl == "pages/order/create/index" {
-			if miniObj, miniOk := cv.mappingData[fmt.Sprintf("visit_buypage_applet_%s", miniCode)]; miniOk && miniObj != nil {
-				miniObj.Seven[uid]++
-				if insertOne {
-					miniObj.One[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次
+func (ua *UserAnalysis) getVisitStatic(ctx context.Context, vp *visitParam) *AnalysisRes {
+	res, err := g.DB().Query(ctx, "SELECT userId,SUM(num) as total FROM dwd_d_visit WHERE code=? and date>=? and date<=?", vp.Code, vp.St.Format("2006-01-02"), vp.Et.Format("2006-01-02"))
 	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 action_id='c_jy_open_page' and  user_id !='' and  and `date` > ? ", t.AddDate(0, 0, -7).Format(time.DateTime))
 	if err != nil {
-		return nil, errors.Wrap(err, "查询超级订阅购买页访问数据异常")
-	}
-	var c int
-	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)
+		g.Log().Errorf(ctx, "<getVisitStatic.Query> err %v", err)
+	} else {
+		for _, m := range res.List() {
+			var (
+				userId = gconv.String(m["userId"])
+				total  = gconv.Int(m["total"])
+			)
+			if vp.Limit <= 0 || (vp.Limit > 0 && total > vp.Limit) {
+				if v, ok := ua.UserMapping[userId]; ok {
+					sevenData[v] = true
+				}
+			}
 		}
-		c++
 	}
-	g.Log().Infof(ctx, "<UserAnalysis.visitBuyPageRes> %d", c)
-	return visitStatic.getAnalysisRes(), nil
+	return &AnalysisRes{fmt.Sprintf("getVisitStatic-%s", vp.BitmapCode), vp.BitmapCode, sevenData, false}
 }