package data import ( "context" "sort" "go-common/app/interface/main/creative/model/data" "go-common/app/interface/main/creative/model/medal" account "go-common/app/service/main/account/model" "go-common/library/log" "go-common/library/sync/errgroup" ) var ( rankKeys = []string{data.PlayDuration, data.VideoAct, data.DynamicAct} ) // UpFansAnalysisForWeb get web fans data. func (s *Service) UpFansAnalysisForWeb(c context.Context, mid int64, ip string) (res *data.WebFan, err error) { var ( origin *data.WebFan rkList map[string][]*data.RankInfo mdlRank []*medal.FansRank ) if origin, err = s.data.UpFansAnalysisForWeb(c, mid, data.Thirty); err != nil { log.Error("s.data.UpFansAnalysisForWeb err(%v)", err) return } if origin == nil { return } group, ctx := errgroup.WithContext(c) group.Go(func() (err error) { if rkList, err = s.getTopList(ctx, mid, origin.RankMap, ip); err != nil { log.Error("s.getTopList mid(%d)|err(%v)", mid, err) err = nil } return }) group.Go(func() (err error) { if mdlRank, err = s.medal.Rank(ctx, mid); err != nil { log.Error("s.medal.Rank mid(%d)|err(%v)", mid, err) err = nil } return }) group.Wait() if len(rkList) == 0 { log.Info("s.getTopList is empty rkList(%+v) ", rkList) rkList = make(map[string][]*data.RankInfo) } for _, key := range rankKeys { if v, ok := rkList[key]; ok { rkList[key] = v } else { rkList[key] = nil } } log.Info("s.getTopList rkList(%+v)|len(%d)", rkList, len(rkList)) res = &data.WebFan{ Summary: origin.Summary, Source: origin.Source, RankList: rkList, RankMedal: map[string][]*medal.FansRank{ "medal": mdlRank, }, } return } // sort mid list and get uname/avatar info func (s *Service) getTopList(c context.Context, mid int64, RankMap map[string]map[string]int32, ip string) (rkList map[string][]*data.RankInfo, err error) { rkList = make(map[string][]*data.RankInfo) for _, key := range rankKeys { vd, ok := RankMap[key] //map playduration videoact dynamicact top10 mids. if !ok { continue } sortK := make([]string, 0, 10) for key := range vd { //sort top mids by key, for example (dr2,dr1,dr3...) sortK = append(sortK, key) } sort.Slice(sortK, func(i, j int) bool { //for example (dr1,dr2,dr3...) return sortK[i] < sortK[j] }) mids := make([]int64, 0, 10) for _, k := range sortK { //get sort mids slice. if mid, ok := vd[k]; ok { mids = append(mids, int64(mid)) } } if len(mids) == 0 { continue } var ( g, ctx = errgroup.WithContext(c) users map[int64]*account.Info followers map[int64]int ) g.Go(func() error { //获取用户信息 if users, err = s.acc.Infos(ctx, mids, ip); err != nil { log.Error("s.acc.Infos mid(%d)|mids(%v)|ip(%s)|err(%v)", mid, mids, ip, err) } return err }) g.Go(func() error { //获取关注状态 if followers, err = s.acc.Relations2(ctx, mid, mids, ip); err != nil { log.Error("s.acc.Relations mid(%d)|ip(%s)|err(%v)", mid, ip, err) } return err }) if g.Wait() != nil { return } rkInfos := make([]*data.RankInfo, 0, 10) for _, m := range mids { ri := &data.RankInfo{} if v, ok := users[m]; ok { //get userinfo by sorted mids. ri.MID = v.Mid ri.Uname = v.Name ri.Photo = v.Face } if fl, ok := followers[m]; ok { //get relation by sorted mids. ri.Relation = fl } rkInfos = append(rkInfos, ri) //append top10 useinfo. if len(rkInfos) == 10 { break } } rkList[key] = rkInfos //map playduration videoact dynamicact top10 userinfo. } log.Info("getTopList mid(%d)|rkList(%+v) ", mid, rkList) return } //UpFansMedal for get fan medel count. func (s *Service) UpFansMedal(c context.Context, mid int64) (fansMdl *data.UpFansMedal, err error) { if fansMdl, err = s.data.UpFansMedal(c, mid); err != nil { log.Error("s.data.UpFansMedal mid(%d)|err(%v)", mid, err) } return }