205 lines
5.8 KiB
Go
205 lines
5.8 KiB
Go
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)
|
||
}
|
||
}
|
||
}
|