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.parent_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, }) }