package campaignstat import ( "joybuywork/internal/consts" "joybuywork/internal/repository/cache" "joybuywork/internal/repository/dbcheck" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/provider" "joybuywork/internal/utils" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_campaign_stat" "joybuywork/proto/go_proto/workerr" "github.com/golang-module/carbon/v2" "gorm.io/gen" ) const ( summaryTypeInstall = iota + 1 summaryTypeRegister summaryTypeEvent summaryTypeSign summaryTypeGrow ) type Summary struct { logic.Logic Req *pb.SummaryReq Res *pb.SummaryRes } func (s *Summary) Run() error { return logic.Run(s) } func (s *Summary) Exec() (err error) { cpn, err := s.campaign() if err != nil { return } err = s.common(cpn) if err != nil { return } err = s.scenes(cpn) if err != nil { return } return } func (s *Summary) campaign() (cpn *model.FissionCampaign, err error) { cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignId(), s.Req.GetCampaignHashId()) if err != nil { err = s.BE().CacheError(err) return } if cpn == nil || cpn.IsDel == mtype.Yes { err = workerr.NotFound("not found campaign") return } s.AddAfterRun(func() (err error) { s.Res.Title = cpn.Title s.Res.StartTime = cpn.StartTime s.Res.EndTime = cpn.EndTime s.Res.Status = int32(cpn.Status) return }) return } // 通用统计 func (s *Summary) common(cpn *model.FissionCampaign) (err error) { //裂变最深层级 furM := s.GetDao().FissionUser.SubTable(cpn.ID) var maxDeep struct { Deep int64 `json:"deep"` } err = furM.WithContext(s.Ctx).Select(furM.Deep.Max().As("deep")).Where(furM.CampaignID.Eq(cpn.ID)).Scan(&maxDeep) if err = dbcheck.DbError(err); err != nil { return s.BE().MysqlError(err) } //当天数据 dayNum, dayUserNum, err := provider.NewFissionBehaviorTotal(s.Ctx, cpn.ID).CycleDay(carbon.Now()) if err != nil { return } switch cpn.FissionID { case consts.IdGrow: s.Res.Grow = &pb.SummaryRes_Grow{} s.AddAfterRun(func() (err error) { s.Res.Grow.Today = dayUserNum[mtype.FissionBehaviorMarkGrow] return }) } s.AddAfterRun(func() (err error) { s.Res.MaxDeep = maxDeep.Deep s.Res.TodayViewNum = dayNum[mtype.FissionBehaviorMarkView] s.Res.TodayUserNum = dayUserNum[mtype.FissionBehaviorMarkView] s.Res.TodaySignNum = dayUserNum[mtype.FissionBehaviorMarkSign] s.Res.TodaySignTargetNum = dayUserNum[mtype.FissionBehaviorMarkSignTarget] return }) return } // 场景数据 func (s *Summary) scenes(cpn *model.FissionCampaign) (err error) { conf, err := cache.NewCampaignConfig(s.Ctx).FindByCampaignId(cpn.ID) if err != nil { err = s.BE().CacheError(err) return } var t int32 = summaryTypeEvent defer s.AddAfterRun(func() (err error) { s.Res.Target = int32(conf.Target) s.Res.Option = int32(conf.Option) s.Res.Type = t return }) switch cpn.FissionID { case consts.IdSignIn: t = summaryTypeSign return s._sign(conf) case consts.IdGrow: t = summaryTypeGrow return s._grow(conf) } switch conf.Option { case mtype.FissionCampaignConfigTargetOptionApp: t = utils.Ternary[int32](conf.AppEvent == mtype.FissionCampaignConfigTargetAppEventRegister, summaryTypeRegister, summaryTypeInstall) } switch conf.Option { case mtype.FissionCampaignConfigTargetOptionApp: return s._optionApp(conf) case mtype.FissionCampaignConfigTargetOptionFriend, mtype.FissionCampaignConfigTargetOptionSelf, mtype.FissionCampaignConfigTargetOptionUse, mtype.FissionCampaignConfigTargetOptionTask: return s._eventData(conf) } return } func (s *Summary) _optionApp(conf *model.FissionCampaignConfig) (err error) { m := s.GetDao().FissionTotal var cond = []gen.Condition{ m.CampaignID.Eq(conf.CampaignID), } if conf.AppEvent == mtype.FissionCampaignConfigTargetAppEventRegister { cond = append(cond, m.Mark.In(mtype.FissionBehaviorMarkAppRegister, mtype.FissionBehaviorMarkClickShare, mtype.FissionBehaviorMarkView)) } else { cond = append(cond, m.Mark.In(mtype.FissionBehaviorMarkAppInstall, mtype.FissionBehaviorMarkClickShare, mtype.FissionBehaviorMarkView)) } total, err := m.WithContext(s.Ctx).Where(cond...).Find() if err != nil { return s.BE().MysqlError(err) } s.AddAfterRun(func() (err error) { for _, v := range total { switch v.Mark { case mtype.FissionBehaviorMarkView: s.Res.ViewNum = v.Num s.Res.ViewUserNum = v.UserNum case mtype.FissionBehaviorMarkClickShare: s.Res.ShareUserNum = v.UserNum case mtype.FissionBehaviorMarkAppRegister, mtype.FissionBehaviorMarkAppInstall: s.Res.InstallNum = v.Num } } return }) return } // 事件数据 func (s *Summary) _eventData(conf *model.FissionCampaignConfig) (err error) { m := s.GetDao().FissionTotal total, err := m.WithContext(s.Ctx).Where( m.CampaignID.Eq(conf.CampaignID), m.Mark.In(mtype.FissionBehaviorMarkAppInstall, mtype.FissionBehaviorMarkView, mtype.FissionBehaviorMarkFinishTask), ).Find() if err != nil { return s.BE().MysqlError(err) } condM := s.GetDao().FissionCampaignCond conds, err := condM.WithContext(s.Ctx).Where(condM.CampaignID.Eq(conf.CampaignID)). Where( 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 { return s.BE().MysqlError(err) } s.AddAfterRun(func() (err error) { s.Res.EventData = &pb.SummaryRes_EventData{ TargetNum: 0, TargetUserNum: 0, Conds: make([]*pb.SummaryRes_Cond, 0, len(conds)), } for _, v := range total { switch v.Mark { case mtype.FissionBehaviorMarkFinishTask: s.Res.EventData.TargetNum = v.Num s.Res.EventData.TargetUserNum = v.UserNum case mtype.FissionBehaviorMarkView: s.Res.ViewNum = v.Num s.Res.ViewUserNum = v.UserNum case mtype.FissionBehaviorMarkAppInstall: s.Res.InstallNum = v.Num } } for _, v := range conds { s.Res.EventData.Conds = append(s.Res.EventData.Conds, &pb.SummaryRes_Cond{ Event: v.Event, EventKey: v.EventKey, Num: v.Num, UserNum: v.UserNum, Total: v.Total, IfCond: int32(v.IfCond), }) } return }) return } func (s *Summary) _sign(conf *model.FissionCampaignConfig) (err error) { m := s.GetDao().FissionTotal var cond = []gen.Condition{ m.CampaignID.Eq(conf.CampaignID), m.Mark.In(mtype.FissionBehaviorMarkAppInstall, mtype.FissionBehaviorMarkSign, mtype.FissionBehaviorMarkSignTarget, mtype.FissionBehaviorMarkView), } total, err := m.WithContext(s.Ctx).Where(cond...).Find() if err != nil { return s.BE().MysqlError(err) } s.AddAfterRun(func() (err error) { for _, v := range total { switch v.Mark { case mtype.FissionBehaviorMarkView: s.Res.ViewNum = v.Num s.Res.ViewUserNum = v.UserNum case mtype.FissionBehaviorMarkAppInstall: s.Res.InstallNum = v.Num case mtype.FissionBehaviorMarkSign: s.Res.SignNum = v.UserNum case mtype.FissionBehaviorMarkSignTarget: s.Res.SignTargetNum = v.UserNum } } return }) return } func (s *Summary) _grow(conf *model.FissionCampaignConfig) (err error) { m := s.GetDao().FissionTotal var cond = []gen.Condition{ m.CampaignID.Eq(conf.CampaignID), m.Mark.In(mtype.FissionBehaviorMarkAppInstall, mtype.FissionBehaviorMarkGrow, mtype.FissionBehaviorMarkView), } total, err := m.WithContext(s.Ctx).Where(cond...).Find() if err != nil { return s.BE().MysqlError(err) } s.AddAfterRun(func() (err error) { for _, v := range total { switch v.Mark { case mtype.FissionBehaviorMarkView: s.Res.ViewNum = v.Num s.Res.ViewUserNum = v.UserNum case mtype.FissionBehaviorMarkAppInstall: s.Res.InstallNum = v.Num case mtype.FissionBehaviorMarkGrow: s.Res.Grow.Total = v.UserNum } } return }) return }