You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.5 KiB
Go
157 lines
4.5 KiB
Go
package campaignnotice
|
|
|
|
import (
|
|
"joybuywork/internal/app"
|
|
"joybuywork/internal/consts/ckey"
|
|
"joybuywork/internal/plugins/jsonm"
|
|
"joybuywork/internal/repository/dbcheck"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"joybuywork/internal/repository/withdefault"
|
|
"joybuywork/internal/service/provider"
|
|
"joybuywork/internal/service/queue/types"
|
|
"joybuywork/internal/utils"
|
|
"joybuywork/internal/utils/logic"
|
|
"time"
|
|
)
|
|
|
|
type Behavior struct {
|
|
logic.Logic
|
|
|
|
Req *types.CampaignBehavior
|
|
}
|
|
|
|
func (s *Behavior) Exec() (err error) {
|
|
var mark string
|
|
var first bool
|
|
switch s.Req.BehaviorType {
|
|
case mtype.FissionBehaviorTypeView, mtype.FissionBehaviorTypeClickPlay, mtype.FissionBehaviorTypeClickShare,
|
|
mtype.FissionBehaviorTypeViewDownload, mtype.FissionBehaviorTypeClickDownload, mtype.FissionBehaviorTypeViewWechat,
|
|
mtype.FissionBehaviorTypeAppInstall, mtype.FissionBehaviorTypeAppOpen, mtype.FissionBehaviorTypeViewDownloadByWx,
|
|
mtype.FissionBehaviorTypeAppRegister, mtype.FissionBehaviorTypeCustom, mtype.FissionBehaviorTypeFinishTask,
|
|
mtype.FissionBehaviorTypeViewHot, mtype.FissionBehaviorTypeViewWeb, mtype.FissionBehaviorTypeSign,
|
|
mtype.FissionBehaviorTypeSignTarget, mtype.FissionBehaviorTypeSignCard,
|
|
mtype.FissionBehaviorTypeGrow, mtype.FissionBehaviorTypeGrowOk:
|
|
mark = mtype.BehaviorTypeToMark[s.Req.BehaviorType]
|
|
case mtype.FissionBehaviorTypeFinishCond, mtype.FissionBehaviorTypeClickMedia,
|
|
mtype.FissionBehaviorTypeChannelInstall, mtype.FissionBehaviorTypeChannelView, mtype.FissionBehaviorTypeChannelOpen,
|
|
mtype.FissionBehaviorTypeClickIcon, mtype.FissionBehaviorTypeRewardApp, mtype.FissionBehaviorTypeRewardWeb:
|
|
mark = utils.BehaviorFormatMark(s.Req.BehaviorType, s.Req.MarkId)
|
|
}
|
|
|
|
if mark == "" {
|
|
return
|
|
}
|
|
|
|
// 是否是第一次行为
|
|
first, err = s.firstBehavior(mark)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// 记录缓存统计
|
|
s.stat()
|
|
|
|
// 创建行为记录
|
|
err = s.create(mark)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return provider.NewFissionBehaviorTotal(s.Ctx, s.Req.CampaignId).FissionTotalAdd(1, s.Req.BehaviorType, mark, first)
|
|
}
|
|
|
|
// 创建一个行为记录
|
|
func (s *Behavior) create(mark string) (err error) {
|
|
|
|
b := withdefault.FissionBehavior(&model.FissionBehavior{
|
|
BehaviorType: s.Req.BehaviorType,
|
|
BehaviorTime: s.Req.BehaviorTime,
|
|
CampaignID: s.Req.CampaignId,
|
|
UserMark: s.Req.UserMark,
|
|
Mark: mark,
|
|
})
|
|
|
|
b.OtherData, _ = jsonm.MarshalToString(s.Req.OtherData)
|
|
|
|
m := s.GetDao().FissionBehavior
|
|
err = m.WithContext(s.Ctx).Create(b)
|
|
if err != nil {
|
|
return s.BE().MysqlError(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 用户新行为
|
|
func (s *Behavior) firstBehavior(mark string) (yes bool, err error) {
|
|
key := ckey.FissionUserFirstBehavior(s.Req.CampaignId, s.Req.UserMark, mark)
|
|
defer func() {
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
app.Redis.Cache.Expire(s.Ctx, key, 2*time.Hour)
|
|
}()
|
|
|
|
exist, err := app.Redis.Exists(s.Ctx, key)
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if exist {
|
|
return
|
|
}
|
|
|
|
first, err := app.Redis.Cache.SetNX(s.Ctx, key, 1, 2*time.Hour).Result()
|
|
if err != nil {
|
|
err = s.BE().CacheError(err)
|
|
return
|
|
}
|
|
|
|
if !first {
|
|
return
|
|
}
|
|
|
|
m := s.GetDao().FissionBehavior
|
|
info, err := m.WithContext(s.Ctx).
|
|
Select(m.CampaignID, m.Mark, m.UserMark).
|
|
Where(m.CampaignID.Eq(s.Req.CampaignId), m.Mark.Eq(mark), m.UserMark.Eq(s.Req.UserMark)).
|
|
Take()
|
|
if err = dbcheck.DbError(err); err != nil {
|
|
err = s.BE().MysqlError(err)
|
|
return
|
|
}
|
|
|
|
if info != nil {
|
|
return
|
|
}
|
|
|
|
return first, nil
|
|
}
|
|
|
|
// 做展示的纬度即时统计,保证为归档的数据实时展示
|
|
func (s *Behavior) stat() {
|
|
var mark string
|
|
switch s.Req.BehaviorType {
|
|
case mtype.FissionBehaviorTypeView, mtype.FissionBehaviorTypeClickPlay, mtype.FissionBehaviorTypeClickShare,
|
|
mtype.FissionBehaviorTypeViewDownload, mtype.FissionBehaviorTypeClickDownload, mtype.FissionBehaviorTypeViewWechat,
|
|
mtype.FissionBehaviorTypeAppInstall, mtype.FissionBehaviorTypeViewDownloadByWx, mtype.FissionBehaviorTypeAppRegister,
|
|
mtype.FissionBehaviorTypeFinishTask, mtype.FissionBehaviorTypeSign, mtype.FissionBehaviorTypeSignTarget,
|
|
mtype.FissionBehaviorTypeGrow:
|
|
mark = mtype.BehaviorTypeToMark[s.Req.BehaviorType]
|
|
case mtype.FissionBehaviorTypeFinishCond, mtype.FissionBehaviorTypeRewardApp:
|
|
mark = utils.BehaviorFormatMark(s.Req.BehaviorType, s.Req.MarkId)
|
|
}
|
|
|
|
if mark == "" {
|
|
return
|
|
}
|
|
|
|
fbt := provider.NewFissionBehaviorTotal(s.Ctx, s.Req.CampaignId)
|
|
|
|
fbt.StatHour(mark, s.Req.BehaviorTime, s.Req.UserMark)
|
|
fbt.StatDay(mark, s.Req.BehaviorTime, s.Req.UserMark)
|
|
}
|