123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- package service
- import (
- "context"
- "encoding/json"
- "strconv"
- "time"
- "go-common/app/interface/openplatform/article/dao"
- "go-common/app/interface/openplatform/article/model"
- resmdl "go-common/app/service/main/resource/model"
- "go-common/library/log"
- )
- func (s *Service) loadBannersproc() {
- for {
- now := time.Now()
- ts := now.Unix()
- if (s.bannersMap == nil) || (ts%s.dao.UpdateBannersInterval == 0) {
- banners, err := s.banners(context.TODO(), s.c.Article.BannerIDs)
- if err != nil {
- dao.PromError("service:更新banner数据")
- time.Sleep(time.Second)
- continue
- }
- s.bannersMap = banners
- }
- // 这里不是每秒钟一更新
- time.Sleep(time.Second)
- }
- }
- func (s *Service) loadActBannersproc() {
- for {
- now := time.Now()
- ts := now.Unix()
- if (s.actBannersMap == nil) || (ts%s.dao.UpdateBannersInterval == 0) {
- banners, err := s.banners(context.TODO(), s.c.Article.ActBannerIDs)
- if err != nil {
- dao.PromError("service:更新actBanner数据")
- time.Sleep(time.Second)
- continue
- }
- s.actBannersMap = banners
- }
- // 这里不是每秒钟一更新
- time.Sleep(time.Second)
- }
- }
- // Banners get banners
- func (s *Service) Banners(c context.Context, plat int8, build int, t time.Time) (res []*model.Banner, err error) {
- tStr := strconv.FormatInt((t.UnixNano() / 1e6), 10)
- for _, banner := range s.bannersMap[int8(plat)] {
- if !invalidBuild(build, banner.Build, banner.Condition) {
- b := &model.Banner{}
- *b = *banner
- b.RequestID = tStr
- res = append(res, b)
- }
- }
- return
- }
- func (s *Service) actBanners(c context.Context, plat int8, t time.Time) (res []*model.Banner, err error) {
- tStr := strconv.FormatInt((t.UnixNano() / 1e6), 10)
- for _, banner := range s.actBannersMap[int8(plat)] {
- b := &model.Banner{}
- *b = *banner
- b.RequestID = tStr
- res = append(res, b)
- }
- return
- }
- func invalidBuild(srcBuild, cfgBuild int, cfgCond string) bool {
- if cfgBuild != 0 && cfgCond != "" {
- switch cfgCond {
- case "gt":
- if cfgBuild >= srcBuild {
- return true
- }
- case "lt":
- if cfgBuild <= srcBuild {
- return true
- }
- case "eq":
- if cfgBuild != srcBuild {
- return true
- }
- case "ne":
- if cfgBuild == srcBuild {
- return true
- }
- }
- }
- return false
- }
- func (s *Service) banners(c context.Context, resIDs []int) (res map[int8][]*model.Banner, err error) {
- arg := &resmdl.ArgRess{ResIDs: resIDs}
- bs, err := s.resRPC.Resources(c, arg)
- if err != nil {
- dao.PromError("banner:RPC")
- log.Error("s.resRPC.Resources(%+v) err: %+v", arg, err)
- return
- }
- res = make(map[int8][]*model.Banner)
- for _, r := range bs {
- for i, a := range r.Assignments {
- b := &model.Banner{
- ID: a.ID,
- Title: a.Name,
- URL: a.URL,
- Image: a.Pic,
- Position: i + 1,
- Plat: int8(r.Platform),
- Rule: string(a.Rule),
- ResID: r.ID,
- }
- if b.Rule != "" {
- var tmp *model.BannerRule
- if json.Unmarshal([]byte(b.Rule), &tmp) == nil {
- b.Build = tmp.Build
- b.Condition = tmp.Condition
- }
- }
- b.Plat = model.ConvertPlat(b.Plat)
- res[b.Plat] = append(res[b.Plat], b)
- }
- }
- return
- }
|