user.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. package main
  2. import (
  3. qu "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/date"
  5. "app.yhyue.com/moapp/jybase/mongodb"
  6. "app.yhyue.com/moapp/jybase/redis"
  7. "fmt"
  8. "log"
  9. "strings"
  10. "time"
  11. )
  12. // getUserTrustedId 获取mgo中的匿名id
  13. func getUserTrustedId(userid string) string {
  14. sess := Mgo_Log.GetMgoConn()
  15. defer Mgo_Log.DestoryMongoConn(sess)
  16. query := map[string]interface{}{
  17. "userid": userid,
  18. }
  19. it := sess.DB("qfw").C("jy_logs").Find(query).Select(map[string]interface{}{
  20. "trustedId": 1,
  21. }).Iter()
  22. total := 0
  23. for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
  24. trustedId := qu.ObjToString(tmp["trustedId"])
  25. if trustedId != "" {
  26. return MgoTrustedIdToCkTrustedId(trustedId)
  27. }
  28. tmp = make(map[string]interface{})
  29. }
  30. return ""
  31. }
  32. func User(st, et int64) {
  33. s, e := GetCurTimePiInfo(st, et)
  34. query := map[string]interface{}{
  35. "_id": map[string]interface{}{
  36. "$gte": mongodb.StringTOBsonId(s),
  37. "$lt": mongodb.StringTOBsonId(e),
  38. },
  39. }
  40. sess := Mgo_Log.GetMgoConn()
  41. defer Mgo_Log.DestoryMongoConn(sess)
  42. it := sess.DB("qfw").C("register_log").Find(query).Sort("-_id").Select(map[string]interface{}{
  43. "userid": 1,
  44. "system": 1,
  45. "source": 1,
  46. "create_time": 1,
  47. "phone": 1,
  48. }).Iter()
  49. total := 0
  50. for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
  51. userid := qu.ObjToString(tmp["userid"])
  52. source := qu.ObjToString(tmp["source"]) //pc wx app h5 entbase background vipgift
  53. create_time := qu.ObjToString(tmp["create_time"])
  54. t, _ := time.ParseInLocation(date.Date_Full_Layout, create_time, time.Local)
  55. if source == "pc" {
  56. if tid := getUserTrustedId(userid); tid != "" {
  57. sql := fmt.Sprintf(`select * from userbehavior.user_behavior_log
  58. where trusted_id='%s' and user_id ='' and date<='%s' limit 1`, tid, create_time)
  59. data := Ch.SelectBySql(sql)
  60. if data != nil && len(*data) > 0 {
  61. d := (*data)[0]
  62. ip := qu.ObjToString(d["ip"])
  63. area := qu.ObjToString(d["area"])
  64. city := qu.ObjToString(d["city"])
  65. os := qu.ObjToString(d["os"])
  66. browser := qu.ObjToString(d["browser"])
  67. module := qu.ObjToString(d["module"])
  68. href := qu.ObjToString(d["href"])
  69. urlname := qu.ObjToString(d["url_name"])
  70. refer := qu.ObjToString(d["refer"])
  71. refer_name := qu.ObjToString(d["refer_name"])
  72. refer_type := qu.ObjToString(d["refer_type"])
  73. phone := qu.ObjToString(d["phone"])
  74. urldesc := qu.ObjToString(d["desc"])
  75. session_id := qu.ObjToString(d["session_id"])
  76. page_code_id := qu.Int64All(d["page_code_id"])
  77. position_id := qu.ObjToString(d["position_id"])
  78. StrategyInfo.CacheData <- &UserBehaviorLog{
  79. UserID: userid,
  80. ActionID: int64(4), // 动作ID
  81. TrustedID: tid, // 浏览器指纹
  82. IP: ip, // 用户IP地址
  83. Area: area, // 省份
  84. City: city, // 城市
  85. OS: os, // 操作系统
  86. Browser: browser, // 浏览器类型
  87. BrowserVersion: "", // 浏览器版本
  88. Date: t, // 行为发生时间
  89. Platform: "pc", // 平台(如移动端、PC端)
  90. Subsystem: "", // 子系统
  91. Module: module, // 模块
  92. URL: href, // 访问的URL
  93. URLName: urlname, // URL名称
  94. URLElement: "", // 页面元素
  95. AddField: "", // 附加数据
  96. TimeStamp: int32(t.Unix()), // 时间戳
  97. Refer: refer, // 引用来源
  98. ReferName: refer_name, // 引用名称
  99. ReferType: refer_type, // 引用类型
  100. SessionID: session_id, // 会话ID
  101. Phone: phone, // 手机号码
  102. PageName: urlname, // 页面名称
  103. Desc: urldesc, // 描述
  104. BreakData: "", // 额外数据
  105. PageCodeId: uint64(page_code_id),
  106. PositionId: position_id,
  107. }
  108. }
  109. }
  110. } else {
  111. StrategyInfo.CacheData <- &UserBehaviorLog{
  112. UserID: userid,
  113. ActionID: int64(4), // 动作ID
  114. TrustedID: "", // 浏览器指纹
  115. IP: "", // 用户IP地址
  116. Area: "", // 省份
  117. City: "", // 城市
  118. OS: "", // 操作系统
  119. Browser: "", // 浏览器类型
  120. BrowserVersion: "", // 浏览器版本
  121. Date: t, // 行为发生时间
  122. Platform: "", // 平台(如移动端、PC端)
  123. Subsystem: "", // 子系统
  124. Module: "", // 模块
  125. URL: "", // 访问的URL
  126. URLName: "", // URL名称
  127. URLElement: "", // 页面元素
  128. AddField: "", // 附加数据
  129. TimeStamp: int32(t.Unix()), // 时间戳
  130. Refer: "", // 引用来源
  131. ReferName: "", // 引用名称
  132. ReferType: "", // 引用类型
  133. SessionID: "", // 会话ID
  134. Phone: qu.ObjToString(tmp["phone"]), // 手机号码
  135. PageName: "", // 页面名称
  136. Desc: "", // 描述
  137. BreakData: "", // 额外数据
  138. PageCodeId: 0,
  139. PositionId: "",
  140. }
  141. }
  142. tmp = make(map[string]interface{})
  143. }
  144. }
  145. func salesLeads_logs(st, et int64) {
  146. userPhoneMap := GetPhone()
  147. modelMap := MatchRegexModule()
  148. s, e := GetCurTimePiInfo(st, et)
  149. q := map[string]interface{}{
  150. "_id": map[string]interface{}{
  151. "$gte": mongodb.StringTOBsonId(s),
  152. "$lt": mongodb.StringTOBsonId(e),
  153. },
  154. "url": "/salesLeads/retainedCapital",
  155. }
  156. log.Println(q)
  157. sess := Mgo_Log.GetMgoConn()
  158. defer Mgo_Log.DestoryMongoConn(sess)
  159. it := sess.DB("qfw").C("salesLeads_logs").Find(q).Sort("-_id").Select(map[string]interface{}{
  160. "userid": 1,
  161. "ip": 1,
  162. "refer": 1,
  163. "client": 1,
  164. "url": 1,
  165. "createtime": 1,
  166. "date": 1,
  167. "trustedId": 1,
  168. "os": 1,
  169. "browse": 1,
  170. "positionId": 1,
  171. }).Iter()
  172. total := 0
  173. for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
  174. if total%50000 == 0 {
  175. log.Println("cur saleLeads index ", total)
  176. }
  177. userid := qu.ObjToString(tmp["userid"])
  178. client := qu.ObjToString(tmp["client"])
  179. href := qu.ObjToString(tmp["url"])
  180. trustedId := qu.ObjToString(tmp["trustedId"])
  181. ip := qu.ObjToString(tmp["ip"])
  182. area, city := GetIpSource(ip)
  183. os := qu.ObjToString(tmp["os"])
  184. browse := qu.ObjToString(tmp["browse"])
  185. refer := qu.ObjToString(tmp["refer"])
  186. i_createtime := qu.Int64All(tmp["date"])
  187. createtime := time.Unix(i_createtime, 0)
  188. platform := ""
  189. if strings.Contains(refer, "www.jianyu") {
  190. platform = "pc"
  191. } else if strings.Contains(refer, "wx.jianyu") {
  192. platform = "wx"
  193. } else {
  194. if strings.Contains(client, "Android") {
  195. platform = "android"
  196. }
  197. // 检查是否为 iOS 客户端
  198. if strings.Contains(client, "iPhone") || strings.Contains(client, "iPad") || strings.Contains(client, "iPod") {
  199. platform = "ios"
  200. }
  201. }
  202. hrefinfo, _ := modelMap.MatchRegexMap(Unescape(href))
  203. module := ""
  204. if hrefinfo != nil {
  205. module = hrefinfo.Module
  206. }
  207. referinfo, _ := modelMap.MatchRegexMap(Unescape(refer))
  208. refermodule := ""
  209. urlname := ""
  210. urldesc := ""
  211. if referinfo != nil {
  212. refermodule = referinfo.Module
  213. urlname = referinfo.Page_name
  214. urldesc = referinfo.Desc
  215. }
  216. referType := GetReferType(refer)
  217. positionid := qu.ObjToString(tmp["positionId"])
  218. //if !mongodb.IsObjectIdHex(userid) {
  219. // userid = GetUserId(userid)
  220. // positionid = userid
  221. //} else {
  222. // positionid = gconv.String(positionMap[userid])
  223. //}
  224. StrategyInfo.CacheData <- &UserBehaviorLog{
  225. UserID: userid,
  226. ActionID: 12, // 动作ID
  227. TrustedID: trustedId, // 浏览器指纹
  228. IP: ip, // 用户IP地址
  229. Area: area, // 省份
  230. City: city, // 城市
  231. OS: os, // 操作系统
  232. Browser: browse, // 浏览器类型
  233. BrowserVersion: "", // 浏览器版本
  234. Date: createtime, // 行为发生时间
  235. Platform: platform, // 平台(如移动端、PC端)
  236. Subsystem: "", // 子系统
  237. Module: module, // 模块
  238. URL: href, // 访问的URL
  239. URLName: urlname, // URL名称
  240. URLElement: "", // 页面元素
  241. AddField: "", // 附加数据
  242. TimeStamp: int32(i_createtime), // 时间戳
  243. Refer: refer, // 引用来源
  244. ReferName: refermodule, // 引用名称
  245. ReferType: referType, // 引用类型
  246. SessionID: "", // 会话ID
  247. //SessionStartTime: time.Now(), // 会话开始时间 //TODO 会话开始时间
  248. Phone: userPhoneMap[userid], // 手机号码
  249. PageName: urlname, // 页面名称
  250. Desc: urldesc, // 描述
  251. BreakData: "", // 额外数据
  252. PositionId: positionid,
  253. }
  254. tmp = make(map[string]interface{})
  255. }
  256. log.Println("mongodb end")
  257. }
  258. // InitPositionId 通过用户归集获取职位id和mgoid的对应关系
  259. func InitPositionId() map[string]int64 {
  260. positionIdMap := map[string]int64{}
  261. DataService.SelectByBath(20, func(l *[]map[string]interface{}) bool {
  262. for _, v := range *l {
  263. user_id := qu.ObjToString(v["user_id"])
  264. id := qu.Int64All(v["id"])
  265. positionIdMap[user_id] = id
  266. }
  267. return true
  268. }, fmt.Sprintf("SELECT userid,position_id FROM data_service.%s WHERE TYPE=0;", Sysconfig.Tidb.DataServiceCollName))
  269. return positionIdMap
  270. }
  271. // LoadUserTrustedId 获取userid和虚拟id对应关系
  272. func LoadUserTrustedId(st, et int64) map[string]string {
  273. userTrusted := map[string]string{}
  274. starttime := time.Unix(st, 0).Format(date.Date_Full_Layout)
  275. endtime := time.Unix(et, 0).Format(date.Date_Full_Layout)
  276. Ch.SelectByBath(20, func(l *[]map[string]interface{}) bool {
  277. for _, v := range *l {
  278. userid := qu.ObjToString(v["user_id"])
  279. trusted_id := qu.ObjToString(v["trusted_id"])
  280. userTrusted[trusted_id] = userid
  281. }
  282. return true
  283. }, fmt.Sprintf(`select user_id,trusted_id from user_behavior_log where date>='%s' and date< '%s' and user_id !='' and trusted_id!=''`, starttime, endtime))
  284. return userTrusted
  285. }
  286. func GetPhone() map[string]string {
  287. sess := Mgo.GetMgoConn()
  288. defer Mgo.DestoryMongoConn(sess)
  289. q := map[string]interface{}{
  290. "i_appid": 2,
  291. "$or": []map[string]interface{}{
  292. map[string]interface{}{"s_phone": map[string]interface{}{"$exists": true}},
  293. map[string]interface{}{"s_m_phone": map[string]interface{}{"$exists": true}},
  294. },
  295. }
  296. userPhoneMap := map[string]string{}
  297. it := sess.DB("qfw").C("user").Find(q).Select(map[string]interface{}{
  298. "userid": 1,
  299. "s_phone": 1,
  300. "s_m_phone": 1,
  301. }).Iter()
  302. total := 0
  303. for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
  304. if total%50000 == 0 {
  305. log.Println("cur index ", total)
  306. }
  307. userid := mongodb.BsonIdToSId(tmp["_id"])
  308. phone := qu.ObjToString(tmp["s_phone"])
  309. if phone == "" {
  310. phone = qu.ObjToString(tmp["s_m_phone"])
  311. }
  312. if phone != "" {
  313. userPhoneMap[userid] = phone
  314. }
  315. tmp = make(map[string]interface{})
  316. }
  317. return userPhoneMap
  318. }
  319. // 获取用户id
  320. func GetUserId(userid string) string {
  321. keyname := fmt.Sprintf("position_%s", userid)
  322. mgoUserid := redis.GetStr("useraction", keyname)
  323. if mgoUserid != "" {
  324. return mgoUserid
  325. }
  326. data := Base.SelectBySql(`select user_id from base_position where id =?`, userid)
  327. if data != nil && len(*data) > 0 {
  328. base_user_id := qu.Int64All((*data)[0]["user_id"])
  329. udata, _ := Mgo.FindOne("user", map[string]interface{}{
  330. "base_user_id": base_user_id,
  331. })
  332. if udata != nil && len(*udata) > 0 {
  333. mgoUserid := mongodb.BsonIdToSId((*udata)["_id"])
  334. redis.Put("useraction", keyname, mgoUserid, 3600*24)
  335. return mgoUserid
  336. }
  337. }
  338. return ""
  339. }