123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- package service
- import (
- "context"
- "fmt"
- "time"
- "go-common/app/admin/main/mcn/model"
- dtmdl "go-common/app/interface/main/mcn/model/datamodel"
- accgrpc "go-common/app/service/main/account/api"
- arcgrpc "go-common/app/service/main/archive/api"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- xtime "go-common/library/time"
- "github.com/pkg/errors"
- )
- // ArcTopDataStatistics .
- func (s *Service) ArcTopDataStatistics(c context.Context, arg *model.McnGetRankReq) (res *model.McnGetRankUpFansReply, err error) {
- return s.dao.ArcTopDataStatistics(c, arg)
- }
- // McnsTotalDatas .
- func (s *Service) McnsTotalDatas(c context.Context, arg *model.TotalMcnDataReq) (res *model.TotalMcnDataInfo, err error) {
- var (
- signUpsTotal, FanTotal, videoupTotal, playTotal int64
- mids, fansMids, ArcsMids, avids, tids, arcsTids, typeTids []int64
- m *model.McnDataOverview
- mrf map[int8][]*model.McnRankFansOverview
- ras []*model.McnRankArchiveLikesOverview
- mmd map[string][]*model.McnDataTypeSummary
- )
- td := new(thirdDataMap)
- res = new(model.TotalMcnDataInfo)
- res.TopInfo = new(model.McnDataTopInfo)
- res.TypesInfo = new(model.McnDataTypesInfo)
- date := xtime.Time(time.Date(arg.Date.Time().Year(), arg.Date.Time().Month(), arg.Date.Time().Day()-1, 0, 0, 0, 0, time.Local).Unix())
- if m, err = s.dao.McnDataOverview(c, date); err != nil {
- return
- }
- res.BaseInfo = m
- if mrf, fansMids, err = s.dao.McnRankFansOverview(c, model.DataTypeDay, date, model.TopDataLenth); err != nil {
- return
- }
- if ras, ArcsMids, avids, arcsTids, err = s.dao.McnRankArchiveLikesOverview(c, model.DataTypeDay, date, model.TopDataLenth); err != nil {
- return
- }
- if mmd, typeTids, err = s.dao.McnDataTypeSummary(c, date); err != nil {
- return
- }
- mids = append(mids, fansMids...)
- mids = append(mids, ArcsMids...)
- tids = append(tids, arcsTids...)
- tids = append(tids, typeTids...)
- if td.infosReply, err = s.accGRPC.Infos3(c, &accgrpc.MidsReq{Mids: mids}); err != nil {
- log.Error("s.accGRPC.Infos3(%+v) error(%+v)", mids, err)
- err = nil
- }
- if td.archivesReply, err = s.arcGRPC.Arcs(c, &arcgrpc.ArcsRequest{Aids: avids}); err != nil {
- log.Error("s.arcGRPC.Arcs(%+v) error(%+v)", avids, err)
- err = nil
- }
- td.tpNames = s.videoup.GetTidName(tids)
- for view, data := range mrf {
- for _, v := range data {
- var (
- rateIncr int64
- name, _, _, _ = td.getTypeName(v.Mid, 0, 0, 0)
- )
- if v.Fans != 0 {
- rateIncr = (10000 * v.FansIncr) / v.Fans
- }
- fr := &model.FansRankIncr{Mid: v.Mid, Name: name, Rank: v.Rank, FansIncr: v.FansIncr, Fans: v.Fans, RateIncr: rateIncr, SignID: v.SignID}
- switch model.DataViewFansTop(view) {
- case model.McnFansIncr:
- res.TopInfo.McnFansIncr = append(res.TopInfo.McnFansIncr, fr)
- case model.McnFansIncrRate:
- res.TopInfo.McnFansRateIncr = append(res.TopInfo.McnFansRateIncr, fr)
- case model.UpFansIncr:
- res.TopInfo.UpFansIncr = append(res.TopInfo.UpFansIncr, fr)
- case model.UpFansIncrRate:
- res.TopInfo.UpFansRateIncr = append(res.TopInfo.UpFansRateIncr, fr)
- }
- }
- }
- for _, v := range ras {
- var mcnName, upName, avTitle, tpName = td.getTypeName(v.McnMid, v.UpMid, v.Avid, int64(v.Tid))
- lr := &model.LikesRankIncr{McnMid: v.McnMid, McnName: mcnName,
- UpMid: v.UpMid, UpName: upName, AVID: v.Avid, AVTitle: avTitle,
- TID: v.Tid, TypeName: tpName, LikesIncr: v.Likes, PlayIncr: v.Plays, SignID: v.SignID}
- res.TopInfo.ArcLikesIncr = append(res.TopInfo.ArcLikesIncr, lr)
- }
- for vt, data := range mmd {
- for _, v := range data {
- var _, _, _, tpName = td.getTypeName(0, 0, 0, int64(v.Tid))
- dt := &model.DataTypes{TID: v.Tid, TypeName: tpName, Amount: v.Amount}
- switch vt {
- case fmt.Sprintf("%d-%d", model.SignUpsAccumulate, model.DataTypeAccumulate):
- signUpsTotal += v.Amount
- res.TypesInfo.SignUps = append(res.TypesInfo.SignUps, dt)
- case fmt.Sprintf("%d-%d", model.FansIncr, model.DataTypeDay):
- FanTotal += v.Amount
- res.TypesInfo.FansIncr = append(res.TypesInfo.FansIncr, dt)
- case fmt.Sprintf("%d-%d", model.VideoUpsIncr, model.DataTypeDay):
- videoupTotal += v.Amount
- res.TypesInfo.VideoupIncr = append(res.TypesInfo.VideoupIncr, dt)
- case fmt.Sprintf("%d-%d", model.PlaysIncr, model.DataTypeDay):
- playTotal += v.Amount
- res.TypesInfo.PlayIncr = append(res.TypesInfo.PlayIncr, dt)
- }
- }
- }
- statTypeRate(res.TypesInfo.SignUps, signUpsTotal)
- statTypeRate(res.TypesInfo.FansIncr, FanTotal)
- statTypeRate(res.TypesInfo.VideoupIncr, videoupTotal)
- statTypeRate(res.TypesInfo.PlayIncr, playTotal)
- return
- }
- type thirdDataMap struct {
- tpNames map[int64]string
- infosReply *accgrpc.InfosReply
- archivesReply *arcgrpc.ArcsReply
- }
- func (td *thirdDataMap) getTypeName(mcnMid, upMid, avid, tid int64) (mcnName, upName, avTitle, tpName string) {
- if td.infosReply != nil {
- infos := td.infosReply.Infos
- if info, ok := infos[mcnMid]; ok {
- mcnName = info.Name
- }
- if info, ok := infos[upMid]; ok {
- upName = info.Name
- }
- }
- if td.archivesReply != nil {
- archives := td.archivesReply.Arcs
- if archive, ok := archives[avid]; ok {
- avTitle = archive.Title
- }
- }
- tpName = td.tpNames[tid]
- return
- }
- func statTypeRate(dts []*model.DataTypes, total int64) {
- for _, v := range dts {
- if total != 0 {
- v.Rate = (10000 * v.Amount) / total
- }
- v.Total = total
- }
- }
- // McnFansAnalyze .
- func (s *Service) McnFansAnalyze(c context.Context, arg *model.McnCommonReq) (res *model.McnGetMcnFansReply, err error) {
- var (
- f *dtmdl.DmConMcnFansD
- sex *dtmdl.DmConMcnFansSexW
- age *dtmdl.DmConMcnFansAgeW
- playWay *dtmdl.DmConMcnFansPlayWayW
- areas []*dtmdl.DmConMcnFansAreaW
- types []*dtmdl.DmConMcnFansTypeW
- tags []*dtmdl.DmConMcnFansTagW
- g errgroup.Group
- )
- res = new(model.McnGetMcnFansReply)
- g.Go(func() (err error) {
- if f, err = s.dao.DataFans(c, arg); err != nil {
- log.Error("s.dao.DataFans(%+v) error(%v)", arg, err)
- return
- }
- res.FansOverview = f
- return
- })
- g.Go(func() (err error) {
- if sex, age, playWay, err = s.dao.DataFansBaseAttr(c, arg); err != nil {
- log.Error("s.dao.DataFansBaseAttr(%+v) error(%v)", arg, err)
- return
- }
- res.FansSex = sex
- res.FansAge = age
- res.FansPlayWay = playWay
- return
- })
- g.Go(func() (err error) {
- if areas, err = s.dao.DataFansArea(c, arg); err != nil {
- log.Error("s.dao.DataFansArea(%+v) error(%v)", arg, err)
- return
- }
- res.FansArea = areas
- return
- })
- g.Go(func() (err error) {
- if types, err = s.dao.DataFansType(c, arg); err != nil {
- log.Error("s.dao.DataFansType(%+v) error(%v)", arg, err)
- return
- }
- res.FansType = types
- return
- })
- g.Go(func() (err error) {
- if tags, err = s.dao.DataFansTag(c, arg); err != nil {
- log.Error("s.dao.DataFansTag(%+v) error(%v)", arg, err)
- return
- }
- res.FansTag = tags
- return
- })
- if err = g.Wait(); err != nil {
- err = errors.WithStack(err)
- }
- return
- }
|