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