wkyuer 1 month ago
parent
commit
ffbf2391f6

+ 2 - 1
userSign/main.go

@@ -59,7 +59,8 @@ func runOnce(ctx context.Context) {
 		allRes = append(allRes, res...)
 	}
 	var (
-		nowTime = time.Now()
+		now     = time.Now()
+		nowTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
 	)
 	// 日志标签
 	logRes, logErr := manager.GetAnalysisLogRes(ctx, nowTime)

+ 11 - 1
userSign/new.sql

@@ -128,4 +128,14 @@ INSERT INTO pub_tags.dwd_d_tag (id, name,code,bitobj, groupid, created_at, creat
 
 INSERT INTO pub_tags.dwd_d_tag (id, code, name, bitobj, groupid, created_at, created_by, bit_num) VALUES(2184, 'click_saleLeads_gte_3_1day', '近1天点击平台产品留资弹窗>=3次',bitmapBuild([toUInt64(0)]) , 2, '2025-03-25 00:00:00', 'wky', 2184);
 INSERT INTO pub_tags.dwd_d_tag (id, code, name, bitobj, groupid, created_at, created_by, bit_num) VALUES(2185, 'telemarketing_follow_30_day', '近30天内有销售人员创建跟进记',bitmapBuild([toUInt64(0)]) , 2, '2025-03-25 00:00:00', 'wky', 2185);
-INSERT INTO pub_tags.dwd_d_tag (id, code, name, bitobj, groupid, created_at, created_by, bit_num) VALUES(2186, 'telemarketing_listen_30_day', '近30天内有销售人员接听记录',bitmapBuild([toUInt64(0)]) , 2, '2025-03-25 00:00:00', 'wky', 2186);
+INSERT INTO pub_tags.dwd_d_tag (id, code, name, bitobj, groupid, created_at, created_by, bit_num) VALUES(2186, 'telemarketing_listen_30_day', '近30天内有销售人员接听记录',bitmapBuild([toUInt64(0)]) , 2, '2025-03-25 00:00:00', 'wky', 2186);
+
+
+
+
+INSERT INTO pub_tags.dwd_d_tag (id, code, name, bitobj, groupid, created_at, created_by, bit_num) VALUES(2200, 'activeDay_gte3day_7day', '7天活跃用户天数大于3天',bitmapBuild([toUInt64(0)]) , 2, '2025-6-17 00:00:00', 'wky', 2200);
+INSERT INTO pub_tags.dwd_d_tag (id, code, name, bitobj, groupid, created_at, created_by, bit_num) VALUES(2021, 'telemarketing_follow_gte2_7day', '近7天销售跟进≥2次',bitmapBuild([toUInt64(0)]) , 2, '2025-6-17 00:00:00', 'wky', 2021);
+INSERT INTO pub_tags.dwd_d_tag (id, code, name, bitobj, groupid, created_at, created_by, bit_num) VALUES(2022, 'search_gte3_7day', '近7天搜索次数≥3次',bitmapBuild([toUInt64(0)]) , 2, '2025-6-17 00:00:00', 'wky', 2022);
+
+
+

+ 46 - 12
userSign/userAnalysis/analysisLogsAnalysis.go

@@ -30,7 +30,9 @@ func (ua *UserAnalysis) GetAnalysisLogRes(ctx context.Context, runTime time.Time
 	//标讯详情页访问
 	if res, err := ua.ArticleVisit(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
 		returnData = append(returnData, res...)
-		//returnData = append(returnData, &AnalysisRes{Name: fmt.Sprintf("%d天内访问详情页次数%s", param.Day, param.Compare), Code: fmt.Sprintf("%dday_article_gt_%d", param.Day, param.Compare), Data: res})
+	}
+	if res, err := ua.SearchVisit(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
+		returnData = append(returnData, res...)
 	}
 	//标讯详情页访问
 	if res, err := ua.ArticleVisit1Day(ctx, runTime.AddDate(0, 0, -1)); err == nil && len(res) > 0 {
@@ -41,6 +43,9 @@ func (ua *UserAnalysis) GetAnalysisLogRes(ctx context.Context, runTime time.Time
 	if res, err := ua.Visited(ctx, runTime.AddDate(0, 0, -7)); err == nil && len(res) > 0 {
 		returnData = append(returnData, &AnalysisRes{Name: "访问过剑鱼产品", Code: "visited", Data: res, SaveOldData: true})
 	}
+
+	//活跃天数
+
 	return returnData, nil
 }
 
@@ -67,21 +72,28 @@ func (ua *UserAnalysis) ActiveUserLoad(ctx context.Context, start time.Time, sou
 	return activeUser, nil
 }
 
-// UnActiveUserLoad 未活跃用户
-func (ua *UserAnalysis) UnActiveUserLoad(ctx context.Context, start time.Time) (map[BaseUserId]bool, error) {
-	rPc, err := g.DB().Query(ctx, `SELECT DISTINCT(dmp.baseUserId) as baseUserId1 FROM dwd_mgo_position dmp
-	left join (	SELECT DISTINCT(baseUserId) as baseUserId
-	FROM user_log_byHour ulbh
-	WHERE create_time > ? ) ulog  on  dmp.baseUserId =ulog.baseUserId where ulog.baseUserId=0`, start.Format(time.DateTime))
+func (ua *UserAnalysis) ActiveDayNum(ctx context.Context, runTime time.Time, day, actDayNum int) ([]*AnalysisRes, error) {
+	rPc, err := g.DB().Query(ctx, `SELECT baseUserId,COUNT(DISTINCT toDate(create_time)) AS acDayNum
+			FROM 
+				pub_tags.user_log_byHour
+			WHERE 
+				create_time >= ?
+			GROUP BY 
+				baseUserId
+			having   acDayNum >=?`, runTime.AddDate(0, 0, -day).Format(time.DateTime), actDayNum)
 	if err != nil {
-		return nil, err
+		g.Log().Errorf(ctx, "UserAnalysis.ActiveDayNum")
 	}
-	unActiveUser := map[BaseUserId]bool{}
+	var m1 = map[BaseUserId]bool{}
 	for _, m := range rPc.List() {
-		// 插入pc30天活跃用户
-		unActiveUser[BaseUserId(gconv.Int64(m["baseUserId1"]))] = true
+		var baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
+		if baseUserId > 0 {
+			m1[baseUserId] = true
+		}
 	}
-	return unActiveUser, nil
+	return []*AnalysisRes{
+		{"近7天活跃天数≥3次", "activeDay_gte3day_7day", m1, false},
+	}, nil
 }
 
 // ArticleVisit 指定时间内访问详情页数量大于num次的用户
@@ -128,6 +140,28 @@ func (ua *UserAnalysis) ArticleVisit(ctx context.Context, start time.Time) ([]*A
 	}, nil
 }
 
+func (ua *UserAnalysis) SearchVisit(ctx context.Context, start time.Time) ([]*AnalysisRes, error) {
+	var (
+		d1 = map[BaseUserId]bool{}
+	)
+
+	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))
+	if err != nil {
+		return nil, err
+	}
+	for _, m := range rPc.List() {
+		var (
+			baseUserId = BaseUserId(gconv.Int64(m["baseUserId"]))
+		)
+		if baseUserId <= 0 {
+			continue
+		}
+		d1[baseUserId] = true
+	}
+	return []*AnalysisRes{
+		{"7天内访问详情页次数>5", "7day_article_gt_5", d1, false},
+	}, nil
+}
 func (ua *UserAnalysis) ArticleVisit1Day(ctx context.Context, start time.Time) ([]*AnalysisRes, error) {
 	var (
 		d0 = map[BaseUserId]bool{}

+ 80 - 74
userSign/userAnalysis/telemarketing.go

@@ -2,7 +2,6 @@ package userAnalysis
 
 import (
 	"context"
-	"github.com/gogf/gf/v2/errors/gerror"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/util/gconv"
 	"time"
@@ -17,48 +16,35 @@ type jyTelemarketing struct {
 	HasEffectiveCall30Day    map[BaseUserId]bool // 30天有效通话时长
 }
 
-func (ua *UserAnalysis) GetTelemarketingRes(ctx context.Context, t time.Time) ([]*AnalysisRes, error) {
-	jyT := &jyTelemarketing{
-		Intended30Day:     map[BaseUserId]bool{}, // 近30天电销意向客户
-		HighIntended30Day: map[BaseUserId]bool{}, // 近30天电销高意向客户
-		BeSigned30Day:     map[BaseUserId]bool{}, // 近30天电销待签署客户
-		Follow7Day:        map[BaseUserId]bool{}, // 近7天内有销售人员创建跟进记录
-		Listen7Day:        map[BaseUserId]bool{}, // 近7天内无销售人员接听记录
-		Follow30Day:       map[BaseUserId]bool{}, // 近30天内有销售人员创建跟进记录
-		Listen30Day:       map[BaseUserId]bool{}, // 近30天内无销售人员接听记录
-		//近30天电销有效通话大于60秒
-		HasEffectiveCall30Day: map[BaseUserId]bool{}, // 30天有效通话时长
+func (ua *UserAnalysis) GetTelemarketingRes(ctx context.Context, t time.Time) (fData []*AnalysisRes, err error) {
+	telemarketingRes := ua.initTelemarketingIntended(ctx, t.AddDate(0, 0, -30))
+	for _, datum := range telemarketingRes {
+		fData = append(fData, datum)
 	}
-	if err := ua.initTelemarketingIntended(ctx, jyT, t.AddDate(0, 0, -30)); err != nil {
-		g.Log().Error(ctx, "init telemarketing intended failed", err)
-	}
-	//if err := ua.initFollowListen(ctx, jyT, t.AddDate(0, 0, -7)); err != nil {
-	//	g.Log().Errorf(ctx, "init follow listen err:%v", err)
-	//}
-	if err := ua.initFollowListen(ctx, jyT, t); err != nil {
-		g.Log().Errorf(ctx, "init follow listen err:%v", err)
+
+	followRes := ua.initFollowListen(ctx, t)
+	for _, datum := range followRes {
+		fData = append(fData, datum)
 	}
+
 	//有效通话时长
-	if err := ua.initHasEffectiveCall(ctx, jyT, t.AddDate(0, 0, -30)); err != nil {
-		g.Log().Errorf(ctx, "init hasEffectiveCall err:%v", err)
+	hasEffectiveCallRes := ua.initHasEffectiveCall(ctx, t.AddDate(0, 0, -30))
+	for _, datum := range hasEffectiveCallRes {
+		fData = append(fData, datum)
 	}
-	return []*AnalysisRes{
-		{"近30天电销意向客户", "telemarketing_intended_30_day", jyT.Intended30Day, false},
-		{"近30天电销高意向客户", "telemarketing_highIntended_30_day", jyT.HighIntended30Day, false},
-		{"近30天电销待签署客户", "telemarketing_beSigned_30_day", jyT.BeSigned30Day, false},
-		{"近7天内有销售人员创建跟进记录", "telemarketing_follow_7_day", jyT.Follow7Day, false},
-		{"近7天内无销售人员接听记录", "telemarketing_listen_7_day", jyT.Listen7Day, false},
-		{"近30天内有销售人员创建跟进记录", "telemarketing_follow_30_day", jyT.Follow30Day, false},
-		{"近30天内无销售人员接听记录", "telemarketing_listen_30_day", jyT.Listen30Day, false},
-		{"近30天电销有效通话", "telemarketing_hasCall_30_day", jyT.HasEffectiveCall30Day, false},
-	}, nil
+	return fData, nil
 }
 
-func (ua *UserAnalysis) initTelemarketingIntended(ctx context.Context, jyT *jyTelemarketing, t time.Time) (err error) {
+func (ua *UserAnalysis) initTelemarketingIntended(ctx context.Context, t time.Time) []*AnalysisRes {
 	res, err := g.DB("subjectdb").Query(ctx, "SELECT clue_id,new_value FROM dwd_f_crm_clue_change_record WHERE position_id!=-1 AND change_type='基本信息变更' AND new_value in ('意向客户','高意向客户','待签署客户') AND createtime >? ", t.Format(time.DateTime))
 	if err != nil {
-		return err
+		return nil
 	}
+	var (
+		intended30Day     = map[BaseUserId]bool{}
+		highIntended30Day = map[BaseUserId]bool{}
+		beSigned30Day     = map[BaseUserId]bool{}
+	)
 	for _, m := range res.List() {
 		var (
 			//position_id = gconv.String(m["position_id"])
@@ -68,64 +54,81 @@ func (ua *UserAnalysis) initTelemarketingIntended(ctx context.Context, jyT *jyTe
 		if baseUserId, ok := ua.TelemarketingBaseUserMap[clue_id]; ok {
 			switch new_value {
 			case "意向客户":
-				jyT.Intended30Day[baseUserId] = true
+				intended30Day[baseUserId] = true
 			case "高意向客户":
-				jyT.HighIntended30Day[baseUserId] = true
+				highIntended30Day[baseUserId] = true
 			case "待签署客户":
-				jyT.BeSigned30Day[baseUserId] = true
+				beSigned30Day[baseUserId] = true
 			}
 		}
 	}
-	return
+	return []*AnalysisRes{
+		{"近30天电销意向客户", "telemarketing_intended_30_day", intended30Day, false},
+		{"近30天电销高意向客户", "telemarketing_highIntended_30_day", highIntended30Day, false},
+		{"近30天电销待签署客户", "telemarketing_beSigned_30_day", beSigned30Day, false}}
 }
 
-func (ua *UserAnalysis) initFollowListen(ctx context.Context, jyT *jyTelemarketing, t time.Time) (err error) {
+func (ua *UserAnalysis) initFollowListen(ctx context.Context, t time.Time) []*AnalysisRes {
 	seven := t.AddDate(0, 0, -7)
+	var (
+		numStatic      = map[BaseUserId]int64{}
+		follow30Day    = map[BaseUserId]bool{}
+		follow7Day     = map[BaseUserId]bool{}
+		follow7DayGte2 = map[BaseUserId]bool{}
+
+		listen30Day = map[BaseUserId]bool{}
+		listen7Day  = map[BaseUserId]bool{}
+	)
 	res, err := g.DB("subjectdb").Query(ctx, "SELECT uid,trail_time FROM dwd_f_crm_clue_info WHERE trail_time >? ", t.AddDate(0, 0, -30).Format(time.DateTime))
-	if err == nil {
-		for _, m := range res.List() {
-			var (
-				userId  = gconv.String(m["uid"])
-				timeStr = gconv.String(m["trail_time"])
-			)
-			if baseUserId, ok := ua.TelemarketingBaseUserMap[userId]; ok {
-				jyT.Follow30Day[baseUserId] = true
-				if t, err := time.ParseInLocation(time.DateTime, timeStr, time.Local); err == nil && t.After(seven) {
-					jyT.Follow7Day[baseUserId] = true
-				}
+	if err != nil {
+		g.Log().Errorf(ctx, "init follow listen err1:%v", err)
+	}
+	for _, m := range res.List() {
+		var (
+			userId  = gconv.String(m["uid"])
+			timeStr = gconv.String(m["trail_time"])
+		)
+		if baseUserId, ok := ua.TelemarketingBaseUserMap[userId]; ok {
+			follow30Day[baseUserId] = true
+			if t, err := time.ParseInLocation(time.DateTime, timeStr, time.Local); err == nil && t.After(seven) {
+				follow7Day[baseUserId] = true
+				numStatic[baseUserId]++
 			}
 		}
 	}
 
 	res2, err2 := g.DB("subjectdb").Query(ctx, "SELECT uid,last_begin_time FROM dwd_f_crm_clue_info WHERE last_begin_time >? ", t.AddDate(0, 0, -30).Format(time.DateTime))
-	if err2 == nil {
-		for _, m := range res2.List() {
-			var (
-				userId  = gconv.String(m["uid"])
-				timeStr = gconv.String(m["last_begin_time"])
-			)
-			if baseUserId, ok := ua.TelemarketingBaseUserMap[userId]; ok {
-				jyT.Listen30Day[baseUserId] = true
-				if t, err := time.ParseInLocation(time.DateTime, timeStr, time.Local); err == nil && t.After(seven) {
-					jyT.Listen7Day[baseUserId] = true
-				}
+	if err2 != nil {
+		g.Log().Errorf(ctx, "init follow listen err2:%v", err)
+	}
+	for _, m := range res2.List() {
+		var (
+			userId  = gconv.String(m["uid"])
+			timeStr = gconv.String(m["last_begin_time"])
+		)
+		if baseUserId, ok := ua.TelemarketingBaseUserMap[userId]; ok {
+			listen30Day[baseUserId] = true
+			if t, err := time.ParseInLocation(time.DateTime, timeStr, time.Local); err == nil && t.After(seven) {
+				listen7Day[baseUserId] = true
 			}
 		}
 	}
-	var errMsg string
-	if err != nil {
-		errMsg = err.Error()
-	}
-	if err2 != nil {
-		errMsg += err2.Error()
+	for id, i := range numStatic {
+		if i >= 2 {
+			follow7DayGte2[id] = true
+		}
 	}
-	if errMsg != "" {
-		return gerror.New(errMsg)
+	return []*AnalysisRes{
+		{"近7天内有销售人员创建跟进记录", "telemarketing_follow_7_day", follow7Day, false},
+		{"近7天内有销售人员接听记录", "telemarketing_listen_7_day", listen7Day, false},
+		{"近7天内近7天销售跟进≥2次", "telemarketing_follow_gte2_7day", follow7DayGte2, false},
+		{"近30天内有销售人员创建跟进记录", "telemarketing_follow_30_day", follow30Day, false},
+		{"近30天内无销售人员接听记录", "telemarketing_listen_30_day", listen30Day, false},
 	}
-	return nil
 }
 
-func (ua *UserAnalysis) initHasEffectiveCall(ctx context.Context, jyT *jyTelemarketing, t time.Time) (err error) {
+func (ua *UserAnalysis) initHasEffectiveCall(ctx context.Context, t time.Time) []*AnalysisRes {
+	var hasEffectiveCall30Day = map[BaseUserId]bool{}
 	res, err := g.DB("subjectdb").Query(ctx, `SELECT userid FROM dwd_f_userbase_baseinfo WHERE status=1 AND phone in (
 	SELECT phone
 	FROM (
@@ -137,15 +140,18 @@ func (ua *UserAnalysis) initHasEffectiveCall(ctx context.Context, jyT *jyTelemar
 	GROUP BY phone
 	)`, t.Format(time.DateTime), t.Format(time.DateTime))
 	if err != nil {
-		return err
+		g.Log().Errorf(ctx, "init hasEffectiveCall30Day err:%v", err)
+		return nil
 	}
 	for _, m := range res.List() {
 		var (
 			userId = gconv.String(m["userid"])
 		)
 		if baseUserId, ok := ua.UserMapping[userId]; ok {
-			jyT.HasEffectiveCall30Day[baseUserId] = true
+			hasEffectiveCall30Day[baseUserId] = true
 		}
 	}
-	return
+	return []*AnalysisRes{
+		{"近30天电销有效通话", "telemarketing_hasCall_30_day", hasEffectiveCall30Day, false},
+	}
 }