go-common/app/job/main/figure-timer/service/rank.go
2019-04-22 18:49:16 +08:00

84 lines
1.4 KiB
Go

package service
import (
"context"
"sort"
"sync"
"go-common/app/job/main/figure-timer/model"
"go-common/library/log"
)
var (
rank = &scores{}
)
type scores struct {
ss []int32
mu sync.Mutex
}
func (s *scores) AddScore(score int32) {
s.mu.Lock()
defer s.mu.Unlock()
s.ss = append(s.ss, score)
}
func (s *scores) Init() {
s.ss = make([]int32, 0)
}
func (s *scores) Sort() {
sort.Sort(s)
}
func (s *scores) Get(i int) int32 {
return s.ss[i]
}
func (s *scores) Len() int {
return len(s.ss)
}
func (s *scores) Less(i1, i2 int) bool {
return s.ss[i1] > s.ss[i2]
}
func (s *scores) Swap(i1, i2 int) {
s.ss[i1], s.ss[i2] = s.ss[i2], s.ss[i1]
}
func (s *Service) calcRank(c context.Context, ver int64) {
if rank.Len() <= 0 {
return
}
rank.Sort()
var (
scoreFrom, scoreTo int32
err error
)
scoreTo = rank.Get(0)
for i := int8(1); i <= 100; i++ {
var index int
if i == 100 {
scoreFrom = 0
} else {
index = int(float64(rank.Len()) * (float64(i) / 100.0))
scoreFrom = rank.Get(index)
}
if scoreFrom > scoreTo {
scoreTo = scoreFrom
}
r := &model.Rank{ScoreFrom: scoreFrom, ScoreTo: scoreTo, Percentage: i, Ver: ver}
if _, err = s.dao.InsertRankHistory(c, r); err != nil {
log.Error("%+v", err)
return
}
if _, err = s.dao.UpsertRank(c, r); err != nil {
log.Error("%+v", err)
return
}
scoreTo = scoreFrom - 1
}
}