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.
140 lines
3.8 KiB
140 lines
3.8 KiB
package service |
|
|
|
import ( |
|
"math" |
|
"time" |
|
|
|
"go-common/app/job/main/up-rating/model" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
// Copy copy data from month to month |
|
func (s *Service) Copy(rch chan []*model.Rating, wch chan []*model.Rating, past map[int64]*model.Past, params *model.RatingParameter) { |
|
defer close(wch) |
|
for rs := range rch { |
|
for _, r := range rs { |
|
if _, ok := past[r.MID]; !ok { |
|
continue |
|
} |
|
r.MetaCreativityScore = 0 |
|
csr := past[r.MID].MetaCreativityScore |
|
if csr == 0 { |
|
r.CreativityScore = 0 |
|
} else { |
|
r.CreativityScore = int64(math.Min(float64(params.WCS)*math.Log(float64(csr)), float64(params.WCSR))) |
|
} |
|
|
|
r.MetaInfluenceScore = 0 |
|
isr := past[r.MID].MetaInfluenceScore |
|
if isr == 0 { |
|
r.InfluenceScore = 0 |
|
} else { |
|
r.InfluenceScore = int64(math.Min(float64(params.WIS)*math.Log(float64(isr)), float64(params.WISR))) |
|
} |
|
r.Date = xtime.Time(time.Date(r.Date.Time().Year(), r.Date.Time().Month()+1, 1, 0, 0, 0, 0, time.Local).Unix()) |
|
r.MagneticScore = r.CreativityScore + r.InfluenceScore + r.CreditScore |
|
} |
|
wch <- rs |
|
} |
|
} |
|
|
|
// CalScore cal rating score |
|
func (s *Service) CalScore(rch chan []*model.BaseInfo, |
|
wch chan []*model.Rating, |
|
params *model.RatingParameter, |
|
past map[int64]*model.Past, date time.Time) { |
|
defer close(wch) |
|
for bs := range rch { |
|
m := make([]*model.Rating, 0) |
|
for _, b := range bs { |
|
if !b.Date.Time().Equal(date) { |
|
continue |
|
} |
|
r := &model.Rating{ |
|
MID: b.MID, |
|
TagID: b.TagID, |
|
MetaCreativityScore: calCreativetyMetaScore(b, params), |
|
CreativityScore: calCreativityScore(b, params, past), |
|
MetaInfluenceScore: calInfluenceMetaScore(b, params), |
|
InfluenceScore: calInfluenceScore(b, params, past), |
|
CreditScore: calCreditScore(b, params, past), |
|
Date: b.Date, |
|
} |
|
r.MagneticScore = r.CreativityScore + r.InfluenceScore + r.CreditScore |
|
m = append(m, r) |
|
} |
|
wch <- m |
|
} |
|
} |
|
|
|
func calCreativetyMetaScore(b *model.BaseInfo, params *model.RatingParameter) int64 { |
|
// ps: 当月播放分 |
|
ps := params.WDP*b.PlayIncr + params.WDC*b.CoinIncr |
|
// ubs: 当月投稿低保分 |
|
ubs := params.WDV * int64(math.Min(float64(b.Avs), float64(params.WMDV))) |
|
// csm: 当月创作力得分 |
|
csm := ps + ubs |
|
return csm |
|
} |
|
|
|
func calCreativityScore(b *model.BaseInfo, params *model.RatingParameter, past map[int64]*model.Past) int64 { |
|
csm := calCreativetyMetaScore(b, params) |
|
// csr: csm + past 创作力原始分 |
|
var csr int64 |
|
if _, ok := past[b.MID]; ok { |
|
csr = csm + past[b.MID].MetaCreativityScore |
|
} else { |
|
csr = csm |
|
} |
|
if csr < 1 { |
|
return 0 |
|
} |
|
// cs: 创作力总分 |
|
cs := math.Min(float64(params.WCS)*math.Log(float64(csr)), float64(params.WCSR)) |
|
return int64(cs) |
|
} |
|
|
|
func calInfluenceMetaScore(b *model.BaseInfo, params *model.RatingParameter) int64 { |
|
// mfans: 当月活跃粉丝数 |
|
mfans := params.WMAAFans*(b.MAAFans+b.MAHFans) + params.WMAHFans*b.MAHFans |
|
return mfans |
|
} |
|
|
|
func calInfluenceScore(b *model.BaseInfo, params *model.RatingParameter, past map[int64]*model.Past) int64 { |
|
mfans := calInfluenceMetaScore(b, params) |
|
// isr: 影响力原始分 |
|
var isr int64 |
|
if _, ok := past[b.MID]; ok { |
|
isr = mfans + past[b.MID].MetaInfluenceScore |
|
} else { |
|
isr = mfans |
|
} |
|
if isr < 1 { |
|
return 0 |
|
} |
|
// is: up主影响力分 |
|
is := math.Min(float64(params.WIS)*math.Log(float64(isr)), float64(params.WISR)) |
|
return int64(is) |
|
} |
|
|
|
func calCreditScore(b *model.BaseInfo, params *model.RatingParameter, past map[int64]*model.Past) int64 { |
|
addScore := min(b.OpenAvs*params.HV, params.HVM) |
|
minusScore := min(b.LockedAvs*params.HL, params.HLM) |
|
var cs int64 |
|
if _, ok := past[b.MID]; ok { |
|
cs = past[b.MID].CreditScore + addScore - minusScore |
|
} else { |
|
cs = params.HBASE + addScore - minusScore |
|
} |
|
if cs < 0 { |
|
cs = 0 |
|
} |
|
return min(cs, params.HR) |
|
} |
|
|
|
func min(x, y int64) int64 { |
|
if x > y { |
|
return y |
|
} |
|
return x |
|
}
|
|
|