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.

206 lines
4.5 KiB
Go

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
}