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.

836 lines
22 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package fissionaction
import (
"context"
"joybuywork/internal/consts"
"joybuywork/internal/plugins/hashid"
"joybuywork/internal/plugins/jsonm"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dao"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/queue/producer"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils"
"fmt"
"strings"
)
type identify struct {
campaignId int64
userMark string
userMarkSource int8
isView bool // 是否一个预览用户
}
type pointOnce struct {
t int32 // 埋点类型
at int64 // 行为时间
otherData *types.FissionActionOtherData
opts []Option
}
type MarkPoint struct {
ctx context.Context
p producer.FissionBiReceiver
dimension mtype.Dimension
identify identify
batch bool
points []*pointOnce
actions []*model.FissionAction
afterDo []func()
timezone []int32
}
func NewMarkPoint(ctx context.Context, opts ...BPOption) *MarkPoint {
markPoint := &MarkPoint{
ctx: ctx,
p: producer.NewFissionBiReceiver(ctx),
}
for _, opt := range opts {
opt(markPoint)
}
return markPoint
}
func (s *MarkPoint) append(t int32, at int64, otherData *types.FissionActionOtherData, opts ...Option) {
if s.batch {
s.points = append(s.points, &pointOnce{
t: t,
at: at,
otherData: otherData,
opts: opts,
})
return
}
s.pub(t, at, otherData, opts...)
}
func (s *MarkPoint) appendDo(fc func()) {
s.afterDo = append(s.afterDo, fc)
}
// Push 推送
func (s *MarkPoint) Push() {
for _, point := range s.points {
s.pub(point.t, point.at, point.otherData, point.opts...)
}
s.after()
// 推送之后要重制一下值
s.points, s.actions, s.afterDo = nil, nil, nil
}
func (s *MarkPoint) pub(t int32, at int64, otherData *types.FissionActionOtherData, opts ...Option) {
if s.identify.isView {
return
}
dms := s.dimension
for _, opt := range opts {
opt(&dms.DimensionOption)
}
otherStr, _ := jsonm.MarshalToString(otherData)
tz := s.timezones()
data := types.FissionAction{
ID: hashid.IdBigint(),
CampaignID: s.identify.campaignId,
UserMark: s.identify.userMark,
UserMarkSource: s.identify.userMarkSource,
Type: t,
ActionTime: at,
Dimension: dms,
OtherData: otherStr,
Timezone: tz,
}
s.p.FissionAction(data)
if s.batch {
return
}
s.after()
}
func (s *MarkPoint) after() {
for _, do := range s.afterDo {
do()
}
}
func (s *MarkPoint) platform(platform string) string {
platform = strings.ToLower(platform)
switch platform {
case consts.PlatformAndroid, consts.PlatformIOS, consts.PlatformWeb, consts.PlatformIPad:
default:
platform = consts.PlatformOther
}
return platform
}
func (s *MarkPoint) timezones() []int32 {
if len(s.timezone) > 0 {
return s.timezone
}
cpn, _ := cache.NewCampaign(s.ctx).FindById(s.identify.campaignId)
s.timezone = append(s.timezone, cpn.TOffset)
if len(cpn.GetLangTypes()) == 1 {
return s.timezone
}
m := dao.FissionCampaignLang
var tz []int32
_ = m.WithContext(s.ctx).Where(m.CampaignID.Eq(cpn.ID), m.TOffset.Neq(cpn.TOffset), m.IsDel.Eq(0)).Group(m.TOffset).Pluck(m.TOffset, &tz)
for _, t := range tz {
s.timezone = append(s.timezone, t)
}
return s.timezone
}
// InApp 站内行为
type InApp struct {
*MarkPoint
user *model.FissionUser
}
func (s *MarkPoint) InApp(user *model.FissionUser, dems ...CusDem) InApp {
s.identify = identify{
campaignId: user.CampaignID,
userMark: fmt.Sprint(user.ID),
userMarkSource: mtype.FissionActionUserMarkSourceFissionUser,
isView: user.IsView == mtype.Yes,
}
var platform string
pAttr, _ := cache.NewFissionUserAttr(s.ctx).FindByUniqIdx(user.ID, mtype.FissionUserAttrMarkPlatform)
if pAttr != nil {
platform = pAttr.Value
}
s.dimension = mtype.Dimension{
Platform: platform,
ChannelId: user.ChannelID,
ParentId: user.ParentID,
Lang: utils.STernary[string](user.UserLang, "", user.LangMark),
LevelMark: user.LevelMark,
UserLv: user.UserLevel,
Country: user.UserCountry,
DimensionOption: mtype.DimensionOption{},
}
for _, dem := range dems {
dem(&s.dimension)
}
return InApp{
MarkPoint: s,
user: user,
}
}
// View 访问活动行为
func (s InApp) View(at int64, ip, os, ver, device string) {
s.appendDo(func() {
if s.user.JoinAt > 0 {
return
}
m, sm := dao.FissionUser, dao.FissionUser.SubTable(s.user.CampaignID)
_, _ = m.WithContext(s.ctx).Where(m.ID.Eq(s.user.ID)).UpdateSimple(m.JoinAt.Value(at))
_, _ = sm.WithContext(s.ctx).Where(sm.ID.Eq(s.user.ID)).UpdateSimple(sm.JoinAt.Value(at))
_ = cache.NewFissionUser(s.ctx, s.user.CampaignID).Clear(s.user)
})
s.append(mtype.FissionActionTypeView, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
})
}
// AppOpen 用户打开app行为
func (s InApp) AppOpen(at int64, ip, os, ver, device string, cpnFirst bool) {
s.append(mtype.FissionActionTypeAppOpen, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
}, SetCpnFirst(cpnFirst))
}
// AppInstall 用户安装app行为
func (s InApp) AppInstall(at int64, ip, os, ver, device string, cpnFirst bool) {
s.appendDo(func() {
if s.user.InstallAt > 0 {
return
}
m, sm := dao.FissionUser, dao.FissionUser.SubTable(s.user.CampaignID)
_, _ = m.WithContext(s.ctx).Where(m.ID.Eq(s.user.ID)).UpdateSimple(m.InstallAt.Value(at))
_, _ = sm.WithContext(s.ctx).Where(sm.ID.Eq(s.user.ID)).UpdateSimple(sm.InstallAt.Value(at))
_ = cache.NewFissionUser(s.ctx, s.user.CampaignID).Clear(s.user)
})
s.append(mtype.FissionActionTypeAppInstall, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
}, SetCpnFirst(cpnFirst))
}
// WebFirstOpen 用户首次打开行为
func (s InApp) WebFirstOpen(at int64, ip, os, ver, device string, cpnFirst bool) {
s.appendDo(func() {
if s.user.InstallAt > 0 {
return
}
m, sm := dao.FissionUser, dao.FissionUser.SubTable(s.user.CampaignID)
_, _ = m.WithContext(s.ctx).Where(m.ID.Eq(s.user.ID)).UpdateSimple(m.InstallAt.Value(at))
_, _ = sm.WithContext(s.ctx).Where(sm.ID.Eq(s.user.ID)).UpdateSimple(sm.InstallAt.Value(at))
_ = cache.NewFissionUser(s.ctx, s.user.CampaignID).Clear(s.user)
})
s.append(mtype.FissionActionTypeWebFirstOpen, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
}, SetCpnFirst(cpnFirst))
}
// AppRegister 用户注册app行为
func (s InApp) AppRegister(at int64, ip, os, ver, device string, cpnFirst bool) {
s.appendDo(func() {
if s.user.RegisterAt > 0 {
return
}
m, sm := dao.FissionUser, dao.FissionUser.SubTable(s.user.CampaignID)
_, _ = m.WithContext(s.ctx).Where(m.ID.Eq(s.user.ID)).UpdateSimple(m.RegisterAt.Value(at))
_, _ = sm.WithContext(s.ctx).Where(sm.ID.Eq(s.user.ID)).UpdateSimple(sm.RegisterAt.Value(at))
_ = cache.NewFissionUser(s.ctx, s.user.CampaignID).Clear(s.user)
})
s.append(mtype.FissionActionTypeAppRegister, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
}, SetCpnFirst(cpnFirst))
}
// ClickPlay 活动按钮点击行为
// from: play_btn=点击活动玩的按钮 again=点击再玩一次触发玩的按钮
func (s InApp) ClickPlay(at int64, ip, from string) {
s.append(mtype.FissionActionTypeClickPlay, at, &types.FissionActionOtherData{
Ip: ip,
}, SetFrom(from))
}
// ClickShare 点击分享
func (s InApp) ClickShare(at, mediaId int64, ip string) {
s.append(mtype.FissionActionTypeClickShare, at, &types.FissionActionOtherData{
Ip: ip,
}, SetMediaId(mediaId))
}
// ClickCond 点击去完成条件
// from: my_task=点击我的任务弹窗中的去完成按钮 home=点击首页中展示的任务的去完成按钮
func (s InApp) ClickCond(at, condId int64, ip, from string) {
s.append(mtype.FissionActionTypeClickCond, at, &types.FissionActionOtherData{
Ip: ip,
}, SetCondId(condId), SetFrom(from))
}
// FinishCond 完成条件
func (s InApp) FinishCond(at, condId int64, total float64, event string, eventData []types.EventData) {
s.append(mtype.FissionActionTypeFinishCond, at, &types.FissionActionOtherData{
Event: event,
EventData: eventData,
Total: total,
}, SetCondId(condId))
}
// Sign 签到 signDate 格式为 20250712
func (s InApp) Sign(at int64, utm int32, signDate string) {
s.append(mtype.FissionActionTypeSign, at, nil, SetSignDate(utm, signDate))
}
// UseProp 使用道具
// prop_name: sign_card = 补签卡 fixed_dice = 幸运骰子(固定点数)
//
// uno_three = uno+3道具 uno_five = uno+5道具 uno_fix = uno指定颜色道具
func (s InApp) UseProp(at int64, propName string) {
s.append(mtype.FissionActionTypeUseProp, at, nil, SetPropName(propName))
}
// GetProp 领取道具
// prop_name: sign_card = 补签卡 fixed_dice = 幸运骰子(固定点数)
//
// uno_three = uno+3道具 uno_five = uno+5道具 uno_fix = uno指定颜色道具
func (s InApp) GetProp(at int64, propName string, propNum int32) {
s.append(mtype.FissionActionTypeGetProp, at, nil,
SetPropName(propName),
SetPropNum(propNum),
)
}
// Grow 领养生命体
func (s InApp) Grow(at int64, rewardId int64) {
s.append(mtype.FissionActionTypeGrow, at, nil, SetRewardId(rewardId))
}
// GrowOk 养成生命体
func (s InApp) GrowOk(at int64, rewardId, rewardRecordId int64) {
s.append(mtype.FissionActionTypeGrowOk, at, nil,
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
)
}
// WebToApp web用户转行成app用户
func (s InApp) WebToApp(at, rewardId, rewardRecordId int64, webId string) {
s.append(mtype.FissionActionTypeWebToApp, at, nil,
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
SetFromWebId(webId),
)
}
// ToUse 点击去使用按钮
// from: my_reward=点击奖励记录去使用 window=点击领奖弹窗去使用按钮
func (s InApp) ToUse(at, rewardId int64, ip, from string) {
s.append(mtype.FissionActionTypeToUse, at, &types.FissionActionOtherData{
Ip: ip,
}, SetRewardId(rewardId), SetFrom(from))
}
// ClickLongImg 点击长图
func (s InApp) ClickLongImg(at int64, imgUrl string, imgId, zoneId int64, ip string) {
s.append(mtype.FissionActionTypeClickLongImg, at, &types.FissionActionOtherData{
Ip: ip,
}, SetImgUrl(imgUrl), SetImgId(imgId), SetZoneId(zoneId))
}
// FinishTask 完成任务
func (s InApp) FinishTask(at int64, taskId int64) {
s.append(mtype.FissionActionTypeFinishTask, at, nil, SetTaskId(taskId))
}
// ClickMyTask 点击我的任务icon
func (s InApp) ClickMyTask(at int64, ip string) {
s.append(mtype.FissionActionTypeClickMyTask, at, &types.FissionActionOtherData{
Ip: ip,
})
}
// ClickMyReward 点击奖励记录
func (s InApp) ClickMyReward(at int64, ip string) {
s.append(mtype.FissionActionTypeClickMyReward, at, &types.FissionActionOtherData{
Ip: ip,
})
}
// ClickRule 点击活动规则
func (s InApp) ClickRule(at int64, ip string) {
s.append(mtype.FissionActionTypeClickRule, at, &types.FissionActionOtherData{
Ip: ip,
})
}
// FormShow 打开表单
// from: my_reward = 奖品记录 window = 弹窗
// form_status: blank = 空白表单 fill = 已经填写过的
func (s InApp) FormShow(at int64, status, from string, rewardId, rewardRecordId int64) {
s.append(mtype.FissionActionTypeFormShow, at, nil,
SetFromStatus(status),
SetFrom(from),
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
)
}
// FormSubmit 点击活动规则
func (s InApp) FormSubmit(at int64, rewardId, rewardRecordId int64) {
s.append(mtype.FissionActionTypeFormSubmit, at, nil,
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
)
}
// CopyContact 复制客服联系方式
// from: my_reward = 奖品记录 window = 弹窗
func (s InApp) CopyContact(at int64, from string, rewardId int64) {
s.append(mtype.FissionActionTypeCopyContact, at, nil,
SetFrom(from),
SetRewardId(rewardId),
)
}
// Reward 获得一个奖品
func (s InApp) Reward(at, rewardId, rewardRecordId, childId int64, rewardType int8, rewardNum int32) {
s.append(mtype.FissionActionTypeReward, at, nil,
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
SetChildId(childId),
SetRewardType(int32(rewardType)),
SetRewardNum(rewardNum),
)
}
// ShowWindow 展示弹窗
// from: reward = 获得奖品弹窗 chance = 获得抽奖机会弹窗 chance_lack = 抽奖机会不足弹窗
func (s InApp) ShowWindow(at int64, from string) {
s.append(mtype.FissionActionTypeShowWindow, at, nil,
SetFrom(from),
)
}
// AnswerQa 回答问题
func (s InApp) AnswerQa(at int64, qaId, qaOptionId int64, isRight int32) {
s.append(mtype.FissionActionTypeAnswerQa, at, nil,
SetQaId(qaId),
SetQaOptionId(qaOptionId),
SetQaOptionRight(isRight),
)
}
// SubmitQa 提交答卷
func (s InApp) SubmitQa(at int64, qaGroupId int64, qaNum int32, point string) {
s.append(mtype.FissionActionTypeSubmitQa, at, nil,
SetQaGroupId(qaGroupId),
SetQaNum(qaNum),
SetQaPoint(point),
)
}
// SelectReward 选择奖品
func (s InApp) SelectReward(at int64, rewardId int64) {
s.append(mtype.FissionActionTypeSelectReward, at, nil,
SetRewardId(rewardId),
)
}
// Help 获得助力
// from: help_install = 安装助力 help_register = 注册助力 help_open = 拉日活助力
func (s InApp) Help(at int64, from string, rewardId int64) {
s.append(mtype.FissionActionTypeHelp, at, nil,
SetFrom(from),
SetRewardId(rewardId),
)
}
// Newcomer 完成新人任务
func (s InApp) Newcomer(at int64, rewardId, rewardRecordId int64) {
s.append(mtype.FissionActionTypeNewcomer, at, nil,
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
)
}
// ClickFlip 点击立即翻牌
func (s InApp) ClickFlip(at int64, fromStatus string) {
s.append(mtype.FissionActionTypeClickFlip, at, nil,
SetFromStatus(fromStatus),
)
}
// UseCoin 投放金币
func (s InApp) UseCoin(at int64, sceneId, times int64) {
s.append(mtype.FissionActionTypeUseCoin, at, nil,
SetSceneId(sceneId),
SetUseTimes(times),
)
}
// GetCoin 领取金币
func (s InApp) GetCoin(at int64, sceneId int64) {
s.append(mtype.FissionActionTypeGetCoin, at, nil,
SetSceneId(sceneId),
)
}
// ClickCustomBtn 点击自定义按钮
func (s InApp) ClickCustomBtn(at int64, customBtnId int64) {
s.append(mtype.FissionActionTypeClickCustomBtn, at, nil,
SetCustomBtnId(customBtnId),
)
}
// ClickChild 点击子活动入口
func (s InApp) ClickChild(at int64, childId int64, childType int8) {
s.append(mtype.FissionActionTypeClickChild, at, nil,
SetChildId(childId),
SetChildType(int32(childType)),
)
}
// JoinChild 参与子活动(玩子活动)
func (s InApp) JoinChild(at int64, childId int64, childType int8) {
s.append(mtype.FissionActionTypeJoinChild, at, nil,
SetChildId(childId),
SetChildType(int32(childType)),
)
}
// Pay 支付事件
func (s InApp) Pay(at int64, info *types.PurchaseData) {
s.append(mtype.FissionActionTypePay, at,
&types.FissionActionOtherData{PurchaseData: info},
SetPay(info.Amount, info.Currency),
)
}
// PointsUse 使用积分事件
func (s InApp) PointsUse(at int64, pointUse int32) {
s.append(mtype.FissionActionTypePointsUse, at, nil,
SetPointsUse(pointUse),
)
}
// ManualTask 手动领取任务奖励
func (s InApp) ManualTask(at int64, taskId, rewardId int64) {
s.append(mtype.FissionActionTypeManualTask, at, nil,
SetRewardId(rewardId),
SetTaskId(taskId),
)
}
// CenterDrainage 任务中心引流
func (s InApp) CenterDrainage(at int64, centerHashId, centerModuleId string) {
s.append(mtype.FissionActionTypeCenterDrainage, at, nil,
SetCenterHashId(centerHashId),
SetCenterModuleId(centerModuleId),
)
}
// ClickChat 进入AI对话
// chat_from: icon = 图标,tip = 宠物文案
func (s InApp) ClickChat(at int64, chatFrom, chatTipMsg string) {
s.append(mtype.FissionActionTypeClickChat, at, nil,
SetChatFrom(chatFrom),
SetChatTipMsg(chatTipMsg),
)
}
// VsVote 赛事竞猜投票
func (s InApp) VsVote(at int64, scheduleId int64, winType int32, winTeamId int64) {
s.append(mtype.FissionActionTypeVsVote, at, nil,
SetScheduleId(scheduleId),
SetWinType(winType, winTeamId),
)
}
// VsWin 赛事竞猜获胜
func (s InApp) VsWin(at int64, scheduleId int64, voteNum int32) {
s.append(mtype.FissionActionTypeVsWin, at, nil,
SetScheduleId(scheduleId),
SetVoteNum(voteNum),
)
}
// VsAcceptReward 赛事竞猜领取奖品
func (s InApp) VsAcceptReward(at int64, scheduleId, rewardId, rewardRecordId int64) {
s.append(mtype.FissionActionTypeVsAcceptReward, at, nil,
SetScheduleId(scheduleId),
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
)
}
// MallRedeem 兑换商城商品
func (s InApp) MallRedeem(at int64, mallId, mallItemId int64, pointUse int32) {
s.append(mtype.FissionActionTypeMallRedeem, at, nil,
SetMallId(mallId),
SetMallItemId(mallItemId),
SetPointsUse(pointUse),
)
}
// ClickUnoCard 点击UNO自定卡
func (s InApp) ClickUnoCard(at int64, colorMark, cardNo string, cardId int64) {
s.append(mtype.FissionActionTypeClickUnoCard, at, nil,
SetCardNo(colorMark, cardNo),
SetUnoCardId(cardId),
)
}
// CollectUnoCard 集齐uno卡牌
func (s InApp) CollectUnoCard(at int64, cardColor string) {
s.append(mtype.FissionActionTypeCollectUnoCard, at, nil,
SetCardColor(cardColor),
)
}
// UnlockReward 解锁奖品
func (s InApp) UnlockReward(at, rewardId, taskId int64) {
s.append(mtype.FissionActionTypeUnlockReward, at, nil,
SetRewardId(rewardId),
SetTaskId(taskId),
)
}
// OutApp 站外行为
type OutApp struct {
*MarkPoint
}
func (s *MarkPoint) OutApp(cpnId, channelId, parentId int64, webId, platform, lang string) OutApp {
s.identify = identify{
campaignId: cpnId,
userMark: webId,
userMarkSource: mtype.FissionActionUserMarkSourceUaWebId,
}
s.dimension = mtype.Dimension{
Platform: s.platform(platform),
ChannelId: channelId,
ParentId: parentId,
Lang: lang,
DimensionOption: mtype.DimensionOption{},
}
return OutApp{
MarkPoint: s,
}
}
// View 访问活动行为,这个是web2app用的访问活动
func (s OutApp) View(at int64, ip, os, ver, device string) {
s.append(mtype.FissionActionTypeView, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
})
}
// ViewDownload 浏览下载页行为
// from: base=正常下载页 wechat=从微信跳转过来的下载页 web=站外过来的下载页
func (s OutApp) ViewDownload(at int64, downloadFrom, ip, os, ver, device string) {
s.append(mtype.FissionActionTypeViewDownload, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
}, SetDownloadFrom(downloadFrom))
}
// ClickDownload 点击下载按钮行为 base=正常下载页点击下载 wechat=从微信跳转过来的下载页点击下载 web=站外过来的下载页点击下载
func (s OutApp) ClickDownload(at int64, downloadFrom string) {
s.append(mtype.FissionActionTypeClickDownload, at, nil, SetDownloadFrom(downloadFrom))
}
// ViewWechat 浏览微信页行为
func (s OutApp) ViewWechat(at int64, ip string) {
s.append(mtype.FissionActionTypeViewWechat, at, &types.FissionActionOtherData{
Ip: ip,
})
}
// ViewWeb 访问站外链接行为
func (s OutApp) ViewWeb(at int64, ip, os, ver, device string) {
s.append(mtype.FissionActionTypeViewWeb, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
})
}
// ClickPlayWeb 活动站外按钮点击行为
func (s OutApp) ClickPlayWeb(at int64, rewardId int64) {
s.append(mtype.FissionActionTypeClickPlayWeb, at, nil,
SetRewardId(rewardId),
)
}
// InAppOpenLink 站内打开链接行为
func (s OutApp) InAppOpenLink(at int64, blackBox, uid string) {
s.append(mtype.FissionActionTypeInAppOpenLink, at, nil,
SetBlackbox(blackBox),
SetUid(uid),
)
}
// Help 获得助力
// from: help_click = 点击助力
func (s OutApp) Help(at int64, from string, rewardId int64, ip, os, ver, device string) {
s.append(mtype.FissionActionTypeHelp, at,
&types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
},
SetFrom(from),
SetRewardId(rewardId),
)
}
// ClickShareLink 点击分享连接行为
func (s OutApp) ClickShareLink(at int64, ip, os, ver, device string) {
s.append(mtype.FissionActionTypeClickShareLink, at, &types.FissionActionOtherData{
Ip: ip,
Os: os,
OsVersion: ver,
DeviceModel: device,
})
}
// Child 子活动行为
type Child struct {
*MarkPoint
}
func (s *MarkPoint) Child(child *model.FissionChildUser, user *model.FissionUser, dems ...CusDem) Child {
s.identify = identify{
campaignId: child.CampaignID,
userMark: fmt.Sprint(child.ID),
userMarkSource: mtype.FissionActionUserMarkSourceChild,
}
var platform string
pAttr, _ := cache.NewFissionUserAttr(s.ctx).FindByUniqIdx(user.ID, mtype.FissionUserAttrMarkPlatform)
if pAttr != nil {
platform = pAttr.Value
}
s.dimension = mtype.Dimension{
Platform: platform,
ChannelId: user.ChannelID,
ParentId: user.ParentID,
Lang: utils.STernary[string](user.UserLang, "", user.LangMark),
LevelMark: user.LevelMark,
UserLv: user.UserLevel,
Country: user.UserCountry,
DimensionOption: mtype.DimensionOption{
PCpnId: child.PCpnID,
},
}
for _, dem := range dems {
dem(&s.dimension)
}
return Child{
MarkPoint: s,
}
}
// ChildShow 子活动入口打开
func (s Child) ChildShow(at int64) {
s.append(mtype.FissionActionTypeChildShow, at, nil)
}
// ChildSign 子活动签到
func (s Child) ChildSign(at int64) {
s.append(mtype.FissionActionTypeChildSign, at, nil)
}
// ChildLottery 子活动抽奖
func (s Child) ChildLottery(at int64) {
s.append(mtype.FissionActionTypeChildLottery, at, nil)
}
// ChildInvite 子活动邀请成功
func (s Child) ChildInvite(at int64, invitedId int64) {
s.append(mtype.FissionActionTypeChildInvite, at, &types.FissionActionOtherData{
InvitedId: invitedId,
})
}
// ChildGetReward 子活动获得奖品
func (s Child) ChildGetReward(at int64, rewardId, rewardRecordId int64, rewardType int8) {
s.append(mtype.FissionActionTypeChildGetReward, at, nil,
SetRewardId(rewardId),
SetRewardRecordId(rewardRecordId),
SetRewardType(int32(rewardType)),
)
}