package campaignstat import ( "joybuywork/internal/config" "joybuywork/internal/consts" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/provider" "joybuywork/internal/utils" "joybuywork/internal/utils/logic" "joybuywork/internal/utils/timez" pb "joybuywork/proto/go_proto/w_campaign_stat" "joybuywork/proto/go_proto/workerr" "fmt" "strings" ) type DemTitle struct { logic.Logic Req *pb.DemTitleReq Res *pb.DemTitleRes rewardMap map[int64]provider.RewardAutoLang } func (s *DemTitle) Run() error { return logic.Run(s) } func (s *DemTitle) Exec() (err error) { cpn, err := s.campaign() if err != nil { return } err = s.cond(cpn) if err != nil { return } s.media() err = s.channel() if err != nil { return } err = s.rewards() if err != nil { return } err = s.userLv() if err != nil { return } err = s.qa() if err != nil { return } err = s.qaOption() if err != nil { return } err = s.qaGroup() if err != nil { return } err = s.scenes(cpn) if err != nil { return } err = s.customBtn() if err != nil { return } err = s.task(cpn) if err != nil { return } err = s.parent(cpn) if err != nil { return } err = s.img() if err != nil { return } err = s.zone() if err != nil { return } err = s.cpns() if err != nil { return } err = s.schedules() if err != nil { return } err = s.mall() if err != nil { return } err = s.mallItem() if err != nil { return } err = s.unoCards() if err != nil { return } return } // 活动数据 func (s *DemTitle) 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("campaign not found") return } s.Res.CampaignId = cpn.ID s.Res.TOffect = cpn.TOffset s.rewardMap = make(map[int64]provider.RewardAutoLang) return } func (s *DemTitle) cond(cpn *model.FissionCampaign) (err error) { if len(s.Req.GetCondIds()) == 0 { return } condM := s.GetDao().FissionCampaignCond conds, err := condM.WithContext(s.Ctx).Where(condM.ID.In(s.Req.GetCondIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var rewardIds []int64 for _, v := range conds { rewardIds = append(rewardIds, v.RewardID) } unlockRewardMap, err := s._getRewardMap(cpn.ProjectID, rewardIds) if err != nil { return } s.Res.Conds = make([]*pb.DemTitleRes_Title, 0, len(conds)) for _, cond := range conds { var title = cond.Desc if cond.RewardID > 0 { title = fmt.Sprintf("解锁奖品%s", unlockRewardMap[cond.RewardID].RewardTitle) } s.Res.Conds = append(s.Res.Conds, &pb.DemTitleRes_Title{ Id: cond.ID, Title: title, }) } return } func (s *DemTitle) media() { if len(s.Req.GetMediaIds()) == 0 { return } s.Res.Media = make([]*pb.DemTitleRes_Title, 0, len(s.Req.GetMediaIds())) for _, mediaId := range s.Req.GetMediaIds() { if mediaId == -1 { s.Res.Media = append(s.Res.Media, &pb.DemTitleRes_Title{ Id: mediaId, Title: "Copy Link", SecondId: 0, }) continue } title, ok := consts.ShareTitleMap[mediaId] if !ok { continue } s.Res.Media = append(s.Res.Media, &pb.DemTitleRes_Title{ Id: mediaId, Title: title, SecondId: 0, }) } } func (s *DemTitle) channel() (err error) { if len(s.Req.GetChannelIds()) == 0 { return } m := s.GetDao().FissionCampaignChannel list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetChannelIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.Channel = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.Channel = append(s.Res.Channel, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.Title, SecondId: int64(v.CType), }) } return } func (s *DemTitle) rewards() (err error) { if len(s.Req.GetRewardIds()) == 0 { return } m := s.GetDao().FissionCampaignReward list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetRewardIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var titleMap = make(map[int64]string) var ids []int64 for _, v := range list { if _, ok := titleMap[v.RewardID]; !ok { titleMap[v.RewardID] = "" ids = append(ids, v.RewardID) } } rewardM := s.GetDao().Reward rewards, err := rewardM.WithContext(s.Ctx).Where(rewardM.ID.In(ids...)).Find() if err != nil { err = s.BE().MysqlError(err) return } for _, v := range rewards { titleMap[v.ID] = v.RewardTitle } for _, v := range list { one := &pb.DemTitleRes_Title{ Id: v.ID, Title: titleMap[v.RewardID], SecondId: v.RewardID, } if v.PropMark == mtype.FissionCampaignRewardPropMarkPoint { one.Title = fmt.Sprintf("系统积分 * %d", v.RewardNum) } else if v.PropMark == mtype.FissionCampaignRewardPropMarkChance { one.Title = fmt.Sprintf("活动机会 * %d", v.RewardNum) } else if v.RewardID < 0 { one.Title = "谢谢参与" } s.Res.Rewards = append(s.Res.Rewards, one) } return } func (s *DemTitle) userLv() (err error) { if len(s.Req.GetLevelIds()) == 0 { return } m := s.GetDao().FissionUserLevel list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetLevelIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.UserLv = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.UserLv = append(s.Res.UserLv, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.Title, }) } return } func (s *DemTitle) qa() (err error) { if len(s.Req.GetQaIds()) == 0 { return } m := s.GetDao().LibraryQa list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetQaIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.Qa = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.Qa = append(s.Res.Qa, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.Title, }) } return } func (s *DemTitle) qaOption() (err error) { if len(s.Req.GetQaOptionIds()) == 0 { return } m := s.GetDao().LibraryQaOption list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetQaOptionIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.QaOption = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.QaOption = append(s.Res.QaOption, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.Title, }) } return } func (s *DemTitle) qaGroup() (err error) { if len(s.Req.GetQaGroupIds()) == 0 { return } m := s.GetDao().LibraryQaGroup list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetQaGroupIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.QaGroup = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.QaGroup = append(s.Res.QaGroup, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.Title, }) } return } func (s *DemTitle) scenes(cpn *model.FissionCampaign) (err error) { if len(s.Req.GetSceneIds()) == 0 { return } switch cpn.FissionID { case consts.IdCoin: m := s.GetDao().FissionCoinScene var scenes []*model.FissionCoinScene scenes, err = m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetSceneIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } gmt := utils.Ternary[string](cpn.TOffset < 0, fmt.Sprint(cpn.TOffset), fmt.Sprintf("+%d", cpn.TOffset)) s.Res.Scenes = make([]*pb.DemTitleRes_Title, 0, len(scenes)) for _, v := range scenes { day, _, _ := timez.GMTStartAndEndTs(cpn.TOffset, v.OpenTime) s.Res.Scenes = append(s.Res.Scenes, &pb.DemTitleRes_Title{ Id: v.ID, Title: fmt.Sprintf("%s(GMT%s)", day, gmt), }) } } return } func (s *DemTitle) customBtn() (err error) { if len(s.Req.GetCustomBtnIds()) == 0 { return } m := s.GetDao().FissionCustomBtn list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetCustomBtnIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.QaGroup = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.QaGroup = append(s.Res.QaGroup, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.BtnText, }) } return } func (s *DemTitle) task(cpn *model.FissionCampaign) (err error) { if len(s.Req.GetTaskIds()) == 0 { return } taskM := s.GetDao().FissionCampaignTask tasks, err := taskM.WithContext(s.Ctx).Where(taskM.ID.In(s.Req.GetTaskIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.Tasks = make([]*pb.DemTitleRes_Title, 0, len(tasks)) var unlockRewardIds []int64 var campaignMap = make(map[int64][]int64) var condIds []int64 for _, task := range tasks { if task.PropMark == mtype.FissionCampaignTaskPropMarkUnlockReward { unlockRewardIds = append(unlockRewardIds, task.RewardID) } switch task.TaskType { case mtype.FissionCampaignTaskTypeCondOne: condIds = append(condIds, utils.FissionCampaignTaskMarkCondOneCondId(task.TaskMark)) case mtype.FissionCampaignTaskTypeCondAll: campaignMap[task.CampaignID] = append(campaignMap[task.CampaignID], task.ID) default: continue } } var condMap = make(map[int64]string, len(condIds)) if len(condIds) > 0 { var conds []*model.FissionCampaignCond m := s.GetDao().FissionCampaignCond conds, err = m.WithContext(s.Ctx).Where(m.ID.In(condIds...)).Find() if err != nil { err = s.BE().MysqlError(err) return } for _, v := range conds { condMap[v.ID] = v.Desc } } var cpnMap = make(map[int64]string) if len(campaignMap) > 0 { m := s.GetDao().FissionCampaignCond for cpnId, taskIds := range campaignMap { var conds []*model.FissionCampaignCond conds, err = m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpnId)).Find() if err != nil { err = s.BE().MysqlError(err) return } var desc string for _, cond := range conds { desc += cond.Desc + ", " } for _, v := range taskIds { cpnMap[v] = strings.TrimRight(desc, ", ") } } } unlockRewardMap, err := s._getRewardMap(cpn.ProjectID, unlockRewardIds) if err != nil { return } for _, task := range tasks { one := &pb.DemTitleRes_Title{ Id: task.ID, } switch task.TaskType { case mtype.FissionCampaignTaskTypeCondOne: one.Title = condMap[utils.FissionCampaignTaskMarkCondOneCondId(task.TaskMark)] case mtype.FissionCampaignTaskTypeInstall: one.Title = fmt.Sprintf("获得%d个安装事件助力", task.Num) case mtype.FissionCampaignTaskTypeRegister: one.Title = fmt.Sprintf("获得%d个注册事件助力", task.Num) case mtype.FissionCampaignTaskTypeCondAll: one.Title = cpnMap[task.ID] case mtype.FissionCampaignTaskTypeOpen: one.Title = fmt.Sprintf("获得%d个打开事件助力", task.Num) case mtype.FissionCampaignTaskTypeClick: one.Title = fmt.Sprintf("获得%d个点击邀请链接助力", task.Num) } if task.PropMark == mtype.FissionCampaignTaskPropMarkUnlockReward { one.Title = fmt.Sprintf("解锁奖品%s", unlockRewardMap[task.RewardID].RewardTitle) } s.Res.Tasks = append(s.Res.Tasks, one) } return } func (s *DemTitle) parent(cpn *model.FissionCampaign) (err error) { if len(s.Req.GetParentIds()) == 0 { return } m := s.GetDao().FissionUser.SubTable(cpn.ID) list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetParentIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.Parents = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.Parents = append(s.Res.Parents, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.SubUserID, }) } return } func (s *DemTitle) img() (err error) { if len(s.Req.GetImgIds()) == 0 { return } m := s.GetDao().FissionCampaignLongImg list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetImgIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var cpnIds []int64 for _, v := range list { if v.TargetType == mtype.FissionCampaignLongImgTargetTypeCampaign { cpnIds = append(cpnIds, v.TargetID) } } var cpnMap = make(map[int64]string) if len(cpnIds) > 0 { cpnM := s.GetDao().FissionCampaign cpnList, err1 := cpnM.WithContext(s.Ctx).Where(cpnM.ID.In(cpnIds...)).Find() if err1 != nil { err = s.BE().MysqlError(err1) return } for _, v := range cpnList { cpnMap[v.ID] = v.Title } } s.Res.Imgs = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { if v.ClickType == mtype.FissionCampaignLongImgClickTypeZone { continue } var title string switch v.TargetType { case mtype.FissionCampaignLongImgTargetTypeCustom: title = "跳转指定地址" if v.AppParam != "" { title += fmt.Sprintf(";APP端参数: %s", v.AppParam) } if v.WebURL != "" { title += fmt.Sprintf(";H5跳转url: %s", v.WebURL) } if v.PcParam != "" { title += fmt.Sprintf(";PC端参数: %s", v.PcParam) } case mtype.FissionCampaignLongImgTargetTypeCampaign: title = fmt.Sprintf("跳转到活动'%s'", cpnMap[v.CampaignID]) } s.Res.Imgs = append(s.Res.Imgs, &pb.DemTitleRes_Title{ Id: v.ID, Title: title, }) } return } func (s *DemTitle) zone() (err error) { if len(s.Req.GetZoneIds()) == 0 { return } m := s.GetDao().FissionCampaignLongImgZone list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetZoneIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var cpnIds []int64 for _, v := range list { if v.TargetType == mtype.FissionCampaignLongImgTargetTypeCampaign { cpnIds = append(cpnIds, v.TargetID) } } var cpnMap = make(map[int64]string) if len(cpnIds) > 0 { cpnM := s.GetDao().FissionCampaign cpnList, err1 := cpnM.WithContext(s.Ctx).Where(cpnM.ID.In(cpnIds...)).Find() if err1 != nil { err = s.BE().MysqlError(err1) return } for _, v := range cpnList { cpnMap[v.ID] = v.Title } } s.Res.Zones = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { var title string switch v.TargetType { case mtype.FissionCampaignLongImgTargetTypeCustom: title = "跳转指定地址" if v.AppParam != "" { title += fmt.Sprintf(";APP端参数: %s", v.AppParam) } if v.WebURL != "" { title += fmt.Sprintf(";H5跳转url: %s", v.WebURL) } if v.PcParam != "" { title += fmt.Sprintf(";PC端参数: %s", v.PcParam) } case mtype.FissionCampaignLongImgTargetTypeCampaign: title = fmt.Sprintf("跳转到活动'%s'", cpnMap[v.CampaignID]) } s.Res.Zones = append(s.Res.Zones, &pb.DemTitleRes_Title{ Id: v.ID, Title: title, }) } return } func (s *DemTitle) cpns() (err error) { if len(s.Req.GetCpnIds()) == 0 { return } m := s.GetDao().FissionCampaign list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetCpnIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.Cpns = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.Cpns = append(s.Res.Cpns, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.Title, }) } return } func (s *DemTitle) schedules() (err error) { if len(s.Req.GetScheduleIds()) == 0 { return } m := s.GetDao().FissionCampaignVsSchedule list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetScheduleIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var teamIds []int64 var teamMap = make(map[int64]*model.FissionCampaignVsTeam) for _, v := range list { for _, t := range v.GetVsTeamIds() { if _, ok := teamMap[t]; !ok && t > 0 { teamIds = append(teamIds, t) } } } teamM := s.GetDao().FissionCampaignVsTeam teamList, err := teamM.WithContext(s.Ctx).Where(teamM.ID.In(teamIds...)).Find() if err != nil { err = s.BE().MysqlError(err) return } for _, v := range teamList { teamMap[v.ID] = v } s.Res.Schedules = make([]*pb.DemTitleRes_Schedule, 0, len(list)) for _, v := range list { var teams = make([]*pb.DemTitleRes_Team, 2) var t1 = "A队" var t2 = "B队" for i, t := range v.GetVsTeamIds() { switch i { case 0: if _, ok := teamMap[t]; ok { t1 = teamMap[t].Name if t1 == "" { t1 = fmt.Sprintf("[%s%s]", config.Config.Upload.Host, teamMap[t].LogoImg) } } teams[0] = &pb.DemTitleRes_Team{ Id: t, Title: t1, } case 1: if _, ok := teamMap[t]; ok { t2 = teamMap[t].Name if t2 == "" { t2 = fmt.Sprintf("[%s%s]", config.Config.Upload.Host, teamMap[t].LogoImg) } } teams[1] = &pb.DemTitleRes_Team{ Id: t, Title: t2, } } } s.Res.Schedules = append(s.Res.Schedules, &pb.DemTitleRes_Schedule{ Id: v.ID, Title: fmt.Sprintf("%s vs %s", t1, t2), Teams: teams, }) } return } func (s *DemTitle) mall() (err error) { if len(s.Req.GetMallIds()) == 0 { return } m := s.GetDao().RedeemMall list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetMallIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.Malls = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.Malls = append(s.Res.Malls, &pb.DemTitleRes_Title{ Id: v.ID, Title: v.Title, }) } return } func (s *DemTitle) mallItem() (err error) { if len(s.Req.GetMallItemIds()) == 0 { return } m := s.GetDao().RedeemMallItem list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetMallItemIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var rewardIds []int64 var rewardMap = make(map[int64]string) for _, v := range list { if _, ok := rewardMap[v.ID]; !ok { rewardIds = append(rewardIds, v.RewardID) rewardMap[v.RewardID] = "" } } rewardM := s.GetDao().Reward rewardList, err := rewardM.WithContext(s.Ctx).Where(rewardM.ID.In(rewardIds...)).Find() if err != nil { err = s.BE().MysqlError(err) return } for _, v := range rewardList { rewardMap[v.ID] = v.RewardTitle } s.Res.MallItems = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { s.Res.MallItems = append(s.Res.MallItems, &pb.DemTitleRes_Title{ Id: v.ID, Title: rewardMap[v.RewardID], }) } return } func (s *DemTitle) unoCards() (err error) { if len(s.Req.GetUnoCardIds()) == 0 { return } m := s.GetDao().FissionCampaignUnoCard list, err := m.WithContext(s.Ctx).Where(m.ID.In(s.Req.GetUnoCardIds()...)).Find() if err != nil { err = s.BE().MysqlError(err) return } s.Res.UnoCards = make([]*pb.DemTitleRes_Title, 0, len(list)) for _, v := range list { var title = fmt.Sprintf("图片[%s%s]", config.Config.Upload.Host, v.ImgURL) if v.AppParam != "" { title += fmt.Sprintf(";APP端参数: %s", v.AppParam) } if v.WebURL != "" { title += fmt.Sprintf(";H5跳转url: %s", v.WebURL) } if v.PcParam != "" { title += fmt.Sprintf(";PC端参数: %s", v.PcParam) } s.Res.UnoCards = append(s.Res.UnoCards, &pb.DemTitleRes_Title{ Id: v.ID, Title: title, }) } return } func (s *DemTitle) _getRewardMap(projectId int64, rewardIds []int64) (data map[int64]provider.RewardAutoLang, err error) { var newIds []int64 for _, id := range rewardIds { if _, ok := s.rewardMap[id]; !ok { newIds = append(newIds, id) } } if len(newIds) == 0 { return s.rewardMap, nil } m := s.GetDao().FissionCampaignReward var rewards []*model.FissionCampaignReward rewards, err = m.WithContext(s.Ctx).Where(m.ID.In(newIds...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var bids []int64 var brMap = make(map[int64]string) for _, v := range rewards { if _, ok := brMap[v.RewardID]; !ok { bids = append(bids, v.RewardID) brMap[v.RewardID] = "" } } prewards, err := provider.NewRewards(s.Ctx, projectId, bids...) if err != nil { return } for _, v := range rewards { s.rewardMap[v.ID], _ = prewards.InfoAutoLang(v.RewardID) } return s.rewardMap, nil }