private async Task <bool> UpdateBonusInDatabase(BonusEntity bonus) { using (var db = databaseManager.GetWritableDatabase()) { var bonusEntity = new BonusEntity { UserId = bonus.UserId, GameId = bonus.GameId, Guid = bonus.Guid, Data = bonus.Data, BonusType = bonus.BonusType, Version = bonus.Version, IsOptional = bonus.IsOptional, IsStarted = bonus.IsStarted, RoundId = bonus.RoundId, BetReference = bonus.BetReference, BnsClsId = bonus.BnsClsId, ClientId = bonus.ClientId, Order = bonus.Order, IsFreeGame = bonus.IsFreeGame, CampaignId = bonus.CampaignId }; db.InsertOrUpdate(bonusEntity, bonus.UserId, bonus.GameId); return(await db.SaveChangesAsync() > 0); } }
public BonusDTO ToDTO(BonusEntity model) { BonusDTO dto = new BonusDTO(); dto.ID = model.ID; dto.UserID = model.UserID; dto.TypeID = model.TypeID; dto.Amount = model.Amount; dto.Sf = model.Sf; dto.Revenue = model.Revenue; dto.AddTime = model.AddTime; dto.IsSettled = model.IsSettled; dto.SttleTime = model.SttleTime; dto.Bonus001 = model.Bonus001; dto.Bonus002 = model.Bonus002; dto.Bonus003 = model.Bonus003; dto.Bonus004 = model.Bonus004; dto.Bonus005 = model.Bonus005; dto.Bonus006 = model.Bonus006; dto.Bonus007 = model.Bonus007; dto.UserCode = model.Users.UserCode; dto.TrueName = model.Users.TrueName; dto.TypeName = model.BonusTypes.TypeName; dto.TypeNameEn = model.BonusTypes.TypeNameEn; dto.SettleName = model.IsSettled == 0 ? "未结算" : "已结算"; return(dto); }
private static SummaryData ExecuteBonus(int level, RequestContext <BonusArgs> requestContext, GeniesLuckResult result) { var bonus = module.CreateBonus(result); var geniesLuckBonus = bonus.Value as GeniesLuckBonus; var entity = new BonusEntity { UserId = -1, GameId = GameId, Guid = geniesLuckBonus.Guid.ToString("N"), Data = Model.Utility.Extension.ToByteArray(geniesLuckBonus), BonusType = bonus.GetType().Name, Version = 3, RoundId = 1, BetReference = "" }; var summData = new SummaryData(); do { var freeSpinResult = module.ExecuteBonus(level, entity, requestContext).Value as GeniesLuckBonusSpinResult; var spinResult = freeSpinResult.SpinResult; switch (freeSpinResult.GameResultType) { case Model.GameResultType.FreeSpinResult: summData.FSWin += freeSpinResult.Win; summData.FSpinCounter++; break; case Model.GameResultType.CollapsingSpinResult: summData.ReSpinWin += freeSpinResult.Win; break; case Model.GameResultType.FreeSpinCollapsingSpinResult: summData.ReSpinFSWin += freeSpinResult.Win; break; } if (spinResult.HasBonus) { if (spinResult.Bonus.ClientId == 3) { summData.FgFHit++; } else { summData.FgReHit++; } } if (freeSpinResult.IsCompleted) { break; } entity.Data = Model.Utility.Extension.ToByteArray(freeSpinResult.Bonus); } while (true); return(summData); }
private async Task <bool> UpdateBonusInCache(UserSession userSession, BonusEntity bonus) { await cache.SetAsync(userSession.SessionKey, bonus, new DistributedCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(5) }); return(true); }
/// <summary> /// 计算购物奖 /// </summary> /// <param name="orderId"></param> /// <param name="orderCode"></param> /// <param name="profit">支付积分部分</param> /// <param name="buyerId"></param> /// <returns></returns> public async Task <bool> CalcAwardBuy(long orderId, string orderCode, decimal profit, long buyerId) { if (profit <= 0) { return(true); } using (MyDbContext dbc = new MyDbContext()) { int journalTypeId = 1; decimal parm; decimal.TryParse(await dbc.GetParameterAsync <SettingEntity>(s => s.Name == "购物奖励", s => s.Param), out parm); var user = await dbc.GetAll <UserEntity>().Where(u => u.IsNull == false).SingleOrDefaultAsync(u => u.Id == buyerId); decimal bonus = profit * (parm / 100); user.FrozenAmount = user.FrozenAmount + bonus; BonusEntity entity = new BonusEntity(); entity.UserId = user.Id; entity.Amount = bonus; entity.Revenue = 0; entity.sf = bonus; entity.TypeID = 3; //购物奖励 entity.Source = "用户(" + user.Mobile + ")购买商品,获得购物奖励"; entity.FromUserID = user.Id; entity.IsSettled = 1; dbc.Bonus.Add(entity); JournalEntity journal1 = new JournalEntity(); journal1.UserId = user.Id; journal1.BalanceAmount = user.FrozenAmount; journal1.InAmount = bonus; journal1.Remark = "用户(" + user.Mobile + ")购买商品,获得购物奖励"; journal1.JournalTypeId = journalTypeId; journal1.OrderCode = orderCode; journal1.GoodsId = orderId;//来至订单ID journal1.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal1); await dbc.SaveChangesAsync(); //累计业绩 int flag = await dbc.Database.ExecuteSqlCommandAsync("exec proc_Sroce @UserId = " + user.Id + ",@sroce = " + bonus); log.DebugFormat($"购物奖励 累计业绩 CalcAwardBuy:{flag},orderCode:{orderCode},buyerId:{buyerId}"); //极差奖 bool result = await CalcAwardLevelDiff(orderId, orderCode, bonus, buyerId); log.DebugFormat($"购物奖励 极差奖 CalcAwardLevelDiff:{result},orderCode:{orderCode},buyerId:{buyerId}"); //极差奖 平分 result = await CalcAwardLevelDiffMaxAvg(orderId, orderCode, bonus, buyerId, user.Mobile); log.DebugFormat($"购物奖励 极差奖 平分 CalcAwardLevelDiffMaxAvg:{result},orderCode:{orderCode},buyerId:{buyerId}"); return(true); } }
public Result <BonusResult, ErrorCode> ExecuteBonus(int level, BonusEntity bonus, RequestContext <BonusArgs> requestContext) { var bns = bonus.Data.FromByteArray <Bonus>(); if (bns is BullRushFreeSpinBonus fb) { return(BullRushFreeSpinFeature.Execute(level, requestContext, fb, bonus)); } else if (bns is BullRushJackpotBonus jpb) { return(BullRushJackPotFeature.Execute(level, requestContext, jpb, bonus)); } return(ErrorCode.NonexistenceBonus); }
public async Task <bool> DeleteAsync(long id) { using (MyDbContext dbc = new MyDbContext()) { BonusEntity entity = await dbc.GetAll <BonusEntity>().SingleOrDefaultAsync(g => g.Id == id); if (entity == null) { return(false); } entity.IsDeleted = true; await dbc.SaveChangesAsync(); return(true); } }
private async Task <bool> RemoveBonusFromDatabase(BonusEntity bonus) { using (var db = databaseManager.GetWritableDatabase()) { var entity = db.Bonuses .Where(x => x.UserId == bonus.UserId) .Where(x => x.GameId == bonus.GameId) .AsNoTracking() .SingleOrDefault(); if (entity != null) { db.Bonuses.Remove(entity); return(await db.SaveChangesAsync() > 0); } return(false); } }
public async Task <bool> ActivateAllAsync(long[] ids) { using (MyDbContext dbc = new MyDbContext()) { //批量激活会员 foreach (var id in ids) { UserEntity entity = await dbc.GetAll <UserEntity>().Where(u => u.IsNull == false).SingleOrDefaultAsync(u => u.Id == id); if (entity == null) { return(false); } decimal givingAmount = await dbc.GetDecimalParamAsync("激活赠送积分数量"); entity.IsUpgraded = true; entity.Amount = entity.Amount + givingAmount; BonusEntity bonus = new BonusEntity(); bonus.UserId = entity.Id; bonus.Amount = givingAmount; bonus.Revenue = 0; bonus.sf = givingAmount; bonus.TypeID = 1; //购买课程奖励 bonus.Source = "用户(" + entity.Mobile + ")后台激活成功,获赠碳积分"; bonus.FromUserID = entity.Id; bonus.IsSettled = 1; dbc.Bonus.Add(bonus); JournalEntity journal = new JournalEntity(); journal.UserId = entity.Id; journal.BalanceAmount = entity.Amount; journal.InAmount = givingAmount; journal.Remark = "用户(" + entity.Mobile + ")后台激活成功,获赠碳积分"; journal.JournalTypeId = (int)JournalTypeEnum.会员激活; journal.OrderCode = ""; journal.GoodsId = 0;//来至订单ID journal.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal); } await dbc.SaveChangesAsync(); return(true); } }
public async Task <long> AddAsync(long userId, decimal amount, decimal revenue, decimal sf, string source, long fromUserID, int isSettled) { using (MyDbContext dbc = new MyDbContext()) { BonusEntity entity = new BonusEntity(); entity.UserId = userId; entity.Amount = amount; entity.Revenue = revenue; entity.sf = sf; entity.Source = source; entity.FromUserID = fromUserID; entity.IsSettled = isSettled; dbc.Bonus.Add(entity); await dbc.SaveChangesAsync(); return(entity.Id); } }
public BonusDTO ToDTO(BonusEntity entity) { BonusDTO dto = new BonusDTO(); dto.Source = entity.Source; dto.TypeID = entity.TypeID; dto.CreateTime = entity.CreateTime; dto.Id = entity.Id; dto.Amount = entity.Amount; dto.Revenue = entity.Revenue; dto.sf = entity.sf; dto.UserId = entity.UserId; dto.IsSettled = entity.IsSettled; dto.SttleTime = entity.SttleTime; dto.FromUserID = entity.FromUserID; dto.UserMobile = entity.User.Mobile; return(dto); }
public Bonus ConvertToBonus(BonusEntity bonusEntity) { Bonus bonus = null; if (bonusEntity.Data != null) { if (bonusEntity.BonusType == nameof(BullRushFreeSpinBonus)) { bonus = bonusEntity.Data.FromByteArray <BullRushFreeSpinBonus>() ?? new BullRushFreeSpinBonus(); } else if (bonusEntity.BonusType == nameof(BullRushJackpotBonus)) { bonus = bonusEntity.Data.FromByteArray <BullRushJackpotBonus>() ?? new BullRushJackpotBonus(); } } return(bonus); }
/// <summary> /// 添加奖项记录 /// </summary> /// <param name="UserID"></param> /// <param name="TypeID"></param> /// <param name="Amount"></param> /// <param name="Sf"></param> /// <param name="Revenue"></param> /// <param name="IsSettled"></param> /// <param name="Remark"></param> /// <param name="RemarkEn"></param> /// <returns></returns> public long Add(long UserID, int TypeID, decimal Amount, decimal Sf, decimal Revenue, int IsSettled, string Remark, string RemarkEn) { using (MyDbContext dbcontext = new MyDbContext()) { BonusEntity model = new BonusEntity(); model.UserID = UserID; model.TypeID = TypeID; model.Amount = Amount; model.Revenue = Revenue; model.Sf = Sf; model.AddTime = DateTime.Now; model.IsSettled = IsSettled; model.Source = Remark; model.SourceEn = RemarkEn; dbcontext.Bonus.Add(model); dbcontext.SaveChanges(); return(model.ID); } }
public async Task <ValidateBonusResponseModel> ValidBonus(ValidateBonusRequetsModel validateBonusRequetsModel) { ValidateBonusRequetsContract bonusRequest = _mapper.Map <ValidateBonusRequetsContract>(validateBonusRequetsModel); ValidateBonusResponseContract bonusResponse = await _wSValidBonoRepository.ValidBonus(bonusRequest); bonusResponse.codigoBono = bonusRequest.codigoBono; var bono = _bonusDataRepository.GetByCode(bonusRequest.codigoBono); if (bono == null) { BonusEntity entity = _mapper.Map <BonusEntity>(bonusResponse); entity.UserName = validateBonusRequetsModel.UserName; _bonusDataRepository.Insert(entity); } return(_mapper.Map <ValidateBonusResponseModel>(bonusResponse)); }
public BonusNoticeInfo AddBonusNotify(string xml) { BonusNoticeInfo info = XmlAnalyzer.AnalyseXmlToCommunicationObject <BonusNoticeInfo>(xml); try { BonusEntity bonusEntity = new BonusEntity(); bonusEntity.GameName = info._Body._BonusInfo._Issue.GameName; bonusEntity.IssuseNumber = info._Body._BonusInfo._Issue.Number; bonusEntity.BonusNumber = info._Body._BonusInfo.BonusNumber; bonusEntity.TotalItems = info._Body._BonusInfo.TotalItems; bonusEntity.TotalMoney = info._Body._BonusInfo.TotalMoney; bonusEntity.NoticeId = info.Id; bonusEntity.IsDistributed = false; using (ILHDBTran tran = BeginTran()) { BonusManager bonusManager = new BonusManager(tran); bonusManager.AddBonus(bonusEntity); List <BonusDetailEntity> bonusDetailList = new List <BonusDetailEntity>(); foreach (BonusMappingInfo.BonusItem bonusItem in info._Body._BonusInfo._BonusItemList) { BonusDetailEntity detail = new BonusDetailEntity(); detail.TicketId = bonusItem.TicketId; detail.BonusLevel = bonusItem.BonusLevel; detail.PlayType = (int)bonusItem.PlayType; detail.Money = bonusItem.Money; detail.IsBombBonus = bonusItem.IsBombBonus; detail.Size = bonusItem.Size; detail.GameName = bonusEntity.GameName; detail.IssuseNumber = bonusEntity.IssuseNumber; bonusManager.AddBonusDetail(detail); } tran.Commit(); } return(info); } catch (Exception ex) { string errMsg = "添加返奖通知失败!" + xml; throw HandleException(LogCategory.Notice, errMsg, ex); } }
private decimal TestPayout(string strwheel, decimal betperline, Func <int, int, int[], Wheel> wheelEncoding) { var sdt = DateTime.Now; var serviceProvider = new ServiceCollection() .AddLogging() .BuildServiceProvider(); var logFactory = serviceProvider.GetService <ILoggerFactory>(); var logger = logFactory.CreateLogger <ChessRoyaleModule>(); var chessRoyaleModule = new ChessRoyaleModule(logger); var totalWin = 0m; List <int> maxIndexPosition = new List <int>(); RequestContext <SpinArgs> requestContext = new RequestContext <SpinArgs>("", ChessRoyaleConfiguration.GameName, PlatformType.Web); var summData = new SummaryData(); Assert.That(strwheel, Is.Not.Null.Or.Empty); string[] arrstr = strwheel.Split(','); int[] arr = Array.ConvertAll(arrstr, int.Parse); UserGameKey ugk = new UserGameKey() { UserId = -1, GameId = ChessRoyaleConfiguration.GameId, Level = 1 }; SpinBet sb = new SpinBet(ugk, PlatformType.None) { LineBet = 1, Credits = 0, Lines = ChessRoyaleConfiguration.Lines, Multiplier = 1 }; requestContext.Currency = new Currency() { Id = sb.CurrencyId }; requestContext.Parameters = new SpinArgs() { LineBet = sb.LineBet, BettingLines = sb.Lines }; requestContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; ChessRoyaleSpinResult sr = new ChessRoyaleSpinResult(ugk) { SpinBet = new SpinBet(ugk, PlatformType.None) { Lines = ChessRoyaleConfiguration.Lines, Multiplier = 1, LineBet = betperline }, Wheel = wheelEncoding(ChessRoyaleConfiguration.Width, ChessRoyaleConfiguration.Height, arr) }; totalWin = ChessRoyaleCommon.CalculateWin(sr, 1); if (sr.HasBonus) { var bonusCreated = chessRoyaleModule.CreateBonus(sr); var bonus = bonusCreated.Value; bonus.SpinTransactionId = sr.TransactionId; bonus.GameResult = sr; RequestContext <BonusArgs> requestBonusContext = new RequestContext <BonusArgs>("", ChessRoyaleConfiguration.GameName, PlatformType.Web); requestBonusContext.Currency = new Currency() { Id = sb.CurrencyId }; requestBonusContext.Parameters = new BonusArgs() { Bonus = "CollapsingSpin" }; requestBonusContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; BonusResult bonusResult; int step = bonus.CurrentStep; do { var entity = new BonusEntity { UserId = ugk.UserId, GameId = ChessRoyaleConfiguration.GameId, Guid = bonus.Guid.ToString("N"), Data = bonus.ToByteArray(), BonusType = bonus.GetType().Name, Version = 2, IsOptional = bonus.IsOptional, IsStarted = bonus.IsStarted, RoundId = sr.RoundId }; bonusResult = chessRoyaleModule.ExecuteBonus(ChessRoyaleConfiguration.LevelOne, entity, requestBonusContext).Value; var chessRoyaleFreeSpinResult = bonusResult as ChessRoyaleFreeSpinResult; var win = chessRoyaleFreeSpinResult.Win; if (win > 0) { totalWin += win; } bonus = bonusResult.Bonus; }while (!bonusResult.IsCompleted && bonusResult.Bonus != null); } Console.WriteLine($"Win : {totalWin}"); return(totalWin); }
public void TestExecuteBonus() { // Arrange var user = new UserGameKey(-1, 104); var spinResult = new Games.DragonRiches.DragonRichesResult(); var reels = new List <int[]> { new[] { 0, 6, 10 }, new[] { 6, 9, 12 }, new[] { 6, 9, 13 }, new[] { 9, 11, 12, }, new[] { 12, 10, 13 } }; spinResult.Bonus = new Stake(Guid.NewGuid(), 3); spinResult.Bonus.Count = 6; spinResult.Wheel = new Games.DragonRiches.DragonRichesWheel(); spinResult.BonusPositions = new List <BonusPosition> { new BonusPosition { Line = 1, Multiplier = 1, RowPositions = new List <int> { 0, 2, 2, 1, 0 } } }; spinResult.SpinBet = new SpinBet(user, PlatformType.None) { Lines = 30, LineBet = 1.0m }; var userSession = new UserSession { SessionKey = "unittest", UserId = -1 }; var requestContext = new RequestContext <SpinArgs>("simulation", "Dragon Riches", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, Game = new Game { Id = 104 } }; var requestBonusContext = new RequestContext <BonusArgs>("unittest", "Dragon Riches", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; requestBonusContext.UserSession = userSession; requestBonusContext.UserGameKey = user; var bonus = module.CreateBonus(spinResult).Value; var entity = new BonusEntity { UserId = userSession.UserId, GameId = requestContext.Game.Id, Guid = bonus.Guid.ToString("N"), Data = Model.Utility.Extension.ToByteArray(bonus), BonusType = bonus.GetType().Name, Version = 3, IsOptional = bonus.IsOptional, IsStarted = bonus.IsStarted, RoundId = 1, BetReference = "" }; // action var result = module.ExecuteBonus(1, entity, requestBonusContext).Value as Games.DragonRiches.DragonRichesBonusSpinResult; // assert Assert.NotNull(result); //Assert.AreEqual(true, ((DragonRichesBonus)result.Bonus).State.IsFreeSpin); }
private decimal TestCollapsingPayout(string strwheel, decimal betperline, Func <int, int, int[], Wheel> wheelEncoding) { var alchemyReelsModule = new AlchemyReelsModule(null); var maxWin = 0m; var totalWin = 0m; var maxIndexPosition = new List <int>(); var requestContext = new RequestContext <SpinArgs>("", AlchemyReelsConfiguration.GameName, PlatformType.Web); var summData = new SummaryData(); AlchemyReelsCommon.CreateWheels(new List <int>() { 3, 3, 3 }); Assert.That(strwheel, Is.Not.Null.Or.Empty); string[] arrstr = strwheel.Split(','); int[] arr = Array.ConvertAll(arrstr, int.Parse); var ugk = new UserGameKey() { UserId = -1, GameId = AlchemyReelsConfiguration.GameId, Level = 1 }; var sb = new SpinBet(ugk, PlatformType.None) { LineBet = 1, Credits = 0, Lines = AlchemyReelsConfiguration.BettingLines, Multiplier = 1 }; requestContext.Currency = new Currency() { Id = sb.CurrencyId }; requestContext.Parameters = new SpinArgs() { LineBet = sb.LineBet, BettingLines = sb.Lines }; requestContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; var sr = new AlchemyReelsCollapsingSpinResult() { SpinBet = new SpinBet(ugk, PlatformType.None) { Lines = AlchemyReelsConfiguration.BettingLines, Multiplier = 1, LineBet = betperline }, Wheel = wheelEncoding(AlchemyReelsConfiguration.Width, AlchemyReelsConfiguration.Height, arr) }; sr.TopIndices = new List <int>() { 6, 6, 49 }; totalWin = AlchemyReelsCommon.CalculateWin(sr); Console.WriteLine(); Console.WriteLine("--- POSITION TABLE ---"); foreach (AlchemyReelTableWin tw in sr.TableWins) { Console.WriteLine(String.Format("[WIN:{0} SYM:{1} COUNT:{2}]", tw.Win, tw.Card, tw.Count)); } if (sr.HasBonus) { var bonusCreated = alchemyReelsModule.CreateBonus(sr); var bonus = bonusCreated.Value; bonus.SpinTransactionId = sr.TransactionId; bonus.GameResult = sr; var requestBonusContext = new RequestContext <BonusArgs>("", AlchemyReelsConfiguration.GameName, PlatformType.Web); requestBonusContext.Currency = new Currency() { Id = sb.CurrencyId }; requestBonusContext.Parameters = new BonusArgs() { Bonus = "CollapsingSpin" }; requestBonusContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; BonusResult bonusResult; int step = bonus.CurrentStep; do { var entity = new BonusEntity { UserId = ugk.UserId, GameId = AlchemyReelsConfiguration.GameId, Guid = bonus.Guid.ToString("N"), Data = bonus.ToByteArray(), BonusType = bonus.GetType().Name, Version = 2, IsOptional = bonus.IsOptional, IsStarted = bonus.IsStarted, RoundId = sr.RoundId }; bonusResult = alchemyReelsModule.ExecuteBonus(AlchemyReelsConfiguration.LevelOne, entity, requestBonusContext).Value; var alchemyFreeCollapsingSpinResult = bonusResult as AlchemyFreeCollapsingSpinResult; var win = alchemyFreeCollapsingSpinResult.Win; if (win > 0) { totalWin += win; } var maxTopIndices = alchemyFreeCollapsingSpinResult.SpinResult.TopIndices.ToList(); if (totalWin > maxWin) { maxWin = totalWin; maxIndexPosition = maxTopIndices; } Console.WriteLine("--- POSITION TABLE ---"); foreach (AlchemyReelTableWin tw in alchemyFreeCollapsingSpinResult.SpinResult.TableWins) { Console.WriteLine(String.Format("[WIN:{0} SYM:{1} COUNT:{2}]", tw.Win, tw.Card, tw.Count)); } bonus = bonusResult.Bonus; }while (!bonusResult.IsCompleted && bonusResult.Bonus != null); } Console.WriteLine($"Win : {totalWin}"); return(totalWin); }
public void TestAlchemyReels(int gameId, int level, string currencyCode, int numusers, int numItrPerUser, decimal bet, int lines, int mp) { var sdt = DateTime.Now; var serviceProvider = new ServiceCollection() .AddLogging() .BuildServiceProvider(); var logFactory = serviceProvider.GetService <ILoggerFactory>(); var logger = logFactory.CreateLogger <AlchemyReelsModule>(); var alchemyReelsModule = new AlchemyReelsModule(logger); var maxWin = 0m; AlchemyReelsCommon.CreateWheels(new List <int>() { 3, 3, 3 }); var summData = new SummaryData(); var users = GenerateUsers(gameId, numusers, level); var sbs = GenerateUserBets(users, bet, lines, mp); var requestContext = new RequestContext <SpinArgs>("", AlchemyReelsConfiguration.GameName, PlatformType.Web); var requestBonusContext = new RequestContext <BonusArgs>("", AlchemyReelsConfiguration.GameName, PlatformType.Web); Parallel.ForEach(users, () => new SummaryData(), (key, state, sdata) => { var sb = sbs[key.UserId]; requestContext.Currency = new Currency() { Id = sb.CurrencyId }; requestContext.Parameters = new SpinArgs() { LineBet = sb.LineBet, BettingLines = sb.Lines }; requestContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; for (var i = 0; i < numItrPerUser; ++i) { var sr = alchemyReelsModule.ExecuteSpin(level, new UserGameSpinData(), requestContext).Value as AlchemyReelsCollapsingSpinResult; if (sr.Win > maxWin) { maxWin = sr.Win; } UpdateSummaryData(sdata, sr); UpdateAlchemyReelsSummaryData(sdata, sr); if (sr.HasBonus) { var bonusCreated = alchemyReelsModule.CreateBonus(sr); var bonus = bonusCreated.Value; bonus.SpinTransactionId = sr.TransactionId; bonus.GameResult = sr; requestBonusContext.Currency = new Currency() { Id = sb.CurrencyId }; requestBonusContext.Parameters = new BonusArgs() { Bonus = "CollapsingSpin" }; requestBonusContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; BonusResult bonusResult; var step = bonus.CurrentStep; do { var entity = new BonusEntity { UserId = key.UserId, GameId = AlchemyReelsConfiguration.GameId, Guid = bonus.Guid.ToString("N"), Data = bonus.ToByteArray(), BonusType = bonus.GetType().Name, Version = 2, IsOptional = bonus.IsOptional, IsStarted = bonus.IsStarted, RoundId = sr.RoundId }; bonusResult = alchemyReelsModule.ExecuteBonus(level, entity, requestBonusContext).Value; var alchemyFreeCollapsingSpinResult = bonusResult as AlchemyFreeCollapsingSpinResult; UpdateSummaryDataCollapsing(sdata, alchemyFreeCollapsingSpinResult.SpinResult); UpdateAlchemyReelsSummaryData(sdata, alchemyFreeCollapsingSpinResult.SpinResult); bonus = bonusResult.Bonus; }while (!bonusResult.IsCompleted && bonusResult.Bonus != null); } } return(sdata); }, sdata => { lock (summData) { summData.Sum(sdata); } }); DisplayAlchemyReelsSummaryData(level, bet, lines, summData, sdt, maxWin, null); }
public void TestAlchemyReelsFullCycle(int level, List <int> rows) { var sdt = DateTime.Now; var serviceProvider = new ServiceCollection() .AddLogging() .BuildServiceProvider(); var logFactory = serviceProvider.GetService <ILoggerFactory>(); var logger = logFactory.CreateLogger <AlchemyReelsModule>(); var alchemyReelsModule = new AlchemyReelsModule(logger); var maxWin = 0m; var profile = new Dictionary <decimal, int>(); var maxIndexPosition = new List <int>(); AlchemyReelsCommon.CreateWheels(rows); var summData = new SummaryData(); for (var reel0 = 0; reel0 < AlchemyReelsConfiguration.Wheels[level].Reels[0].Count; reel0++) { for (var reel1 = 0; reel1 < AlchemyReelsConfiguration.Wheels[level].Reels[1].Count; reel1++) { for (var reel2 = 0; reel2 < AlchemyReelsConfiguration.Wheels[level].Reels[2].Count; reel2++) { var totalWin = (decimal)0; var ugk = new UserGameKey() { UserId = -1, GameId = AlchemyReelsConfiguration.GameId, Level = 1 }; var sb = new SpinBet(ugk, PlatformType.None) { LineBet = 1, Credits = 0, Lines = AlchemyReelsConfiguration.BettingLines, Multiplier = 1 }; var requestContext = new RequestContext <SpinArgs>("", AlchemyReelsConfiguration.GameName, PlatformType.Web); var requestBonusContext = new RequestContext <BonusArgs>("", AlchemyReelsConfiguration.GameName, PlatformType.Web); requestContext.Currency = new Currency() { Id = sb.CurrencyId }; requestContext.Parameters = new SpinArgs() { LineBet = sb.LineBet, BettingLines = sb.Lines }; requestContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; var wheel = new Wheel(rows); wheel.Reels[0] = GetRange(AlchemyReelsConfiguration.Wheels[level].Reels[0], reel0, wheel.Rows[0]); wheel.Reels[1] = GetRange(AlchemyReelsConfiguration.Wheels[level].Reels[1], reel1, wheel.Rows[1]); wheel.Reels[2] = GetRange(AlchemyReelsConfiguration.Wheels[level].Reels[2], reel2, wheel.Rows[2]); var sr = new AlchemyReelsCollapsingSpinResult() { SpinBet = new SpinBet(ugk, PlatformType.None) { Lines = AlchemyReelsConfiguration.BettingLines, Multiplier = 1, LineBet = 1m }, Wheel = wheel }; sr.Wheel = wheel; sr.TopIndices = new List <int>() { reel0, reel1, reel2 }; AlchemyReelsCommon.CalculateWin(sr); totalWin = sr.Win; UpdateSummaryData(summData, sr); UpdateAlchemyReelsSummaryData(summData, sr); if (sr.HasBonus) { var bonusCreated = alchemyReelsModule.CreateBonus(sr); var bonus = bonusCreated.Value; bonus.SpinTransactionId = sr.TransactionId; bonus.GameResult = sr; requestBonusContext.Currency = new Currency() { Id = sb.CurrencyId }; requestBonusContext.Parameters = new BonusArgs() { Bonus = "CollapsingSpin" }; requestBonusContext.GameSetting = new GameSetting() { GameSettingGroupId = sb.GameSettingGroupId }; BonusResult bonusResult; var step = bonus.CurrentStep; do { var entity = new BonusEntity { UserId = ugk.UserId, GameId = AlchemyReelsConfiguration.GameId, Guid = bonus.Guid.ToString("N"), Data = bonus.ToByteArray(), BonusType = bonus.GetType().Name, Version = 2, IsOptional = bonus.IsOptional, IsStarted = bonus.IsStarted, RoundId = sr.RoundId }; bonusResult = alchemyReelsModule.ExecuteBonus(level, entity, requestBonusContext).Value; var alchemyFreeCollapsingSpinResult = bonusResult as AlchemyFreeCollapsingSpinResult; var win = alchemyFreeCollapsingSpinResult.Win; if (win > 0) { totalWin += win; } var maxTopIndices = alchemyFreeCollapsingSpinResult.SpinResult.TopIndices.ToList(); if (totalWin > maxWin) { maxWin = totalWin; maxIndexPosition = maxTopIndices; } UpdateSummaryDataCollapsing(summData, alchemyFreeCollapsingSpinResult.SpinResult); UpdateAlchemyReelsSummaryData(summData, alchemyFreeCollapsingSpinResult.SpinResult); bonus = bonusResult.Bonus; }while (!bonusResult.IsCompleted && bonusResult.Bonus != null); } if (!profile.ContainsKey(totalWin)) { profile.Add(totalWin, 1); } else { profile.TryGetValue(totalWin, out int count); profile.Remove(totalWin); profile.Add(totalWin, count + 1); } } } } DisplayAlchemyReelsSummaryData(level, 1, 10, summData, sdt, maxWin, maxIndexPosition); if (profile != null) { foreach (var item in profile.OrderByDescending(p => p.Key)) { Console.WriteLine($"Win : {item.Key}; {item.Value}"); } } }
/// <summary> /// 积分购买课程发放奖励 /// </summary> /// <param name="id"></param> /// <returns></returns> public async Task <bool> IntegralBuyAsync(long id) { using (MyDbContext dbc = new MyDbContext()) { var course = await dbc.GetAll <CourseOrderEntity>().SingleOrDefaultAsync(c => c.Id == id); if (course == null) { return(false); } UserEntity user = await dbc.GetAll <UserEntity>().SingleOrDefaultAsync(u => u.Id == course.BuyerId); //未激活会员 if (!user.IsUpgraded) { return(true); } //不是普通会员,无法升级 if (user.LevelId != (int)LevelEnum.普通会员) { return(true); } else { //购买课程成功,会员升级为节点会员 user.LevelId = (int)LevelEnum.创客会员; await dbc.SaveChangesAsync(); } if (user.RecommendId <= 0) { return(true); } UserEntity recUser = await dbc.GetAll <UserEntity>().SingleOrDefaultAsync(u => u.Id == user.RecommendId); if (!recUser.IsUpgraded) { return(true); } if (recUser.LevelId == (int)LevelEnum.普通会员) { return(true); } //推荐奖 decimal param = (await dbc.GetDecimalParamAsync("直接推荐奖励比例")) / 100; decimal blance = 100 * param; recUser.Amount = recUser.Amount + blance; BonusEntity entity1 = new BonusEntity(); entity1.UserId = recUser.Id; entity1.Amount = blance; entity1.Revenue = 0; entity1.sf = blance; entity1.TypeID = 2; //直接推荐奖 entity1.Source = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得直接推荐奖励"; entity1.FromUserID = user.Id; entity1.IsSettled = 1; dbc.Bonus.Add(entity1); JournalEntity journal1 = new JournalEntity(); journal1.UserId = recUser.Id; journal1.BalanceAmount = recUser.Amount; journal1.InAmount = blance; journal1.Remark = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得直接推荐奖励"; journal1.JournalTypeId = (int)JournalTypeEnum.直推奖; journal1.OrderCode = course.Code; journal1.GoodsId = course.CourseId;//来至订单ID journal1.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal1); long recommendId = recUser.RecommendId; int count = 0; long recCount = await dbc.GetAll <UserEntity>().AsNoTracking().LongCountAsync(u => u.RecommendId == recUser.Id && u.LevelId == (int)LevelEnum.创客会员); if (recCount >= 10) { recUser.LevelId = (int)LevelEnum.贵宾会员; count++; } decimal param1 = (await dbc.GetDecimalParamAsync("招募创客6到9个奖金比例")) / 100; decimal param2 = (await dbc.GetDecimalParamAsync("招募创客大于9个奖金比例")) / 100; //领导奖 while (recommendId > 0 && recCount >= 6) { recUser = await dbc.GetAll <UserEntity>().SingleOrDefaultAsync(u => u.Id == recommendId); recCount = await dbc.GetAll <UserEntity>().AsNoTracking() .LongCountAsync(u => u.RecommendId == recUser.Id && (u.LevelId == (int)LevelEnum.贵宾会员 || u.LevelId == (int)LevelEnum.超级会员)); recommendId = recUser.RecommendId; if (recCount < 6) { break; } else if (recCount >= 6 & recCount < 10) { blance = blance * param1 / 100; recUser.Amount = recUser.Amount + blance; count = 0; BonusEntity entity2 = new BonusEntity(); entity2.UserId = recUser.Id; entity2.Amount = blance; entity2.Revenue = 0; entity2.sf = blance; entity2.TypeID = 3; //领导奖 entity2.Source = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; entity2.FromUserID = user.Id; entity2.IsSettled = 1; dbc.Bonus.Add(entity2); JournalEntity journal2 = new JournalEntity(); journal2.UserId = recUser.Id; journal2.BalanceAmount = recUser.Amount; journal2.InAmount = blance; journal2.Remark = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; journal2.JournalTypeId = (int)JournalTypeEnum.领导奖; journal2.OrderCode = course.Code; journal2.GoodsId = course.CourseId;//来至订单ID journal2.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal1); } else { blance = blance * param2 / 100; recUser.Amount = recUser.Amount + blance; count++; if (count >= 10 && recUser.LevelId == (int)LevelEnum.贵宾会员) { recUser.LevelId = (int)LevelEnum.超级会员; } BonusEntity entity3 = new BonusEntity(); entity3.UserId = recUser.Id; entity3.Amount = blance; entity3.Revenue = 0; entity3.sf = blance; entity3.TypeID = 3; //领导奖 entity3.Source = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; entity3.FromUserID = user.Id; entity3.IsSettled = 1; dbc.Bonus.Add(entity3); JournalEntity journal3 = new JournalEntity(); journal3.UserId = recUser.Id; journal3.BalanceAmount = recUser.Amount; journal3.InAmount = blance; journal3.Remark = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; journal3.JournalTypeId = (int)JournalTypeEnum.领导奖; journal3.OrderCode = course.Code; journal3.GoodsId = course.CourseId;//来至订单ID journal3.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal3); } } await dbc.SaveChangesAsync(); return(true); } }
public Task <bool> RemoveBonus(UserSession userSession, BonusEntity bonus) { return(bonus.UserId <= 0 ? RemoveBonusFromCache(userSession) : RemoveBonusFromDatabase(bonus)); }
public void TestExecuteBonus() { // Arrange var user = new UserGameKey(-1, 3); var spinBet = new SpinBet(user, PlatformType.None) { Lines = 30, LineBet = 1.0m }; var result1 = new BikiniBeachResult() { BonusPositions = new List <BonusPosition> { new BonusPosition { Line = 1, Multiplier = 1, RowPositions = new List <int> { 0, 2, 2, 2, 0 } } }, Bonus = new Stake(Guid.NewGuid(), 2) { Count = 1 } }; var result2 = new BikiniBeachResult() { BonusPositions = new List <BonusPosition> { new BonusPosition { Line = 1, Multiplier = 1, RowPositions = new List <int> { 0, 2, 2, 2, 0 } } }, Bonus = new Stake(Guid.NewGuid(), 3) { Count = 1 } }; var result3 = new BikiniBeachResult() { BonusPositions = new List <BonusPosition> { new BonusPosition { Line = 1, Multiplier = 1, RowPositions = new List <int> { 0, 2, 2, 2, 0 } } }, Bonus = new Stake(Guid.NewGuid(), 4) { Count = 1 } }; result1.SpinBet = spinBet; result2.SpinBet = spinBet; result3.SpinBet = spinBet; var userSession = new UserSession { SessionKey = "unittest", UserId = -1 }; var requestContext = new RequestContext <SpinArgs>("simulation", "Bikini Beach", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, Game = new Game { Id = 3 } }; var requestBonusContext = new RequestContext <BonusArgs>("unittest", "Bikini Beach", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; requestBonusContext.UserSession = userSession; requestBonusContext.UserGameKey = user; var bonus1 = module.CreateBonus(result1).Value; var bonus2 = module.CreateBonus(result2).Value; var bonus3 = module.CreateBonus(result3).Value; var entity1 = new BonusEntity { UserId = userSession.UserId, GameId = requestContext.Game.Id, Guid = bonus1.Guid.ToString("N"), Data = Model.Utility.Extension.ToByteArray(bonus1), BonusType = bonus1.GetType().Name, Version = 3, IsOptional = bonus1.IsOptional, IsStarted = bonus1.IsStarted, RoundId = 1, BetReference = "" }; var entity2 = new BonusEntity { UserId = userSession.UserId, GameId = requestContext.Game.Id, Guid = bonus2.Guid.ToString("N"), Data = Model.Utility.Extension.ToByteArray(bonus2), BonusType = bonus2.GetType().Name, Version = 3, IsOptional = bonus2.IsOptional, IsStarted = bonus2.IsStarted, RoundId = 1, BetReference = "" }; var entity3 = new BonusEntity { UserId = userSession.UserId, GameId = requestContext.Game.Id, Guid = bonus3.Guid.ToString("N"), Data = Model.Utility.Extension.ToByteArray(bonus3), BonusType = bonus3.GetType().Name, Version = 3, IsOptional = bonus3.IsOptional, IsStarted = bonus3.IsStarted, RoundId = 1, BetReference = "" }; // action var freeSpinResult1 = module.ExecuteBonus(1, entity1, requestBonusContext).Value as BikiniBeachBonusSpinResult; var freeSpinResult2 = module.ExecuteBonus(1, entity2, requestBonusContext).Value as BikiniBeachBonusSpinResult; var freeSpinResult3 = module.ExecuteBonus(1, entity3, requestBonusContext).Value as BikiniBeachBonusSpinResult; // assert Assert.NotNull(freeSpinResult1); Assert.NotNull(freeSpinResult2); Assert.NotNull(freeSpinResult3); Assert.AreEqual(freeSpinResult1.SpinResult.HasBonus == false, ((BikiniBeachBonus)freeSpinResult1.Bonus).State is Finish); Assert.AreEqual(freeSpinResult2.SpinResult.HasBonus == false, ((BikiniBeachBonus)freeSpinResult1.Bonus).State is Finish); Assert.AreEqual(freeSpinResult3.SpinResult.HasBonus == false, ((BikiniBeachBonus)freeSpinResult1.Bonus).State is Finish); Assert.AreEqual(freeSpinResult1.GameResultType, GameResultType.FreeSpinResult); Assert.AreEqual(freeSpinResult2.GameResultType, GameResultType.RevealResult); Assert.AreEqual(freeSpinResult3.GameResultType, GameResultType.RevealResult); }
public async Task <bool> CalcShareBonusAsync(decimal totalScore) { using (MyDbContext dbc = new MyDbContext()) { decimal teamScore; IQueryable <UserEntity> res; string keyword; decimal term; int levelId; int count; decimal bonusAmount; decimal totalBuyAmount = 0; IQueryable <UserEntity> users; //皇冠会员 users = dbc.GetAll <UserEntity>().Where(u => u.LevelId == (int)LevelEnum.皇冠会员); count = await users.CountAsync(); if (count > 0) { levelId = 1; decimal.TryParse(await dbc.GetStringPropertyAsync <SettingEntity>(s => s.TypeName == "全国分红" && s.LevelId == levelId, s => s.Param), out term); foreach (UserEntity user in await users.ToListAsync()) { if (user.UserCode == "system") { keyword = (user.Id + "-").ToString(); res = dbc.GetAll <UserEntity>().AsNoTracking().Where(u => u.RecommendPath.Contains(keyword)); teamScore = await res.SumAsync(u => u.BuyAmount); user.FrozenAmount = teamScore; } else { keyword = ("-" + user.Id + "-").ToString(); res = dbc.GetAll <UserEntity>().AsNoTracking().Where(u => u.RecommendPath.Contains(keyword)); teamScore = await res.SumAsync(u => u.BuyAmount); user.FrozenAmount = teamScore; } if (user.FrozenAmount >= 100000) { totalBuyAmount = totalBuyAmount + ((int)Math.Truncate(user.FrozenAmount)) / 100000 * 100000; } await dbc.SaveChangesAsync(); } if (totalBuyAmount >= 100000) { foreach (UserEntity user in await users.ToListAsync()) { if (user.FrozenAmount < 100000) { continue; } bonusAmount = totalScore * (term / 100) * (((int)Math.Truncate(user.FrozenAmount)) / 100000 * 100000 / totalBuyAmount); user.Amount = user.Amount + bonusAmount; user.BonusAmount = user.BonusAmount + bonusAmount; BonusEntity bonus = new BonusEntity(); bonus.UserId = user.Id; bonus.Amount = bonusAmount; bonus.Revenue = 0; bonus.sf = bonusAmount; bonus.TypeID = 5; //5、分红 bonus.Source = "用户(" + user.Mobile + ")获得全国分红"; bonus.FromUserID = user.Id; bonus.IsSettled = 1; dbc.Bonus.Add(bonus); JournalEntity journal = new JournalEntity(); journal.UserId = user.Id; journal.BalanceAmount = user.Amount; journal.InAmount = bonusAmount; journal.Remark = "用户(" + user.Mobile + ")获得全国分红"; journal.JournalTypeId = (int)JournalTypeEnum.全国分红; //journal.OrderCode = order.Code; //journal.GoodsId = order.Id;//来至订单ID journal.CurrencyType = 1;//币种,只有rmb dbc.Journals.Add(journal); } } } users = dbc.GetAll <UserEntity>().Where(u => u.LevelId == (int)LevelEnum.董事会员); count = await users.CountAsync(); totalBuyAmount = 0; if (count > 0) { levelId = 2; decimal.TryParse(await dbc.GetStringPropertyAsync <SettingEntity>(s => s.TypeName == "全国分红" && s.LevelId == levelId, s => s.Param), out term); foreach (UserEntity user in await users.ToListAsync()) { if (user.UserCode == "system") { keyword = (user.Id + "-").ToString(); res = dbc.GetAll <UserEntity>().AsNoTracking().Where(u => u.RecommendPath.Contains(keyword)); teamScore = await res.SumAsync(u => u.BuyAmount); user.FrozenAmount = teamScore; } else { keyword = ("-" + user.Id + "-").ToString(); res = dbc.GetAll <UserEntity>().AsNoTracking().Where(u => u.RecommendPath.Contains(keyword)); teamScore = await res.SumAsync(u => u.BuyAmount); user.FrozenAmount = teamScore; } if (user.BuyAmount >= 100000) { totalBuyAmount = totalBuyAmount + ((int)Math.Truncate(user.FrozenAmount)) / 100000 * 100000; } await dbc.SaveChangesAsync(); } if (totalBuyAmount >= 100000) { foreach (UserEntity user in await users.ToListAsync()) { if (user.FrozenAmount < 100000) { continue; } bonusAmount = totalScore * (term / 100) * (((int)Math.Truncate(user.FrozenAmount)) / 100000 * 100000 / totalBuyAmount); user.Amount = user.Amount + bonusAmount; user.BonusAmount = user.BonusAmount + bonusAmount; BonusEntity bonus = new BonusEntity(); bonus.UserId = user.Id; bonus.Amount = bonusAmount; bonus.Revenue = 0; bonus.sf = bonusAmount; bonus.TypeID = 5; //5、分红 bonus.Source = "用户(" + user.Mobile + ")获得全国分红"; bonus.FromUserID = user.Id; bonus.IsSettled = 1; dbc.Bonus.Add(bonus); JournalEntity journal = new JournalEntity(); journal.UserId = user.Id; journal.BalanceAmount = user.Amount; journal.InAmount = bonusAmount; journal.Remark = "用户(" + user.Mobile + ")获得全国分红"; journal.JournalTypeId = (int)JournalTypeEnum.全国分红; //journal.OrderCode = order.Code; //journal.GoodsId = order.Id;//来至订单ID journal.CurrencyType = 1;//币种,只有rmb dbc.Journals.Add(journal); } } } await dbc.SaveChangesAsync(); return(true); } }
public void TestExecuteBonus() { // Arrange var user = new UserGameKey(-1, 109); var spinBet = new SpinBet(user, PlatformType.None) { Lines = 30, LineBet = 1.0m }; var wheel = new FortuneChimesWheel { Reels = new List <int[]> { new int[] { 1, 1, 1 }, new int[] { 2, 10, 2 }, new int[] { 3, 10, 3 }, new int[] { 4, 10, 4 }, new int[] { 5, 5, 5 }, }, Indices = new int[] { 0, 0, 0, 0, 0 } }; var result1 = new FortuneChimesSpinResult(user) { Wheel = wheel, BonusPositions = new List <BonusPosition> { new BonusPosition { Line = 1, Multiplier = 1, RowPositions = new List <int> { 0, 2, 2, 2, 0 } } }, Bonus = new Stake(Guid.NewGuid(), 3) { Count = 1 } }; result1.SpinBet = spinBet; var userSession = new UserSession { SessionKey = "unittest", UserId = -1 }; var requestContext = new RequestContext <SpinArgs>("simulation", "Cleopatra", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, Game = new Game { Id = 109 } }; var requestBonusContext = new RequestContext <BonusArgs>("unittest", "Cleopatra", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; requestBonusContext.UserSession = userSession; requestBonusContext.UserGameKey = user; var bonus1 = module.CreateBonus(result1).Value; var entity1 = new BonusEntity { UserId = userSession.UserId, GameId = requestContext.Game.Id, Guid = bonus1.Guid.ToString("N"), Data = Model.Utility.Extension.ToByteArray(bonus1), BonusType = bonus1.GetType().Name, Version = 3, IsOptional = bonus1.IsOptional, IsStarted = bonus1.IsStarted, RoundId = 1, BetReference = "" }; // action var freeSpinResult1 = module.ExecuteBonus(1, entity1, requestBonusContext).Value as FortuneChimesBonusSpinResult; // assert Assert.NotNull(freeSpinResult1); Assert.AreEqual(freeSpinResult1.GameResultType, GameResultType.FreeSpinResult); }
public static Result <BonusResult, ErrorCode> Execute(int level, RequestContext <BonusArgs> requestContext, BullRushJackpotBonus bullRushJackpotBonus, BonusEntity bonusEntity) { if (bullRushJackpotBonus != null) { return(ExecuteBullRushJackpot(level, requestContext, bullRushJackpotBonus, bonusEntity)); } return(ErrorCode.NonexistenceBonus); }
private static Result <BonusResult, ErrorCode> ExecuteBullRushJackpot(int level, RequestContext <BonusArgs> requestContext, BullRushJackpotBonus bullRushJackpotBonus, BonusEntity bonusEntity) { bullRushJackpotBonus.IsStarted = true; var br = new BullRushJackpotBonusResult(requestContext.UserGameKey) { SpinTransactionId = bullRushJackpotBonus.SpinTransactionId, Level = level, PlatformType = requestContext.Platform, TotalSpin = bullRushJackpotBonus.NumOfJackpot, CumulativeWin = bullRushJackpotBonus.CumulativeWin, SpinResult = bullRushJackpotBonus.GameResult as BullRushSpinResult, Step = bullRushJackpotBonus.CurrentStep, }; if (br.SpinResult == null) { if (bullRushJackpotBonus.GameResult is BullRushJackpotBonusResult) { br.SpinResult = (bullRushJackpotBonus.GameResult as BullRushJackpotBonusResult).SpinResult; } } GenerateJackpotResult(requestContext, br, bullRushJackpotBonus); if (br.SpinResult.SelectedInnerWheelValue == BullRushConfiguration.TREASURE3 || br.SpinResult.SelectedInnerWheelValue == BullRushConfiguration.TREASURE4 || br.SpinResult.SelectedInnerWheelValue == BullRushConfiguration.TREASURE5) { for (int i = 0; i < br.SpinResult.SelectedInnerWheelValue; i++) { br.SpinResult.InventoryList.Add(BullRushConfiguration.TREASURE); } } else if (br.SpinResult.SelectedInnerWheelValue == BullRushConfiguration.BONUS) { var bonusPrize = new Dictionary <double, int>(BullRushConfiguration.BonusRace); var prizeList = new List <decimal>(); var random = RandomNumberEngine.NextDouble(); var selectedCoinValue = bonusPrize.FirstOrDefault(item => random <= item.Key).Value; prizeList.Add(selectedCoinValue); for (int i = 0; i < BullRushConfiguration.VEHICLES - 1; i++) { var randomShowingIndex = RandomNumberEngine.Next(0, bonusPrize.Count - 1); var selectedShowingValue = bonusPrize.Values.ElementAt(randomShowingIndex); var selectedShowingKey = bonusPrize.Keys.ElementAt(randomShowingIndex); prizeList.Add(selectedShowingValue); bonusPrize.Remove(selectedShowingKey); } br.SpinResult.BonusRacingPrizesList = prizeList.Shuffle(); var selectedPrizeIndex = br.SpinResult.BonusRacingPrizesList.IndexOf(selectedCoinValue); br.SpinResult.SelectedBonusRacingPrizeIndex = selectedPrizeIndex; br.SpinResult.SelectedBonusRacingPrize = selectedCoinValue; br.SpinResult.IsBonusRacing = true; } br.SpinResult.IsRacing = true; bullRushJackpotBonus.GameResult = br; var variantWheel = new Wheel(new List <int>() { 105, 105, 105, 105 }); var numberOfMagnet = br.SpinResult.InventoryList.Count(x => x == BullRushConfiguration.MAGNET); var numberOfVacuum = br.SpinResult.InventoryList.Count(x => x == BullRushConfiguration.VACUUM); if (numberOfMagnet == 0 && numberOfVacuum == 0) { variantWheel = BullRushConfiguration.VariantWheelsOne[level]; br.SpinResult.VariantWheel = 1; } else if (numberOfMagnet == 0 && numberOfVacuum > 0) { var randomDouble = RandomNumberEngine.NextDouble(); var isVariantTwo = (randomDouble <= BullRushConfiguration.VariantTwoWeight) ? true : false; if (isVariantTwo) { variantWheel = BullRushConfiguration.VariantWheelsTwo[level]; br.SpinResult.VariantWheel = 2; } else { variantWheel = BullRushConfiguration.VariantWheelsThree[level]; br.SpinResult.VariantWheel = 3; } } else if (numberOfMagnet > 0 && numberOfVacuum == 0) { variantWheel = BullRushConfiguration.VariantWheelsFour[level]; br.SpinResult.VariantWheel = 4; } else if (numberOfMagnet > 0 && numberOfVacuum > 0) { variantWheel = BullRushConfiguration.VariantWheelsFive[level]; br.SpinResult.VariantWheel = 5; } var listOfChestPosition = variantWheel[3].Select((value, index) => new { value, index }).Where(a => a.value > 0).Select(a => a.index).ToList(); var chosenTreasureItems = new List <int>(); for (int i = 0; i < BullRushConfiguration.WidthOfRace; i++) { int index = RandomNumberEngine.Next(0, listOfChestPosition.Count() - 1); chosenTreasureItems.Add(listOfChestPosition[index]); listOfChestPosition.RemoveAt(index); } if (br.SpinResult.IsBonusRacing) { var distributedAllRows = BullRushCommon.GenerateBonusRacing(br.SpinResult.SelectedBonusRacingPrize, br.SpinResult.SpinBet.LineBet, br.SpinResult.SpinBet.FunPlayDemoKey); br.SpinResult.DistributedAllRows = distributedAllRows; br.SpinResult.CurrentBonusRacingCounter = BullRushConfiguration.HeightBonusRacing; } else if (br.SpinResult.IsRacing) { var distributedAllRows = BullRushCommon.GenerateRacing(variantWheel, chosenTreasureItems, br.SpinResult); br.SpinResult.DistributedAllRows = distributedAllRows; br.SpinResult.CurrentRacingCounter = BullRushConfiguration.HeightOfRacing; } var freeSpinBonus = BullRushFreeSpinFeature.CreateBonus(br.SpinResult); br.SpinResult.BonusElement = new BullRushBonusElement { Id = freeSpinBonus.Id, Count = br.SpinResult.CurrentRacingCounter, Value = freeSpinBonus.Guid.ToString("N") }; br.SpinResult.Bonus = new BonusStruct() { Id = freeSpinBonus.Id, Count = br.SpinResult.CurrentRacingCounter, }; bonusEntity.BonusType = freeSpinBonus.GetType().Name; br.Bonus = freeSpinBonus; return(br); }
public async Task <bool> AuditAsync(long id, int stateId, long auditorId) { using (MyDbContext dbc = new MyDbContext()) { var course = await dbc.GetAll <CourseOrderEntity>().SingleOrDefaultAsync(c => c.Id == id); if (course == null) { return(false); } //取消课程订单 if ((int)CourseOrderStateEnum.已取消 == stateId) { course.OrderStateId = stateId; course.AuditTime = DateTime.Now; course.AuditMobile = await dbc.GetParameterAsync <AdminEntity>(a => a.Id == auditorId, a => a.Mobile); await dbc.SaveChangesAsync(); return(true); } else { course.OrderStateId = stateId; course.AuditTime = DateTime.Now; course.AuditMobile = await dbc.GetParameterAsync <AdminEntity>(a => a.Id == auditorId, a => a.Mobile); UserEntity user = await dbc.GetAll <UserEntity>().SingleOrDefaultAsync(u => u.Id == course.BuyerId); //未激活会员 if (!user.IsUpgraded) { course.OrderStateId = (int)CourseOrderStateEnum.已取消; await dbc.SaveChangesAsync(); return(true); } if (user.LevelId != (int)LevelEnum.普通会员) { //购买课程成功,获得100碳积分 user.Amount = user.Amount + 100; } else { //购买课程成功,会员升级为节点会员,获得100碳积分 user.LevelId = (int)LevelEnum.创客会员; user.Amount = user.Amount + 100; } BonusEntity entity = new BonusEntity(); entity.UserId = user.Id; entity.Amount = 100; entity.Revenue = 0; entity.sf = 100; entity.TypeID = 1; //购买课程奖励 entity.Source = "用户(" + user.Mobile + ")购买课程,获得碳积分奖励"; entity.FromUserID = user.Id; entity.IsSettled = 1; dbc.Bonus.Add(entity); JournalEntity journal = new JournalEntity(); journal.UserId = user.Id; journal.BalanceAmount = user.Amount; journal.InAmount = 100; journal.Remark = "用户(" + user.Mobile + ")购买课程,获得碳积分奖励"; journal.JournalTypeId = (int)JournalTypeEnum.购买课程奖励; journal.OrderCode = course.Code; journal.GoodsId = course.CourseId;//来至订单ID journal.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal); if (user.RecommendId <= 0) { await dbc.SaveChangesAsync(); return(true); } UserEntity recUser = await dbc.GetAll <UserEntity>().SingleOrDefaultAsync(u => u.Id == user.RecommendId); if (recUser.LevelId == (int)LevelEnum.普通会员) { await dbc.SaveChangesAsync(); return(true); } //推荐奖 decimal param = (await dbc.GetDecimalParamAsync("直接推荐奖励比例")) / 100; decimal blance = 100 * param; recUser.Amount = recUser.Amount + blance; BonusEntity entity1 = new BonusEntity(); entity1.UserId = recUser.Id; entity1.Amount = blance; entity1.Revenue = 0; entity1.sf = blance; entity1.TypeID = 2; //直接推荐奖 entity1.Source = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得直接推荐奖励"; entity1.FromUserID = user.Id; entity1.IsSettled = 1; dbc.Bonus.Add(entity1); JournalEntity journal1 = new JournalEntity(); journal1.UserId = recUser.Id; journal1.BalanceAmount = recUser.Amount; journal1.InAmount = blance; journal1.Remark = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得直接推荐奖励"; journal1.JournalTypeId = (int)JournalTypeEnum.直推奖; journal1.OrderCode = course.Code; journal1.GoodsId = course.CourseId;//来至订单ID journal1.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal1); long recommendId = recUser.RecommendId; int count = 0; long recCount = await dbc.GetAll <UserEntity>().AsNoTracking().LongCountAsync(u => u.RecommendId == recUser.Id && u.LevelId == (int)LevelEnum.创客会员); if (recCount >= 10) { recUser.LevelId = (int)LevelEnum.贵宾会员; count++; } decimal param1 = (await dbc.GetDecimalParamAsync("招募创客6到9个奖金比例")) / 100; decimal param2 = (await dbc.GetDecimalParamAsync("招募创客大于9个奖金比例")) / 100; //领导奖 while (recommendId > 0 && recCount >= 6) { recUser = await dbc.GetAll <UserEntity>().SingleOrDefaultAsync(u => u.Id == recommendId); recCount = await dbc.GetAll <UserEntity>().AsNoTracking() .LongCountAsync(u => u.RecommendId == recUser.Id && (u.LevelId == (int)LevelEnum.贵宾会员 || u.LevelId == (int)LevelEnum.超级会员)); recommendId = recUser.RecommendId; if (recCount < 6) { break; } else if (recCount >= 6 & recCount < 10) { blance = blance * 60 / 100; recUser.Amount = recUser.Amount + blance; count = 0; BonusEntity entity2 = new BonusEntity(); entity2.UserId = recUser.Id; entity2.Amount = blance; entity2.Revenue = 0; entity2.sf = blance; entity2.TypeID = 3; //领导奖 entity2.Source = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; entity2.FromUserID = user.Id; entity2.IsSettled = 1; dbc.Bonus.Add(entity2); JournalEntity journal2 = new JournalEntity(); journal2.UserId = recUser.Id; journal2.BalanceAmount = recUser.Amount; journal2.InAmount = blance; journal2.Remark = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; journal2.JournalTypeId = (int)JournalTypeEnum.领导奖; journal2.OrderCode = course.Code; journal2.GoodsId = course.CourseId;//来至订单ID journal2.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal1); } else { blance = blance * 80 / 100; recUser.Amount = recUser.Amount + blance; count++; if (count >= 10 && recUser.LevelId == (int)LevelEnum.贵宾会员) { recUser.LevelId = (int)LevelEnum.超级会员; } BonusEntity entity3 = new BonusEntity(); entity3.UserId = recUser.Id; entity3.Amount = blance; entity3.Revenue = 0; entity3.sf = blance; entity3.TypeID = 3; //领导奖 entity3.Source = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; entity3.FromUserID = user.Id; entity3.IsSettled = 1; dbc.Bonus.Add(entity3); JournalEntity journal3 = new JournalEntity(); journal3.UserId = recUser.Id; journal3.BalanceAmount = recUser.Amount; journal3.InAmount = blance; journal3.Remark = "用户(" + user.Mobile + ")购买课程,用户(" + recUser.Mobile + ")获得领导奖励"; journal3.JournalTypeId = (int)JournalTypeEnum.领导奖; journal3.OrderCode = course.Code; journal3.GoodsId = course.CourseId;//来至订单ID journal3.CurrencyType = (int)CurrencyEnums.碳积分; dbc.Journals.Add(journal3); } } await dbc.SaveChangesAsync(); return(true); } } }
public void TestExecuteBonus() { // Arrange var user = new UserGameKey(-1, 80); var result = new GeniesLuckResult() { BonusPositions = new List <BonusPosition> { new BonusPosition { Line = 1, Multiplier = 1, RowPositions = new List <int> { 0, 2, 2, 2, 0 } } }, Bonus = new Stake(Guid.NewGuid(), 3) { Count = 1 } }; result.SpinBet = new SpinBet(user, PlatformType.None) { Lines = 40, LineBet = 1.0m }; var userSession = new UserSession { SessionKey = "unittest", UserId = -1 }; var requestContext = new RequestContext <SpinArgs>("simulation", "Genies Luck", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, Game = new Game { Id = 80 } }; var requestBonusContext = new RequestContext <BonusArgs>("unittest", "Genies Luck", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; requestBonusContext.UserSession = userSession; requestBonusContext.UserGameKey = user; var bonus = module.CreateBonus(result).Value; var entity = new BonusEntity { UserId = userSession.UserId, GameId = requestContext.Game.Id, Guid = bonus.Guid.ToString("N"), Data = Model.Utility.Extension.ToByteArray(bonus), BonusType = bonus.GetType().Name, Version = 3, IsOptional = bonus.IsOptional, IsStarted = bonus.IsStarted, RoundId = 1, BetReference = "" }; // action var respinResult = module.ExecuteBonus(1, entity, requestBonusContext).Value as GeniesLuckBonusSpinResult; // assert Assert.NotNull(respinResult); Assert.AreEqual(respinResult.SpinResult.HasBonus == false, ((GeniesLuckBonus)respinResult.Bonus).State is Finish); Assert.AreEqual(respinResult.GameResultType, GameResultType.FreeSpinResult); }
public Task <bool> UpdateBonus(UserSession userSession, BonusEntity bonus) { return(bonus.UserId <= 0 ? UpdateBonusInCache(userSession, bonus) : UpdateBonusInDatabase(bonus)); }