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 }