You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
577 lines
22 KiB
577 lines
22 KiB
package datadao |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"net/http" |
|
"net/url" |
|
"time" |
|
|
|
"go-common/app/interface/main/mcn/dao/cache" |
|
"go-common/app/interface/main/mcn/dao/global" |
|
"go-common/app/interface/main/mcn/model/datamodel" |
|
"go-common/app/interface/main/mcn/model/mcnmodel" |
|
"go-common/app/interface/main/mcn/tool/datacenter" |
|
tagmdl "go-common/app/interface/main/tag/api" |
|
"go-common/library/log" |
|
"go-common/library/sync/errgroup" |
|
) |
|
|
|
// const url for api |
|
const ( |
|
APIMcnSummary = "http://berserker.bilibili.co/avenger/api/155/query" // 7 see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690 |
|
APIIndexInc = "http://berserker.bilibili.co/avenger/api/156/query" // 3.1 |
|
APIIndexSource = "http://berserker.bilibili.co/avenger/api/159/query" // 3.2 |
|
APIPlaySource = "http://berserker.bilibili.co/avenger/api/161/query" // 3.3 |
|
APIMcnFans = "http://berserker.bilibili.co/avenger/api/168/query" // 3.4 |
|
APIMcnFansInc = "http://berserker.bilibili.co/avenger/api/171/query" // 3.5 |
|
APIMcnFansDec = "http://berserker.bilibili.co/avenger/api/169/query" // 3.6 |
|
APIMcnFansAttentionWay = "http://berserker.bilibili.co/avenger/api/170/query" // 3.7 |
|
APIMcnFansSex = "http://berserker.bilibili.co/avenger/api/162/query" // 3.8 |
|
APIMcnFansAge = "http://berserker.bilibili.co/avenger/api/163/query" // 3.8 |
|
APIMcnFansPlayWay = "http://berserker.bilibili.co/avenger/api/164/query" // 3.8 |
|
APIMcnFansArea = "http://berserker.bilibili.co/avenger/api/165/query" // 3.9 |
|
APIMcnFansType = "http://berserker.bilibili.co/avenger/api/166/query" // 3.10 |
|
APIMcnFansTag = "http://berserker.bilibili.co/avenger/api/167/query" // 3.11 |
|
) |
|
|
|
func (d *Dao) callDataAPI(c context.Context, api string, query *datacenter.Query, res interface{}) (err error) { |
|
var response = &datacenter.Response{ |
|
Result: res, |
|
} |
|
if query.Error() != nil { |
|
err = query.Error() |
|
log.Error("query error, err=%s", err) |
|
return |
|
} |
|
var params = url.Values{} |
|
params.Add("query", query.String()) |
|
|
|
if err = d.Client.Get(c, api, params, response); err != nil { |
|
log.Error("fail to get response, err=%+v", err) |
|
return |
|
} |
|
|
|
if response.Code != http.StatusOK { |
|
err = fmt.Errorf("code:%d, msg:%s", response.Code, response.Msg) |
|
return |
|
} |
|
return |
|
} |
|
|
|
// GetMcnSummary 7 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-7.mcn获取概要数据 |
|
func (d *Dao) GetMcnSummary(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetDataSummaryReply, err error) { |
|
res = new(mcnmodel.McnGetDataSummaryReply) |
|
var tmp []*datamodel.DmConMcnArchiveD |
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
).Limit(1, 0).Order("log_date desc") |
|
var api = APIMcnSummary |
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
if len(tmp) > 0 { |
|
res.CopyFromDmConMcnArchiveD(tmp[0]) |
|
} |
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp[0]) |
|
return |
|
} |
|
|
|
//GetMcnSummaryCache GetMcnSummary with cache |
|
func (d *Dao) GetMcnSummaryCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetDataSummaryReply, err error) { |
|
res = new(mcnmodel.McnGetDataSummaryReply) |
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetDataSummaryReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) { |
|
return d.GetMcnSummary(c, signID, date) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetIndexInc 3.1 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.1.查询MCN增量趋势 |
|
func (d *Dao) GetIndexInc(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexIncReply, err error) { |
|
res = new(mcnmodel.McnGetIndexIncReply) |
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
).Limit(30, 0).Order("log_date desc") |
|
var api = APIIndexInc |
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0]) |
|
return |
|
} |
|
|
|
//GetIndexIncCache GetIndexInc with cache |
|
func (d *Dao) GetIndexIncCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexIncReply, err error) { |
|
res = new(mcnmodel.McnGetIndexIncReply) |
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetIndexIncReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) { |
|
return d.GetIndexInc(c, signID, date, tp) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetIndexSource 3.2 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.2.查询MCN下播放稿件来源所在分区 |
|
func (d *Dao) GetIndexSource(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexSourceReply, err error) { |
|
res = new(mcnmodel.McnGetIndexSourceReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
) |
|
var api = APIIndexSource |
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
|
|
var tids []int64 |
|
for _, v := range res.Result { |
|
tids = append(tids, v.TypeID) |
|
} |
|
|
|
tpNames := cache.GetTidNames(tids) |
|
for _, v := range res.Result { |
|
if tpName, ok := tpNames[v.TypeID]; ok { |
|
v.TypeName = tpName |
|
} |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0]) |
|
return |
|
} |
|
|
|
//GetIndexSourceCache GetIndexSource with cache |
|
func (d *Dao) GetIndexSourceCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexSourceReply, err error) { |
|
res = new(mcnmodel.McnGetIndexSourceReply) |
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetIndexSourceReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) { |
|
return d.GetIndexSource(c, signID, date, tp) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetPlaySource 3.3 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.3.查询MCN播放设备占比 |
|
func (d *Dao) GetPlaySource(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetPlaySourceReply, err error) { |
|
res = new(mcnmodel.McnGetPlaySourceReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
).Limit(1, 0).Order("log_date desc") |
|
var api = APIPlaySource |
|
var tmp []*mcnmodel.McnGetPlaySourceReply |
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
if len(tmp) > 0 { |
|
res = tmp[0] |
|
} |
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp) |
|
return |
|
} |
|
|
|
//GetPlaySourceCache GetPlaySource with cache |
|
func (d *Dao) GetPlaySourceCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetPlaySourceReply, err error) { |
|
res = new(mcnmodel.McnGetPlaySourceReply) |
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetPlaySourceReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) { |
|
return d.GetPlaySource(c, signID, date) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetMcnFans 3.4 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.4.查询MCN粉丝数与活跃度 |
|
func (d *Dao) GetMcnFans(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
).Limit(1, 0).Order("log_date desc") |
|
var tmp []*mcnmodel.McnGetMcnFansReply |
|
var api = APIMcnFans |
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
if len(tmp) > 0 { |
|
res = tmp[0] |
|
} |
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp[0]) |
|
return |
|
} |
|
|
|
//GetMcnFansCache GetMcnFans with cache |
|
func (d *Dao) GetMcnFansCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansReply) |
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) { |
|
return d.GetMcnFans(c, signID, date) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetMcnFansInc 3.5 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.5.查询MCN粉丝按天增量 |
|
func (d *Dao) GetMcnFansInc(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansIncReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansIncReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
).Limit(30, 0).Order("log_date desc") |
|
|
|
var api = APIMcnFansInc |
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, res.Result[0]) |
|
return |
|
} |
|
|
|
//GetMcnFansIncCache GetMcnFansInc with cache |
|
func (d *Dao) GetMcnFansIncCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansIncReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansIncReply) |
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansIncReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) { |
|
return d.GetMcnFansInc(c, signID, date) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetMcnFansDec 3.6 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.6.查询MCN粉丝取关数按天 |
|
func (d *Dao) GetMcnFansDec(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansDecReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansDecReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
).Limit(30, 0).Order("log_date desc") |
|
|
|
var api = APIMcnFansDec |
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, res.Result[0]) |
|
return |
|
} |
|
|
|
//GetMcnFansDecCache GetMcnFansDec with cache |
|
func (d *Dao) GetMcnFansDecCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansDecReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansDecReply) |
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansDecReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) { |
|
return d.GetMcnFansDec(c, signID, date) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetMcnFansAttentionWay 3.7 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.7.查询MCN粉丝关注渠道 |
|
func (d *Dao) GetMcnFansAttentionWay(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansAttentionWayReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansAttentionWayReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
).Limit(1, 0).Order("log_date desc") |
|
var tmp []*mcnmodel.McnGetMcnFansAttentionWayReply |
|
var api = APIMcnFansAttentionWay |
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
if len(tmp) > 0 { |
|
res = tmp[0] |
|
} |
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp[0]) |
|
return |
|
} |
|
|
|
//GetMcnFansAttentionWayCache GetMcnFansAttentionWay with cache |
|
func (d *Dao) GetMcnFansAttentionWayCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansAttentionWayReply, err error) { |
|
res = new(mcnmodel.McnGetMcnFansAttentionWayReply) |
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansAttentionWayReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) { |
|
return d.GetMcnFansAttentionWay(c, signID, date) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetFansBaseFansAttr 3.8 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.8.查询MCN粉丝/游客基本属性分析(性别占比 观众年龄 观看途径) |
|
func (d *Dao) GetFansBaseFansAttr(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetBaseFansAttrReply, err error) { |
|
res = new(mcnmodel.McnGetBaseFansAttrReply) |
|
|
|
var group, _ = errgroup.WithContext(c) |
|
group.Go(func() (err error) { |
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
).Limit(1, 0).Order("log_date desc") |
|
var api = APIMcnFansSex |
|
var tmp []*datamodel.DmConMcnFansSexW |
|
if err = d.callDataAPI(context.Background(), api, q, &tmp); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
if len(tmp) > 0 { |
|
res.FansSex = tmp[0] |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, tmp[0]) |
|
return |
|
}) |
|
group.Go(func() (err error) { |
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
).Limit(1, 0).Order("log_date desc") |
|
var tmp []*datamodel.DmConMcnFansAgeW |
|
var api = APIMcnFansAge |
|
if err = d.callDataAPI(context.Background(), api, q, &tmp); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
if len(tmp) > 0 { |
|
res.FansAge = tmp[0] |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, tmp[0]) |
|
return |
|
}) |
|
group.Go(func() (err error) { |
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
).Limit(1, 0).Order("log_date desc") |
|
var tmp []*datamodel.DmConMcnFansPlayWayW |
|
var api = APIMcnFansPlayWay |
|
if err = d.callDataAPI(context.Background(), api, q, &tmp); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
if len(tmp) > 0 { |
|
res.FansPlayWay = tmp[0] |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, tmp[0]) |
|
return |
|
}) |
|
err = group.Wait() |
|
if err != nil { |
|
log.Error("fail to get data, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
//GetFansBaseFansAttrCache GetFansBaseFansAttr with cache |
|
func (d *Dao) GetFansBaseFansAttrCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetBaseFansAttrReply, err error) { |
|
res = new(mcnmodel.McnGetBaseFansAttrReply) |
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetBaseFansAttrReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) { |
|
return d.GetFansBaseFansAttr(c, signID, date, tp) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetFansArea 3.9 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.9.查询MCN粉丝/游客地区分布分析 |
|
func (d *Dao) GetFansArea(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansAreaReply, err error) { |
|
res = new(mcnmodel.McnGetFansAreaReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
) |
|
|
|
var api = APIMcnFansArea |
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0]) |
|
return |
|
} |
|
|
|
//GetFansAreaCache GetFansArea with cache |
|
func (d *Dao) GetFansAreaCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansAreaReply, err error) { |
|
res = new(mcnmodel.McnGetFansAreaReply) |
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetFansAreaReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) { |
|
return d.GetFansArea(c, signID, date, tp) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetFansType 3.10 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.10.查询MCN粉丝/游客内容倾向分析 |
|
func (d *Dao) GetFansType(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTypeReply, err error) { |
|
res = new(mcnmodel.McnGetFansTypeReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
) |
|
|
|
var api = APIMcnFansType |
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
|
|
var tids []int64 |
|
for _, v := range res.Result { |
|
tids = append(tids, v.TypeID) |
|
} |
|
|
|
tpNames := cache.GetTidNames(tids) |
|
for _, v := range res.Result { |
|
if tpName, ok := tpNames[v.TypeID]; ok { |
|
v.TypeName = tpName |
|
} |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0]) |
|
return |
|
} |
|
|
|
//GetFansTypeCache GetFansType with cache |
|
func (d *Dao) GetFansTypeCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTypeReply, err error) { |
|
res = new(mcnmodel.McnGetFansTypeReply) |
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetFansTypeReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) { |
|
return d.GetFansType(c, signID, date, tp) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetFansTag 3.11 |
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.11.查询MCN粉丝/游客标签地图分析 |
|
func (d *Dao) GetFansTag(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTagReply, err error) { |
|
res = new(mcnmodel.McnGetFansTagReply) |
|
|
|
var q = &datacenter.Query{} |
|
q.Select("*").Where( |
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)}, |
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)}, |
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)}, |
|
) |
|
|
|
var api = APIMcnFansTag |
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil { |
|
log.Error("call data api fail, api=%s, err=%s", api, err) |
|
return |
|
} |
|
|
|
var tagIDs []int64 |
|
for _, v := range res.Result { |
|
tagIDs = append(tagIDs, v.TagID) |
|
} |
|
|
|
var tagsReply *tagmdl.TagsReply |
|
if tagsReply, err = global.GetTagGRPC().Tags(c, &tagmdl.TagsReq{Tids: tagIDs}); err != nil { |
|
log.Error("tag(%+v) grpc client fail, err=%s", tagIDs, err) |
|
err = nil |
|
} |
|
|
|
for _, v := range res.Result { |
|
if tagsReply == nil { |
|
continue |
|
} |
|
if tag, ok := tagsReply.Tags[v.TagID]; ok { |
|
v.TagName = tag.Name |
|
} |
|
} |
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0]) |
|
return |
|
} |
|
|
|
//GetFansTagCache GetFansTag with cache |
|
func (d *Dao) GetFansTagCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTagReply, err error) { |
|
res = new(mcnmodel.McnGetFansTagReply) |
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetFansTagReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) { |
|
return d.GetFansTag(c, signID, date, tp) |
|
}) |
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil { |
|
log.Error("cache get err, err=%v", err) |
|
return |
|
} |
|
|
|
return |
|
}
|
|
|