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.

269 lines
8.2 KiB
Go

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
}