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.
127 lines
3.4 KiB
127 lines
3.4 KiB
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 |
|
}
|
|
|