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.

204 lines
4.1 KiB
Go

package campaignstat
import (
"joybuywork/internal/app"
"joybuywork/internal/consts"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_campaign_stat"
"joybuywork/proto/go_proto/workerr"
bi_fission_actionpb "gits.branchcn.com/backend/fissionbi/proto/go_proto/bi_fission_action"
)
type UserCycle struct {
logic.Logic
Req *pb.UserCycleReq
Res *pb.UserCycleRes
}
func (s *UserCycle) Run() error {
return logic.Run(s)
}
func (s *UserCycle) Exec() (err error) {
cpn, err := s.campaign()
if err != nil {
return
}
err = s.platform(cpn.ID)
if err != nil {
return
}
err = s.channel(cpn.ID)
if err != nil {
return
}
err = s.media(cpn.ID)
if err != nil {
return
}
return
}
// 活动数据
func (s *UserCycle) 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 {
return nil, workerr.NotFound("campaign not found")
}
return
}
func (s *UserCycle) platform(cpnId int64) (err error) {
m := s.GetDao().FissionUserAttrTotal
num, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpnId), m.Attr.Eq(mtype.FissionUserAttrMarkPlatform)).Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
var pnMap = make(map[string]int64)
for _, v := range num {
pnMap[v.Val] = v.Num
}
var platforms = []string{consts.PlatformIOS, consts.PlatformAndroid, consts.PlatformWeb, consts.PlatformIPad, consts.PlatformOther}
var list = make([]*pb.UserCycleRes_Part, 0, len(platforms))
for _, v := range platforms {
list = append(list, &pb.UserCycleRes_Part{
Title: v,
Num: pnMap[v],
})
}
s.Res.List = append(s.Res.List, &pb.UserCycleRes_One{
Mark: "platform",
Parts: list,
})
return
}
func (s *UserCycle) channel(cpnId int64) (err error) {
channelM := s.GetDao().FissionCampaignChannel
cList, err := channelM.WithContext(s.Ctx).
Where(
channelM.CampaignID.Eq(cpnId),
channelM.CType.Eq(mtype.FissionCampaignChannelTypeApp),
channelM.IsDel.Eq(mtype.No),
).
Find()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if len(cList) <= 1 {
return
}
var num []struct {
ChannelID int64 `json:"channel_id"`
Num int64 `json:"num"`
}
m := s.GetDao().FissionUser.SubTable(cpnId)
err = m.WithContext(s.Ctx).Select(m.ChannelID, m.ID.Count().As("num")).
Where(m.CampaignID.Eq(cpnId), m.IsView.Eq(mtype.No)).
Group(m.ChannelID).Scan(&num)
if err != nil {
err = s.BE().MysqlError(err)
return
}
var cnMap = make(map[int64]int64)
for _, v := range num {
cnMap[v.ChannelID] = v.Num
}
var list = make([]*pb.UserCycleRes_Part, 0, len(cList))
for _, v := range cList {
list = append(list, &pb.UserCycleRes_Part{
Title: v.Title,
Num: cnMap[v.ID],
})
}
s.Res.List = append(s.Res.List, &pb.UserCycleRes_One{
Mark: "channel",
Parts: list,
})
return
}
func (s *UserCycle) media(cpnId int64) (err error) {
conf, err := cache.NewCampaignConfig(s.Ctx).FindByCampaignId(cpnId)
if err != nil {
err = s.BE().CacheError(err)
return
}
ms := conf.GetShare()
if len(ms) == 0 {
return
}
res, err := app.NewFissionBiFissionAction().CampaignTotal(s.Ctx, &bi_fission_actionpb.CampaignTotalReq{
CampaignId: cpnId,
Type: mtype.FissionActionTypeClickShare,
})
if err != nil {
return
}
var msMap = make(map[int64]int64)
for _, v := range res.GetList() {
msMap[utils.StrToInt64(v.Mark)] = v.Num
}
ms = append(ms, -1)
var list = make([]*pb.UserCycleRes_Part, 0, len(ms))
for _, id := range ms {
if id == -1 {
list = append(list, &pb.UserCycleRes_Part{
Title: "Copy Link",
Num: msMap[id],
})
continue
}
list = append(list, &pb.UserCycleRes_Part{
Title: consts.ShareMap[id].Title,
Num: msMap[id],
})
}
s.Res.List = append(s.Res.List, &pb.UserCycleRes_One{
Mark: "media",
Parts: list,
})
return
}