rank.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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", "task") // task任务排行/invite邀请排行
  13. timeType := ctx.QueryString("timeType", "daily") // daily/weekly/monthly
  14. limit := ctx.QueryInt64("limit", 50)
  15. if limit > 100 {
  16. limit = 100
  17. }
  18. type RankInfo struct {
  19. Rank int `json:"rank"`
  20. UserId int64 `json:"userId"`
  21. Uid string `json:"uid"`
  22. Nickname string `json:"nickname"`
  23. Avatar string `json:"avatar"`
  24. Count int `json:"count"`
  25. }
  26. ranks := make([]*RankInfo, 0)
  27. // 时间条件
  28. var timeCondition string
  29. switch timeType {
  30. case "daily":
  31. timeCondition = "DATE(FROM_UNIXTIME(t.created_at)) = '" + time.Now().Format("2006-01-02") + "'"
  32. case "weekly":
  33. weekStart := time.Now().AddDate(0, 0, -int(time.Now().Weekday())).Format("2006-01-02")
  34. timeCondition = "DATE(FROM_UNIXTIME(t.created_at)) >= '" + weekStart + "'"
  35. case "monthly":
  36. month := time.Now().Format("2006-01")
  37. timeCondition = "DATE_FORMAT(FROM_UNIXTIME(t.created_at), '%Y-%m') = '" + month + "'"
  38. default:
  39. timeCondition = "DATE(FROM_UNIXTIME(t.created_at)) = '" + time.Now().Format("2006-01-02") + "'"
  40. }
  41. // 根据类型查询不同的排行榜
  42. switch rankType {
  43. case "task":
  44. // 任务完成数量排行
  45. db.Raw(`
  46. SELECT
  47. ROW_NUMBER() OVER(ORDER BY cnt DESC) as `+"`rank`"+`,
  48. user_id,
  49. uid,
  50. nickname,
  51. avatar,
  52. cnt as count
  53. FROM (
  54. SELECT
  55. u.id as user_id,
  56. u.uid,
  57. u.nickname,
  58. u.avatar,
  59. COUNT(t.id) as cnt
  60. FROM dt_user u
  61. INNER JOIN dt_user_task t ON u.id = t.user_id
  62. AND t.status = ?
  63. AND `+timeCondition+`
  64. WHERE u.status = 1
  65. GROUP BY u.id, u.uid, u.nickname, u.avatar
  66. HAVING cnt > 0
  67. ) ranked
  68. LIMIT ?
  69. `, entity.UserTaskStatusCompleted, limit).Scan(&ranks)
  70. case "invite":
  71. // 邀请人数排行
  72. db.Raw(`
  73. SELECT
  74. ROW_NUMBER() OVER(ORDER BY cnt DESC) as `+"`rank`"+`,
  75. user_id,
  76. uid,
  77. nickname,
  78. avatar,
  79. cnt as count
  80. FROM (
  81. SELECT
  82. u.id as user_id,
  83. u.uid,
  84. u.nickname,
  85. u.avatar,
  86. COUNT(t.id) as cnt
  87. FROM dt_user u
  88. INNER JOIN dt_user t ON u.id = t.parent_id
  89. AND `+timeCondition+`
  90. WHERE u.status = 1
  91. GROUP BY u.id, u.uid, u.nickname, u.avatar
  92. HAVING cnt > 0
  93. ) ranked
  94. LIMIT ?
  95. `, limit).Scan(&ranks)
  96. default:
  97. ctx.Fail("invalid_type")
  98. return
  99. }
  100. // 查询当前用户排名
  101. var myRank *RankInfo
  102. for _, rank := range ranks {
  103. if rank.UserId == userId {
  104. myRank = rank
  105. break
  106. }
  107. }
  108. // 如果当前用户不在榜单中,单独查询
  109. if myRank == nil {
  110. var user entity.DtUser
  111. if err := db.Where("id = ?", userId).First(&user).Error; err == nil {
  112. myRank = &RankInfo{
  113. Rank: 0,
  114. UserId: user.Id,
  115. Uid: user.Uid,
  116. Nickname: user.Nickname,
  117. Avatar: user.Avatar,
  118. Count: 0,
  119. }
  120. }
  121. }
  122. ctx.OK(gin.H{
  123. "list": ranks,
  124. "myRank": myRank,
  125. })
  126. }
  127. // RankReward 排行榜奖励配置
  128. func (s *Server) RankReward(c *gin.Context) {
  129. ctx := s.FromContext(c)
  130. db := s.DB()
  131. var configs []entity.DtLeaderboardReward
  132. db.Where("status = ?", 1).
  133. Order("rank_start ASC").
  134. Find(&configs)
  135. type RewardInfo struct {
  136. RankStart int `json:"rankStart"`
  137. RankEnd int `json:"rankEnd"`
  138. Reward float64 `json:"reward"`
  139. }
  140. rewards := make([]*RewardInfo, 0)
  141. for _, config := range configs {
  142. rewards = append(rewards, &RewardInfo{
  143. RankStart: config.RankStart,
  144. RankEnd: config.RankEnd,
  145. Reward: config.Reward,
  146. })
  147. }
  148. ctx.OK(gin.H{
  149. "list": rewards,
  150. })
  151. }