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 }