wx_user.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. package services
  2. import (
  3. "context"
  4. "fmt"
  5. "hongze/hongze_cygx/models"
  6. "hongze/hongze_cygx/utils"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. func UpdateWxUserLabel(cont context.Context) (err error) {
  13. defer func() {
  14. if err != nil {
  15. go utils.SendAlarmMsg("更新用户标签失败;Err:"+err.Error(), 2)
  16. go utils.SendEmail("更新用户标签失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), ";Err:"+err.Error(), utils.EmailSendToUsers)
  17. utils.FileLog.Info("更新用户标签失败,Err:%s", err.Error())
  18. }
  19. }()
  20. listUser, err := models.GetUserRegisterList()
  21. if err != nil {
  22. fmt.Println("GetUserRegisterList Err", err)
  23. return err
  24. }
  25. var userIds string
  26. var interactionNum int // 互动量
  27. mapComapnyInteractionNum := make(map[int]int)
  28. //拉取策略平台用户同步的图表信息
  29. {
  30. var chartMobile string
  31. var chartItems []*models.CygxChartCollect
  32. for k, vUser := range listUser {
  33. if vUser.Mobile != "" {
  34. mobile := vUser.Mobile
  35. chartMobile += mobile + ","
  36. listChart, _, _ := GetChartCollectionByApi(mobile, 9999, 0)
  37. if len(listChart) > 0 {
  38. for _, vChart := range listChart {
  39. item := new(models.CygxChartCollect)
  40. item.ChartId = vChart.ChartId
  41. t1, _ := time.Parse("2006-01-02T15:04:05Z", vChart.CreateDate)
  42. item.CreateTime = t1
  43. item.Mobile = mobile
  44. chartItems = append(chartItems, item)
  45. }
  46. }
  47. fmt.Println(mobile, "长度", len(listChart), "条数", k)
  48. }
  49. }
  50. fmt.Println("总长度", len(chartItems))
  51. chartMobile = strings.TrimRight(chartMobile, ",")
  52. err = models.RemoveChartCollectByMobile(chartMobile)
  53. if err != nil {
  54. fmt.Println(" RemoveChartCollectByMobile Err", err)
  55. }
  56. _, err = models.AddCygxChartCollectList(chartItems)
  57. if err != nil {
  58. fmt.Println(" RemoveChartCollectByMobile Err", err)
  59. }
  60. //处理图表关注后的用户
  61. {
  62. fmt.Println("处理图表关注后的用户")
  63. listChartCollect, err := models.GetCygxChartCollectByMobileList()
  64. if err != nil {
  65. fmt.Println("GetCygxChartCollectByMobileList ,Err" + err.Error())
  66. }
  67. fmt.Println("长度", len(listChartCollect))
  68. for k, v := range listChartCollect {
  69. if v.Mobile != "" {
  70. user, err := models.GetWxUserItemByMobile(v.Mobile)
  71. if err != nil && err.Error() != utils.ErrNoRow() {
  72. fmt.Println("GetWxUserItemByUserId ,Err" + err.Error())
  73. }
  74. if user != nil {
  75. fmt.Println(user.RealName, k)
  76. err = models.UpdateCygxChartCollect(user)
  77. if err != nil {
  78. fmt.Println("UpdateCygxChartCollect ,Err" + err.Error())
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. // 处理用户标签
  86. for _, vUser := range listUser {
  87. labels, err := models.GetCygxCompanyUserListSplit(strconv.Itoa(vUser.UserId))
  88. if err != nil {
  89. fmt.Println("GetCygxCompanyUserListSplit Err", err)
  90. return err
  91. }
  92. mapLabels := make(map[string]string)
  93. var labelsListStr []*models.UserLabel
  94. mapActivityLabels := make(map[string]string)
  95. labelsList := strings.Split(labels, ",")
  96. for _, vL := range labelsList {
  97. if mapLabels[vL] == "" && vL != "" {
  98. mapLabels[vL] = vL
  99. item := new(models.UserLabel)
  100. item.Label = vL
  101. labelsListStr = append(labelsListStr, item)
  102. }
  103. }
  104. dateTime := time.Now().AddDate(0, -3, 0).Format(utils.FormatDate)
  105. listArticlePv, err := models.GetArticlePvCount(vUser.Mobile, vUser.Email, dateTime)
  106. if err != nil && err.Error() != utils.ErrNoRow() {
  107. fmt.Println("GetArticlePvCount Err", err)
  108. return err
  109. }
  110. var articleIds string
  111. mapArticleIdLabelTotal := make(map[string]int)
  112. mapArticleIdPv := make(map[int]int)
  113. if len(listArticlePv) > 0 {
  114. for _, v := range listArticlePv {
  115. articleIds += strconv.Itoa(v.ArticleId) + ","
  116. mapArticleIdPv[v.ArticleId] = v.Pv
  117. }
  118. articleIds = strings.TrimRight(articleIds, ",")
  119. //产业、标的标签
  120. listLabelName, err := models.GetArticleGroupyIndustryName(articleIds)
  121. if err != nil && err.Error() != utils.ErrNoRow() {
  122. fmt.Println("GetArticleGroupyIndustryName Err", err)
  123. return err
  124. }
  125. if len(listLabelName) > 0 {
  126. for _, v := range listLabelName {
  127. labelsIndustryList := strings.Split(v.IndustryName, "/")
  128. labelsSubjectList := strings.Split(v.SubjectName, "/")
  129. //添加产业统计
  130. if len(labelsIndustryList) > 0 {
  131. for _, vIn := range labelsIndustryList {
  132. if mapActivityLabels[vIn] != "" {
  133. mapArticleIdLabelTotal[vIn] += mapArticleIdPv[v.ArticleId]
  134. } else {
  135. mapArticleIdLabelTotal[vIn] = mapArticleIdPv[v.ArticleId]
  136. mapActivityLabels[vIn] = vIn
  137. }
  138. }
  139. }
  140. if len(labelsSubjectList) > 0 {
  141. //添加标的统计
  142. for _, vIn := range labelsSubjectList {
  143. if mapActivityLabels[vIn] != "" {
  144. mapArticleIdLabelTotal[vIn] += mapArticleIdPv[v.ArticleId]
  145. } else {
  146. mapArticleIdLabelTotal[vIn] = mapArticleIdPv[v.ArticleId]
  147. mapActivityLabels[vIn] = vIn
  148. }
  149. }
  150. }
  151. }
  152. }
  153. }
  154. articleIds, err = models.GetCygxArticleCollectId(vUser.UserId, dateTime)
  155. if err != nil && err.Error() != utils.ErrNoRow() {
  156. fmt.Println("GetCygxArticleCollectId Err", err)
  157. return err
  158. }
  159. if articleIds != "" {
  160. //产业、标的标签
  161. listLabelName, err := models.GetArticleGroupyIndustryName(articleIds)
  162. if err != nil && err.Error() != utils.ErrNoRow() {
  163. fmt.Println("GetArticleGroupyIndustryName Err", err)
  164. return err
  165. }
  166. if len(listLabelName) > 0 {
  167. for _, v := range listLabelName {
  168. labelsIndustryList := strings.Split(v.IndustryName, "/")
  169. labelsSubjectList := strings.Split(v.SubjectName, "/")
  170. //添加产业统计
  171. if len(labelsIndustryList) > 0 {
  172. for _, vIn := range labelsIndustryList {
  173. if mapActivityLabels[vIn] != "" {
  174. mapArticleIdLabelTotal[vIn] += 1
  175. } else {
  176. mapArticleIdLabelTotal[vIn] = 1
  177. mapActivityLabels[vIn] = vIn
  178. }
  179. }
  180. }
  181. if len(labelsSubjectList) > 0 {
  182. //添加标的统计
  183. for _, vIn := range labelsSubjectList {
  184. if mapActivityLabels[vIn] != "" {
  185. mapArticleIdLabelTotal[vIn] += 1
  186. } else {
  187. mapArticleIdLabelTotal[vIn] = 1
  188. mapActivityLabels[vIn] = vIn
  189. }
  190. }
  191. }
  192. }
  193. }
  194. }
  195. //活动标签计算
  196. listActivityPv, err := models.GetActivitySignCount(vUser.Mobile, dateTime)
  197. if err != nil && err.Error() != utils.ErrNoRow() {
  198. fmt.Println("GetActivitySignCount Err", err)
  199. return err
  200. }
  201. if len(listActivityPv) > 0 {
  202. for _, v := range listActivityPv {
  203. labelsList := strings.Split(v.Label, "-")
  204. for _, v2 := range labelsList {
  205. labelsListSon := strings.Split(v2, "/")
  206. for _, v3 := range labelsListSon {
  207. if mapActivityLabels[v3] != "" {
  208. mapArticleIdLabelTotal[v3] += 1
  209. } else {
  210. mapArticleIdLabelTotal[v3] = 1
  211. mapActivityLabels[v3] = v3
  212. }
  213. }
  214. }
  215. }
  216. }
  217. //对标签数量进行排序
  218. type KvPair struct {
  219. Key string
  220. Val int
  221. }
  222. tmpList := make([]KvPair, 0)
  223. for k, v := range mapArticleIdLabelTotal {
  224. tmpList = append(tmpList, KvPair{Key: k, Val: v})
  225. }
  226. sort.Slice(tmpList, func(i, j int) bool {
  227. return tmpList[i].Val > tmpList[j].Val // 降序
  228. })
  229. for _, v := range tmpList {
  230. if v.Key != "" {
  231. mapLabels[v.Key] = v.Key
  232. item := new(models.UserLabel)
  233. item.Label = v.Key
  234. labelsListStr = append(labelsListStr, item)
  235. }
  236. }
  237. var labelNew string
  238. for _, v := range labelsListStr {
  239. labelNew += v.Label + ","
  240. }
  241. labelNew = strings.TrimRight(labelNew, ",")
  242. if labelNew != "" {
  243. err = models.UpdateUserLabel(labelNew, vUser.UserId)
  244. if err != nil {
  245. fmt.Println("UpdateUserLabel Err", err)
  246. return err
  247. }
  248. }
  249. }
  250. //处理用户、机构互动量数据
  251. {
  252. var itemsInteraction []*models.CygxUserInteractionNum
  253. mapUserInteraction := make(map[int]int)
  254. //获取已经处理记录的用户并记录切片
  255. listUserInteractionNum, err := models.GetCygxUserInteractionNumList()
  256. if err != nil && err.Error() != utils.ErrNoRow() {
  257. fmt.Println("GetCygxUserInteractionNumList Err", err)
  258. return err
  259. }
  260. for _, v := range listUserInteractionNum {
  261. mapUserInteraction[v.UserId] = v.UserId
  262. }
  263. //处理用户互动量数据
  264. for kUser, vUser := range listUser {
  265. userIds += strconv.Itoa(vUser.UserId) + ","
  266. //一次查询一百个避免用户过多
  267. if kUser%100 == 0 {
  268. userIds = strings.TrimRight(userIds, ",")
  269. userUserInteractionList, err := models.GetCygxCompanyUserUserInteraction(userIds)
  270. if err != nil {
  271. fmt.Println("GetCygxCompanyUserUserInteraction Err", err)
  272. return err
  273. }
  274. //处理用户的互动量
  275. if len(userUserInteractionList) > 0 {
  276. for _, vsplit := range userUserInteractionList {
  277. interactionNum = vsplit.HistoryNum + vsplit.CountNum + vsplit.IndustryFllowNum + vsplit.DepartmentFollowNum + vsplit.KeyWordNum + vsplit.OnLineNum + vsplit.OfficeNum + vsplit.ChartCountNum
  278. if interactionNum > 0 {
  279. //更改用户的互动量
  280. err = models.UpdateUserInteractionNum(interactionNum, int(vsplit.UserId))
  281. if err != nil {
  282. fmt.Println("UpdateUserInteractionNum Err", err)
  283. return err
  284. }
  285. mapComapnyInteractionNum[vsplit.CompanyId] += interactionNum
  286. itemInteraction := new(models.CygxUserInteractionNum)
  287. itemInteraction.UserId = int(vsplit.UserId)
  288. itemInteraction.ArticleCountNum = vsplit.HistoryNum
  289. itemInteraction.ArticleCountNum = vsplit.CountNum
  290. itemInteraction.ChartCountNum = vsplit.ChartCountNum
  291. itemInteraction.IndustryFllowNum = vsplit.IndustryFllowNum
  292. itemInteraction.DepartmentFollowNum = vsplit.DepartmentFollowNum
  293. itemInteraction.KeyWordNum = vsplit.KeyWordNum
  294. itemInteraction.ActivityOnLineNum = vsplit.OnLineNum
  295. itemInteraction.ActivityOfficeNum = vsplit.OfficeNum
  296. itemInteraction.ActivityNum = vsplit.OnLineNum + vsplit.OfficeNum
  297. itemInteraction.CreateTime = time.Now()
  298. itemInteraction.ModifyTime = time.Now()
  299. //如果存在就修改不存在就新增
  300. if mapUserInteraction[int(vsplit.UserId)] == 0 {
  301. itemsInteraction = append(itemsInteraction, itemInteraction)
  302. } else {
  303. err = models.UpdateCygxUserInteractionNum(itemInteraction)
  304. }
  305. }
  306. }
  307. }
  308. userIds = ""
  309. }
  310. }
  311. userIds = strings.TrimRight(userIds, ",")
  312. if userIds != "" {
  313. userUserInteractionList, err := models.GetCygxCompanyUserUserInteraction(userIds)
  314. if err != nil {
  315. fmt.Println("GetCygxCompanyUserUserInteraction Err", err)
  316. return err
  317. }
  318. fmt.Println("处理用户剩余的")
  319. //处理用户的互动量
  320. if len(userUserInteractionList) > 0 {
  321. for _, vsplit := range userUserInteractionList {
  322. interactionNum = vsplit.HistoryNum + vsplit.CountNum + vsplit.IndustryFllowNum + vsplit.DepartmentFollowNum + vsplit.KeyWordNum + vsplit.OnLineNum + vsplit.OfficeNum + vsplit.ChartCountNum
  323. if interactionNum > 0 {
  324. err = models.UpdateUserInteractionNum(interactionNum, int(vsplit.UserId))
  325. if err != nil {
  326. fmt.Println("UpdateUserInteractionNum Err", err)
  327. return err
  328. }
  329. mapComapnyInteractionNum[vsplit.CompanyId] += interactionNum
  330. itemInteraction := new(models.CygxUserInteractionNum)
  331. itemInteraction.UserId = int(vsplit.UserId)
  332. itemInteraction.ArticleCountNum = vsplit.HistoryNum
  333. itemInteraction.ArticleCountNum = vsplit.CountNum
  334. itemInteraction.ChartCountNum = vsplit.ChartCountNum
  335. itemInteraction.IndustryFllowNum = vsplit.IndustryFllowNum
  336. itemInteraction.DepartmentFollowNum = vsplit.DepartmentFollowNum
  337. itemInteraction.KeyWordNum = vsplit.KeyWordNum
  338. itemInteraction.ActivityOnLineNum = vsplit.OnLineNum
  339. itemInteraction.ActivityOfficeNum = vsplit.OfficeNum
  340. itemInteraction.ActivityNum = vsplit.OnLineNum + vsplit.OfficeNum
  341. itemInteraction.CreateTime = time.Now()
  342. itemInteraction.ModifyTime = time.Now()
  343. //如果存在就修改不存在就新增
  344. if mapUserInteraction[int(vsplit.UserId)] == 0 {
  345. itemsInteraction = append(itemsInteraction, itemInteraction)
  346. } else {
  347. err = models.UpdateCygxUserInteractionNum(itemInteraction)
  348. }
  349. }
  350. }
  351. }
  352. }
  353. //修改机构互动量信息
  354. if len(mapComapnyInteractionNum) > 0 {
  355. for k, v := range mapComapnyInteractionNum {
  356. err = models.UpdateComapanyInteractionNum(v, k)
  357. fmt.Println(k, "修改", v)
  358. }
  359. }
  360. // 批量添加用户互动量信息
  361. if len(itemsInteraction) > 0 {
  362. _, err = models.AddCygxUserInteractionNumList(itemsInteraction)
  363. if err != nil {
  364. fmt.Println(" RemoveChartCollectByMobile Err", err)
  365. }
  366. }
  367. }
  368. return
  369. }