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