package campaignuser import ( "joybuywork/internal/consts" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/provider" "joybuywork/internal/service/provider/players" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_campaign_user" "joybuywork/proto/go_proto/workerr" "time" "gits.branchcn.com/backend/microcode/plugins/lucky" ) type Lottery struct { logic.Logic Req *pb.LotteryReq Res *pb.LotteryRes cpn *model.FissionCampaign } func (s *Lottery) Run() error { return logic.Run(s) } func (s *Lottery) Exec() (err error) { user, cpn, err := s.user() if err != nil { return } err = s.lottery(user, cpn) if err != nil { return } return } // 用户信息 func (s *Lottery) user() (user *model.FissionUser, cpn *model.FissionCampaign, err error) { cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignId()) if err != nil { err = s.BE().CacheError(err) return } if cpn == nil || cpn.IsDel == mtype.Yes { err = workerr.NotFound("not found cpn") return } if cpn.EndTime < time.Now().Unix() { err = workerr.CEndError return } user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.GetUserId()) if err != nil { err = s.BE().CacheError(err) return } if user == nil { err = workerr.NotFound("not found user") return } //如果活动没开始,还不是预览用户,不允许玩 if cpn.StartTime > time.Now().Unix() && user.IsView == mtype.No { err = workerr.CStartError return } s.cpn = cpn return } // 抽奖机 func (s *Lottery) lotteryMachine(selection map[int64]*model.FissionCampaignReward) *lucky.Discrete { var prize []lucky.Reward for _, v := range selection { prize = append(prize, lucky.Reward{ Share: int(v.Odds), Mark: v.ID, }) } return lucky.NewDiscrete(s.Ctx, prize) } func (s *Lottery) lottery(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { switch cpn.FissionID { case consts.IdBlindBox: //盲盒 return s.blindBox(user, cpn) case consts.IdPrizeWheel: //大转盘 return s.prizeWheel(user, cpn) case consts.IdSlotMachine: //老虎机 return s.slotMachine(user, cpn) case consts.IdLuckyGrid: //九宫格 return s.luckyGrid(user, cpn) case consts.IdBallot: //抽签 return s.ballot(user) case consts.IdFlip: //翻牌 return s.flip(user, cpn) case consts.IdGashapon: //扭蛋机 return s.gashapon(user, cpn) default: } return } // 盲盒抽奖 func (s *Lottery) blindBox(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { player, err := players.NewBlind(s.Ctx, user, players.SetCpn(cpn)) if err != nil { return } reward, info, record, err := player.Lottery() if err != nil { return } // 返回数据 s._rsp(reward, info, record) return } // 大转盘抽奖 func (s *Lottery) prizeWheel(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { player, err := players.NewWheel(s.Ctx, user, players.SetCpn(cpn)) if err != nil { return } reward, info, record, err := player.Lottery() if err != nil { return } // 返回数据 s._rsp(reward, info, record) return } // 老虎机抽奖 func (s *Lottery) slotMachine(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { player, err := players.NewSlot(s.Ctx, user, players.SetCpn(cpn)) if err != nil { return } reward, info, record, err := player.Lottery() if err != nil { return } // 返回数据 s._rsp(reward, info, record) return } // 九宫格抽奖 func (s *Lottery) luckyGrid(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { player, err := players.NewGrid(s.Ctx, user, players.SetCpn(cpn)) if err != nil { return } reward, info, record, err := player.Lottery() if err != nil { return } // 返回数据 s._rsp(reward, info, record) return } func (s *Lottery) ballot(user *model.FissionUser) (err error) { ballot, err := players.NewBallot(s.Ctx, user) if err != nil { return } reward, info, record, err := ballot.Lottery() if err != nil { return } // 返回数据 s._rsp(reward, info, record) return } func (s *Lottery) _rsp(reward *model.FissionCampaignReward, info provider.RewardAutoLang, record *model.FissionRewardRecord) { s.AddAfterRun(func() (err error) { s.Res.Id = reward.ID s.Res.Win = reward.GetWin() s.Res.Title = info.Title s.Res.Img = info.ImgUrl s.Res.ReceiveType = info.ReceiveType s.Res.Contact = info.Contact s.Res.OpenToUse = info.OpenToUse s.Res.WebUrl = info.WebUrl s.Res.AppParam = info.AppParam s.Res.PcParam = info.PcParam if record != nil { s.Res.RewardHashId = record.HashID } s.Res.KvData = make([]*pb.LotteryRes_KV, 0, len(info.KvData)) for _, v := range info.KvData { s.Res.KvData = append(s.Res.KvData, &pb.LotteryRes_KV{ Key: v.Key, Value: v.Value, IsShow: v.IsShow, }) } return }) } func (s *Lottery) flip(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { player, err := players.NewFlip(s.Ctx, user, players.SetCpn(cpn)) if err != nil { return } reward, info, record, err := player.Lottery() if err != nil { return } // 返回数据 s._rsp(reward, info, record) return } func (s *Lottery) gashapon(user *model.FissionUser, cpn *model.FissionCampaign) (err error) { player, err := players.NewGashapon(s.Ctx, user, players.SetCpn(cpn)) if err != nil { return } reward, info, record, err := player.Lottery() if err != nil { return } // 返回数据 s._rsp(reward, info, record) return }