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.
259 lines
6.6 KiB
259 lines
6.6 KiB
package task |
|
|
|
import ( |
|
"sort" |
|
"sync" |
|
"time" |
|
|
|
"go-common/app/job/main/videoup-report/model/utils" |
|
) |
|
|
|
const ( |
|
// UpperSuperWhite 优质>10w粉 |
|
UpperSuperWhite = int8(1) |
|
// UpperSuperBlack 高危>10w粉 |
|
UpperSuperBlack = int8(2) |
|
// UpperWhite 优质 |
|
UpperWhite = int8(3) |
|
// UpperBigWhite 优质>1w粉 |
|
UpperBigWhite = int8(4) |
|
// UpperBigNormal 普通>1w粉 |
|
UpperBigNormal = int8(5) |
|
// UpperSuperNormal 普通>10w粉 |
|
UpperSuperNormal = int8(6) |
|
// UpperBlack 高危 |
|
UpperBlack = int8(7) |
|
// WConfMid 按照mid配置权重 |
|
WConfMid = int8(0) |
|
// WConfTaskID 按照taskid配置权重 |
|
WConfTaskID = int8(1) |
|
// WConfType 按照分区配置权重 |
|
WConfType = int8(2) |
|
// WConfUpFrom 按照投稿来源配置权重 |
|
WConfUpFrom = int8(3) |
|
|
|
//UpperTypeWhite 优质 |
|
UpperTypeWhite int8 = 1 |
|
//UpperTypeBlack 高危 |
|
UpperTypeBlack int8 = 2 |
|
//UpperTypePGC 生产组 |
|
UpperTypePGC int8 = 3 |
|
//UpperTypeUGCX don't know |
|
UpperTypeUGCX int8 = 3 |
|
//UpperTypePolitices 时政 |
|
UpperTypePolitices int8 = 5 |
|
//UpperTypeEnterprise 企业 |
|
UpperTypeEnterprise int8 = 7 |
|
//UpperTypeSigned 签约 |
|
UpperTypeSigned int8 = 15 |
|
) |
|
|
|
var ( |
|
// TaskCountTH 插队任务阈值 |
|
TaskCountTH = 2000 |
|
// SuperUpperTH 粉丝数阈值 |
|
SuperUpperTH = int64(100000) |
|
// BigUpperTH 粉丝数阈值 |
|
BigUpperTH = int64(10000) |
|
// WLVConf 各个权重等级具体的配置数值 |
|
WLVConf = &WeightValueConf{ |
|
MaxWeight: int64(200000), //最大权重值 |
|
MinWeight: int64(-510), |
|
SubRelease: int64(18), //指派再释放的任务 |
|
//特殊任务参数 |
|
Slv1: int64(8), // 普通用户>=1W粉 |
|
Slv2: int64(10), // 普通用户>=10W粉 |
|
Slv3: int64(12), // 优质用户<1W粉 |
|
Slv4: int64(15), // 优质用户>=1W粉 |
|
Slv5: int64(18), // 优质用户>=10W粉 |
|
Slv6: int64(6), // 高危用户>=10W粉 |
|
Slv7: int64(0), // 其他高危 |
|
//普通任务参数 |
|
Nlv1: int64(3), |
|
Nlv2: int64(6), |
|
Nlv3: int64(9), |
|
Nlv4: int64(12), |
|
Nlv5: int64(0), |
|
Nsum9: int64(0), // 等待9分钟总和 3*0 |
|
Nsum15: int64(6), // 等待15分钟总和 2*3 |
|
Nsum27: int64(30), // 等待27分钟总和 6 + 4*6 |
|
Nsum45: int64(84), // 等待45分钟总和 30 + 6*9 |
|
//定时任务参数 |
|
Tlv1: int64(3), |
|
Tlv2: int64(9), |
|
Tlv3: int64(21), |
|
Tlv4: int64(0), |
|
Tsum2h: int64(120), |
|
Tsum1h: int64(300), |
|
} |
|
) |
|
|
|
//WeightValueConf 可配置的权重 |
|
type WeightValueConf struct { |
|
MaxWeight int64 `json:"maxweight"` |
|
SubRelease int64 `json:"subrelease"` |
|
MinWeight int64 `json:"minweight"` |
|
Slv1 int64 `json:"slv1"` |
|
Slv2 int64 `json:"slv2"` |
|
Slv3 int64 `json:"slv3"` |
|
Slv4 int64 `json:"slv4"` |
|
Slv5 int64 `json:"slv5"` |
|
Slv6 int64 `json:"slv6"` |
|
Slv7 int64 `json:"slv7"` |
|
Nlv1 int64 `json:"nlv1"` |
|
Nlv2 int64 `json:"nlv2"` |
|
Nlv3 int64 `json:"nlv3"` |
|
Nlv4 int64 `json:"nlv4"` |
|
Nlv5 int64 `json:"nlv5"` |
|
Nsum9 int64 `json:"-"` |
|
Nsum15 int64 `json:"-"` |
|
Nsum27 int64 `json:"-"` |
|
Nsum45 int64 `json:"-"` |
|
Tlv1 int64 `json:"tlv1"` |
|
Tlv2 int64 `json:"tlv2"` |
|
Tlv3 int64 `json:"tlv3"` |
|
Tlv4 int64 `json:"tlv4"` |
|
Tsum2h int64 `json:"-"` |
|
Tsum1h int64 `json:"-"` |
|
} |
|
|
|
//WeightConfig task_weight_config记录结构 |
|
type WeightConfig struct { |
|
ID int64 |
|
Mid int64 |
|
TaskID int64 |
|
Rule int8 |
|
Weight int64 |
|
Ctime time.Time |
|
Mtime time.Time |
|
UserName string |
|
Desc string |
|
} |
|
|
|
//WeightParams 审核任务权重的相关参数 |
|
type WeightParams struct { |
|
TaskID int64 `json:"taskid"` |
|
Weight int64 `json:"weight"` //权重总值 |
|
State int8 `json:"state"` //任务状态 |
|
Mid int64 `json:"mid"` |
|
Special int8 `json:"special"` //特殊任务 |
|
Ctime utils.FormatTime `json:"ctime"` //任务生成时间 |
|
Ptime utils.FormatTime `json:"ptime"` //定时发布时间 |
|
CfItems []*ConfigItem `json:"cfitems,omitempty"` |
|
Fans int64 `json:"fans"` //粉丝数 |
|
AccFailed bool `json:"accfaild"` //账号查询是否失败 |
|
|
|
UpGroups []int8 `json:"ugs"` //分组 |
|
UpFrom int8 `json:"upfrom"` //来源 |
|
TypeID int16 `json:"typeid"` //分区 |
|
} |
|
|
|
// ConfigItem task weight config item |
|
type ConfigItem struct { |
|
ID int64 `json:"id"` |
|
Radio int8 `json:"radio"` |
|
CID int64 `json:"cid"` // config id 四种配置通用 |
|
Uname string `json:"user,omitempty"` |
|
Rule int8 `json:"rule"` |
|
Weight int64 `json:"weight"` |
|
Mtime utils.FormatTime `json:"mtime"` |
|
Desc string `json:"desc,omitempty"` |
|
Bt utils.FormatTime `json:"et"` |
|
Et utils.FormatTime `json:"bt"` |
|
} |
|
|
|
//WeightLog 权重变更记录 |
|
type WeightLog struct { |
|
TaskID int64 `json:"taskid"` |
|
Mid int64 `json:"mid"` //用户id |
|
Weight int64 `json:"weight"` //任务权重总和 |
|
CWeight int64 `json:"cweight"` //配置权重 |
|
NWeight int64 `json:"nweight"` //普通任务 |
|
SWeight int64 `json:"sweight"` //特殊任务 |
|
TWeight int64 `json:"tweight"` //定时任务 |
|
Uptime utils.FormatTime `json:"uptime"` //更新时间 |
|
CfItems []*ConfigItem `json:"cfitems,omitempty"` |
|
} |
|
|
|
// JumpList 插队同步的任务 |
|
type JumpList struct { |
|
l []*WeightLog |
|
min int64 |
|
count int |
|
mux sync.RWMutex |
|
} |
|
|
|
// NewJumpList New JumpList |
|
func NewJumpList() *JumpList { |
|
return &JumpList{ |
|
l: []*WeightLog{}, |
|
min: -1, |
|
count: 0, |
|
} |
|
} |
|
|
|
// PUSH 添加 |
|
func (jl *JumpList) PUSH(item *WeightLog) { |
|
jl.mux.Lock() |
|
defer jl.mux.Unlock() |
|
if jl.count == TaskCountTH { //队列满了 |
|
if item.Weight > jl.min { //剔除最小的 |
|
jl.l = jl.l[1:jl.count] |
|
jl.min = jl.l[0].Weight |
|
jl.count-- |
|
} else { |
|
return |
|
} |
|
} |
|
inx := sort.SearchInts(jl.List(), int(item.Weight)) |
|
switch { |
|
case inx == 0: //头部 |
|
jl.l = append([]*WeightLog{item}, jl.l...) |
|
jl.min = item.Weight |
|
case inx == jl.count: //尾部 |
|
jl.l = append(jl.l, item) |
|
default: |
|
rear := append([]*WeightLog{}, jl.l[inx:]...) |
|
jl.l = append(jl.l[:inx], item) |
|
jl.l = append(jl.l, rear...) |
|
} |
|
jl.count++ |
|
} |
|
|
|
// POP 读取 |
|
func (jl *JumpList) POP() (item *WeightLog) { |
|
jl.mux.Lock() |
|
defer jl.mux.Unlock() |
|
if jl.count > 1 { |
|
item = jl.l[jl.count-1] |
|
jl.l = jl.l[:jl.count-1] |
|
jl.count-- |
|
jl.min = jl.l[jl.count-1].Weight |
|
return |
|
} else if jl.count == 1 { |
|
item = jl.l[0] |
|
jl.l = []*WeightLog{} |
|
jl.count = 0 |
|
jl.min = -1 |
|
return |
|
} |
|
return nil |
|
} |
|
|
|
// Reset 重置 |
|
func (jl *JumpList) Reset() { |
|
jl.mux.Lock() |
|
defer jl.mux.Unlock() |
|
jl.l = []*WeightLog{} |
|
jl.min = -1 |
|
jl.count = 0 |
|
} |
|
|
|
// List 待更新权重的任务 |
|
func (jl *JumpList) List() []int { |
|
arr := []int{} |
|
for _, jw := range jl.l { |
|
arr = append(arr, int(jw.Weight)) |
|
} |
|
return arr |
|
}
|
|
|