rank.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package daytask
  2. import (
  3. "app/commons/model/entity"
  4. "github.com/gin-gonic/gin"
  5. "time"
  6. )
  7. // RankList 排行榜列表
  8. func (s *Server) RankList(c *gin.Context) {
  9. ctx := s.FromContext(c)
  10. db := s.DB()
  11. userId := ctx.UserId()
  12. rankType := ctx.QueryString("type", "daily") // daily/weekly/monthly/total
  13. limit := ctx.QueryInt64("limit", 50)
  14. if limit > 100 {
  15. limit = 100
  16. }
  17. type RankInfo struct {
  18. Rank int `json:"rank"`
  19. UserId int64 `json:"userId"`
  20. Uid string `json:"uid"`
  21. Nickname string `json:"nickname"`
  22. Avatar string `json:"avatar"`
  23. Amount float64 `json:"amount"`
  24. }
  25. ranks := make([]*RankInfo, 0)
  26. // 根据类型查询不同的排行榜
  27. switch rankType {
  28. case "daily":
  29. // 今日收益排行
  30. today := time.Now().Format("2006-01-02")
  31. db.Raw(`
  32. SELECT
  33. @rank := @rank + 1 as rank,
  34. u.id as user_id,
  35. u.uid,
  36. u.nickname,
  37. u.avatar,
  38. COALESCE(SUM(bl.amount), 0) as amount
  39. FROM dt_user u
  40. LEFT JOIN dt_balance_log bl ON u.id = bl.user_id
  41. AND bl.type IN (?, ?)
  42. AND DATE(FROM_UNIXTIME(bl.created_at)) = ?
  43. CROSS JOIN (SELECT @rank := 0) r
  44. WHERE u.status = 1
  45. GROUP BY u.id
  46. HAVING amount > 0
  47. ORDER BY amount DESC
  48. LIMIT ?
  49. `, entity.BalanceLogTypeTaskIncome, entity.BalanceLogTypeCommission, today, limit).Scan(&ranks)
  50. case "weekly":
  51. // 本周收益排行
  52. weekStart := time.Now().AddDate(0, 0, -int(time.Now().Weekday())).Format("2006-01-02")
  53. db.Raw(`
  54. SELECT
  55. @rank := @rank + 1 as rank,
  56. u.id as user_id,
  57. u.uid,
  58. u.nickname,
  59. u.avatar,
  60. COALESCE(SUM(bl.amount), 0) as amount
  61. FROM dt_user u
  62. LEFT JOIN dt_balance_log bl ON u.id = bl.user_id
  63. AND bl.type IN (?, ?)
  64. AND DATE(FROM_UNIXTIME(bl.created_at)) >= ?
  65. CROSS JOIN (SELECT @rank := 0) r
  66. WHERE u.status = 1
  67. GROUP BY u.id
  68. HAVING amount > 0
  69. ORDER BY amount DESC
  70. LIMIT ?
  71. `, entity.BalanceLogTypeTaskIncome, entity.BalanceLogTypeCommission, weekStart, limit).Scan(&ranks)
  72. case "monthly":
  73. // 本月收益排行
  74. month := time.Now().Format("2006-01")
  75. db.Raw(`
  76. SELECT
  77. @rank := @rank + 1 as rank,
  78. u.id as user_id,
  79. u.uid,
  80. u.nickname,
  81. u.avatar,
  82. COALESCE(SUM(bl.amount), 0) as amount
  83. FROM dt_user u
  84. LEFT JOIN dt_balance_log bl ON u.id = bl.user_id
  85. AND bl.type IN (?, ?)
  86. AND DATE_FORMAT(FROM_UNIXTIME(bl.created_at), '%Y-%m') = ?
  87. CROSS JOIN (SELECT @rank := 0) r
  88. WHERE u.status = 1
  89. GROUP BY u.id
  90. HAVING amount > 0
  91. ORDER BY amount DESC
  92. LIMIT ?
  93. `, entity.BalanceLogTypeTaskIncome, entity.BalanceLogTypeCommission, month, limit).Scan(&ranks)
  94. case "total":
  95. // 累计收益排行
  96. db.Raw(`
  97. SELECT
  98. @rank := @rank + 1 as rank,
  99. id as user_id,
  100. uid,
  101. nickname,
  102. avatar,
  103. total_income as amount
  104. FROM dt_user
  105. CROSS JOIN (SELECT @rank := 0) r
  106. WHERE status = 1 AND total_income > 0
  107. ORDER BY total_income DESC
  108. LIMIT ?
  109. `, limit).Scan(&ranks)
  110. default:
  111. ctx.Fail("invalid_type")
  112. return
  113. }
  114. // 查询当前用户排名
  115. var myRank *RankInfo
  116. for _, rank := range ranks {
  117. if rank.UserId == userId {
  118. myRank = rank
  119. break
  120. }
  121. }
  122. // 如果当前用户不在榜单中,单独查询
  123. if myRank == nil {
  124. var user entity.DtUser
  125. if err := db.Where("id = ?", userId).First(&user).Error; err == nil {
  126. myRank = &RankInfo{
  127. Rank: 0,
  128. UserId: user.Id,
  129. Uid: user.Uid,
  130. Nickname: user.Nickname,
  131. Avatar: user.Avatar,
  132. Amount: user.TotalIncome,
  133. }
  134. }
  135. }
  136. ctx.OK(gin.H{
  137. "list": ranks,
  138. "myRank": myRank,
  139. })
  140. }
  141. // RankReward 排行榜奖励配置
  142. func (s *Server) RankReward(c *gin.Context) {
  143. ctx := s.FromContext(c)
  144. db := s.DB()
  145. var configs []entity.DtLeaderboardReward
  146. db.Where("status = ?", 1).
  147. Order("rank_start ASC").
  148. Find(&configs)
  149. type RewardInfo struct {
  150. RankStart int `json:"rankStart"`
  151. RankEnd int `json:"rankEnd"`
  152. Reward float64 `json:"reward"`
  153. }
  154. rewards := make([]*RewardInfo, 0)
  155. for _, config := range configs {
  156. rewards = append(rewards, &RewardInfo{
  157. RankStart: config.RankStart,
  158. RankEnd: config.RankEnd,
  159. Reward: config.Reward,
  160. })
  161. }
  162. ctx.OK(gin.H{
  163. "list": rewards,
  164. })
  165. }