public async Task <IHttpActionResult> LotteryAsync([Required] LotteryRequest request) { //中奖名单 var wonEmployee = await _prizeService.GetListAsync(a => a.EmployeeId, a => a.Disable == (short)BaseModel.DisableEnum.Normal); var notWonEmployee = await _employeeService.GetListAsync(a => a.Id, a => !wonEmployee.Contains(a.Id)); var prizeType = await _prizeTypeService.FirstOrDefaultAsync(a => a.Id == request.Type); //当前类型奖品的中奖人数 var typeCount = await _prizeService.CountAsync(a => a.PrizeTypeId == request.Type); if (typeCount >= prizeType.Count) { return(Fail("奖品已经抽完")); } int xunhuanr = 0; if ((prizeType.Count - typeCount) <= prizeType.Num) { xunhuanr = (prizeType.Count - typeCount); } else { xunhuanr = prizeType.Num; } Random rand = new Random(); List <int> plist = new List <int>(); for (int i = 0; i < xunhuanr; i++) { var employeeId = Suiji(rand, plist, notWonEmployee); plist.Add(employeeId); } var result = await _prizeService.AddAsync(plist.Select(a => new Prize { EmployeeId = a, PrizeTypeId = prizeType.Id }).ToList()); return(Succeed(new LotteryResponse { EmployeeIds = plist, Rounds = (prizeType.Count % prizeType.Num) == 0 ? (prizeType.Count / prizeType.Num) : (prizeType.Count / prizeType.Num + 1), RoundsIndex = (typeCount % prizeType.Num) == 0 ? (typeCount / prizeType.Num) : (typeCount / prizeType.Num + 1) }, "抽取成功")); }
public int Call_LotteryDraw(LotteryRequest request) { LotteryResponse response = new LotteryResponse(); var p = this.CurrentSession.GetBindPlayer(); Lottery l = p.Lottery; DateTime now = DateTime.Now; int method = response.method = request.method; int mode = response.mode = request.mode; response.rewardInfo = new RewardInfo() { items = new List <RewardItem>(), units = new List <UnitInfo>(), res = new List <ResInfo>() }; PlayerController playerController = Server.GetController <PlayerController>(); PkgController pkgController = Server.GetController <PkgController>(); //先判断是否免费 if (method == 1) { //单抽 if (mode == 1) { //金币单抽 DLottery dl = DLotteries[1]; if (now >= l.GoldFreeNextTime) { DLotteryRand rand = null; if (l.GoldBaseNumb <= 1) { rand = this.Rand(dl.rand_sp, p.Level); l.GoldBaseNumb = GameConfig.lottery_base_cnt; } else { rand = this.Rand(dl.rand, p.Level); l.GoldBaseNumb -= 1; } response.success = true; response.rewardInfo.items.Add(new RewardItem() { id = rand.item_id, count = rand.item_cnt, }); //todo: 滚屏广播 l.GoldUsedNumb += 1; l.GoldFreeNumb -= 1; if (l.GoldFreeNumb > 0) { l.GoldFreeNextTime = now.AddMinutes(dl.free_cd);//下次免费金币抽刷新时间 } else { l.GoldFreeNextTime = DateTime.Today.AddDays(1); } } else { bool canChou = false; //扣道具 string reason = "金币单抽"; if (pkgController.TrySubItem(p, dl.cost_item, 1, reason, out var item)) { canChou = true; } else { //扣钱 if (playerController.IsCurrencyEnough(p, CurrencyType.GOLD, dl.cost_res_cnt)) { canChou = true; playerController.AddCurrency(p, CurrencyType.GOLD, -dl.cost_res_cnt, reason); } } if (canChou) { DLotteryRand rand = null; if (l.GoldBaseNumb <= 1) { rand = this.Rand(dl.rand_sp, p.Level); l.GoldBaseNumb = GameConfig.lottery_base_cnt; } else { rand = this.Rand(dl.rand, p.Level); l.GoldBaseNumb -= 1; } response.success = true; response.rewardInfo.items.Add(new RewardItem() { id = rand.item_id, count = rand.item_cnt }); l.GoldUsedNumb += 1; //todo: 滚屏广播 } } } else//钻石单抽奖 { DLottery dl = DLotteries[2]; if (now >= l.DmdFreeNextTime) { DLotteryRand rand = null; if (l.DmdBaseNumb <= 1) { rand = this.Rand(dl.rand_sp, p.Level); l.DmdBaseNumb = GameConfig.lottery_base_cnt; } else { rand = this.Rand(dl.rand, p.Level); l.DmdBaseNumb -= 1; } if (l.DmdUsedNumb == 0) { rand = new DLotteryRand(); rand.item_id = GameConfig.lottery_first_item_id; rand.item_cnt = GameConfig.lottery_first_item_cnt; } response.success = true; response.rewardInfo.items.Add(new RewardItem() { id = rand.item_id, count = rand.item_cnt }); //todo: 滚屏广播 l.DmdUsedNumb += 1; l.DmdFreeNumb -= 1; l.DmdFreeNextTime = now.AddMinutes(dl.free_cd);//下次免费金币抽刷新时间 } else { bool canChou = false; //扣道具 string reason = "钻石单抽"; if (pkgController.TrySubItem(p, dl.cost_item, 1, reason, out var item)) { canChou = true; } else { //扣钱 if (playerController.IsCurrencyEnough(p, CurrencyType.DIAMOND, dl.cost_res_cnt)) { canChou = true; playerController.AddCurrency(p, CurrencyType.DIAMOND, -dl.cost_res_cnt, reason); } } if (canChou) { DLotteryRand rand = null; if (l.DmdBaseNumb <= 1) { rand = this.Rand(dl.rand_sp, p.Level); l.DmdBaseNumb = GameConfig.lottery_base_cnt; } else { rand = this.Rand(dl.rand, p.Level); l.DmdBaseNumb -= 1; } response.success = true; response.rewardInfo.items.Add(new RewardItem() { id = rand.item_id, count = rand.item_cnt }); //todo: 滚屏广播 l.DmdUsedNumb += 1; } } } } else { //十连抽 if (mode == 1) {//金币抽 string reason = "金币十连抽"; DLottery dl = DLotteries[1]; int cost = (int)(dl.cost_res_cnt * 10d * dl.ten_discount / 100d); if (playerController.IsCurrencyEnough(p, CurrencyType.GOLD, cost)) { playerController.AddCurrency(p, CurrencyType.GOLD, -cost, reason); for (int i = 0; i < 10; i++) { DLotteryRand rand = null; if (l.GoldBaseNumb <= 1) { rand = this.Rand(dl.rand_sp, p.Level); l.GoldBaseNumb = GameConfig.lottery_base_cnt; } else { rand = this.Rand(dl.rand, p.Level); l.GoldBaseNumb -= 1; } response.rewardInfo.items.Add(new RewardItem() { id = rand.item_id, count = rand.item_cnt }); } //todo: 滚屏广播 response.success = true; l.Gold10UsedNumb += 1; } } else {//钻石抽 string reason = "钻石十连抽"; DLottery dl = DLotteries[2]; int cost = (int)(dl.cost_res_cnt * 10d * dl.ten_discount / 100d); if (playerController.IsCurrencyEnough(p, CurrencyType.DIAMOND, cost)) { playerController.AddCurrency(p, CurrencyType.DIAMOND, -cost, reason); for (int i = 0; i < 10; i++) { DLotteryRand rand = null; if (l.DmdBaseNumb <= 1) { if (l.Dmd10UsedNumb == 0) { rand = this.Rand(dl.rand_first10, p.Level); } else { rand = this.Rand(dl.rand_sp, p.Level); } l.DmdBaseNumb = GameConfig.lottery_base_cnt; } else { rand = this.Rand(dl.rand, p.Level); l.DmdBaseNumb -= 1; } response.rewardInfo.items.Add(new RewardItem() { id = rand.item_id, count = rand.item_cnt }); } //todo: 滚屏广播 l.Dmd10UsedNumb += 1; response.success = true; } } } if (response.success) { String reason; if (mode == 1) { reason = "金币"; } else { reason = "钻石"; } if (method == 1) { reason += "单抽"; } else { reason += "十连抽"; } foreach (var kv in response.rewardInfo.items.GroupBy(x => x.id)) { int itemid = kv.Key; int itemcnt = kv.Sum(m => m.count); pkgController.AddItem(p, itemid, itemcnt, reason); } } response.diamond = p.Wallet.DIAMOND; response.diamondBaseNumb = l.DmdBaseNumb; response.diamondFreeNextTime = l.DmdFreeNextTime.ToUnixTime(); response.diamondUsedNumb = l.DmdUsedNumb; response.gold = p.Wallet.GOLD; response.goldBaseNumb = l.GoldBaseNumb; response.goldFreeNextTime = l.GoldFreeNextTime.ToUnixTime(); response.goldUsedNumb = l.GoldUsedNumb; response.goldFreeNumb = l.GoldFreeNumb; response.diamondFreeNumb = l.DmdFreeNumb; CurrentSession.SendAsync(response); return(0); }