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.
272 lines
5.4 KiB
Go
272 lines
5.4 KiB
Go
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
|
|
}
|