resourceChannel.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package resourceChannel
  2. import (
  3. "encoding/json"
  4. "github.com/go-redis/redis"
  5. "golang.org/x/net/context"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. func redisCli() *redis.Client {
  11. client := redis.NewClient(&redis.Options{
  12. Addr: coo.RedisHost, // Redis地址
  13. Password: "", // Redis密码,默认为空
  14. DB: 1, // 使用哪个数据库,默认为0
  15. })
  16. _, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
  17. defer cancel()
  18. return client
  19. }
  20. type ResourceAssessment struct {
  21. ID uint `gorm:"primaryKey" json:"id"` // 留学评估表
  22. DataType uint8 `json:"data_type"` // 1.网课 2.api资源 3.专题页 4.工作台录入 5.后台录入 6 小程序
  23. ChatID string `json:"chat_id"` // 会话id
  24. Channel int `json:"channel"` // 渠道id
  25. Category int `json:"category"` // 分类id
  26. CreatedAt time.Time `json:"created_at"` // 数据创建时间
  27. ReferPageURL string `json:"refer_page_url"` // 来源网址
  28. URL string `json:"url"` // 落地页地址
  29. ChatURL string `json:"chat_url"` // 对话发起页
  30. GrUserId string `json:"gr_user_id"` // 神策distinct_id
  31. }
  32. type SemJsChatRecord struct {
  33. ChatID int64 `gorm:"column:CHAT_ID"`
  34. CreateTime time.Time `gorm:"column:CREATE_TIME"`
  35. ReferPage string `gorm:"type:text;column:REFER_PAGE"`
  36. ChatURL string `gorm:"type:text;column:CHAT_URL"`
  37. ChannleID int `gorm:"column:CHANNLE_ID"`
  38. CategoryID int `gorm:"column:CATEGORY_ID"`
  39. GrUserID string `gorm:"column:gr_user_id"`
  40. }
  41. type ChannelCategory struct {
  42. Channel int
  43. Category int
  44. }
  45. // GetChatChannel 会话渠道归因处理
  46. func GetChatChannel(chat SemJsChatRecord) ChannelCategory {
  47. channel := 7
  48. category := 126
  49. if strings.Contains(chat.ChatURL, "pages") && strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[0] == "miniapp" {
  50. appType := strings.Split(strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[1], "_")[1]
  51. if appType == "baidu" {
  52. channel = 1
  53. category = 30
  54. } else if appType == "wechat" {
  55. channel = 8
  56. category = 32
  57. }
  58. } else if !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") && (strings.Contains(chat.ReferPage, "daomeng") || strings.Contains(chat.ChatURL, "daomeng")) {
  59. channel = 38
  60. category = 201
  61. } else if chat.ChannleID == 5 || chat.ChannleID == 7 && !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") {
  62. // redis获取渠道信息
  63. key := "sensors:" + chat.GrUserID
  64. cc, _ := redisCli().Get(key).Result()
  65. var sensors SensorsData
  66. json.Unmarshal([]byte(cc), &sensors)
  67. if sensors.Channel > 0 {
  68. channel = sensors.Channel
  69. category = sensors.Category
  70. } else if sensors.Url == "https://www.jjl.cn/" || sensors.Url == "https://m.jjl.cn/" {
  71. channel = 7
  72. category = 126
  73. } else {
  74. channel = 5
  75. category = 11
  76. }
  77. } else {
  78. if strings.Contains(strings.ToLower(chat.ChatURL), "link") {
  79. println(chat.ChatURL)
  80. channelIDString := strings.Split(strings.Split(chat.ChatURL, "link")[1], "_")[1]
  81. categoryIDString := strings.Split(strings.Split(chat.ChatURL, "link")[1], "_")[2]
  82. channel, _ = strconv.Atoi(channelIDString)
  83. category, _ = strconv.Atoi(categoryIDString)
  84. } else if strings.Contains(strings.ToLower(chat.ReferPage), "link") {
  85. channelIDString := strings.Split(strings.Split(chat.ReferPage, "link")[1], "_")[1]
  86. categoryIDString := strings.Split(strings.Split(chat.ReferPage, "link")[1], "_")[2]
  87. channel, _ = strconv.Atoi(channelIDString)
  88. category, _ = strconv.Atoi(categoryIDString)
  89. } else if !strings.Contains(strings.ToLower(chat.ReferPage), "link") {
  90. channel = 7
  91. category = 126
  92. }
  93. }
  94. var channelCategory ChannelCategory
  95. channelCategory.Channel = channel
  96. channelCategory.Category = category
  97. return channelCategory
  98. }
  99. // GetChannel 表单渠道归因处理
  100. func GetChannel(assessment ResourceAssessment) ChannelCategory {
  101. var channel int
  102. var category int
  103. 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")) {
  104. channel = 38
  105. category = 201
  106. } else if assessment.DataType == 1 {
  107. channel = 26
  108. category = 121
  109. } else if assessment.DataType == 5 || assessment.DataType == 7 {
  110. channel = assessment.Channel
  111. category = assessment.Category
  112. } else if assessment.DataType == 2 {
  113. if strings.Contains(assessment.URL, "link") {
  114. channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1])
  115. category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[2])
  116. } else if strings.Contains(assessment.ReferPageURL, "link") {
  117. channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
  118. category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
  119. } else {
  120. channel = assessment.Channel
  121. category = assessment.Category
  122. }
  123. } else if assessment.DataType == 3 || ((assessment.Channel == 5 || assessment.Channel == 7) && assessment.ChatID != "") {
  124. if !strings.Contains(assessment.URL, "utm") && !strings.Contains(assessment.ChatURL, "utm") && !strings.Contains(assessment.ReferPageURL, "utm") {
  125. key := "sensors:" + assessment.GrUserId
  126. cc, _ := redisCli().Get(key).Result()
  127. var sensors SensorsData
  128. json.Unmarshal([]byte(cc), &sensors)
  129. if sensors.Channel > 0 {
  130. channel = sensors.Channel
  131. category = sensors.Category
  132. } else if sensors.Url == "https://www.jjl.cn/" || sensors.Url == "https://m.jjl.cn/" {
  133. channel = 7
  134. category = 126
  135. } else {
  136. channel = 5
  137. category = 11
  138. }
  139. } else {
  140. if !strings.Contains(assessment.URL, "https") {
  141. assessment.URL = "https://wx.com" + assessment.URL
  142. }
  143. if !strings.Contains(assessment.ReferPageURL, "https") {
  144. assessment.ReferPageURL = "https://wx.com" + assessment.ReferPageURL
  145. }
  146. if strings.Contains(assessment.URL, "link") {
  147. channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1])
  148. category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[2])
  149. } else if strings.Contains(assessment.ReferPageURL, "link") {
  150. channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
  151. category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
  152. } else {
  153. channel = 7
  154. category = 126
  155. }
  156. }
  157. } else if assessment.DataType == 4 {
  158. if strings.Contains(assessment.ChatURL, "link") {
  159. channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[1])
  160. category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[2])
  161. } else if strings.Contains(assessment.ReferPageURL, "link") {
  162. channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
  163. category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
  164. } else {
  165. channel = 7
  166. category = 126
  167. }
  168. }
  169. if channel == 0 {
  170. channel = 5
  171. }
  172. if category == 0 {
  173. category = 11
  174. }
  175. var channelCategory ChannelCategory
  176. channelCategory.Channel = channel
  177. channelCategory.Category = category
  178. return channelCategory
  179. }
  180. type SensorsData struct {
  181. DistinctId string `json:"distinctID"`
  182. Channel int `json:"channel"`
  183. Category int `json:"category"`
  184. Url string `json:"url"`
  185. }