go-common/app/interface/main/creative/service/resource/service.go

128 lines
3.4 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package resource
import (
"context"
"go-common/app/interface/main/creative/conf"
"go-common/app/interface/main/creative/dao/resource"
"go-common/app/interface/main/creative/dao/tool"
model "go-common/app/interface/main/creative/model/resource"
"go-common/app/interface/main/creative/service"
resmdl "go-common/app/service/main/resource/model"
"go-common/library/log"
"sort"
"strconv"
"time"
)
// Android iPhone
const (
BanneriPhone = 2417
BannerAndroid = 2431
AcademyiPhone = 2873
AcademyAndroid = 2877
BannerCooperate = 2893
)
//Service struct
type Service struct {
c *conf.Config
resDao *resource.Dao
Seed int64
}
//New get service
func New(c *conf.Config, rpcdaos *service.RPCDaos) *Service {
s := &Service{
c: c,
resDao: resource.New(c),
}
return s
}
// TopBanner fn
func (s *Service) TopBanner(c context.Context, mobiApp, device, network, ipAddr, buvid, adExtra string, build, resID int, plat int8, mid int64, isAd bool) (res []*model.Banner, err error) {
var bnsm map[int][]*resmdl.Banner
if resID == 0 {
if model.IsAndroid(plat) {
resID = BannerAndroid
} else if model.IsIPhone(plat) || model.IsIPad(plat) {
resID = BanneriPhone
mobiApp = "iphone"
device = "phone"
plat = resmdl.PlatIPhone
}
}
if bnsm, err = s.resDao.Banner(c, mobiApp, device, network, "", ipAddr, buvid, adExtra, strconv.Itoa(resID), build, plat, mid, isAd); err != nil {
log.Error("s.resDao.Banner err(%v)", err)
return
}
for _, rb := range bnsm[resID] {
b := &model.Banner{}
b.ChangeBanner(rb)
if b.ClientIp == "" {
b.ClientIp = ipAddr
}
res = append(res, b)
}
topLen := 5
if len(res) > topLen {
res = res[:5]
}
sort.Slice(res, func(i, j int) bool { return res[i].Rank < res[j].Rank })
return
}
// AcademyBanner fn
func (s *Service) AcademyBanner(c context.Context, mobiApp, device, network, ipAddr, buvid, adExtra string, build, resID int, plat int8, mid int64, isAd bool) (randomRes []*model.Banner, err error) {
var (
bnsm map[int][]*resmdl.Banner
res = make([]*model.Banner, 0)
keys []int
)
randomRes = make([]*model.Banner, 0)
if model.IsAndroid(plat) {
resID = AcademyAndroid
} else if model.IsIPhone(plat) {
resID = AcademyiPhone
} else if model.IsIPad(plat) {
return
}
if bnsm, err = s.resDao.Banner(c, mobiApp, device, network, "", ipAddr, buvid, adExtra, strconv.Itoa(resID), build, plat, mid, isAd); err != nil {
log.Error("s.resDao.Banner err(%v)", err)
return
}
for _, rb := range bnsm[resID] {
b := &model.Banner{}
b.ChangeBanner(rb)
if b.ClientIp == "" {
b.ClientIp = ipAddr
}
res = append(res, b)
}
sort.Slice(res, func(i, j int) bool { return res[i].Rank < res[j].Rank })
randLength := 3
if len(res) > randLength {
keys = tool.RandomSliceKeys(0, len(res), randLength, time.Now().Unix())
} else {
keys = tool.RandomSliceKeys(0, len(res), len(res), time.Now().Unix())
}
for _, k := range keys {
randomRes = append(randomRes, res[k])
}
return
}
// CooperateBanner fn
func (s *Service) CooperateBanner(c context.Context, mobiApp, device, network, buvid, adExtra string, build int, plat int8, mid int64, isAd bool) (ass []*resmdl.Assignment, err error) {
var res *resmdl.Resource
if res, err = s.resDao.SimpleResource(c, BannerCooperate); err != nil {
log.Error("Resource SimpleResource (%d) error(%v)", BannerCooperate, err)
return
}
if res != nil {
ass = res.Assignments
return
}
return
}