|
@@ -0,0 +1,130 @@
|
|
|
+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"
|
|
|
+)
|
|
|
+
|
|
|
+type jyTelemarketing struct {
|
|
|
+ Intended30Day map[BaseUserId]bool // 近30天电销意向客户
|
|
|
+ HighIntended30Day map[BaseUserId]bool // 近30天电销高意向客户
|
|
|
+ BeSigned30Day map[BaseUserId]bool // 近30天电销待签署客户
|
|
|
+ Follow7Day, Listen7Day map[BaseUserId]bool
|
|
|
+ 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天内无销售人员接听记录
|
|
|
+ //近30天电销有效通话大于60秒
|
|
|
+ HasEffectiveCall30Day: map[BaseUserId]bool{}, // 30天有效通话时长
|
|
|
+ }
|
|
|
+ if err := ua.initTelemarketingIntended(ctx, jyT, t.AddDate(0, -30, 0)); err != nil {
|
|
|
+ g.Log().Error(ctx, "init telemarketing intended failed", err)
|
|
|
+ }
|
|
|
+ if err := ua.initFollowListen(ctx, jyT, t.AddDate(0, -7, 0)); err != nil {
|
|
|
+ g.Log().Errorf(ctx, "init follow listen err:%v", err)
|
|
|
+ }
|
|
|
+ //有效通话时长
|
|
|
+ if err := ua.initHasEffectiveCall(ctx, jyT, t.AddDate(0, -30, 0)); err != nil {
|
|
|
+ g.Log().Errorf(ctx, "init hasEffectiveCall err:%v", err)
|
|
|
+ }
|
|
|
+ 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_hasCall_30_day", jyT.HasEffectiveCall30Day, false},
|
|
|
+ }, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (ua *UserAnalysis) initTelemarketingIntended(ctx context.Context, jyT *jyTelemarketing, t time.Time) (err error) {
|
|
|
+ res, err := g.DB("subjectdb").Query(ctx, "SELECT position_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
|
|
|
+ }
|
|
|
+ for _, m := range res.List() {
|
|
|
+ var (
|
|
|
+ position_id = gconv.String(m["position_id"])
|
|
|
+ new_value = gconv.String(m["new_value"])
|
|
|
+ )
|
|
|
+ if baseUserId, ok := ua.UserMapping[position_id]; !ok {
|
|
|
+ switch new_value {
|
|
|
+ case "意向客户":
|
|
|
+ jyT.Intended30Day[baseUserId] = true
|
|
|
+ case "高意向客户":
|
|
|
+ jyT.HighIntended30Day[baseUserId] = true
|
|
|
+ case "待签署客户":
|
|
|
+ jyT.BeSigned30Day[baseUserId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (ua *UserAnalysis) initFollowListen(ctx context.Context, jyT *jyTelemarketing, t time.Time) (err error) {
|
|
|
+ res, err := g.DB("subjectdb").Query(ctx, "SELECT userid FROM dwd_f_crm_clue_info WHERE trail_time >? ", t.Format(time.DateTime))
|
|
|
+ if err == nil {
|
|
|
+ for _, m := range res.List() {
|
|
|
+ var (
|
|
|
+ userId = gconv.String(m["userid"])
|
|
|
+ )
|
|
|
+ if baseUserId, ok := ua.UserMapping[userId]; !ok {
|
|
|
+ jyT.Follow7Day[baseUserId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ res2, err2 := g.DB("subjectdb").Query(ctx, "SELECT userid FROM dwd_f_crm_clue_info WHERE trail_timelast_begin_time >? ", t.Format(time.DateTime))
|
|
|
+ if err2 == nil {
|
|
|
+ for _, m := range res2.List() {
|
|
|
+ var (
|
|
|
+ userId = gconv.String(m["userid"])
|
|
|
+ )
|
|
|
+ if baseUserId, ok := ua.UserMapping[userId]; !ok {
|
|
|
+ jyT.Listen7Day[baseUserId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var errMsg string
|
|
|
+ if err != nil {
|
|
|
+ errMsg = err.Error()
|
|
|
+ }
|
|
|
+ if err2 != nil {
|
|
|
+ errMsg += err2.Error()
|
|
|
+ }
|
|
|
+ return gerror.New(errMsg)
|
|
|
+}
|
|
|
+
|
|
|
+func (ua *UserAnalysis) initHasEffectiveCall(ctx context.Context, jyT *jyTelemarketing, t time.Time) (err error) {
|
|
|
+ res, err := g.DB("subjectdb").Query(ctx, `SELECT userid FROM dwd_f_crm_clue_info WHERE phone in (
|
|
|
+ SELECT phone
|
|
|
+ FROM (
|
|
|
+ SELECT DISTINCT(CallNo) AS phone FROM Call_Accounting.voice_record WHERE CallTimeLength>60 AND createTime>?
|
|
|
+ UNION ALL
|
|
|
+ SELECT DISTINCT(CalledNo) AS phone FROM Call_Accounting.voice_record WHERE CallTimeLength>60 AND createTime>?
|
|
|
+ ) AS temp
|
|
|
+ WHERE phone IS NOT NULL -- 如需保留 NULL,删除此条件
|
|
|
+ GROUP BY phone
|
|
|
+ )`, t.Format(time.DateTime), t.Format(time.DateTime))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ for _, m := range res.List() {
|
|
|
+ var (
|
|
|
+ userId = gconv.String(m["userid"])
|
|
|
+ )
|
|
|
+ if baseUserId, ok := ua.UserMapping[userId]; !ok {
|
|
|
+ jyT.HasEffectiveCall30Day[baseUserId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|