package campaignstat import ( "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/provider" "joybuywork/internal/utils" "joybuywork/internal/utils/decimal" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_campaign_stat" "joybuywork/proto/go_proto/workerr" "github.com/golang-module/carbon/v2" ) type AdsSummary struct { logic.Logic Req *pb.AdsSummaryReq Res *pb.AdsSummaryRes } func (s *AdsSummary) Run() error { return logic.Run(s) } func (s *AdsSummary) Exec() (err error) { cpn, err := s.campaign() if err != nil { return } err = s.total(cpn) if err != nil { return } err = s.today(cpn) if err != nil { return } err = s.compare(cpn) if err != nil { return } return } func (s *AdsSummary) 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 || cpn.IsDel == mtype.Yes { err = workerr.NotFound("not found campaign") return } return } func (s *AdsSummary) total(cpn *model.FissionCampaign) (err error) { m := s.GetDao().FissionTotal totals, err := m.WithContext(s.Ctx).Where( m.CampaignID.Eq(cpn.ID), m.Mark.In(mtype.FissionBehaviorMarkView, mtype.FissionBehaviorMarkAppInstall), ).Find() if err != nil { err = s.BE().MysqlError(err) return } s.AddAfterRun(func() (err error) { for _, v := range totals { switch v.Mark { case mtype.FissionBehaviorMarkView: s.Res.VisitorNum = v.Num s.Res.VisitorUser = v.UserNum case mtype.FissionBehaviorMarkAppInstall: s.Res.InstallNum = v.Num s.Res.InstallUser = v.UserNum } } return }) return } func (s *AdsSummary) today(cpn *model.FissionCampaign) (err error) { pTotal := provider.NewFissionBehaviorTotal(s.Ctx, cpn.ID) numMap, userMap, err := pTotal.CycleDay(carbon.Now(), mtype.FissionBehaviorMarkView, mtype.FissionBehaviorMarkAppInstall) if err != nil { return } m := s.GetDao().FissionCampaignReward list, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Find() if err != nil { err = s.BE().MysqlError(err) return } var marks = make([]string, 0, len(list)) for _, v := range list { marks = append(marks, utils.BehaviorFormatMark(mtype.FissionBehaviorTypeRewardApp, v.ID)) } _, rewardUserMap, err := pTotal.CycleDay(carbon.Now(), marks...) if err != nil { return } s.AddAfterRun(func() (err error) { for mark, num := range numMap { switch mark { case mtype.FissionBehaviorMarkView: s.Res.VisitorNumToday = num case mtype.FissionBehaviorMarkAppInstall: s.Res.InstallNumToday = num } } for mark, num := range userMap { switch mark { case mtype.FissionBehaviorMarkView: s.Res.VisitorUserToday = num case mtype.FissionBehaviorMarkAppInstall: s.Res.InstallUserToday = num } } for _, num := range rewardUserMap { s.Res.RewardUserAppToday += num } return }) return } func (s *AdsSummary) compare(cpn *model.FissionCampaign) (err error) { m := s.GetDao().FissionTotalCycle day := carbon.Yesterday().StartOfDay() yesterday := day.Timestamp() before := day.Yesterday().Timestamp() list, err := m.WithContext(s.Ctx).Where( m.CampaignID.Eq(cpn.ID), m.Mark.In(mtype.FissionBehaviorMarkView, mtype.FissionBehaviorMarkAppInstall), m.StatType.Eq(mtype.FissionTotalCycleTypeDay), m.StatTime.In(yesterday, before), ).Find() if err != nil { err = s.BE().MysqlError(err) return } s.AddAfterRun(func() (err error) { var viewYesterday, viewBefore int64 var installYesterday, installBefore int64 for _, v := range list { if v.StatTime == yesterday { switch v.Mark { case mtype.FissionBehaviorMarkView: s.Res.VisitorNumYesterday = v.Num s.Res.VisitorUserYesterday = v.UserNum viewYesterday = v.UserNum case mtype.FissionBehaviorMarkAppInstall: s.Res.InstallNumYesterday = v.Num s.Res.InstallUserYesterday = v.UserNum installYesterday = v.UserNum } } if v.StatTime == before { switch v.Mark { case mtype.FissionBehaviorMarkView: viewBefore = v.UserNum case mtype.FissionBehaviorMarkAppInstall: installBefore = v.UserNum } } } s.Res.VisitorUserDayCompareUp, s.Res.VisitorUserDayCompare = decimal.Chain1PointMax999(viewYesterday, viewBefore) s.Res.InstallUserDayCompareUp, s.Res.InstallUserDayCompare = decimal.Chain1PointMax999(installYesterday, installBefore) return }) return }