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

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)
}