bilibili-backup/app/service/main/coupon/service/service.go
2019-04-22 02:59:20 +00:00

144 lines
3.6 KiB
Go

package service
import (
"context"
"math/rand"
"time"
"github.com/pkg/errors"
"go-common/app/service/main/coupon/conf"
"go-common/app/service/main/coupon/dao"
"go-common/app/service/main/coupon/model"
v1 "go-common/app/service/main/vipinfo/api"
"go-common/library/log"
"go-common/library/sync/pipeline/fanout"
)
var (
_emptyCoupons = make([]*model.CouponInfo, 0)
_emptyBlance = make([]*model.CouponBalanceInfo, 0)
_emptyAllowance = make([]*model.CouponAllowanceInfo, 0)
_defps = 20
_defpn = 1
_deftitle = "观影劵"
_defCartoonTitle = "漫画体验券"
_maxCount int64 = -1
)
// Service struct
type Service struct {
c *conf.Config
dao *dao.Dao
r *rand.Rand
messageChan chan func()
cache *fanout.Fanout
allBranchInfo map[string]*model.CouponBatchInfo
vipinfoClient v1.VipInfoClient //vipinfo grpc client
MapNoVipBatchToken map[int8]string
MapMonthBatchToken map[int8]string
MapMore180BatchToken map[int8]string
MapLess180BatchToken map[int8]string
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
r: rand.New(rand.NewSource(time.Now().Unix())),
allBranchInfo: make(map[string]*model.CouponBatchInfo),
messageChan: make(chan func(), 10240),
// cache chan
cache: fanout.New("cache", fanout.Buffer(10240)),
MapNoVipBatchToken: map[int8]string{
model.CardType1: c.NewYearConf.NoVipBatchToken1,
model.CardType3: c.NewYearConf.NoVipBatchToken3,
model.CardType12: c.NewYearConf.NoVipBatchToken12,
},
MapMonthBatchToken: map[int8]string{
model.CardType1: c.NewYearConf.MonthBatchToken1,
model.CardType3: c.NewYearConf.MonthBatchToken3,
model.CardType12: c.NewYearConf.MonthBatchToken12,
},
MapMore180BatchToken: map[int8]string{
model.CardType1: c.NewYearConf.More180BatchToken1,
model.CardType3: c.NewYearConf.More180BatchToken3,
model.CardType12: c.NewYearConf.More180BatchToken12,
},
MapLess180BatchToken: map[int8]string{
model.CardType1: c.NewYearConf.Less180BatchToken1,
model.CardType3: c.NewYearConf.Less180BatchToken3,
model.CardType12: c.NewYearConf.Less180BatchToken12,
},
}
var err error
if s.vipinfoClient, err = v1.NewClient(c.VipinfoRPC); err != nil {
panic(errors.Wrap(err, "v1.NewClient failed"))
}
if err := s.loadbatchinfo(); err != nil {
panic(err)
}
go s.loadbatchinfoproc()
go s.handlermessageproc()
return s
}
// Ping Service
func (s *Service) Ping(c context.Context) (err error) {
return s.dao.Ping(c)
}
// Close Service
func (s *Service) Close() {
s.dao.Close()
s.cache.Close()
}
func (s *Service) loadbatchinfo() (err error) {
var (
c = context.Background()
bs []*model.CouponBatchInfo
)
if bs, err = s.dao.AllBranchInfo(c); err != nil {
log.Error("loadbatchinfo allevent error(%v)", err)
return
}
tmp := make(map[string]*model.CouponBatchInfo, len(bs))
for _, v := range bs {
tmp[v.BatchToken] = v
}
s.allBranchInfo = tmp
log.Info("loadbatchinfo (%v) load success", tmp)
return
}
func (s *Service) loadbatchinfoproc() {
defer func() {
if x := recover(); x != nil {
log.Error("service.loadbatchinfoproc panic(%v)", x)
go s.loadbatchinfoproc()
log.Info("service.loadbatchinfoproc recover")
}
}()
for {
time.Sleep(time.Minute * 1)
s.loadbatchinfo()
}
}
func (s *Service) sendMessage(f func()) {
select {
case s.messageChan <- f:
default:
log.Warn("message chan full")
}
}
func (s *Service) handlermessageproc() {
for {
f := <-s.messageChan
f()
}
}