| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- package daytask
- import (
- "app/commons/model/entity"
- "github.com/gin-gonic/gin"
- "time"
- )
- // RankList 排行榜列表
- func (s *Server) RankList(c *gin.Context) {
- ctx := s.FromContext(c)
- db := s.DB()
- userId := ctx.UserId()
- rankType := ctx.QueryString("type", "task") // task任务排行/invite邀请排行
- timeType := ctx.QueryString("timeType", "daily") // daily/weekly/monthly
- limit := ctx.QueryInt64("limit", 50)
- if limit > 100 {
- limit = 100
- }
- type RankInfo struct {
- Rank int `json:"rank"`
- UserId int64 `json:"userId"`
- Uid string `json:"uid"`
- Nickname string `json:"nickname"`
- Avatar string `json:"avatar"`
- Count int `json:"count"`
- }
- ranks := make([]*RankInfo, 0)
- // 时间条件
- var timeCondition string
- switch timeType {
- case "daily":
- timeCondition = "DATE(FROM_UNIXTIME(t.created_at)) = '" + time.Now().Format("2006-01-02") + "'"
- case "weekly":
- weekStart := time.Now().AddDate(0, 0, -int(time.Now().Weekday())).Format("2006-01-02")
- timeCondition = "DATE(FROM_UNIXTIME(t.created_at)) >= '" + weekStart + "'"
- case "monthly":
- month := time.Now().Format("2006-01")
- timeCondition = "DATE_FORMAT(FROM_UNIXTIME(t.created_at), '%Y-%m') = '" + month + "'"
- default:
- timeCondition = "DATE(FROM_UNIXTIME(t.created_at)) = '" + time.Now().Format("2006-01-02") + "'"
- }
- // 根据类型查询不同的排行榜
- switch rankType {
- case "task":
- // 任务完成数量排行
- db.Raw(`
- SELECT
- @rank := @rank + 1 as `+"`rank`"+`,
- u.id as user_id,
- u.uid,
- u.nickname,
- u.avatar,
- COUNT(t.id) as count
- FROM dt_user u
- LEFT JOIN dt_user_task t ON u.id = t.user_id
- AND t.status = ?
- AND `+timeCondition+`
- CROSS JOIN (SELECT @rank := 0) r
- WHERE u.status = 1
- GROUP BY u.id
- HAVING count > 0
- ORDER BY count DESC
- LIMIT ?
- `, entity.UserTaskStatusCompleted, limit).Scan(&ranks)
- case "invite":
- // 邀请人数排行
- db.Raw(`
- SELECT
- @rank := @rank + 1 as `+"`rank`"+`,
- u.id as user_id,
- u.uid,
- u.nickname,
- u.avatar,
- COUNT(t.id) as count
- FROM dt_user u
- LEFT JOIN dt_user t ON u.id = t.invite_user_id
- AND `+timeCondition+`
- CROSS JOIN (SELECT @rank := 0) r
- WHERE u.status = 1
- GROUP BY u.id
- HAVING count > 0
- ORDER BY count DESC
- LIMIT ?
- `, limit).Scan(&ranks)
- default:
- ctx.Fail("invalid_type")
- return
- }
- // 查询当前用户排名
- var myRank *RankInfo
- for _, rank := range ranks {
- if rank.UserId == userId {
- myRank = rank
- break
- }
- }
- // 如果当前用户不在榜单中,单独查询
- if myRank == nil {
- var user entity.DtUser
- if err := db.Where("id = ?", userId).First(&user).Error; err == nil {
- myRank = &RankInfo{
- Rank: 0,
- UserId: user.Id,
- Uid: user.Uid,
- Nickname: user.Nickname,
- Avatar: user.Avatar,
- Count: 0,
- }
- }
- }
- ctx.OK(gin.H{
- "list": ranks,
- "myRank": myRank,
- })
- }
- // RankReward 排行榜奖励配置
- func (s *Server) RankReward(c *gin.Context) {
- ctx := s.FromContext(c)
- db := s.DB()
- var configs []entity.DtLeaderboardReward
- db.Where("status = ?", 1).
- Order("rank_start ASC").
- Find(&configs)
- type RewardInfo struct {
- RankStart int `json:"rankStart"`
- RankEnd int `json:"rankEnd"`
- Reward float64 `json:"reward"`
- }
- rewards := make([]*RewardInfo, 0)
- for _, config := range configs {
- rewards = append(rewards, &RewardInfo{
- RankStart: config.RankStart,
- RankEnd: config.RankEnd,
- Reward: config.Reward,
- })
- }
- ctx.OK(gin.H{
- "list": rewards,
- })
- }
|