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", "daily") // daily/weekly/monthly/total 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"` Amount float64 `json:"amount"` } ranks := make([]*RankInfo, 0) // 根据类型查询不同的排行榜 switch rankType { case "daily": // 今日收益排行 today := time.Now().Format("2006-01-02") db.Raw(` SELECT @rank := @rank + 1 as rank, u.id as user_id, u.uid, u.nickname, u.avatar, COALESCE(SUM(bl.amount), 0) as amount FROM dt_user u LEFT JOIN dt_balance_log bl ON u.id = bl.user_id AND bl.type IN (?, ?) AND DATE(FROM_UNIXTIME(bl.created_at)) = ? CROSS JOIN (SELECT @rank := 0) r WHERE u.status = 1 GROUP BY u.id HAVING amount > 0 ORDER BY amount DESC LIMIT ? `, entity.BalanceLogTypeTaskIncome, entity.BalanceLogTypeCommission, today, limit).Scan(&ranks) case "weekly": // 本周收益排行 weekStart := time.Now().AddDate(0, 0, -int(time.Now().Weekday())).Format("2006-01-02") db.Raw(` SELECT @rank := @rank + 1 as rank, u.id as user_id, u.uid, u.nickname, u.avatar, COALESCE(SUM(bl.amount), 0) as amount FROM dt_user u LEFT JOIN dt_balance_log bl ON u.id = bl.user_id AND bl.type IN (?, ?) AND DATE(FROM_UNIXTIME(bl.created_at)) >= ? CROSS JOIN (SELECT @rank := 0) r WHERE u.status = 1 GROUP BY u.id HAVING amount > 0 ORDER BY amount DESC LIMIT ? `, entity.BalanceLogTypeTaskIncome, entity.BalanceLogTypeCommission, weekStart, limit).Scan(&ranks) case "monthly": // 本月收益排行 month := time.Now().Format("2006-01") db.Raw(` SELECT @rank := @rank + 1 as rank, u.id as user_id, u.uid, u.nickname, u.avatar, COALESCE(SUM(bl.amount), 0) as amount FROM dt_user u LEFT JOIN dt_balance_log bl ON u.id = bl.user_id AND bl.type IN (?, ?) AND DATE_FORMAT(FROM_UNIXTIME(bl.created_at), '%Y-%m') = ? CROSS JOIN (SELECT @rank := 0) r WHERE u.status = 1 GROUP BY u.id HAVING amount > 0 ORDER BY amount DESC LIMIT ? `, entity.BalanceLogTypeTaskIncome, entity.BalanceLogTypeCommission, month, limit).Scan(&ranks) case "total": // 累计收益排行 db.Raw(` SELECT @rank := @rank + 1 as rank, id as user_id, uid, nickname, avatar, total_income as amount FROM dt_user CROSS JOIN (SELECT @rank := 0) r WHERE status = 1 AND total_income > 0 ORDER BY total_income 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, Amount: user.TotalIncome, } } } 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, }) }