rank.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package service
  2. import (
  3. "context"
  4. "sort"
  5. "go-common/app/interface/main/mcn/dao/mcndao"
  6. "go-common/app/interface/main/mcn/model"
  7. "go-common/app/interface/main/mcn/model/mcnmodel"
  8. "go-common/library/ecode"
  9. "go-common/library/log"
  10. )
  11. const (
  12. //SortFieldFans by fans
  13. SortFieldFans = "fans_count"
  14. //SortFieldMonthFans by month increase
  15. SortFieldMonthFans = "fans_count_increase_month"
  16. //SortFieldArchiveCount by archive count
  17. SortFieldArchiveCount = "archive_count"
  18. )
  19. var (
  20. sortFieldMap = map[string]mcndao.RecommendSortFunc{
  21. SortFieldFans: mcndao.RecommendSortByFansDesc,
  22. SortFieldMonthFans: mcndao.RecommendSortByMonthFansDesc,
  23. SortFieldArchiveCount: mcndao.RecommendSortByArchiveCountDesc,
  24. }
  25. )
  26. //McnGetRankUpFans get up rank fans
  27. func (s *Service) McnGetRankUpFans(c context.Context, arg *mcnmodel.McnGetRankReq) (res *mcnmodel.McnGetRankUpFansReply, err error) {
  28. res, err = s.getRankResult(c, arg, s.mcndao.GetRankUpFans)
  29. return
  30. }
  31. //McnGetRankArchiveLikes get rank archive likes
  32. func (s *Service) McnGetRankArchiveLikes(c context.Context, arg *mcnmodel.McnGetRankReq) (res *mcnmodel.McnGetRankUpFansReply, err error) {
  33. res, err = s.getRankResult(c, arg, s.mcndao.GetRankArchiveLikes)
  34. return
  35. }
  36. func (s *Service) getRankResult(c context.Context, arg *mcnmodel.McnGetRankReq, rankFunc mcndao.RankFunc) (res *mcnmodel.McnGetRankUpFansReply, err error) {
  37. mcnSign, err := s.getMcnWithState(c, arg.McnMid, model.MCNSignStateOnSign)
  38. if err != nil {
  39. if err != ecode.NothingFound {
  40. log.Error("error get state, err=%s", err)
  41. }
  42. return
  43. }
  44. v, err := rankFunc(mcnSign.ID)
  45. if err != nil || v == nil {
  46. log.Error("get rank fail, sign id=%d, err=%s", mcnSign.ID, err)
  47. return
  48. }
  49. res = new(mcnmodel.McnGetRankUpFansReply)
  50. res.Result = v.GetList(arg.Tid, arg.DataType)
  51. res.TypeList = v.GetTypeList(arg.DataType)
  52. return
  53. }
  54. //GetRecommendPool get recommend pool reply
  55. func (s *Service) GetRecommendPool(c context.Context, arg *mcnmodel.McnGetRecommendPoolReq) (res *mcnmodel.McnGetRecommendPoolReply, err error) {
  56. mcnSign, err := s.getMcnWithState(c, arg.McnMid, model.MCNSignStateOnSign)
  57. if err != nil {
  58. if err != ecode.NothingFound {
  59. log.Error("error get state, err=%s", err)
  60. }
  61. return
  62. }
  63. var limit, offset = arg.CheckPageValidation()
  64. recommendCache, err := s.mcndao.GetRecommendPool()
  65. if err != nil {
  66. log.Error("get recommend pool fail, err=%s, mcn=%d", err, mcnSign.McnMid)
  67. return
  68. }
  69. if recommendCache == nil {
  70. log.Warn("recommend cache is nil, mcn=%d", mcnSign.McnMid)
  71. res.PageResult = arg.ToPageResult(0)
  72. return
  73. }
  74. res = new(mcnmodel.McnGetRecommendPoolReply)
  75. var upList = recommendCache.UpTidMap[arg.Tid]
  76. var listLen = len(upList)
  77. if offset >= listLen {
  78. return
  79. }
  80. res.PageResult = arg.ToPageResult(listLen)
  81. if upList == nil {
  82. return
  83. }
  84. var end = limit + offset
  85. if end >= listLen {
  86. end = listLen
  87. }
  88. var sortFunc mcndao.RecommendSortFunc
  89. switch arg.OrderField {
  90. case SortFieldMonthFans, SortFieldArchiveCount:
  91. sortFunc = sortFieldMap[arg.OrderField]
  92. }
  93. if sortFunc != nil {
  94. sort.Sort(&mcndao.RecommendDataSorter{Datas: upList, By: sortFunc})
  95. }
  96. var dest = make([]*mcnmodel.McnGetRecommendPoolInfo, listLen)
  97. // 如果是升序,那么把他们倒过来
  98. if arg.Sort == "asc" {
  99. copy(dest, upList)
  100. for left, right := 0, len(dest)-1; left < right; left, right = left+1, right-1 {
  101. dest[left], dest[right] = dest[right], dest[left]
  102. }
  103. } else {
  104. dest = upList
  105. }
  106. log.Info("offset, limit=%d,%d", offset, limit)
  107. dest = dest[offset:end]
  108. res.Result = dest
  109. return
  110. }
  111. //GetRecommendPoolTidList get tid list
  112. func (s *Service) GetRecommendPoolTidList(c context.Context, arg *mcnmodel.McnGetRecommendPoolTidListReq) (res *mcnmodel.McnGetRecommendPoolTidListReply, err error) {
  113. mcnSign, err := s.getMcnWithState(c, arg.McnMid, model.MCNSignStateOnSign)
  114. if err != nil {
  115. if err != ecode.NothingFound {
  116. log.Error("error get state, err=%s", err)
  117. }
  118. return
  119. }
  120. recommendCache, err := s.mcndao.GetRecommendPool()
  121. if err != nil {
  122. log.Error("get recommend pool fail, err=%s, mcn=%d", err, mcnSign.McnMid)
  123. return
  124. }
  125. if recommendCache == nil {
  126. log.Warn("recommend cache is nil, mcn=%d", mcnSign.McnMid)
  127. return
  128. }
  129. res = new(mcnmodel.McnGetRecommendPoolTidListReply)
  130. res.Result = recommendCache.TidTypeList
  131. return
  132. }