rank.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. @rank := @rank + 1 as `+"`rank`"+`,
  48. u.id as user_id,
  49. u.uid,
  50. u.nickname,
  51. u.avatar,
  52. COUNT(t.id) as count
  53. FROM dt_user u
  54. LEFT JOIN dt_user_task t ON u.id = t.user_id
  55. AND t.status = ?
  56. AND `+timeCondition+`
  57. CROSS JOIN (SELECT @rank := 0) r
  58. WHERE u.status = 1
  59. GROUP BY u.id
  60. HAVING count > 0
  61. ORDER BY count DESC
  62. LIMIT ?
  63. `, entity.UserTaskStatusCompleted, limit).Scan(&ranks)
  64. case "invite":
  65. // 邀请人数排行
  66. db.Raw(`
  67. SELECT
  68. @rank := @rank + 1 as `+"`rank`"+`,
  69. u.id as user_id,
  70. u.uid,
  71. u.nickname,
  72. u.avatar,
  73. COUNT(t.id) as count
  74. FROM dt_user u
  75. LEFT JOIN dt_user t ON u.id = t.parent_id
  76. AND `+timeCondition+`
  77. CROSS JOIN (SELECT @rank := 0) r
  78. WHERE u.status = 1
  79. GROUP BY u.id
  80. HAVING count > 0
  81. ORDER BY count DESC
  82. LIMIT ?
  83. `, limit).Scan(&ranks)
  84. default:
  85. ctx.Fail("invalid_type")
  86. return
  87. }
  88. // 查询当前用户排名
  89. var myRank *RankInfo
  90. for _, rank := range ranks {
  91. if rank.UserId == userId {
  92. myRank = rank
  93. break
  94. }
  95. }
  96. // 如果当前用户不在榜单中,单独查询
  97. if myRank == nil {
  98. var user entity.DtUser
  99. if err := db.Where("id = ?", userId).First(&user).Error; err == nil {
  100. myRank = &RankInfo{
  101. Rank: 0,
  102. UserId: user.Id,
  103. Uid: user.Uid,
  104. Nickname: user.Nickname,
  105. Avatar: user.Avatar,
  106. Count: 0,
  107. }
  108. }
  109. }
  110. ctx.OK(gin.H{
  111. "list": ranks,
  112. "myRank": myRank,
  113. })
  114. }
  115. // RankReward 排行榜奖励配置
  116. func (s *Server) RankReward(c *gin.Context) {
  117. ctx := s.FromContext(c)
  118. db := s.DB()
  119. var configs []entity.DtLeaderboardReward
  120. db.Where("status = ?", 1).
  121. Order("rank_start ASC").
  122. Find(&configs)
  123. type RewardInfo struct {
  124. RankStart int `json:"rankStart"`
  125. RankEnd int `json:"rankEnd"`
  126. Reward float64 `json:"reward"`
  127. }
  128. rewards := make([]*RewardInfo, 0)
  129. for _, config := range configs {
  130. rewards = append(rewards, &RewardInfo{
  131. RankStart: config.RankStart,
  132. RankEnd: config.RankEnd,
  133. Reward: config.Reward,
  134. })
  135. }
  136. ctx.OK(gin.H{
  137. "list": rewards,
  138. })
  139. }