Пример #1
0
        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));
        }
Пример #2
0
        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") }));
                }
            }
        }