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.

290 lines
7.0 KiB
Go

package campaignstat
import (
"joybuywork/internal/consts"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/provider"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign_stat"
"joybuywork/proto/go_proto/workerr"
)
type StatEvent struct {
logic.Logic
Req *pb.StatEventReq
Res *pb.StatEventRes
}
func (s *StatEvent) Run() error {
return logic.Run(s)
}
func (s *StatEvent) Exec() (err error) {
cpn, err := s.campaign()
if err != nil {
return
}
if cpn.Target == mtype.FissionCampaignConfigTargetChild {
return s.childEvent(cpn)
}
return s.event(cpn)
}
// 活动数据
func (s *StatEvent) campaign() (cpn *model.FissionCampaign, err error) {
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil {
err = workerr.NotFound("not found cpn")
return
}
s.Res.CampaignId = cpn.ID
s.Res.TOffect = provider.NewCampaignTZ(s.Ctx, cpn, s.Req.GetLangMark()).GetTz()
return
}
func (s *StatEvent) event(cpn *model.FissionCampaign) (err error) {
switch cpn.FissionID {
case consts.IdGrow, consts.IdKeep:
return s._grow(cpn)
case consts.IdQa, consts.IdQaVideo, consts.IdQaAudio, consts.IdPrizeAnswer:
return s._qa(cpn)
case consts.IdWinTogether:
return s._win(cpn)
case consts.IdCoin:
return s._coin(cpn)
case consts.IdSignIn:
return s._sign(cpn)
case consts.IdBallot:
return s._ballot(cpn)
default:
return s._normal(cpn)
}
}
func (s *StatEvent) _normal(cpn *model.FissionCampaign) (err error) {
var eventIds = []int32{
mtype.FissionActionTypeView,
}
m := s.GetDao().FissionCampaignTicket
tickets, err := m.WithContext(s.Ctx).Where(
m.CampaignID.Eq(cpn.ID),
m.Mark.In(mtype.FissionCampaignTicketFixed, mtype.FissionCampaignTicketCustom, mtype.FissionCampaignTicketRewardHelp),
m.Open.Eq(mtype.Yes),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
// 保证一些顺序 顺序:固定事件->助力->自定义
var sortMap = make(map[string]*model.FissionCampaignTicket)
for _, ticket := range tickets {
sortMap[ticket.Mark] = ticket
}
var installEvent, registerEvent bool
// 固定
if ticket, ok := sortMap[mtype.FissionCampaignTicketFixed]; ok {
switch ticket.AppEvent {
case mtype.FissionCampaignTicketAppEventInstall:
eventIds = append(eventIds,
mtype.FissionActionTypeAppInstall,
mtype.FissionActionTypeWebFirstOpen,
mtype.FissionActionTypeClickDownload,
mtype.FissionActionTypeViewDownload,
)
installEvent = true
case mtype.FissionCampaignTicketAppEventRegister:
eventIds = append(eventIds, mtype.FissionActionTypeAppRegister)
registerEvent = true
}
}
// 助力
if ticket, ok := sortMap[mtype.FissionCampaignTicketRewardHelp]; ok {
for _, mark := range ticket.GetHelpEvent() {
s.Res.HelpEvent = append(s.Res.HelpEvent, mark)
if mark == mtype.FissionCampaignTicketHelpEventInstall && !installEvent {
eventIds = append(eventIds,
mtype.FissionActionTypeAppInstall,
mtype.FissionActionTypeWebFirstOpen,
mtype.FissionActionTypeClickDownload,
mtype.FissionActionTypeViewDownload,
)
installEvent = true
} else if mark == mtype.FissionCampaignTicketHelpEventRegister && !registerEvent {
eventIds = append(eventIds, mtype.FissionActionTypeAppRegister)
registerEvent = true
}
}
eventIds = append(eventIds, mtype.FissionActionTypeHelp)
}
// 自定义
if ticket, ok := sortMap[mtype.FissionCampaignTicketCustom]; ok {
switch ticket.PreEvent {
case mtype.FissionCampaignTicketPreEventRegister:
if !registerEvent {
eventIds = append(eventIds, mtype.FissionActionTypeAppRegister)
registerEvent = true
}
case mtype.FissionCampaignTicketPreEventInstall:
if !installEvent {
eventIds = append(eventIds,
mtype.FissionActionTypeAppInstall,
mtype.FissionActionTypeWebFirstOpen,
mtype.FissionActionTypeClickDownload,
mtype.FissionActionTypeViewDownload,
)
installEvent = true
}
}
eventIds = append(eventIds, mtype.FissionActionTypeFinishCond)
err = s._getTask(cpn.ID)
if err != nil {
return
}
}
s.Res.EventIds = eventIds
return
}
func (s *StatEvent) _getTask(cpnId int64) (err error) {
condM := s.GetDao().FissionCampaignCond
var conds []*model.FissionCampaignCond
conds, err = condM.WithContext(s.Ctx).
Where(
condM.CampaignID.Eq(cpnId),
condM.RewardID.Eq(0),
condM.WithContext(s.Ctx).
Or(condM.IsDel.Eq(mtype.No)).
Or(condM.IsDel.Eq(mtype.Yes), condM.DelUse.Eq(mtype.Yes)),
).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
s.Res.Tasks = make([]*pb.StatEventRes_Task, 0, len(conds))
for _, cond := range conds {
s.Res.Tasks = append(s.Res.Tasks, &pb.StatEventRes_Task{
Id: cond.ID,
Title: cond.Desc,
})
}
return
}
func (s *StatEvent) _grow(cpn *model.FissionCampaign) (err error) {
err = s._normal(cpn)
if err != nil {
return
}
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeGrow, mtype.FissionActionTypeGrowOk)
return
}
func (s *StatEvent) _qa(cpn *model.FissionCampaign) (err error) {
err = s._normal(cpn)
if err != nil {
return
}
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeSubmitQa)
return
}
func (s *StatEvent) _win(cpn *model.FissionCampaign) (err error) {
err = s._normal(cpn)
if err != nil {
return
}
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeNewcomer)
return
}
func (s *StatEvent) _coin(cpn *model.FissionCampaign) (err error) {
err = s._normal(cpn)
if err != nil {
return
}
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeUseCoin)
return
}
func (s *StatEvent) _sign(cpn *model.FissionCampaign) (err error) {
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeSign)
conf, err := cache.NewCampaignSign(s.Ctx).FindByCampaignId(cpn.ID)
if err != nil {
err = s.BE().CacheError(err)
return
}
if conf == nil || conf.HasCard == mtype.No {
return
}
s.Res.EventIds = append(s.Res.EventIds,
mtype.FissionActionTypeAppInstall,
mtype.FissionActionTypeWebFirstOpen,
mtype.FissionActionTypeClickDownload,
mtype.FissionActionTypeViewDownload,
)
return
}
func (s *StatEvent) childEvent(cpn *model.FissionCampaign) (err error) {
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeChildShow)
switch cpn.ChildType {
case mtype.FissionCampaignChildTypeSign:
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeChildSign)
case mtype.FissionCampaignChildTypeInvite:
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeChildInvite)
case mtype.FissionCampaignChildTypeLucky, mtype.FissionCampaignChildTypeBlind:
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeChildLottery)
case mtype.FissionCampaignChildTypeTask:
}
return
}
func (s *StatEvent) _ballot(cpn *model.FissionCampaign) (err error) {
s.Res.EventIds = append(s.Res.EventIds, mtype.FissionActionTypeView)
return
}