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
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
|
|
}
|