public IActionResult GetConfirmPurchaseTicket(int amount, int lotteryId) { var viewModel = new LotteryTicketPurchaseViewModel(); viewModel.TicketPrice = _lotteryService.Queryable().FirstOrDefault(x => !x.IsDeleted && x.Id == lotteryId).UnitPrice; viewModel.TotalTickets = amount; viewModel.TotalPriceOfTickets = viewModel.TotalTickets * viewModel.TicketPrice; return(new JsonResult(viewModel)); }
public IActionResult ConfirmPurchaseTicket(LotteryTicketPurchaseViewModel viewModel, MobileModel mobileModel) { var user = HttpContext.Session.GetObjectFromJson <SysUserViewModel>("CurrentUser"); if (user == null && !mobileModel.IsMobile) { var loginViewModel = new AccountLoginModel(); var gcaptchaKey = _settingService.Queryable().FirstOrDefault(x => x.Name == CPLConstant.GCaptchaKey)?.Value; loginViewModel.GCaptchaKey = gcaptchaKey; return(PartialView("_Login", loginViewModel)); } else { try { int userId; if (mobileModel.IsMobile) { if (mobileModel.MobileUserId.HasValue) { userId = mobileModel.MobileUserId.Value; } else { return(new JsonResult(new { code = EnumResponseStatus.ERROR, error_message_key = CPLConstant.MobileAppConstant.CommonErrorOccurs })); } } else { userId = user.Id; } var userEntity = _sysUserService.Queryable().FirstOrDefault(x => x.Id == userId); var lotteryId = viewModel.LotteryId; var lotteryRecordList = _lotteryHistoryService.Queryable().Where(x => x.LotteryId == lotteryId.Value && x.Result != EnumGameResult.REFUND.ToString()).ToList(); var lastTicketIndex = 0; if (lotteryRecordList.Count > 0) { lastTicketIndex = _lotteryHistoryService.Queryable().Where(x => x.LotteryId == lotteryId.Value && x.Result != EnumGameResult.REFUND.ToString()).Max(x => x.TicketIndex); } var unitPrice = _lotteryService.Queryable().FirstOrDefault(x => !x.IsDeleted && x.Id == lotteryId.Value).UnitPrice; var totalPriceOfTickets = viewModel.TotalTickets * unitPrice; var currentLottery = _lotteryService.Queryable().FirstOrDefault(x => !x.IsDeleted && x.Id == lotteryId); if (viewModel.TotalTickets <= currentLottery.Volume - lotteryRecordList.Count()) { if (totalPriceOfTickets <= userEntity.TokenAmount) { /// Example paramsInJson: {"1":{"uint32":"4"},"2":{"address":"0xB43eA1802458754A122d02418Fe71326030C6412"}, "3": {"uint32[]":"[1, 2, 3]"}} var userAddress = userEntity.ETHHDWalletAddress; var ticketIndexList = new List <int> [viewModel.TotalTickets / 10 + 1]; var lotteryPhase = _lotteryService.Queryable().FirstOrDefault(x => !x.IsDeleted && x.Id == lotteryId).Phase; var listIndex = 0; ticketIndexList[listIndex] = new List <int>(); for (int i = 0; i < viewModel.TotalTickets; i++) { if (i % 10 == 0 && i != 0) { listIndex++; ticketIndexList[listIndex] = new List <int>(); } lastTicketIndex += 1; ticketIndexList[listIndex].Add(lastTicketIndex); } var totalOfTicketSuccessful = 0; var buyTime = DateTime.Now; foreach (var ticket in ticketIndexList) { if (ticket == null) { continue; } var paramJson = string.Format(CPLConstant.RandomParamInJson, lotteryPhase, userAddress, string.Join(",", ticket.ToArray())); var ticketGenResult = ServiceClient.ETokenClient.CallTransactionAsync(Authentication.Token, CPLConstant.OwnerAddress, CPLConstant.OwnerPassword, "random", CPLConstant.GasPriceMultiplicator, CPLConstant.DurationInSecond, paramJson); ticketGenResult.Wait(); if (ticketGenResult.Result.Status.Code == 0) { for (int i = 0; i < ticket.Count; i++) { var lotteryRecord = new LotteryHistory { CreatedDate = buyTime, LotteryId = lotteryId.Value, SysUserId = userEntity.Id, TicketIndex = ticket[i], TxHashId = ticketGenResult.Result.TxId }; _lotteryHistoryService.Insert(lotteryRecord); totalOfTicketSuccessful++; } } } userEntity.TokenAmount -= totalOfTicketSuccessful * unitPrice; _sysUserService.Update(userEntity); _unitOfWork.SaveChanges(); if (mobileModel.IsMobile) { return(new JsonResult(new { code = EnumResponseStatus.SUCCESS })); } return(new JsonResult(new { success = true, token = userEntity.TokenAmount.ToString("N0"), hintThankyou = string.Format(LangDetailHelper.Get(HttpContext.Session.GetInt32("LangId").Value, "HintThankYouLottery1"), totalOfTicketSuccessful), message = LangDetailHelper.Get(HttpContext.Session.GetInt32("LangId").Value, "PurchaseSuccessfully") })); } else { if (mobileModel.IsMobile) { return(new JsonResult(new { code = EnumResponseStatus.WARNING, error_message_key = CPLConstant.MobileAppConstant.LotteryDetailNotEnoughCPL })); } return(new JsonResult(new { success = false, message = LangDetailHelper.Get(HttpContext.Session.GetInt32("LangId").Value, "NotEnoughCPL") })); } } else { if (mobileModel.IsMobile) { return(new JsonResult(new { code = EnumResponseStatus.WARNING, error_message_key = CPLConstant.MobileAppConstant.LotteryDetailNoTicketsLeft })); } return(new JsonResult(new { success = false, message = string.Format(LangDetailHelper.Get(HttpContext.Session.GetInt32("LangId").Value, "NoTicketsLeft"), currentLottery.Volume - lotteryRecordList.Count()) })); } } catch (Exception ex) { if (mobileModel.IsMobile) { return(new JsonResult(new { code = EnumResponseStatus.ERROR, error_message_key = CPLConstant.MobileAppConstant.CommonErrorOccurs, error_message = ex.Message })); } return(new JsonResult(new { success = false, message = LangDetailHelper.Get(HttpContext.Session.GetInt32("LangId").Value, "ErrorOccurs") })); } } }