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.
340 lines
7.8 KiB
Go
340 lines
7.8 KiB
Go
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
|
|
}
|