84 lines
1.4 KiB
Go
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
|
|
}
|
|
}
|