task_weight.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package task
  2. import (
  3. "sort"
  4. "sync"
  5. "time"
  6. "go-common/app/job/main/videoup-report/model/utils"
  7. )
  8. const (
  9. // UpperSuperWhite 优质>10w粉
  10. UpperSuperWhite = int8(1)
  11. // UpperSuperBlack 高危>10w粉
  12. UpperSuperBlack = int8(2)
  13. // UpperWhite 优质
  14. UpperWhite = int8(3)
  15. // UpperBigWhite 优质>1w粉
  16. UpperBigWhite = int8(4)
  17. // UpperBigNormal 普通>1w粉
  18. UpperBigNormal = int8(5)
  19. // UpperSuperNormal 普通>10w粉
  20. UpperSuperNormal = int8(6)
  21. // UpperBlack 高危
  22. UpperBlack = int8(7)
  23. // WConfMid 按照mid配置权重
  24. WConfMid = int8(0)
  25. // WConfTaskID 按照taskid配置权重
  26. WConfTaskID = int8(1)
  27. // WConfType 按照分区配置权重
  28. WConfType = int8(2)
  29. // WConfUpFrom 按照投稿来源配置权重
  30. WConfUpFrom = int8(3)
  31. //UpperTypeWhite 优质
  32. UpperTypeWhite int8 = 1
  33. //UpperTypeBlack 高危
  34. UpperTypeBlack int8 = 2
  35. //UpperTypePGC 生产组
  36. UpperTypePGC int8 = 3
  37. //UpperTypeUGCX don't know
  38. UpperTypeUGCX int8 = 3
  39. //UpperTypePolitices 时政
  40. UpperTypePolitices int8 = 5
  41. //UpperTypeEnterprise 企业
  42. UpperTypeEnterprise int8 = 7
  43. //UpperTypeSigned 签约
  44. UpperTypeSigned int8 = 15
  45. )
  46. var (
  47. // TaskCountTH 插队任务阈值
  48. TaskCountTH = 2000
  49. // SuperUpperTH 粉丝数阈值
  50. SuperUpperTH = int64(100000)
  51. // BigUpperTH 粉丝数阈值
  52. BigUpperTH = int64(10000)
  53. // WLVConf 各个权重等级具体的配置数值
  54. WLVConf = &WeightValueConf{
  55. MaxWeight: int64(200000), //最大权重值
  56. MinWeight: int64(-510),
  57. SubRelease: int64(18), //指派再释放的任务
  58. //特殊任务参数
  59. Slv1: int64(8), // 普通用户>=1W粉
  60. Slv2: int64(10), // 普通用户>=10W粉
  61. Slv3: int64(12), // 优质用户<1W粉
  62. Slv4: int64(15), // 优质用户>=1W粉
  63. Slv5: int64(18), // 优质用户>=10W粉
  64. Slv6: int64(6), // 高危用户>=10W粉
  65. Slv7: int64(0), // 其他高危
  66. //普通任务参数
  67. Nlv1: int64(3),
  68. Nlv2: int64(6),
  69. Nlv3: int64(9),
  70. Nlv4: int64(12),
  71. Nlv5: int64(0),
  72. Nsum9: int64(0), // 等待9分钟总和 3*0
  73. Nsum15: int64(6), // 等待15分钟总和 2*3
  74. Nsum27: int64(30), // 等待27分钟总和 6 + 4*6
  75. Nsum45: int64(84), // 等待45分钟总和 30 + 6*9
  76. //定时任务参数
  77. Tlv1: int64(3),
  78. Tlv2: int64(9),
  79. Tlv3: int64(21),
  80. Tlv4: int64(0),
  81. Tsum2h: int64(120),
  82. Tsum1h: int64(300),
  83. }
  84. )
  85. //WeightValueConf 可配置的权重
  86. type WeightValueConf struct {
  87. MaxWeight int64 `json:"maxweight"`
  88. SubRelease int64 `json:"subrelease"`
  89. MinWeight int64 `json:"minweight"`
  90. Slv1 int64 `json:"slv1"`
  91. Slv2 int64 `json:"slv2"`
  92. Slv3 int64 `json:"slv3"`
  93. Slv4 int64 `json:"slv4"`
  94. Slv5 int64 `json:"slv5"`
  95. Slv6 int64 `json:"slv6"`
  96. Slv7 int64 `json:"slv7"`
  97. Nlv1 int64 `json:"nlv1"`
  98. Nlv2 int64 `json:"nlv2"`
  99. Nlv3 int64 `json:"nlv3"`
  100. Nlv4 int64 `json:"nlv4"`
  101. Nlv5 int64 `json:"nlv5"`
  102. Nsum9 int64 `json:"-"`
  103. Nsum15 int64 `json:"-"`
  104. Nsum27 int64 `json:"-"`
  105. Nsum45 int64 `json:"-"`
  106. Tlv1 int64 `json:"tlv1"`
  107. Tlv2 int64 `json:"tlv2"`
  108. Tlv3 int64 `json:"tlv3"`
  109. Tlv4 int64 `json:"tlv4"`
  110. Tsum2h int64 `json:"-"`
  111. Tsum1h int64 `json:"-"`
  112. }
  113. //WeightConfig task_weight_config记录结构
  114. type WeightConfig struct {
  115. ID int64
  116. Mid int64
  117. TaskID int64
  118. Rule int8
  119. Weight int64
  120. Ctime time.Time
  121. Mtime time.Time
  122. UserName string
  123. Desc string
  124. }
  125. //WeightParams 审核任务权重的相关参数
  126. type WeightParams struct {
  127. TaskID int64 `json:"taskid"`
  128. Weight int64 `json:"weight"` //权重总值
  129. State int8 `json:"state"` //任务状态
  130. Mid int64 `json:"mid"`
  131. Special int8 `json:"special"` //特殊任务
  132. Ctime utils.FormatTime `json:"ctime"` //任务生成时间
  133. Ptime utils.FormatTime `json:"ptime"` //定时发布时间
  134. CfItems []*ConfigItem `json:"cfitems,omitempty"`
  135. Fans int64 `json:"fans"` //粉丝数
  136. AccFailed bool `json:"accfaild"` //账号查询是否失败
  137. UpGroups []int8 `json:"ugs"` //分组
  138. UpFrom int8 `json:"upfrom"` //来源
  139. TypeID int16 `json:"typeid"` //分区
  140. }
  141. // ConfigItem task weight config item
  142. type ConfigItem struct {
  143. ID int64 `json:"id"`
  144. Radio int8 `json:"radio"`
  145. CID int64 `json:"cid"` // config id 四种配置通用
  146. Uname string `json:"user,omitempty"`
  147. Rule int8 `json:"rule"`
  148. Weight int64 `json:"weight"`
  149. Mtime utils.FormatTime `json:"mtime"`
  150. Desc string `json:"desc,omitempty"`
  151. Bt utils.FormatTime `json:"et"`
  152. Et utils.FormatTime `json:"bt"`
  153. }
  154. //WeightLog 权重变更记录
  155. type WeightLog struct {
  156. TaskID int64 `json:"taskid"`
  157. Mid int64 `json:"mid"` //用户id
  158. Weight int64 `json:"weight"` //任务权重总和
  159. CWeight int64 `json:"cweight"` //配置权重
  160. NWeight int64 `json:"nweight"` //普通任务
  161. SWeight int64 `json:"sweight"` //特殊任务
  162. TWeight int64 `json:"tweight"` //定时任务
  163. Uptime utils.FormatTime `json:"uptime"` //更新时间
  164. CfItems []*ConfigItem `json:"cfitems,omitempty"`
  165. }
  166. // JumpList 插队同步的任务
  167. type JumpList struct {
  168. l []*WeightLog
  169. min int64
  170. count int
  171. mux sync.RWMutex
  172. }
  173. // NewJumpList New JumpList
  174. func NewJumpList() *JumpList {
  175. return &JumpList{
  176. l: []*WeightLog{},
  177. min: -1,
  178. count: 0,
  179. }
  180. }
  181. // PUSH 添加
  182. func (jl *JumpList) PUSH(item *WeightLog) {
  183. jl.mux.Lock()
  184. defer jl.mux.Unlock()
  185. if jl.count == TaskCountTH { //队列满了
  186. if item.Weight > jl.min { //剔除最小的
  187. jl.l = jl.l[1:jl.count]
  188. jl.min = jl.l[0].Weight
  189. jl.count--
  190. } else {
  191. return
  192. }
  193. }
  194. inx := sort.SearchInts(jl.List(), int(item.Weight))
  195. switch {
  196. case inx == 0: //头部
  197. jl.l = append([]*WeightLog{item}, jl.l...)
  198. jl.min = item.Weight
  199. case inx == jl.count: //尾部
  200. jl.l = append(jl.l, item)
  201. default:
  202. rear := append([]*WeightLog{}, jl.l[inx:]...)
  203. jl.l = append(jl.l[:inx], item)
  204. jl.l = append(jl.l, rear...)
  205. }
  206. jl.count++
  207. }
  208. // POP 读取
  209. func (jl *JumpList) POP() (item *WeightLog) {
  210. jl.mux.Lock()
  211. defer jl.mux.Unlock()
  212. if jl.count > 1 {
  213. item = jl.l[jl.count-1]
  214. jl.l = jl.l[:jl.count-1]
  215. jl.count--
  216. jl.min = jl.l[jl.count-1].Weight
  217. return
  218. } else if jl.count == 1 {
  219. item = jl.l[0]
  220. jl.l = []*WeightLog{}
  221. jl.count = 0
  222. jl.min = -1
  223. return
  224. }
  225. return nil
  226. }
  227. // Reset 重置
  228. func (jl *JumpList) Reset() {
  229. jl.mux.Lock()
  230. defer jl.mux.Unlock()
  231. jl.l = []*WeightLog{}
  232. jl.min = -1
  233. jl.count = 0
  234. }
  235. // List 待更新权重的任务
  236. func (jl *JumpList) List() []int {
  237. arr := []int{}
  238. for _, jw := range jl.l {
  239. arr = append(arr, int(jw.Weight))
  240. }
  241. return arr
  242. }