package fissionaction import ( "context" "joybuywork/internal/consts" "joybuywork/internal/repository/cache" "joybuywork/internal/repository/dao" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/utils" "joybuywork/internal/utils/merr" "joybuywork/internal/utils/verify" ) // 这个是玩法共用的埋点事件,如果有其他玩法没有,调整一下 var commonAction = []int32{ mtype.FissionActionTypeView, mtype.FissionActionTypeAppInstall, mtype.FissionActionTypeWebFirstOpen, mtype.FissionActionTypeAppRegister, mtype.FissionActionTypeAppOpen, mtype.FissionActionTypeViewDownload, mtype.FissionActionTypeClickDownload, } // 排序在最后面的埋点 var weakAction = []int32{ mtype.FissionActionTypeReward, mtype.FissionActionTypeToUse, mtype.FissionActionTypeClickRule, mtype.FissionActionTypeClickShareLink, mtype.FissionActionTypeViewWeb, } type ActionList struct { ctx context.Context be *merr.BusinessError cpn *model.FissionCampaign conf *model.FissionCampaignConfig tempGroup *model.FissionTempGroup } func NewActionList(ctx context.Context, cpn *model.FissionCampaign, conf *model.FissionCampaignConfig, tempGroup *model.FissionTempGroup) *ActionList { return &ActionList{ ctx: ctx, be: merr.NewBE(ctx), cpn: cpn, conf: conf, tempGroup: tempGroup, } } // GetFissionAction 获取活动支持的埋点事件 func (s ActionList) GetFissionAction() (actions []int32) { actions = append(actions, commonAction...) if !s._notNeedClickShare() { actions = append(actions, mtype.FissionActionTypeClickShare) } if !s._notNeedClickPlay() { actions = append(actions, mtype.FissionActionTypeClickPlay) } if !s._notSupportCond() { actions = append(actions, mtype.FissionActionTypeClickCond, mtype.FissionActionTypeFinishCond, mtype.FissionActionTypeClickMyTask) } if s._hasClickPlayWeb() { actions = append(actions, mtype.FissionActionTypeClickPlayWeb) } if s.cpn.Target == mtype.FissionCampaignConfigTargetAdsGame { actions = append(actions, mtype.FissionActionTypeWebToApp) } if s.conf.HasLongImg == mtype.Yes { actions = append(actions, mtype.FissionActionTypeClickLongImg) } switch s.cpn.FissionID { case consts.IdFlip: actions = append(actions, mtype.FissionActionTypeClickMyReward, mtype.FissionActionTypeShowWindow, mtype.FissionActionTypeClickFlip) case consts.IdPrizeWheel, consts.IdBlindBox, consts.IdSlotMachine, consts.IdLuckyGrid: actions = append(actions, mtype.FissionActionTypeClickMyReward) case consts.IdGrow, consts.IdKeep: actions = append(actions, mtype.FissionActionTypeGrow, mtype.FissionActionTypeGrowOk) case consts.IdQa, consts.IdQaAudio, consts.IdQaVideo: actions = append(actions, mtype.FissionActionTypeAnswerQa, mtype.FissionActionTypeSubmitQa) case consts.IdChop: actions = append(actions, mtype.FissionActionTypeHelp) if s._manyReward() { actions = append(actions, mtype.FissionActionTypeSelectReward) } case consts.IdWinTogether: actions = append(actions, mtype.FissionActionTypeNewcomer) case consts.IdCoin: actions = append(actions, mtype.FissionActionTypeUseCoin, mtype.FissionActionTypeGetCoin, mtype.FissionActionTypeClickCustomBtn) case consts.IdSignIn: actions = append(actions, mtype.FissionActionTypeSign) if s._hasUseProp() { actions = append(actions, mtype.FissionActionTypeUseProp) } case consts.IdVs: actions = append(actions, mtype.FissionActionTypeVsVote) default: } if s._hasManualTask() { actions = append(actions, mtype.FissionActionTypeManualTask) } if s._unlockReward() { actions = append(actions, mtype.FissionActionTypeUnlockReward) } actions = append(actions, weakAction...) return } // GetFixDimension 获取活动固有维度 func (s ActionList) GetFixDimension() (dms []string) { dms = []string{ DimensionDateKey, DimensionPlatformKey, DimensionLangKey, DimensionChannelKey, DimensionLevelMarkKey, } // 多语言时区 if len(s.cpn.GetLangTypes()) > 0 { dms = append(dms, DimensionLangGmtKey) } return } // GetDimension 获取埋点事件专属维度 func (s ActionList) GetDimension(actionType int32) (dms []string) { switch s.conf.RewardGroup { case mtype.FissionRewardGroupCountry: dms = append(dms, DimensionCountryKey) } switch actionType { case mtype.FissionActionTypeClickDownload, mtype.FissionActionTypeViewDownload: dms = append(dms, DimensionDownloadFromKey) case mtype.FissionActionTypeClickShare: dms = append(dms, DimensionMediaKey) case mtype.FissionActionTypeClickCond: dms = append(dms, DimensionCondKey) if s._condHasForm() { dms = append(dms, DimensionFromKey) } case mtype.FissionActionTypeFinishCond: dms = append(dms, DimensionCondKey) case mtype.FissionActionTypeToUse: dms = append(dms, DimensionRewardKey, DimensionFromKey) case mtype.FissionActionTypeReward: dms = append(dms, DimensionRewardKey, DimensionRewardTypeKey) case mtype.FissionActionTypeSelectReward: dms = append(dms, DimensionRewardKey) case mtype.FissionActionTypeClickPlay, mtype.FissionActionTypeShowWindow, mtype.FissionActionTypeHelp: dms = append(dms, DimensionFromKey) case mtype.FissionActionTypeClickLongImg: dms = append(dms, DimensionImgUrlKey, DimensionZoneIdKey) case mtype.FissionActionTypeGrow, mtype.FissionActionTypeGrowOk: if s._growHasReward() { dms = append(dms, DimensionRewardKey) } case mtype.FissionActionTypeAnswerQa: dms = append(dms, DimensionQaIdKey, DimensionQaOptionIdKey) case mtype.FissionActionTypeSubmitQa: dms = append(dms, DimensionQaPointKey) case mtype.FissionActionTypeClickFlip: dms = append(dms, DimensionFromStatusKey) case mtype.FissionActionTypeClickCustomBtn: dms = append(dms, DimensionCustomBtnIdKey) case mtype.FissionActionTypeManualTask: dms = append(dms, DimensionTaskIdKey, DimensionRewardKey) case mtype.FissionActionTypeClickShareLink: dms = append(dms, DimensionParentIdKey) case mtype.FissionActionTypeVsVote: dms = append(dms, DimensionScheduleIdKey, DimensionWinTeamIdKey) case mtype.FissionActionTypeUnlockReward: dms = append(dms, DimensionRewardKey) } return } // 任务埋点是否有来源维度 func (s ActionList) _condHasForm() bool { return verify.InArray(s.cpn.FissionID, consts.IdFlip) || (s.cpn.FissionID == consts.IdLuckyGrid && s.tempGroup.Mark == "grid_palm") } func (s ActionList) _notSupportCond() bool { if verify.InArray(s.cpn.FissionID, consts.IdChop, consts.IdCash) { return true } ticket, _ := cache.NewCampaignTicket(s.ctx).FindByMark(s.cpn.ID, mtype.FissionCampaignTicketCustom) return ticket == nil || ticket.Open == mtype.No } func (s ActionList) _unlockReward() bool { m := dao.FissionCampaignReward count, _ := m.WithContext(s.ctx).Where(m.CampaignID.Eq(s.cpn.ID), m.OpenTask.Eq(mtype.Yes), m.IsDel.Eq(mtype.No)).Count() return count > 0 } func (s ActionList) _hasManualTask() bool { m := dao.FissionCampaignTask count, _ := m.WithContext(s.ctx).Where( m.CampaignID.Eq(s.cpn.ID), m.AwardMode.Eq(mtype.FissionCampaignTaskAwardModeManual), m.IsDel.Eq(mtype.No), ).Count() return count > 0 } func (s ActionList) _manyReward() bool { m := dao.FissionCampaignReward count, _ := m.WithContext(s.ctx).Where(m.CampaignID.Eq(s.cpn.ID), m.RewardType.Eq(mtype.FissionCampaignRewardTypeApp), m.IsDel.Eq(mtype.No)).Count() return count > 1 } func (s ActionList) _hasUseProp() bool { switch s.cpn.FissionID { case consts.IdSignIn: conf, _ := cache.NewCampaignSign(s.ctx).FindByCampaignId(s.cpn.ID) return conf.HasCard == mtype.Yes default: return false } } func (s ActionList) _growHasReward() bool { return verify.InArray[int64](s.cpn.FissionID, consts.IdKeep) } func (s ActionList) _notNeedClickPlay() bool { return verify.InArray[int64](s.cpn.FissionID, consts.IdWinTogether, consts.IdReferral, consts.IdCash, consts.IdKeep, consts.IdSignIn, consts.IdVs, ) } func (s ActionList) _notNeedClickShare() bool { conf, _ := cache.NewCampaignConfig(s.ctx).FindByCampaignId(s.cpn.ID) return utils.Ternary[bool](verify.InArray[int64](s.cpn.FissionID, consts.IdSignIn, consts.IdQa, consts.IdQaAudio, consts.IdQaVideo, consts.IdPrizeQuiz), conf.OpenShare == mtype.No, false) } func (s ActionList) _hasClickPlayWeb() bool { return s.conf.HasWeb == mtype.Yes || s.cpn.Target == mtype.FissionCampaignConfigTargetAdsGame }