package show import ( "context" "fmt" "math/rand" "runtime" "strconv" "strings" "time" clive "go-common/app/interface/main/app-card/model/card/live" "go-common/app/interface/main/app-card/model/card/operate" "go-common/app/interface/main/app-card/model/card/rank" "go-common/app/interface/main/app-show/model" "go-common/app/interface/main/app-show/model/card" recmod "go-common/app/interface/main/app-show/model/recommend" "go-common/app/interface/main/app-show/model/region" "go-common/app/interface/main/app-show/model/show" creativeAPI "go-common/app/interface/main/creative/api" "go-common/app/service/main/archive/api" resource "go-common/app/service/main/resource/model" seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1" "go-common/library/log" ) const ( _blackUrl = "http://172.18.7.208/privatedata/reco-deny-arcs.json" ) var ( // 动画,音乐,舞蹈,游戏,科技,娱乐,鬼畜,电影,时尚, 生活,广告,国漫,影视,纪录片 _tids = []string{"1", "3", "129", "4", "36", "5", "119", "23", "155", "160", "11", "165", "167", "181", "177"} _emptyItems = []*show.Item{&show.Item{}, &show.Item{}, &show.Item{}, &show.Item{}} ) // loadRcmmndCache load recommend cahce. func (s *Service) loadRcmmndCache(now time.Time) { aids, err := s.rcmmnd.Hots(context.TODO()) if err != nil { log.Error("s.rcmmnd.Hots(%v) error(%v)", now, err) return } if len(aids) > 200 { aids = aids[:200] } if len(aids) < 60 { return } tmp, tmpOsea := s.fromAids(context.TODO(), aids) if len(tmp) > 0 { s.rcmmndCache = tmp } if len(tmpOsea) > 0 { s.rcmmndOseaCache = tmpOsea } log.Info("loadRcmmndCache success") } // loadRegionCache load region cahce. func (s *Service) loadRegionCache(now time.Time) { var ( tmp = map[string][]*show.Item{} tmpOsea = map[string][]*show.Item{} tmpBg = map[string][]*show.Item{} tmpBgOsea = map[string][]*show.Item{} tmpBgEp = map[string][]*show.Item{} tmpBgEpOsea = map[string][]*show.Item{} sids = map[int32]*seasongrpc.CardInfoProto{} ) for _, tid := range _tids { rs, err := s.rcmmnd.Region(context.TODO(), tid) if len(rs) > 8 { rs = rs[:8] } tidInt, _ := strconv.Atoi(tid) if err != nil || len(rs) < 4 { log.Error("s.rcmmnd.Region(%v) error(%v)", now, err) res, aids, err := s.dyn.RegionDynamic(context.TODO(), tidInt, 1, 8) if err != nil || len(res) < 4 { log.Error("s.dyn.RegionDynamic(%v) error(%v)", now, err) continue } if len(res) > 8 { res = res[:8] } if _, isBangumi := _bangumiReids[tidInt]; isBangumi { sids, _ = s.fromSeasonID(context.TODO(), aids) } tmp[tid], tmpOsea[tid] = s.fromArchivesPB(res) tmpBg[tid], tmpBgOsea[tid] = s.fromArchivesBangumi(context.TODO(), res, aids, sids, _bangumiSeasonID) tmpBgEp[tid], tmpBgEpOsea[tid] = s.fromArchivesBangumi(context.TODO(), res, aids, sids, _bangumiEpisodeID) } else { if _, isBangumi := _bangumiReids[tidInt]; isBangumi { sids, _ = s.fromSeasonID(context.TODO(), rs) } tmp[tid], tmpOsea[tid], tmpBg[tid], tmpBgOsea[tid], tmpBgEp[tid], tmpBgEpOsea[tid] = s.fromBgAids(context.TODO(), rs, sids, _bangumiSeasonID) } log.Info("load show index region(%s) success", tid) } if len(tmp) > 0 { s.regionCache = tmp } if len(tmpOsea) > 0 { s.regionOseaCache = tmpOsea } if len(tmpBg) > 0 { s.regionBgCache = tmpBg } if len(tmpBgOsea) > 0 { s.regionBgOseaCache = tmpBgOsea } if len(tmpBgEp) > 0 { s.regionBgEpCache = tmpBgEp } if len(tmpBgEpOsea) > 0 { s.regionBgEpOseaCache = tmpBgEpOsea } log.Info("loadRegionCache success") } // loadBannerCahce load banner cache. func (s *Service) loadBannerCahce() { 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("loadBannerCahce success") } // loadBgmCache load bangumi cache func (s *Service) loadBgmCache(now time.Time) { bgms, err := s.bgm.Recommend(now) if err != nil { log.Error("s.bgm.Recommend(%v) error(%v)", now, err) return } if len(bgms) < 8 { return } var ( tmp = map[int8][]*show.Item{} si *show.Item ) for _, bgm := range bgms { si = &show.Item{} si.FromBangumi(bgm) tmp[model.PlatAndroid] = append(tmp[model.PlatAndroid], si) tmp[model.PlatIPhone] = append(tmp[model.PlatIPhone], si) tmp[model.PlatAndroidG] = append(tmp[model.PlatAndroidG], si) tmp[model.PlatAndroidI] = append(tmp[model.PlatAndroidI], si) tmp[model.PlatIPhoneI] = append(tmp[model.PlatIPhoneI], si) si = &show.Item{} si.FromBangumi(bgm) si.Cover = bgm.Cover // pad hd get bangumi cover tmp[model.PlatIPad] = append(tmp[model.PlatIPad], si) tmp[model.PlatIPadI] = append(tmp[model.PlatIPadI], si) tmp[model.PlatAndroidTV] = append(tmp[model.PlatAndroidTV], si) } s.bgmCache = tmp log.Info("loadBgmCache success") } // loadLiveCache load live cache . func (s *Service) loadLiveCache(now time.Time) { lrs, err := s.lv.Recommend(now) if err != nil { log.Error("s.live.Recommend(%v) error(%v)", now, err) return } if lrs == nil { return } s.liveCount = lrs.Count if subLen := len(lrs.Lives.Subject); subLen > 0 { tmp := make([]*show.Item, 0, subLen) for _, l := range lrs.Lives.Subject { si := &show.Item{} si.FromLive(l) tmp = append(tmp, si) } s.liveMoeCache = tmp } if hotLen := len(lrs.Lives.Hot); hotLen >= 4 { tmp := make([]*show.Item, 0, hotLen) for _, l := range lrs.Lives.Hot { si := &show.Item{} si.FromLive(l) tmp = append(tmp, si) } s.liveHotCache = tmp } log.Info("loadLiveCache success") } // loadShowCache load all show cache func (s *Service) loadShowCache() { hdm, err := s.dao.Heads(context.TODO()) if err != nil { log.Error("s.dao.Heads error(%v)", err) return } itm, err := s.dao.Items(context.TODO()) if err != nil { log.Error("s.dao.Items error(%v)", err) return } tmp, tmpbg, tmpbgep := s.mergeShow(hdm, itm) if len(tmp) > 0 { s.cache = tmp } if len(tmpbg) > 0 { s.cacheBg = tmpbg } if len(tmpbgep) > 0 { s.cacheBgEp = tmpbgep } log.Info("loadShowCache success") } // loadShowTempCache load all show temp cache func (s *Service) loadShowTempCache() { hdm, err := s.dao.TempHeads(context.TODO()) if err != nil { log.Error("s.dao.TempHeads error(%v)", err) return } itm, err := s.dao.TempItems(context.TODO()) if err != nil { log.Error("s.dao.TempItems error(%v)", err) return } s.tempCache, _, _ = s.mergeShow(hdm, itm) log.Info("loadShowTempCache success") } // loadRegionListCache func (s *Service) loadRegionListCache() { res, err := s.rg.RegionPlat(context.TODO()) if err != nil { log.Error("s.rg.RegionPlat error(%v)", err) return } tmpRegion := map[int]*region.Region{} tmp := map[int]*region.Region{} for _, v := range res { // region list map tmpRegion[v.Rid] = v } for _, r := range res { if r.Reid != 0 { if rerg, ok := tmpRegion[r.Reid]; ok { tmp[r.Rid] = rerg } } } s.reRegionCache = tmp } // loadRankAllCache func (s *Service) loadRankAllCache() { var ( rankAids []int64 err error as map[int64]*api.Arc c = context.TODO() trankCache = []*rank.Rank{} ) aids, others, scores, err := s.rcmmnd.RankAppAll(c) if err != nil { log.Error("s.rcmmnd.RankAppAll error(%v)", err) return } for _, aid := range aids { if _, ok := others[aid]; !ok { rankAids = append(rankAids, aid) } } if len(rankAids) == 0 { return } s.rankAidsCache = rankAids s.rankScoreCache = scores if as, err = s.arc.ArchivesPB(c, rankAids); err != nil { log.Error("s.arc.ArchivesPB aids(%v) error(%v)", aids, err) return } if len(as) == 0 { log.Warn("s.arc.ArchivesPB(%v) length is 0", rankAids) return } s.rankArchivesCache = as tmp, tmpOsea := s.fromRankAids(c, rankAids, scores, as) if len(tmp) > 0 { s.rankCache = tmp } if len(tmpOsea) > 0 { s.rankOseaCache = tmpOsea } log.Info("loadRankAllCache success") // new cache for _, aid := range rankAids { r := &rank.Rank{ Aid: aid, Score: int32(scores[aid]), } trankCache = append(trankCache, r) } s.rankCache2 = trankCache } // loadColumnListCache func (s *Service) loadColumnListCache(now time.Time) { var ( tmpChild = map[int]*card.ColumnList{} ) columns, err := s.cdao.ColumnList(context.TODO(), now) if err != nil { log.Error("s.cdao.ColumnList error(%v)", err) return } for _, column := range columns { tmpChild[column.Cid] = column } s.columnListCache = tmpChild } // loadCardCache load all card cache func (s *Service) loadCardCache(now time.Time) { hdm, err := s.cdao.PosRecs(context.TODO(), now) if err != nil { log.Error("s.cdao.PosRecs error(%v)", err) return } itm, aids, err := s.cdao.RecContents(context.TODO(), now) if err != nil { log.Error("s.cdao.RecContents error(%v)", err) return } tmpItem := map[int]map[int64]*show.Item{} for recid, aid := range aids { tmpItem[recid] = s.fromCardAids(context.TODO(), aid) } tmp := s.mergeCard(context.TODO(), hdm, itm, tmpItem, now) s.cardCache = tmp } func (s *Service) mergeCard(c context.Context, hdm map[int8]map[int][]*card.Card, itm map[int][]*card.Content, tmpItems map[int]map[int64]*show.Item, now time.Time) (res map[string][]*show.Show) { var ( _topic = 1 _activity = 0 ) res = map[string][]*show.Show{} for plat, phds := range hdm { hds, ok := phds[0] if !ok { continue } for _, hd := range hds { key := fmt.Sprintf(_initCardKey, plat) var ( sis []*show.Item ) its, ok := itm[hd.ID] if !ok { its = []*card.Content{} } tmpItem, ok := tmpItems[hd.ID] if !ok { tmpItem = map[int64]*show.Item{} } // 1 daily 2 topic 3 activity 4 rank 5 polymeric_card switch hd.Type { case 1: for _, ci := range its { si := s.fillCardItem(ci, tmpItem) if si.Title != "" { sis = append(sis, si) } } case 2: if topicID, err := strconv.ParseInt(hd.Rvalue, 10, 64); err == nil { if actm, err := s.act.Activitys(c, []int64{topicID}, _topic, ""); err != nil { } else { if act, ok := actm[topicID]; ok && act.H5Cover != "" && act.H5URL != "" { si := &show.Item{} si.FromTopic(act) sis = []*show.Item{si} } } } case 3: if topicID, err := strconv.ParseInt(hd.Rvalue, 10, 64); err == nil { if actm, err := s.act.Activitys(c, []int64{topicID}, _activity, ""); err != nil { } else { if act, ok := actm[topicID]; ok && act.H5Cover != "" && act.H5URL != "" { si := &show.Item{} si.FromActivity(act, now) sis = []*show.Item{si} } } } case 4: if len(s.rankCache) > 3 { sis = s.rankCache[:3] } else { sis = s.rankCache } case 5, 6, 8: for _, ci := range its { si := s.fillCardItem(ci, tmpItem) if si.Title != "" { sis = append(sis, si) } } case 7: si := &show.Item{ Title: hd.Title, Cover: hd.Cover, Desc: hd.Desc, Goto: hd.Goto, Param: hd.Param, } if hd.Goto == model.GotoColumnStage { paramInt, _ := strconv.Atoi(hd.Param) if c, ok := s.columnListCache[paramInt]; ok { cidStr := strconv.Itoa(c.Ceid) si.URI = model.FillURICategory(hd.Goto, cidStr, hd.Param) } } else { si.URI = hd.URi } sis = append(sis, si) default: continue } if len(sis) == 0 { continue } sw := &show.Show{} sw.Head = &show.Head{ CardID: hd.ID, Title: hd.Title, Type: hd.TypeStr, Build: hd.Build, Condition: hd.Condition, Plat: hd.Plat, Style: "small", } if hd.Cover != "" { sw.Head.Cover = hd.Cover } switch sw.Head.Type { case model.GotoDaily: sw.Head.Date = now.Unix() sw.Head.Param = hd.Rvalue case model.GotoCard: sw.Head.URI = hd.URi sw.Head.Goto = hd.Goto sw.Head.Param = hd.Param case model.GotoRank: sw.Head.Param = "all" case model.GotoTopic, model.GotoActivity: if sw.Head.Title == "" { if len(sis) > 0 { sw.Head.Title = sis[0].Title } } case model.GotoVeidoCard: sw.Head.Param = hd.Param if hd.Goto == model.GotoColumnStage { paramInt, _ := strconv.Atoi(hd.Param) if c, ok := s.columnListCache[paramInt]; ok { cidStr := strconv.Itoa(c.Ceid) sw.Head.URI = model.FillURICategory(hd.Goto, cidStr, hd.Param) } sw.Head.Goto = model.GotoColumn } else { sw.Head.Goto = hd.Goto sw.Head.URI = hd.URi } if sisLen := len(sis); sisLen > 1 { if sisLen%2 != 0 { sis = sis[:sisLen-1] } } else { continue } case model.GotoSpecialCard: sw.Head.Cover = "" case model.GotoTagCard: if hd.TagID > 0 { var tagIDInt int64 sw.Head.Title, tagIDInt = s.fromTagIDByName(c, hd.TagID, now) sw.Head.Param = strconv.FormatInt(tagIDInt, 10) sw.Head.Goto = model.GotoTagID } } if len(sis) == 0 { sis = _emptyShowItems } sw.Body = sis res[key] = append(res[key], sw) } } return } func (s *Service) fillCardItem(csi *card.Content, tsi map[int64]*show.Item) (si *show.Item) { si = &show.Item{} switch csi.Type { case model.CardGotoAv: si.Goto = model.GotoAv si.Param = csi.Value } si.URI = model.FillURI(si.Goto, si.Param, nil) if si.Goto == model.GotoAv { aid, err := strconv.ParseInt(si.Param, 10, 64) if err != nil { log.Error("strconv.ParseInt(%s) error(%v)", si.Param, err) } else { if it, ok := tsi[aid]; ok { si = it if csi.Title != "" { si.Title = csi.Title } } else { si = &show.Item{} } } } return } // fromTagIDByName from tag_id by tag_name func (s *Service) fromTagIDByName(ctx context.Context, tagID int, now time.Time) (tagName string, tagIDInt int64) { tag, err := s.tag.TagInfo(ctx, 0, tagID, now) if err != nil { log.Error("s.tag.TagInfo(%d) error(%v)", tagID, err) return } tagName = tag.Name tagIDInt = tag.Tid return } // mergeShow merge heads and items func (s *Service) mergeShow(hdm map[int8][]*show.Head, itm map[int][]*show.Item) (res, resbg, resbgep map[string][]*show.Show) { res = map[string][]*show.Show{} resbg = map[string][]*show.Show{} resbgep = map[string][]*show.Show{} for plat, hds := range hdm { for _, hd := range hds { key := fmt.Sprintf(_initShowKey, plat, hd.Language) its, ok := itm[hd.ID] if !ok { continue } var ( sis []*show.Item sisbg []*show.Item sisbgep []*show.Item ext *show.Ext ) switch hd.Type { case "recommend": for _, si := range its { if si.IsRandom() { continue } s.fillItem(plat, si) sis = append(sis, si) } sisbg = sis sisbgep = sis case "live": if plat == model.PlatAndroidTV { continue } ext = &show.Ext{ LiveCnt: s.liveCount, } case "bangumi": sis = s.sliceCache(plat, s.bgmCache[plat]) sisbg = sis sisbgep = sis case "region": if model.IsOverseas(plat) { sis = s.sliceCache(plat, s.regionOseaCache[hd.Param]) sisbg = s.sliceCache(plat, s.regionBgOseaCache[hd.Param]) sisbgep = s.sliceCache(plat, s.regionBgEpOseaCache[hd.Param]) } else { sis = s.sliceCache(plat, s.regionCache[hd.Param]) sisbg = s.sliceCache(plat, s.regionBgCache[hd.Param]) sisbgep = s.sliceCache(plat, s.regionBgEpCache[hd.Param]) } case "sp": for _, si := range its { spidIdx := strings.Split(si.Param, ",") si.Goto = model.GotoSp si.Param = spidIdx[0] si.URI = model.FillURI(model.GotoSp, spidIdx[0], nil) if len(spidIdx) == 2 { si.Index = spidIdx[1] } sis = append(sis, si) } sisbg = sis sisbgep = sis case "activity": for _, si := range its { if si.IsRandom() { continue } si.Goto = model.GotoWeb si.URI = model.FillURI(model.GotoWeb, si.Param, nil) sis = append(sis, si) } sisbg = sis sisbgep = sis case "topic": for _, si := range its { si.Goto = model.GotoWeb si.URI = model.FillURI(model.GotoWeb, si.Param, nil) sis = append(sis, si) } sisbg = sis sisbgep = sis case "focus": for _, si := range its { if si.IsRandom() { continue } pp := strings.Split(si.Param, ",") si.Param = pp[0] if len(pp) == 2 { si.Goto = pp[1] } else { si.Goto = model.GotoAv } si.URI = model.FillURI(si.Goto, si.Param, nil) sisbg = append(sisbg, si) } sisbgep = sisbg default: continue } sw := &show.Show{} sw.Head = hd sw.Body = sis sw.Ext = ext swbg := &show.Show{} swbg.Head = hd swbg.Body = sisbg swbg.Ext = ext swbgep := &show.Show{} swbgep.Head = hd swbgep.Body = sisbgep swbgep.Ext = ext // append show.Show res[key] = append(res[key], sw) resbg[key] = append(resbg[key], swbg) resbgep[key] = append(resbgep[key], swbgep) } } return } // fillItem used by loadShowCache func (s *Service) fillItem(plat int8, si *show.Item) { pp := strings.Split(si.Param, ",") si.Param = pp[0] if len(pp) == 2 { si.Goto = pp[1] } else { si.Goto = model.GotoAv } si.URI = model.FillURI(si.Goto, si.Param, nil) if si.Goto == model.GotoAv { aid, err := strconv.ParseInt(si.Param, 10, 64) if err != nil { log.Error("strconv.ParseInt(%s) error(%v)", si.Param, err) } else { a, err := s.arc.Archive(context.TODO(), aid) if err != nil || a == nil { log.Error("s.arc.Archive(%d) error(%v)", aid, err) } else { si.Play = int(a.Stat.View) si.Danmaku = int(a.Stat.Danmaku) if si.Title == "" { si.Title = a.Title } if si.Cover == "" { si.Cover = a.Pic } } } } else { si.Play = rand.Intn(1000) si.Danmaku = rand.Intn(1000) } } // sliceCache used by loadShowCache func (s *Service) sliceCache(plat int8, chc []*show.Item) []*show.Item { if len(chc) == 0 { return _emptyItems } cnt := 4 if plat == model.PlatIPad { cnt = 8 } if len(chc) < cnt { cnt = len(chc) } return chc[:cnt] } func (s *Service) loadBlackCache() { var res []int64 if err := s.client.Get(context.TODO(), _blackUrl, "", nil, &res); err != nil { log.Error("recommend ranking url(%s) error(%v)", _blackUrl, err) return } if len(res) == 0 { return } tmp := map[int64]struct{}{} for _, aid := range res { tmp[aid] = struct{}{} } s.blackCache = tmp log.Info("reBlackList success") } // rcmmndproc get recommend aids and add into cache. func (s *Service) rcmmndproc() { var ctx = context.TODO() for i := 0; i < runtime.NumCPU(); i++ { go func() { for { r := <-s.rcmmndCh s.dao.AddRcmmndCache(ctx, r.key, r.aids...) } }() } } // // loadPopularCard load popular card // func (s *Service) loadPopularCard(now time.Time) { // var ( // c = context.TODO() // err error // tmp, tmpcache []*card.PopularCard // tmpPlat = map[int64]map[int8][]*card.PopularCardPlat{} // ) // if tmp, err = s.cdao.Card(c, now); err != nil { // log.Error("popular card s.cd.Card error(%v)", err) // return // } // if tmpPlat, err = s.cdao.CardPlat(c); err != nil { // log.Error("popular card s.cd.CardPlat error(%v)", err) // return // } // for _, t := range tmp { // tc := &card.PopularCard{} // *tc = *t // if pconfig, ok := tmpPlat[t.ID]; ok { // tc.PopularCardPlat = pconfig // } // tmpcache = append(tmpcache, tc) // } // s.hotCache = tmpcache // log.Info("hotCache success") // } func (s *Service) loadHotTenTabAids() { var tmpList = make(map[int][]*recmod.CardList) for i := 0; i < 10; i++ { var ( c = context.TODO() err error hottabAids []*recmod.CardList flowResp *creativeAPI.FlowResponse oids []int64 forbidAids = make(map[int64]struct{}) ) if hottabAids, err = s.rcmmnd.HotHeTongTabCard(c, i); err != nil { log.Error("%+v", err) continue } for _, hot := range hottabAids { if hot.Goto == model.GotoAv { oids = append(oids, hot.ID) } } if flowResp, err = s.creativeClient.FlowJudge(context.Background(), &creativeAPI.FlowRequest{ Oids: oids, Business: 4, Gid: 24, }); err != nil { log.Error("s.creativeClient.FlowJudge error(%v)", err) tmpList[i] = hottabAids } else { for _, oid := range flowResp.Oids { forbidAids[oid] = struct{}{} } for _, list := range hottabAids { if list.Goto == model.GotoAv { if _, ok := forbidAids[list.ID]; ok { log.Info("aid(%d) is flowJundged", list.ID) continue } } tmpList[i] = append(tmpList[i], list) } } log.Info("buildHotSuccess(%d) len(%d)", i, len(tmpList[i])) } if len(tmpList) == 10 { s.hotTenTabCardCache = tmpList } } func (s *Service) loadHotTopicCache() { var ( c = context.TODO() err error topics []*clive.TopicHot ) if topics, err = s.lv.TopicHots(c); err != nil { log.Error("topichots s.lv.TopicHots error(%v)", err) return } if len(topics) > 8 { s.hottopicsCache = topics[:8] } else { s.hottopicsCache = topics } log.Info("loadHotTopicCache success") } func (s *Service) loadHotTenMergeRcmdCache(i int) { // mc var ( c = context.TODO() hcards []*recmod.CardList rcmdcard []*card.PopularCard ok bool err error ) if hcards, ok = s.hotTenTabCardCache[i]; ok { for _, hcard := range hcards { rcmdcard = append(rcmdcard, hcard.CardListChange()) } if err = s.cdao.AddPopularCardTenCache(c, i, rcmdcard); err != nil { log.Error("cards mc s.cdao.AddPopularCardCache error(%v)", err) return } } } // PopularCardList cards func (s *Service) PopularCardTenList(c context.Context, i int) (res []*card.PopularCard) { var err error if res, err = s.cdao.PopularCardTenCache(c, i); err != nil { log.Error("%+v", err) return } return } func (s *Service) loadCardSetCache() { var ( cards map[int64]*operate.CardSet err error ) if cards, err = s.cdao.CardSet(context.TODO()); err != nil { log.Error("%+v", err) return } s.cardSetCache = cards } func (s *Service) loadDynamicHotCache() { var ( liveList []*clive.DynamicHot err error ) if liveList, err = s.lv.DynamicHot(context.TODO()); err != nil { log.Error("s.lv.dynamichot error(%v)", err) return } s.dynamicHotCache = liveList } func (s *Service) loadEventTopicCache() { var ( eventtopic map[int64]*operate.EventTopic err error ) if eventtopic, err = s.cdao.EventTopic(context.TODO()); err != nil { log.Error("s.cdao.eventtopic error(%v)", err) return } s.eventTopicCache = eventtopic }