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.
151 lines
3.7 KiB
151 lines
3.7 KiB
package banner |
|
|
|
import ( |
|
"context" |
|
"strings" |
|
"time" |
|
|
|
"go-common/app/interface/main/app-show/conf" |
|
resdao "go-common/app/interface/main/app-show/dao/resource" |
|
"go-common/app/interface/main/app-show/model" |
|
"go-common/app/interface/main/app-show/model/banner" |
|
resource "go-common/app/service/main/resource/model" |
|
"go-common/library/log" |
|
"go-common/library/net/metadata" |
|
"go-common/library/stat/prom" |
|
) |
|
|
|
var ( |
|
_banners = map[string]map[string]map[int8]int{ |
|
"discover": map[string]map[int8]int{ |
|
"bottom": map[int8]int{ |
|
model.PlatIPhone: 452, |
|
model.PlatIPad: 800, |
|
model.PlatIPhoneI: 1085, |
|
model.PlatIPadI: 1255, |
|
}, |
|
}, |
|
"mine": map[string]map[int8]int{ |
|
"top": map[int8]int{ |
|
model.PlatIPhone: 449, |
|
model.PlatIPad: 801, |
|
model.PlatIPhoneI: 1089, |
|
model.PlatIPadI: 1259, |
|
}, |
|
"center": map[int8]int{ |
|
model.PlatIPhone: 450, |
|
model.PlatIPad: 802, |
|
model.PlatIPhoneI: 1093, |
|
model.PlatIPadI: 1263, |
|
}, |
|
"bottom": map[int8]int{ |
|
model.PlatIPhone: 451, |
|
model.PlatIPad: 803, |
|
model.PlatIPhoneI: 1097, |
|
model.PlatIPadI: 1267, |
|
}, |
|
}, |
|
} |
|
_bannersPlat = map[int8]string{ |
|
model.PlatIPhone: "452,499,450,451", |
|
model.PlatIPad: "800,801,802,803", |
|
model.PlatIPhoneI: "1085,1089,1093,1097", |
|
model.PlatIPadI: "1255,1259,1263,1267", |
|
} |
|
) |
|
|
|
// Service is banner service. |
|
type Service struct { |
|
// dao *bndao.Dao |
|
res *resdao.Dao |
|
tick time.Duration |
|
bannerCache map[int8]map[int][]*resource.Banner |
|
// prom |
|
prmobi *prom.Prom |
|
} |
|
|
|
// New new a banner service. |
|
func New(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
// dao: bndao.New(c), |
|
res: resdao.New(c), |
|
tick: time.Duration(c.Tick), |
|
bannerCache: map[int8]map[int][]*resource.Banner{}, |
|
// prom |
|
prmobi: prom.BusinessInfoCount, |
|
} |
|
s.load() |
|
go s.loadproc() |
|
return |
|
} |
|
|
|
// Display get banner. |
|
func (s *Service) Display(c context.Context, plat int8, build int, channel, module, position, mobiApp string) (res map[string][]*banner.Banner) { |
|
ip := metadata.String(c, metadata.RemoteIP) |
|
res = s.getCache(c, plat, build, channel, module, position, ip) |
|
s.prmobi.Incr("banner_plat_" + mobiApp) |
|
return |
|
} |
|
|
|
// getCahce get banner from cache. |
|
func (s *Service) getCache(c context.Context, plat int8, build int, channel, module, position, ip string) (res map[string][]*banner.Banner) { |
|
res = map[string][]*banner.Banner{} |
|
var ( |
|
resIDs = _bannersPlat[plat] |
|
err error |
|
resbs map[int][]*resource.Banner |
|
plm = s.bannerCache[plat] |
|
resID int |
|
) |
|
if resbs, err = s.res.ResBanner(c, plat, build, 0, resIDs, channel, ip, "", "", "", "", "", false); err != nil || len(resbs) == 0 { |
|
log.Error("s.res.ResBanner is null or err(%v)", err) |
|
resbs = plm |
|
} |
|
mds := strings.Split(module, ",") |
|
poss := strings.Split(position, ",") |
|
for _, md := range mds { |
|
for _, pos := range poss { |
|
resID = _banners[md][pos][plat] |
|
res[md+"_"+pos] = s.resBanners(resbs[resID]) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// resBannersplat |
|
func (s *Service) resBanners(rbs []*resource.Banner) (res []*banner.Banner) { |
|
for _, rb := range rbs { |
|
b := &banner.Banner{} |
|
b.ResChangeBanner(rb) |
|
res = append(res, b) |
|
} |
|
return |
|
} |
|
|
|
// load load all banner. |
|
func (s *Service) load() { |
|
var ( |
|
resbs = map[int8]map[int][]*resource.Banner{} |
|
) |
|
for plat, resIDStr := range _bannersPlat { |
|
mobiApp := model.MobiApp(plat) |
|
res, err := s.res.ResBanner(context.TODO(), plat, 515007, 0, resIDStr, "master", "", "", "", mobiApp, "", "", false) |
|
if err != nil || len(res) == 0 { |
|
log.Error("s.res.ResBanner is null or err(%v)", err) |
|
return |
|
} |
|
resbs[plat] = res |
|
} |
|
if len(resbs) > 0 { |
|
s.bannerCache = resbs |
|
} |
|
log.Info("banner cacheproc success") |
|
} |
|
|
|
// cacheproc load cache. |
|
func (s *Service) loadproc() { |
|
for { |
|
time.Sleep(s.tick) |
|
s.load() |
|
} |
|
}
|
|
|