package campaign import ( "joybuywork/internal/consts" "joybuywork/internal/consts/ckey" "joybuywork/internal/repository/cache" "joybuywork/internal/repository/dbcheck" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/cmm" "joybuywork/internal/service/provider" "joybuywork/internal/service/provider/cachecurd" "joybuywork/internal/utils" "joybuywork/internal/utils/logic" "joybuywork/internal/utils/randext" pb "joybuywork/proto/go_proto/w_campaign" "joybuywork/proto/go_proto/workerr" "fmt" "math" "math/rand" "time" "gorm.io/gen" ) type Barrage struct { logic.Logic Req *pb.BarrageReq Res *pb.BarrageRes } func (s *Barrage) Run() error { return logic.Run(s) } func (s *Barrage) Exec() (err error) { cpn, conf, err := s.campaign() if err != nil { return } return s.barrage(cpn, conf) } // 活动数据 func (s *Barrage) campaign() (cpn *model.FissionCampaign, conf *model.FissionCampaignConfig, err error) { cpn, err = finder.Campaign(s.Ctx, s.Req.GetId(), s.Req.GetHashId()) if err != nil { err = s.BE().CacheError(err) return } if cpn == nil || cpn.IsDel == mtype.Yes { err = workerr.NotFound("cpn not found") return } conf, err = cache.NewCampaignConfig(s.Ctx).FindByCampaignId(cpn.ID) if err != nil { err = s.BE().CacheError(err) return } return } // 奖品处理 func (s *Barrage) barrage(cpn *model.FissionCampaign, conf *model.FissionCampaignConfig) (err error) { switch cpn.FissionID { case consts.IdWinTogether, consts.IdReferral: //一起赢 return s._invite(cpn, conf) case consts.IdCash: return s._cash(cpn) case consts.IdGold: return s._gold(cpn) case consts.IdChop: return s._chop(cpn) case consts.IdKeep: return s._keep(cpn) case consts.IdFlip: return s._flip(cpn) case consts.IdCoin: return s._coin(cpn) } return } func (s *Barrage) _reward(rewardTitle []string) { for i := 0; i < 15; i++ { idx := i % len(rewardTitle) s.Res.Content = append(s.Res.Content, fmt.Sprintf("%s****%s %s", utils.GetRandEnStr(3), utils.GetRandEnStr(3), rewardTitle[idx])) } } func (s *Barrage) _invite(cpn *model.FissionCampaign, conf *model.FissionCampaignConfig) (err error) { rewardM := s.GetDao().FissionCampaignReward var conds = []gen.Condition{ rewardM.CampaignID.Eq(cpn.ID), rewardM.RewardType.Neq(mtype.FissionCampaignRewardTypeNewcomer), rewardM.IsDel.Eq(mtype.No), } // 获取活动对应的用户等级和用户的语言 uct, err := cmm.NewCMM(s.Ctx, s.GetDao()).UserCampaignType(cpn, conf, s.Req.GetLangMark(), s.Req.GetLv(), s.Req.GetCountryMark()) if err != nil { return } userLang, userLevel := uct.LangMark, uct.LevelId switch conf.RewardGroup { case mtype.FissionRewardGroupUserLevel: conds = append(conds, rewardM.LevelID.Eq(userLevel)) case mtype.FissionRewardGroupLangAndUserLevel: conds = append(conds, rewardM.LevelID.Eq(userLevel), rewardM.LangMark.Eq(userLang)) case mtype.FissionRewardGroupLang: conds = append(conds, rewardM.LangMark.Eq(userLang)) } list, err := rewardM.WithContext(s.Ctx).Where(conds...).Find() if err != nil { return s.BE().MysqlError(err) } if len(list) == 0 { return } var rewardTitle []string defer func() { s._reward(rewardTitle) }() var ids []int64 for _, v := range list { ids = append(ids, v.RewardID) } preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, ids...) if err != nil { return } var showLang = utils.NotExistGetFirst(s.Req.GetShowLang(), cpn.GetLangMarks()) for _, v := range list { data, _ := preward.InfoAutoLang(v.RewardID, showLang) rewardTitle = append(rewardTitle, fmt.Sprintf("%d %s", v.RewardNum, data.Title)) } return } func (s *Barrage) _cash(cpn *model.FissionCampaign) (err error) { var price int32 spl := cpn.GetLangMarks() lm := utils.NotExistGetFirst(s.Req.GetShowLang(), spl) if lm == spl[0] { m := s.GetDao().FissionCampaignCash var conf *model.FissionCampaignCash conf, err = m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Take() if err = dbcheck.DbError(err); err != nil { return } if conf == nil { return } price = conf.Price } else { var lang *model.FissionCampaignLang lang, err = cache.NewCampaignLang(s.Ctx).FindByCampaignId(cpn.ID, lm) if err != nil { err = s.BE().CacheError(err) return } if lang == nil { return } if cash := lang.GetCash(); cash != nil { price = cash.Price } } var mark = []string{"victory_tip", "min_won_barrage", "won_barrage", "closer_to_prize", "shine_arrived"} l := len(mark) * 5 s.Res.TranContent = make([]*pb.BarrageRes_TranContent, 0, l) for i := 0; i < l; i++ { key := mark[i%5] one := &pb.BarrageRes_TranContent{ Mark: fmt.Sprintf("barrage:%s", key), ReplaceKv: nil, } switch key { case "won_barrage": one.ReplaceKv = append(one.ReplaceKv, &pb.BarrageRes_KV{ Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, &pb.BarrageRes_KV{ Key: "{{cash}}", Value: fmt.Sprintf("$%d", price), }) case "min_won_barrage": one.ReplaceKv = append(one.ReplaceKv, &pb.BarrageRes_KV{ Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, &pb.BarrageRes_KV{ Key: "{{cash}}", Value: fmt.Sprintf("$%d", price), }, &pb.BarrageRes_KV{ Key: "{{min}}", Value: fmt.Sprintf("%d", rand.Intn(9)+1), }) } s.Res.TranContent = append(s.Res.TranContent, one) } return } func (s *Barrage) _chop(cpn *model.FissionCampaign) (err error) { user, err := cache.NewFissionUser(s.Ctx, cpn.ID).FindById(s.Req.GetUserId()) if err != nil { err = s.BE().CacheError(err) return } rewards, err := cmm.NewCMM(s.Ctx, s.GetDao()).UserAppReward(user) if err != nil { return } var bIds []int64 var randReward = make(map[int64]*model.FissionCampaignReward) for _, reward := range rewards { randReward[reward.ID] = reward bIds = append(bIds, reward.RewardID) } m := s.GetDao().FissionCampaignTicket ticket, err := m.WithContext(s.Ctx).Where( m.CampaignID.Eq(cpn.ID), m.Mark.Eq(mtype.FissionCampaignTicketRewardHelp), m.Open.Eq(mtype.Yes), ).Take() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } if ticket == nil { err = workerr.NotFound("not found reward_help ticket") return } preward, err := provider.NewRewards(s.Ctx, cpn.ProjectID, bIds...) if err != nil { return } var showLang = utils.NotExistGetFirst(s.Req.GetShowLang(), cpn.GetLangMarks()) var marks = ticket.GetHelpEvent() var markL = len(marks) // 20条数据 var randMap = make(map[int]*pb.BarrageRes_TranContent, 20) var idx int for i := 1; i <= 20; i++ { // 5条一组 switch a := i % 5; { case a < 3: // 3个奖品 var rewardTitle string for _, reward := range randReward { info, _ := preward.InfoAutoLang(reward.RewardID, showLang) rewardTitle = info.Title } s.Res.TranContent = append(s.Res.TranContent) randMap[i] = &pb.BarrageRes_TranContent{ Mark: "barrage:get_reward", ReplaceKv: []*pb.BarrageRes_KV{ { Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, { Key: "{{reward_title}}", Value: rewardTitle, }, }, } default: // 1个助力 for j := 0; j < 2; j++ { randMap[i] = &pb.BarrageRes_TranContent{ Mark: fmt.Sprintf("barrage:%s", marks[idx]), ReplaceKv: []*pb.BarrageRes_KV{ { Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, }, } idx++ if idx >= markL { idx = 0 } } } } // 打乱一下 for _, content := range randMap { s.Res.TranContent = append(s.Res.TranContent, content) } return } func (s *Barrage) _keep(cpn *model.FissionCampaign) (err error) { randReward, preward, showLang, err := s._rewardDepend(cpn) if err != nil { return } // 20条数据 s.Res.TranContent = make([]*pb.BarrageRes_TranContent, 20) for i := 0; i < 20; i++ { var rewardTitle, imgUrl string for _, reward := range randReward { info, _ := preward.InfoAutoLang(reward.RewardID, showLang) rewardTitle, imgUrl = info.Title, info.ImgUrl } s.Res.TranContent[i] = &pb.BarrageRes_TranContent{ Mark: "barrage:get_reward", ReplaceKv: []*pb.BarrageRes_KV{ { Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, { Key: "{{reward_title}}", Value: rewardTitle, }, }, RewardImg: imgUrl, } } return } func (s *Barrage) _gold(cpn *model.FissionCampaign) (err error) { var price float64 spl := cpn.GetLangMarks() lm := utils.NotExistGetFirst(s.Req.GetShowLang(), spl) if lm == spl[0] { var conf *model.FissionCampaignGold conf, err = cache.NewCampaignGold(s.Ctx).FindByCampaignId(cpn.ID) if err != nil { err = s.BE().CacheError(err) return } if conf == nil { return } price = conf.Price } else { var lang *model.FissionCampaignLang lang, err = cache.NewCampaignLang(s.Ctx).FindByCampaignId(cpn.ID, lm) if err != nil { err = s.BE().CacheError(err) return } if lang == nil { return } if gold := lang.GetGold(); gold != nil { price = gold.Price } } var mark = []string{"victory_tip", "min_won_barrage", "won_barrage", "closer_to_prize", "shine_arrived"} l := len(mark) * 5 s.Res.TranContent = make([]*pb.BarrageRes_TranContent, 0, l) for i := 0; i < l; i++ { key := mark[i%5] one := &pb.BarrageRes_TranContent{ Mark: fmt.Sprintf("barrage:%s", key), ReplaceKv: nil, } var val = fmt.Sprintf("%.2f", price) if price == math.Trunc(price) { val = fmt.Sprintf("%d", int32(price)) } switch key { case "won_barrage": one.ReplaceKv = append(one.ReplaceKv, &pb.BarrageRes_KV{ Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, &pb.BarrageRes_KV{ Key: "{{cash}}", Value: val, }) case "min_won_barrage": one.ReplaceKv = append(one.ReplaceKv, &pb.BarrageRes_KV{ Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, &pb.BarrageRes_KV{ Key: "{{cash}}", Value: val, }, &pb.BarrageRes_KV{ Key: "{{min}}", Value: fmt.Sprintf("%d", rand.Intn(9)+1), }) } s.Res.TranContent = append(s.Res.TranContent, one) } return } func (s *Barrage) _flip(cpn *model.FissionCampaign) (err error) { randReward, preward, showLang, err := s._rewardDepend(cpn) if err != nil { return } var idx = 20 var ids []int64 for _, reward := range randReward { if (reward.Odds == 0 && reward.IsThank == mtype.Yes) || reward.RewardID < 0 { // 客户设置的概率为0的谢谢参与不显示,默认的谢谢参与奖也不显示 delete(randReward, reward.ID) continue } if reward.Odds == 0 { ids = append(ids, reward.ID) idx-- } } for _, reward := range randReward { if reward.Odds == 0 { continue } g := float64(idx) * (float64(reward.Odds) / 1000) var n = int(g) if n < 1 { n = 1 } for i := 0; i < n; i++ { ids = append(ids, reward.ID) } } l := len(ids) idxL := l for { if l >= 10 { break } for _, id := range ids[:idxL] { ids = append(ids, id) l++ } } // 20条数据 s.Res.TranContent = make([]*pb.BarrageRes_TranContent, l) for i, id := range ids { reward := randReward[id] info, _ := preward.InfoAutoLang(reward.RewardID, showLang) rewardTitle, imgUrl := info.Title, info.ImgUrl s.Res.TranContent[i] = &pb.BarrageRes_TranContent{ Mark: "barrage:get_reward", ReplaceKv: []*pb.BarrageRes_KV{ { Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, { Key: "{{reward_title}}", Value: rewardTitle, }, }, RewardImg: imgUrl, } } return } func (s *Barrage) _rewardDepend(cpn *model.FissionCampaign) (randReward map[int64]*model.FissionCampaignReward, preward *provider.Rewards, showLang string, err error) { user, err := cache.NewFissionUser(s.Ctx, cpn.ID).FindById(s.Req.GetUserId()) if err != nil { err = s.BE().CacheError(err) return } rewards, err := cmm.NewCMM(s.Ctx, s.GetDao()).UserAppReward(user) if err != nil { return } var bIds []int64 randReward = make(map[int64]*model.FissionCampaignReward) for _, reward := range rewards { randReward[reward.ID] = reward bIds = append(bIds, reward.RewardID) } preward, err = provider.NewRewards(s.Ctx, cpn.ProjectID, bIds...) if err != nil { return } showLang = utils.NotExistGetFirst(s.Req.GetShowLang(), cpn.GetLangMarks()) return } func (s *Barrage) _coin(cpn *model.FissionCampaign) (err error) { conf, err := cache.NewCampaignCoin(s.Ctx).FindByCampaignId(cpn.ID) if err != nil { err = s.BE().CacheError(err) return } m := s.GetDao().FissionCoinScene scenes, err := m.WithContext(s.Ctx).Where(m.CampaignID.Eq(cpn.ID)).Find() if err != nil { err = s.BE().CacheError(err) return } var opL int32 for _, scene := range scenes { if scene.OpenTime <= time.Now().Unix() { opL++ } } num := rand.Intn(int(conf.UseLimit)) + 1 var nm = make(map[int]struct{}, num) for i := 1; i < num; i++ { nm[i] = struct{}{} } if opL == 0 { for i := 0; i < 20; i++ { var n int for k := range nm { n = k } s.Res.TranContent = append(s.Res.TranContent, &pb.BarrageRes_TranContent{ Mark: "barrage:join_coin_num", ReplaceKv: []*pb.BarrageRes_KV{ { Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, { Key: "{{num}}", Value: fmt.Sprint(n), }, }, }) } return } var scene *model.FissionCoinScene if len(scenes) == 1 { scene = scenes[0] } else { scene = scenes[len(scenes)-2] } key := ckey.FissionCoinSceneData(scene.ID) sceneData, err := cachecurd.NewHMap(s.Ctx, key, cachecurd.SetCoinSceneBuild(cpn.ID, scene.ID), cachecurd.SetHMapExp(time.Duration(conf.OpenDays+1)*consts.TimeDay), ) if err != nil { err = s.BE().CacheError(err) return } userCoin, _ := sceneData.GetInt64(cachecurd.CoinSceneUserCoin) joinNum, _ := sceneData.GetInt64(cachecurd.CoinSceneJoinNum) var getNum int64 if joinNum > 0 { getNum = userCoin / joinNum } for i := 0; i < 20; i++ { var n int for k := range nm { n = k } if i%2 == 0 { s.Res.TranContent = append(s.Res.TranContent, &pb.BarrageRes_TranContent{ Mark: "barrage:get_coin", ReplaceKv: []*pb.BarrageRes_KV{ { Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, { Key: "{{num}}", Value: fmt.Sprintf("%d", (getNum+int64(conf.UseCoin))*int64(n)), }, }, }) continue } s.Res.TranContent = append(s.Res.TranContent, &pb.BarrageRes_TranContent{ Mark: "barrage:join_coin_num", ReplaceKv: []*pb.BarrageRes_KV{ { Key: "{{name}}", Value: fmt.Sprintf("%s***%s", randext.RandLetters(1), randext.RandLetters(1)), }, { Key: "{{num}}", Value: fmt.Sprint(n), }, }, }) } return }