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.
204 lines
5.8 KiB
204 lines
5.8 KiB
package service |
|
|
|
import ( |
|
"strconv" |
|
"time" |
|
|
|
"encoding/json" |
|
"go-common/app/interface/openplatform/article/model" |
|
"go-common/library/log" |
|
binfoc "go-common/library/log/infoc" |
|
"go-common/library/stat/prom" |
|
) |
|
|
|
type displayInfo struct { |
|
ip string |
|
mid string |
|
now string |
|
client string |
|
build string |
|
buvid string |
|
pagetype string |
|
pageNo string |
|
isRec string |
|
showlist json.RawMessage |
|
} |
|
|
|
type clickInfo struct { |
|
mid string |
|
client string |
|
build string |
|
buvid string |
|
now string |
|
from string |
|
itemID string |
|
itemType string |
|
extra json.RawMessage |
|
} |
|
|
|
type aiClickInfo struct { |
|
mid string |
|
client string |
|
build string |
|
buvid string |
|
time string |
|
from string |
|
itemID string |
|
itemType string |
|
actionID string |
|
action string |
|
extra json.RawMessage |
|
} |
|
|
|
// 用户在列表页停留上报 |
|
type showInfo struct { |
|
ip string |
|
time string |
|
buvid string |
|
mid string |
|
client string |
|
pageType string |
|
from string |
|
build string |
|
extra string |
|
} |
|
|
|
type recItem struct { |
|
ID int64 `json:"id"` |
|
Page int64 `json:"page"` |
|
Pos int64 `json:"pos"` |
|
View int64 `json:"view"` |
|
Fav int64 `json:"fav"` |
|
Like int64 `json:"like"` |
|
Reply int64 `json:"reply"` |
|
Share int64 `json:"share"` |
|
AvFeature string `json:"av_feature,omitempty"` |
|
UserFeature string `json:"user_feature,omitempty"` |
|
} |
|
|
|
// RecommendInfoc . |
|
func (s *Service) RecommendInfoc(mid int64, plat int8, pageType, cid, build int, buvid, ip string, metas []*model.Meta, isRcmd bool, now time.Time, pn int64, sky *model.SkyHorseResp) { |
|
var isRc = "0" |
|
if isRcmd { |
|
isRc = "1" |
|
} |
|
skyMap := make(map[int64]string) |
|
if sky != nil { |
|
for _, item := range sky.Data { |
|
skyMap[item.ID] = item.AvFeature |
|
} |
|
} |
|
var list []*recItem |
|
for i, m := range metas { |
|
x := &recItem{ID: m.ID, Page: pn, Pos: int64(i + 1), View: m.Stats.View, Fav: m.Stats.Favorite, Like: m.Stats.Like, Reply: m.Stats.Reply, Share: m.Stats.Share} |
|
if sky != nil && sky.UserFeature != "" { |
|
x.UserFeature = sky.UserFeature |
|
} |
|
x.AvFeature = skyMap[m.ID] |
|
list = append(list, x) |
|
} |
|
var sl = &struct { |
|
List []*recItem `json:"itemlist"` |
|
}{ |
|
List: list, |
|
} |
|
msg, _ := json.Marshal(sl) |
|
s.infoc(displayInfo{ip, strconv.FormatInt(mid, 10), strconv.FormatInt(now.Unix(), 10), strconv.Itoa(int(plat)), strconv.Itoa(build), buvid, strconv.Itoa(pageType), strconv.Itoa(cid), isRc, msg}) |
|
} |
|
|
|
// ViewInfoc . |
|
func (s *Service) ViewInfoc(mid int64, plat int8, build int, itemType, from, buvid string, itemID int64, now time.Time, ua string) { |
|
var extra = &struct { |
|
UA string `json:"ua"` |
|
}{ |
|
UA: ua, |
|
} |
|
msg, _ := json.Marshal(extra) |
|
s.infoc(clickInfo{strconv.FormatInt(mid, 10), strconv.Itoa(int(plat)), strconv.Itoa(build), buvid, strconv.FormatInt(now.Unix(), 10), from, strconv.FormatInt(itemID, 10), itemType, msg}) |
|
} |
|
|
|
// AIViewInfoc . |
|
func (s *Service) AIViewInfoc(mid int64, plat int8, build int, itemType, from, buvid string, itemID int64, now time.Time, ua string) { |
|
var extra = &struct { |
|
UA string `json:"ua"` |
|
}{ |
|
UA: ua, |
|
} |
|
msg, _ := json.Marshal(extra) |
|
s.infoc(aiClickInfo{ |
|
mid: strconv.FormatInt(mid, 10), |
|
client: model.Client(plat), |
|
build: strconv.Itoa(build), |
|
buvid: buvid, |
|
time: strconv.FormatInt(now.Unix(), 10), |
|
from: from, |
|
itemID: strconv.FormatInt(itemID, 10), |
|
itemType: itemType, |
|
action: "click", |
|
actionID: "", |
|
extra: msg, |
|
}) |
|
} |
|
|
|
// ShowInfoc . |
|
func (s *Service) ShowInfoc(ip string, now time.Time, buvid string, mid int64, client int8, pageType string, from string, build string, ua string, referer string) { |
|
var extra = &struct { |
|
UA string `json:"ua"` |
|
Referer string `json:"referer"` |
|
}{ |
|
UA: ua, |
|
Referer: referer, |
|
} |
|
msg, _ := json.Marshal(extra) |
|
s.infoc(showInfo{ |
|
ip: ip, |
|
time: strconv.FormatInt(now.Unix(), 10), |
|
buvid: buvid, |
|
mid: strconv.FormatInt(mid, 10), |
|
client: strconv.Itoa(int(client)), |
|
pageType: pageType, |
|
from: from, |
|
build: build, |
|
extra: string(msg), |
|
}) |
|
} |
|
|
|
func (s *Service) infoc(i interface{}) { |
|
select { |
|
case s.logCh <- i: |
|
default: |
|
log.Warn("infocproc chan full") |
|
} |
|
} |
|
|
|
// writeInfoc |
|
func (s *Service) infocproc() { |
|
var ( |
|
displayInfoc = binfoc.New(s.c.DisplayInfoc) |
|
clickInfoc = binfoc.New(s.c.ClickInfoc) |
|
aiClickInfoc = binfoc.New(s.c.AIClickInfoc) |
|
showInfoc = binfoc.New(s.c.ShowInfoc) |
|
) |
|
for { |
|
i, ok := <-s.logCh |
|
if !ok { |
|
log.Warn("infoc proc exit") |
|
return |
|
} |
|
prom.BusinessInfoCount.State("infoc_channel", int64(len(s.logCh))) |
|
switch l := i.(type) { |
|
case displayInfo: |
|
displayInfoc.Info(l.ip, l.now, l.buvid, l.mid, l.client, l.pagetype, l.pageNo, string(l.showlist), l.isRec, l.build) |
|
log.Info("infocproc displayInfo param(ip:%s,now:%s,buvid:%s,mid:%s,client:%s,pagetype:%s,pageno:%s,showlist:%s,isRec:%s,build:%s)", l.ip, l.now, l.buvid, l.mid, l.client, l.pagetype, l.pageNo, l.showlist, l.isRec, l.build) |
|
case clickInfo: |
|
clickInfoc.Info(l.from, l.now, l.buvid, l.mid, l.client, l.itemType, l.itemID, "", l.build) |
|
log.Info("infocproc clickInfoc param(client:%s,buvid:%s,mid:%s,now:%s,from:%s,build:%s,itemID:%s,itemType:%s)", l.client, l.buvid, l.mid, l.now, l.from, l.build, l.itemID, l.itemType) |
|
case aiClickInfo: |
|
aiClickInfoc.Info(l.client, l.buvid, l.mid, l.time, l.from, l.build, l.itemID, l.itemType, l.action, l.actionID, string(l.extra)) |
|
log.Info("infocproc aiclickInfoc param(client:%s,buvid:%s,mid:%s,time:%s,from:%s,build:%s,itemID:%s,itemType:%s,action: %s, actionID: %s, extra: %s)", l.client, l.buvid, l.mid, l.time, l.from, l.build, l.itemID, l.itemType, l.action, l.actionID, string(l.extra)) |
|
case showInfo: |
|
showInfoc.Info(l.ip, l.time, l.buvid, l.mid, l.client, l.pageType, l.from, l.build, l.extra) |
|
log.Info("infocproc showInfoc param(%+v)", l) |
|
} |
|
} |
|
}
|
|
|