You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.9 KiB
99 lines
2.9 KiB
package calorie_service
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/ouxuanserver/osmanthuswine/src/core"
|
|
"hudongzhuanjia/models"
|
|
"time"
|
|
)
|
|
|
|
func GetCurrentCalorie(aid, uid, rid int64) (map[string]interface{}, error) {
|
|
calorie := new(models.Calorie)
|
|
exist, err := calorie.GetCurrent(aid)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !exist {
|
|
return nil, errors.New("轮次尚未开启")
|
|
}
|
|
calorieUser := new(models.CalorieUser)
|
|
exist, err = calorieUser.GetByCalorieIdAndUserId(calorie.Id, uid, rid)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !exist { // 不存在,代表最后一名
|
|
calorieUser.ActivityId = aid
|
|
calorieUser.RehearsalId = rid
|
|
calorieUser.UserId = uid
|
|
calorieUser.CalorieId = calorie.Id
|
|
calorieUser.Score = 0
|
|
calorieUser.IsDelete = false
|
|
calorieUser.JoinTime = time.Now().UnixNano()
|
|
calorieUser.CreatedAt = time.Now()
|
|
calorieUser.UpdatedAt = time.Now()
|
|
if _, err = core.GetXormAuto().InsertOne(calorieUser); err != nil {
|
|
return nil, err
|
|
}
|
|
rank, err := core.GetXormAuto().Where("is_delete=0 and calorie_id=? and rehearsal_id=?",
|
|
calorie.Id, rid).Count(new(models.CalorieUser))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return map[string]interface{}{
|
|
"rank": rank,
|
|
"score": calorieUser.Score,
|
|
"calorie_id": calorie.Id,
|
|
}, nil
|
|
} else { // 存在
|
|
|
|
// 计算总数
|
|
count, err := core.GetXormAuto().Where("is_delete=0 and calorie_id=? and rehearsal_id=?", calorie.Id, rid).Count(new(models.CalorieUser))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 计算分数 和 用户偏移量
|
|
users := make([]*models.CalorieUser, 0)
|
|
err = core.GetXormAuto().Where("is_delete=0 and calorie_id=? and rehearsal_id=? and score<=?",
|
|
calorie.Id, rid, calorieUser.Score).Desc("score").Asc("join_time").Find(&users) // desc score asc updated_at
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var rank int
|
|
for index, u := range users {
|
|
if u.Id == calorieUser.Id {
|
|
rank = int(count) - len(users) + index + 1 // 总数
|
|
break
|
|
}
|
|
}
|
|
|
|
return map[string]interface{}{
|
|
"rank": rank,
|
|
"score": calorieUser.Score,
|
|
"calorie_id": calorie.Id,
|
|
}, nil
|
|
}
|
|
}
|
|
|
|
type CalorieCountResult struct {
|
|
Id int64 `json:"id"`
|
|
ActivityId int64 `json:"activity_id"`
|
|
CalorieId int64 `json:"calorie_id"`
|
|
UserId int64 `json:"user_id"`
|
|
Avatar string `json:"avatar"`
|
|
Nickname string `json:"nickname"`
|
|
Score int64 `json:"score"`
|
|
}
|
|
|
|
func RankCalorieUser(calorieId, rehearsalId interface{}, limit int) ([]*CalorieCountResult, error) {
|
|
// 统计排名
|
|
result := make([]*CalorieCountResult, 0)
|
|
err := core.GetXormAuto().Table(new(models.CalorieUser)).Alias("c").
|
|
Select("c.id, c.activity_id, c.calorie_id, c.user_id, u.avatar, u.nickname, c.score, c.join_time").
|
|
Join("LEFT", new(models.User).Alias("u"), "c.user_id=u.id and u.is_delete=0").
|
|
Where("c.is_delete=0 and c.calorie_id=? and c.rehearsal_id=?", calorieId, rehearsalId).
|
|
Limit(limit).Desc("c.score").Asc("c.join_time").Find(&result)
|
|
|
|
return result, err
|
|
}
|