go-common/app/interface/openplatform/article/service/infoc.go
2019-04-22 18:49:16 +08:00

205 lines
5.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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:%spageno:%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)
}
}
}