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

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
}