|
@@ -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},
|
|
|
+ }
|
|
|
}
|