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.
 
 
 

292 lines
7.1 KiB

package service
import (
"context"
"strings"
"time"
"go-common/app/interface/main/videoup/conf"
"go-common/app/interface/main/videoup/dao/account"
"go-common/app/interface/main/videoup/dao/archive"
"go-common/app/interface/main/videoup/dao/bfs"
"go-common/app/interface/main/videoup/dao/creative"
"go-common/app/interface/main/videoup/dao/dynamic"
"go-common/app/interface/main/videoup/dao/elec"
"go-common/app/interface/main/videoup/dao/filter"
"go-common/app/interface/main/videoup/dao/geetest"
"go-common/app/interface/main/videoup/dao/mission"
"go-common/app/interface/main/videoup/dao/order"
"go-common/app/interface/main/videoup/dao/pay"
"go-common/app/interface/main/videoup/dao/subtitle"
"go-common/app/interface/main/videoup/dao/tag"
arcmdl "go-common/app/interface/main/videoup/model/archive"
missmdl "go-common/app/interface/main/videoup/model/mission"
"go-common/app/interface/main/videoup/model/porder"
"go-common/library/log"
binfoc "go-common/library/log/infoc"
"sync"
)
// Service is archive and videos service.
type Service struct {
c *conf.Config
// dao
arc *archive.Dao
acc *account.Dao
bfs *bfs.Dao
miss *mission.Dao
elec *elec.Dao
order *order.Dao
tag *tag.Dao
creative *creative.Dao
filter *filter.Dao
gt *geetest.Dao
dynamic *dynamic.Dao
sub *subtitle.Dao
pay *pay.Dao
wg sync.WaitGroup
asyncCh chan func() error
// type cache
typeCache map[int16]*arcmdl.Type
orderUps map[int64]int64
staffUps map[int64]int64
missCache map[int]*missmdl.Mission
missTagsCache map[string]int
staffTypeCache map[int16]*arcmdl.StaffTypeConf
staffGary bool
descFmtsCache map[int16]map[int8][]*arcmdl.DescFormat
exemptIDCheckUps map[int64]int64
exemptZeroLevelAndAnswerUps map[int64]int64
exemptUgcPayUps map[int64]int64
exemptHalfMinUps map[int64]int64
PorderCfgs map[int64]*porder.Config
PorderGames map[int64]*porder.Game
infoc *binfoc.Infoc
}
// New new a service.
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
arc: archive.New(c),
acc: account.New(c),
bfs: bfs.New(c),
miss: mission.New(c),
elec: elec.New(c),
order: order.New(c),
tag: tag.New(c),
creative: creative.New(c),
filter: filter.New(c),
gt: geetest.New(c),
dynamic: dynamic.New(c),
sub: subtitle.New(c),
pay: pay.New(c),
asyncCh: make(chan func() error, 100),
infoc: binfoc.New(c.AppEditorInfoc),
}
s.loadType()
s.loadMission()
s.loadOrderUps()
s.loadPorderCfgListAsMap()
s.loadPorderGameListAsMap()
s.loadExemptIDCheckUps()
s.loadDescFormatCache()
s.loadExemptZeroLevelAndAnswer()
s.loadExemptUgcPayUps()
s.loadStaffUps()
s.loadStaffConfig()
s.loadExemptHalfMinUps()
go s.loadproc()
go s.asyncproc()
return s
}
func (s *Service) asyncproc() {
s.wg.Add(1)
defer s.wg.Done()
for {
f, ok := <-s.asyncCh
if !ok {
return
}
retry(3, 1*time.Second, f)
}
}
func retry(attempts int, sleep time.Duration, callback func() error) (err error) {
for i := 0; ; i++ {
err = callback()
if err == nil {
return
}
if i >= (attempts - 1) {
break
}
time.Sleep(sleep)
log.Error("asyncproc retry retrying after error:(%+v)", err)
}
log.Error("asyncproc retry after %d attempts, last error: %s", attempts, err)
return nil
}
func (s *Service) loadType() {
tpm, err := s.arc.TypeMapping(context.TODO())
if err != nil {
log.Error("s.arc.TypeMapping error(%v)", err)
return
}
s.typeCache = tpm
}
// s.missTagsCache: missionName or first tag
func (s *Service) loadMission() {
mm, err := s.miss.Missions(context.TODO())
if err != nil {
log.Error("s.miss.Mission error(%v)", err)
return
}
s.missTagsCache = make(map[string]int)
for _, m := range mm {
if len(m.Tags) > 0 {
splitedTags := strings.Split(m.Tags, ",")
s.missTagsCache[splitedTags[0]] = m.ID
} else {
s.missTagsCache[m.Name] = m.ID
}
}
s.missCache = mm
}
func (s *Service) loadOrderUps() {
orderUps, err := s.order.Ups(context.TODO())
if err != nil {
return
}
s.orderUps = orderUps
}
// loadDescFormatCache
func (s *Service) loadDescFormatCache() {
fmts, err := s.arc.DescFormat(context.TODO())
if err != nil {
return
}
newFmts := make(map[int16]map[int8][]*arcmdl.DescFormat)
for _, d := range fmts {
if _, okTp := newFmts[d.TypeID]; !okTp {
newFmts[d.TypeID] = make(map[int8][]*arcmdl.DescFormat)
}
if _, okCp := newFmts[d.TypeID][d.Copyright]; !okCp {
newFmts[d.TypeID][d.Copyright] = []*arcmdl.DescFormat{}
}
newFmts[d.TypeID][d.Copyright] = append(newFmts[d.TypeID][d.Copyright], d)
}
log.Info("s.loadDescFormat: newFmts(%d), fmts(%d)", len(newFmts), len(fmts))
s.descFmtsCache = newFmts
}
func (s *Service) loadStaffUps() {
staffUps, err := s.arc.StaffUps(context.TODO())
if err != nil {
return
}
s.staffUps = staffUps
}
func (s *Service) loadproc() {
for {
time.Sleep(time.Duration(s.c.Tick))
s.loadType()
s.loadMission()
s.loadExemptIDCheckUps()
s.loadExemptZeroLevelAndAnswer()
s.loadExemptUgcPayUps()
s.loadExemptHalfMinUps()
s.loadDescFormatCache()
s.loadOrderUps()
s.loadPorderCfgListAsMap()
s.loadPorderGameListAsMap()
s.loadStaffUps()
s.loadStaffConfig()
}
}
func (s *Service) loadPorderCfgListAsMap() {
porderCfgList, err := s.arc.PorderCfgList(context.TODO())
if err != nil {
log.Error("s.arc.PorderCfgList error(%v)", err)
return
}
s.PorderCfgs = porderCfgList
}
func (s *Service) loadPorderGameListAsMap() {
list, err := s.arc.GameList(context.TODO())
if err != nil {
log.Error("GameList error(%v)", err)
return
}
if len(list) == 0 || list == nil {
log.Error("GameList empty error(%v)", err)
return
}
s.PorderGames = list
}
// Ping ping success.
func (s *Service) Ping(c context.Context) (err error) {
return s.arc.Ping(c)
}
// Close close resource.
func (s *Service) Close() {
s.acc.Close()
s.arc.Close()
s.infoc.Close()
close(s.asyncCh)
s.wg.Wait()
}
// loadExemptIDCheckUps
func (s *Service) loadExemptIDCheckUps() {
ups, err := s.arc.UpSpecial(context.TODO(), 8)
if err != nil {
return
}
s.exemptIDCheckUps = ups
}
// loadExemptIDCheckUps
func (s *Service) loadExemptZeroLevelAndAnswer() {
ups, err := s.arc.UpSpecial(context.TODO(), 12)
if err != nil {
return
}
s.exemptZeroLevelAndAnswerUps = ups
}
// loadExemptUgcPayUps
func (s *Service) loadExemptUgcPayUps() {
ups, err := s.arc.UpSpecial(context.TODO(), 17)
if err != nil {
return
}
s.exemptUgcPayUps = ups
}
// loadStaffConfig 加载联合投稿分区配置
func (s *Service) loadStaffConfig() {
var err error
if s.staffGary, s.staffTypeCache, err = s.arc.StaffTypeConfig(context.TODO()); err != nil {
s.staffGary = true //怕权限被放出,没有获取到 creative配置的时候,默认开启了灰度策略
}
}
// loadExemptHalfMinUps
func (s *Service) loadExemptHalfMinUps() {
ups, err := s.arc.UpSpecial(context.TODO(), 25)
if err != nil {
return
}
s.exemptHalfMinUps = ups
}