package resourceChannel import ( "encoding/json" "github.com/go-redis/redis" "golang.org/x/net/context" "strconv" "strings" "time" ) func redisCli() *redis.Client { client := redis.NewClient(&redis.Options{ Addr: coo.RedisHost, // Redis地址 Password: "", // Redis密码,默认为空 DB: 1, // 使用哪个数据库,默认为0 }) _, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) defer cancel() return client } type ResourceAssessment struct { ID uint `gorm:"primaryKey" json:"id"` // 留学评估表 DataType uint8 `json:"data_type"` // 1.网课 2.api资源 3.专题页 4.工作台录入 5.后台录入 6 小程序 ChatID string `json:"chat_id"` // 会话id Channel int `json:"channel"` // 渠道id Category int `json:"category"` // 分类id CreatedAt time.Time `json:"created_at"` // 数据创建时间 ReferPageURL string `json:"refer_page_url"` // 来源网址 URL string `json:"url"` // 落地页地址 ChatURL string `json:"chat_url"` // 对话发起页 GrUserId string `json:"gr_user_id"` // 神策distinct_id } type SemJsChatRecord struct { ChatID int64 `gorm:"column:CHAT_ID"` CreateTime time.Time `gorm:"column:CREATE_TIME"` ReferPage string `gorm:"type:text;column:REFER_PAGE"` ChatURL string `gorm:"type:text;column:CHAT_URL"` ChannleID int `gorm:"column:CHANNLE_ID"` CategoryID int `gorm:"column:CATEGORY_ID"` GrUserID string `gorm:"column:gr_user_id"` } type ChannelCategory struct { Channel int Category int } // GetChatChannel 会话渠道归因处理 func GetChatChannel(chat SemJsChatRecord) ChannelCategory { channel := 7 category := 126 if strings.Contains(chat.ChatURL, "pages") && strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[0] == "miniapp" { appType := strings.Split(strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[1], "_")[1] if appType == "baidu" { channel = 1 category = 30 } else if appType == "wechat" { channel = 8 category = 32 } } else if !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") && (strings.Contains(chat.ReferPage, "daomeng") || strings.Contains(chat.ChatURL, "daomeng")) { channel = 38 category = 201 } else if chat.ChannleID == 5 || chat.ChannleID == 7 && !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") { // redis获取渠道信息 key := "sensors:" + chat.GrUserID cc, _ := redisCli().Get(key).Result() var sensors SensorsData json.Unmarshal([]byte(cc), &sensors) if sensors.Channel > 0 { channel = sensors.Channel category = sensors.Category } else if sensors.Url == "https://www.jjl.cn/" || sensors.Url == "https://m.jjl.cn/" { channel = 7 category = 126 } else { channel = 5 category = 11 } } else { if strings.Contains(strings.ToLower(chat.ChatURL), "link") { println(chat.ChatURL) channelIDString := strings.Split(strings.Split(chat.ChatURL, "link")[1], "_")[1] categoryIDString := strings.Split(strings.Split(chat.ChatURL, "link")[1], "_")[2] channel, _ = strconv.Atoi(channelIDString) category, _ = strconv.Atoi(categoryIDString) } else if strings.Contains(strings.ToLower(chat.ReferPage), "link") { channelIDString := strings.Split(strings.Split(chat.ReferPage, "link")[1], "_")[1] categoryIDString := strings.Split(strings.Split(chat.ReferPage, "link")[1], "_")[2] channel, _ = strconv.Atoi(channelIDString) category, _ = strconv.Atoi(categoryIDString) } else if !strings.Contains(strings.ToLower(chat.ReferPage), "link") { channel = 7 category = 126 } } var channelCategory ChannelCategory channelCategory.Channel = channel channelCategory.Category = category return channelCategory } // GetChannel 表单渠道归因处理 func GetChannel(assessment ResourceAssessment) ChannelCategory { var channel int var category int if !strings.Contains(assessment.URL, "utm") && !strings.Contains(assessment.ChatURL, "utm") && !strings.Contains(assessment.ReferPageURL, "utm") && (strings.Contains(assessment.ReferPageURL, "daomeng") || strings.Contains(assessment.ChatURL, "daomeng")) { channel = 38 category = 201 } else if assessment.DataType == 1 { channel = 26 category = 121 } else if assessment.DataType == 5 || assessment.DataType == 7 { channel = assessment.Channel category = assessment.Category } else if assessment.DataType == 2 { if strings.Contains(assessment.URL, "link") { channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1]) category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[2]) } else if strings.Contains(assessment.ReferPageURL, "link") { channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1]) category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2]) } else { channel = assessment.Channel category = assessment.Category } } else if assessment.DataType == 3 || ((assessment.Channel == 5 || assessment.Channel == 7) && assessment.ChatID != "") { if !strings.Contains(assessment.URL, "utm") && !strings.Contains(assessment.ChatURL, "utm") && !strings.Contains(assessment.ReferPageURL, "utm") { key := "sensors:" + assessment.GrUserId cc, _ := redisCli().Get(key).Result() var sensors SensorsData json.Unmarshal([]byte(cc), &sensors) if sensors.Channel > 0 { channel = sensors.Channel category = sensors.Category } else if sensors.Url == "https://www.jjl.cn/" || sensors.Url == "https://m.jjl.cn/" { channel = 7 category = 126 } else { channel = 5 category = 11 } } else { if !strings.Contains(assessment.URL, "https") { assessment.URL = "https://wx.com" + assessment.URL } if !strings.Contains(assessment.ReferPageURL, "https") { assessment.ReferPageURL = "https://wx.com" + assessment.ReferPageURL } if strings.Contains(assessment.URL, "link") { channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1]) category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[2]) } else if strings.Contains(assessment.ReferPageURL, "link") { channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1]) category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2]) } else { channel = 7 category = 126 } } } else if assessment.DataType == 4 { if strings.Contains(assessment.ChatURL, "link") { channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[1]) category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[2]) } else if strings.Contains(assessment.ReferPageURL, "link") { channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1]) category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2]) } else { channel = 7 category = 126 } } if channel == 0 { channel = 5 } if category == 0 { category = 11 } var channelCategory ChannelCategory channelCategory.Channel = channel channelCategory.Category = category return channelCategory } type SensorsData struct { DistinctId string `json:"distinctID"` Channel int `json:"channel"` Category int `json:"category"` Url string `json:"url"` }