235 lines
5.8 KiB
Go
235 lines
5.8 KiB
Go
|
package data
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"time"
|
||
|
|
||
|
"go-common/app/admin/main/up/model/datamodel"
|
||
|
"go-common/app/admin/main/up/service/cache"
|
||
|
"go-common/app/interface/main/creative/model/tag"
|
||
|
"go-common/library/log"
|
||
|
"go-common/library/sync/errgroup"
|
||
|
)
|
||
|
|
||
|
// ViewerBase get up viewer base data.
|
||
|
func (s *Service) ViewerBase(c context.Context, mid int64) (res *datamodel.ViewerBaseInfo, err error) {
|
||
|
dt := getDateLastSunday()
|
||
|
|
||
|
if res, err = s.data.ViewerBase(c, mid, dt); err != nil {
|
||
|
log.Error("get viewer base error, err=%v", err)
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// ViewerArea get up viewer area data.
|
||
|
func (s *Service) ViewerArea(c context.Context, mid int64) (res *datamodel.ViewerAreaInfo, err error) {
|
||
|
dt := getDateLastSunday()
|
||
|
|
||
|
res, err = s.data.ViewerArea(c, mid, dt)
|
||
|
if err != nil {
|
||
|
log.Error("get viewer area error, err=%v", err)
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// CacheTrend get trend from mc.
|
||
|
func (s *Service) CacheTrend(c context.Context, mid int64) (res *datamodel.ViewerTrendInfo, err error) {
|
||
|
dt := getDateLastSunday()
|
||
|
|
||
|
if res, err = s.viewerTrend(c, mid, dt); err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//GetTags get tag
|
||
|
func (s *Service) GetTags(c context.Context, ids ...int64) (result map[int64]*tag.Meta) {
|
||
|
var tagMetaMap, leftIDs = cache.GetTagCache(ids...)
|
||
|
if len(leftIDs) > 0 {
|
||
|
if tlist, err := s.dtag.TagList(c, leftIDs); err != nil {
|
||
|
log.Error("trend s.dtag.TagList err(%v)", err)
|
||
|
} else {
|
||
|
for _, v := range tlist {
|
||
|
tagMetaMap[v.TagID] = v
|
||
|
cache.AddTagCache(v)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
result = tagMetaMap
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// ViewerTrend get up viewer trend data.
|
||
|
func (s *Service) viewerTrend(c context.Context, mid int64, dt time.Time) (res *datamodel.ViewerTrendInfo, err error) {
|
||
|
ut, err := s.data.ViewerTrend(c, mid, dt)
|
||
|
if err != nil || ut == nil {
|
||
|
log.Error("trend s.data.ViewerTrend err(%v)", err)
|
||
|
return
|
||
|
}
|
||
|
f := []string{"fan", "guest"}
|
||
|
skeys := make([]int, 0) //for tag sort.
|
||
|
tgs := make([]int64, 0) // for request tag name.
|
||
|
res = &datamodel.ViewerTrendInfo{}
|
||
|
var dataMap = make(map[string]*datamodel.ViewerTypeTagInfo)
|
||
|
for _, fk := range f {
|
||
|
td := ut[fk]
|
||
|
vt := &datamodel.ViewerTypeTagInfo{}
|
||
|
if td == nil {
|
||
|
vt.Type = nil
|
||
|
vt.Tag = nil
|
||
|
dataMap[fk] = vt
|
||
|
continue
|
||
|
}
|
||
|
typeMap := make(map[int]*datamodel.ViewerTypeData) //return type map to user.
|
||
|
//deal type for type name.
|
||
|
if td.Ty != nil {
|
||
|
for k, v := range td.Ty {
|
||
|
var tagInfo, ok = cache.VideoUpTypeCache[k]
|
||
|
var name = ""
|
||
|
if ok {
|
||
|
name = tagInfo.Name
|
||
|
}
|
||
|
typeMap[k] = &datamodel.ViewerTypeData{
|
||
|
Tid: k,
|
||
|
Name: name,
|
||
|
Play: v,
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
typeMap = nil
|
||
|
}
|
||
|
// deal tag for tag name.
|
||
|
if td.Tag != nil {
|
||
|
for k, v := range td.Tag {
|
||
|
tgs = append(tgs, v)
|
||
|
skeys = append(skeys, k)
|
||
|
}
|
||
|
var tagMetaMap, leftIDs = cache.GetTagCache(tgs...)
|
||
|
if len(leftIDs) > 0 {
|
||
|
var tlist []*tag.Meta
|
||
|
if tlist, err = s.dtag.TagList(c, leftIDs); err != nil {
|
||
|
log.Error("trend s.dtag.TagList err(%v)", err)
|
||
|
} else {
|
||
|
for _, v := range tlist {
|
||
|
tagMetaMap[v.TagID] = v
|
||
|
cache.AddTagCache(v)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for _, k := range skeys {
|
||
|
var tagID = td.Tag[k]
|
||
|
var tagData = &datamodel.ViewerTagData{
|
||
|
Idx: k,
|
||
|
TagID: int(tagID),
|
||
|
Name: "",
|
||
|
}
|
||
|
if tagMeta, ok := tagMetaMap[tagID]; ok {
|
||
|
tagData.Name = tagMeta.TagName
|
||
|
}
|
||
|
vt.Tag = append(vt.Tag, tagData)
|
||
|
}
|
||
|
}
|
||
|
for _, v := range typeMap {
|
||
|
vt.Type = append(vt.Type, v)
|
||
|
}
|
||
|
|
||
|
dataMap[fk] = vt
|
||
|
}
|
||
|
res.Fans = dataMap["fan"]
|
||
|
res.Guest = dataMap["guest"]
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//ViewData view data for up
|
||
|
type ViewData struct {
|
||
|
Base *datamodel.ViewerBaseInfo `json:"viewer_base"`
|
||
|
Trend *datamodel.ViewerTrendInfo `json:"viewer_trend"`
|
||
|
Area *datamodel.ViewerAreaInfo `json:"viewer_area"`
|
||
|
}
|
||
|
|
||
|
//GetUpViewInfo get view info by arg
|
||
|
func (s *Service) GetUpViewInfo(c context.Context, arg *datamodel.GetUpViewInfoArg) (result *ViewData, err error) {
|
||
|
if arg == nil {
|
||
|
log.Error("arg is nil")
|
||
|
return
|
||
|
}
|
||
|
res, err := s.GetViewData(c, arg.Mid)
|
||
|
result = &res
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//GetViewData get all view data
|
||
|
func (s *Service) GetViewData(c context.Context, mid int64) (result ViewData, err error) {
|
||
|
var group, ctx = errgroup.WithContext(c)
|
||
|
group.Go(func() error {
|
||
|
var e error
|
||
|
result.Base, e = s.ViewerBase(ctx, mid)
|
||
|
if e != nil {
|
||
|
log.Error("get base view err happen, err=%v", e)
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
var e error
|
||
|
result.Area, e = s.ViewerArea(ctx, mid)
|
||
|
if e != nil {
|
||
|
log.Error("get area view err happen, err=%v", e)
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
var e error
|
||
|
result.Trend, e = s.CacheTrend(ctx, mid)
|
||
|
if e != nil {
|
||
|
log.Error("get trend view err happen, err=%v", e)
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
|
||
|
err = group.Wait()
|
||
|
if err != nil {
|
||
|
log.Error("get view data error, err=%+v", err)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//GetFansSummary get fan summary
|
||
|
func (s *Service) GetFansSummary(c context.Context, arg *datamodel.GetFansSummaryArg) (result *datamodel.FansSummaryResult, err error) {
|
||
|
result = &datamodel.FansSummaryResult{}
|
||
|
var fanInfo, e = s.data.UpFansAnalysis(c, arg.Mid, datamodel.Thirty)
|
||
|
if e != nil || fanInfo == nil {
|
||
|
err = e
|
||
|
log.Error("get fan analysis err happen, err=%v", e)
|
||
|
return
|
||
|
}
|
||
|
result.FanSummary = fanInfo.Summary
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//GetRelationFansDay get fan day history
|
||
|
func (s *Service) GetRelationFansDay(c context.Context, arg *datamodel.GetRelationFansHistoryArg) (result *datamodel.GetRelationFansHistoryResult, err error) {
|
||
|
|
||
|
result = &datamodel.GetRelationFansHistoryResult{}
|
||
|
if arg.DataType == 0 {
|
||
|
arg.DataType = datamodel.DataType30Day
|
||
|
}
|
||
|
switch arg.DataType {
|
||
|
case datamodel.DataType30Day:
|
||
|
result.RelationFanHistoryData, err = s.data.RelationFansDay(c, arg.Mid)
|
||
|
case datamodel.DataTypeMonth:
|
||
|
result.RelationFanHistoryData, err = s.data.RelationFansMonth(c, arg.Mid)
|
||
|
default:
|
||
|
err = fmt.Errorf("invalid data type(%d)", arg.DataType)
|
||
|
}
|
||
|
if err != nil {
|
||
|
log.Error("get relation fans day fail, err=%v", err)
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|