//private WithdrawOM WithdrawalToMerchantAccount(UserWallet fromWallet, UserWithdrawal fromWithdraw, UserWithdrawalFee fromWithdrawFee, MerchantWallet toWallet, Cryptocurrency cryptocurrency) //{ // var mastSettings = new MasterSettingDAC().SelectByGroup("UserWithdrawal"); // using (var scope = new TransactionScope()) // { // //提币 // fromWithdraw.Status = Framework.Enums.TransactionStatus.Confirmed; // fromWithdraw.TransactionId = toWallet.MerchantAccountId.ToString("N"); // fromWithdraw.SelfPlatform = true;//平台内提币 // fromWithdraw.Id = new UserWithdrawalDAC().Create(fromWithdraw); // fromWithdrawFee.WithdrawalId = fromWithdraw.Id; // fromWithdrawFee.Fee = fromWithdraw.Amount * Convert.ToDecimal(mastSettings.First(e => e.Name == "UserWithdrawal_ToMerchant").Value); // fromWithdrawFee.Fee = fromWithdrawFee.Fee.ToSpecificDecimal(cryptocurrency.DecimalPlace); // new UserWithdrawalFeeDAC().Create(fromWithdrawFee); // new UserWalletDAC().Decrease(fromWallet.Id, fromWithdraw.Amount); // new UserWalletStatementDAC().Insert(new UserWalletStatement // { // WalletId = fromWallet.Id, // Action = MerchantWalletStatementAction.Withdrawal, // Amount = -fromWithdraw.Amount, // Balance = fromWallet.Balance - fromWithdraw.Amount, // Timestamp = DateTime.UtcNow // }); // //充币 // var amount = fromWithdraw.Amount - fromWithdrawFee.Fee; // if (amount <= 0) // { // throw new CommonException(ReasonCode.GENERAL_ERROR, Resources.到账数量不能为零或者负数); // } // var deposit = new MerchantDepositDAC().Insert(new MerchantDeposit // { // MerchantAccountId = toWallet.MerchantAccountId, // MerchantWalletId = toWallet.Id, // FromAddress = fromWallet.Address, // ToAddress = toWallet.Address, // Amount = fromWithdraw.Amount - fromWithdrawFee.Fee, // Status = Framework.Enums.TransactionStatus.Confirmed, // Timestamp = DateTime.UtcNow, // OrderNo = CreateOrderno(), // TransactionId = fromWallet.UserAccountId.ToString("N"), // SelfPlatform = true // }); // new MerchantWalletDAC().Increase(toWallet.Id, amount); // new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement // { // WalletId = toWallet.Id, // Action = MerchantWalletStatementAction.Deposit, // Amount = amount, // Balance = toWallet.Balance + amount, // Timestamp = DateTime.UtcNow // }); // new FiiiPayPushComponent().PushWithdrawCompleted(fromWithdraw.Id); // scope.Complete(); // UserMSMQ.PubMerchantDeposit(deposit.Id, 0); // } // return new WithdrawOM // { // OrderId = fromWithdraw.Id, // OrderNo = fromWithdraw.OrderNo, // Timestamp = fromWithdraw.Timestamp.ToUnixTime().ToString() // }; //} private WithdrawOM CancelWithdrawal(UserWithdrawal fromWithdraw) { fromWithdraw.Status = TransactionStatus.Cancelled; fromWithdraw.TransactionId = Guid.NewGuid().ToString("N"); fromWithdraw.SelfPlatform = true;//平台内提币 using (var scope = new TransactionScope()) { fromWithdraw.Id = new UserWithdrawalDAC().Create(fromWithdraw); new UserTransactionDAC().Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = fromWithdraw.UserAccountId, CryptoId = fromWithdraw.CryptoId, CryptoCode = fromWithdraw.CryptoCode, Type = UserTransactionType.Withdrawal, DetailId = fromWithdraw.Id.ToString(), Status = (byte)fromWithdraw.Status, Timestamp = fromWithdraw.Timestamp, Amount = fromWithdraw.Amount, OrderNo = fromWithdraw.OrderNo }); var fromWithdrawFee = new UserWithdrawalFee { Amount = fromWithdraw.Amount, Fee = 0, Timestamp = DateTime.UtcNow, WithdrawalId = fromWithdraw.Id }; new UserWithdrawalFeeDAC().Create(fromWithdrawFee); scope.Complete(); } UserMSMQ.PubUserWithdrawReject(fromWithdraw.Id, 0); return(new WithdrawOM { OrderId = fromWithdraw.Id, OrderNo = fromWithdraw.OrderNo, Timestamp = fromWithdraw.Timestamp.ToUnixTime().ToString() }); }
/// <summary> /// 插入记录 /// </summary> /// <param name="inviteCode">邀请码</param> /// <param name="accoundId">被邀请人id</param> /// /// <param name="type">1:fiiipay 2:fiiipos</param> public void InsertRecord(InviteRecordIM im) { //判断是fiiipos还是fiiipay //1 插入数据 invite profit两个表 邀请双方都支持插入数据 钱包 流水进行更新 // 判断当前邀请人数到达五十 进行推送。。。。。。。。。。。。 //2 插入数据 invite if (!(im.Type == (int)SystemPlatform.FiiiPay || im.Type == (int)SystemPlatform.FiiiPOS)) { throw new ArgumentException("只支持fiiipay和fiiipos邀请"); } var userAccountDAC = new UserAccountDAC(); var account = userAccountDAC.GetByInvitationCode(im.InvitationCode); var settingCollection = new MasterSettingDAC().SelectByGroup("InviteReward"); var cryptoCurrencty = new CryptocurrencyDAC().GetByCode("FIII"); var cryptoId = cryptoCurrencty.Id; if (im.Type == (int)SystemPlatform.FiiiPay) { var iDAC = new InviteRecordDAC(); var pfDAC = new ProfitDetailDAC(); var uwComponent = new UserWalletComponent(); var uwDAC = new UserWalletDAC(); var uwsDAC = new UserWalletStatementDAC(); var utDAC = new UserTransactionDAC(); var inviteMoney = decimal.Parse(settingCollection.Where(item => item.Name == "Invite_Reward_Amount").Select(item => item.Value).FirstOrDefault()); var rewardMoney = decimal.Parse(settingCollection.Where(item => item.Name == "Over_People_Count_Reward_Amount").Select(item => item.Value).FirstOrDefault()); var maxCount = decimal.Parse(settingCollection.Where(item => item.Name == "Max_Reward_Amount").Select(item => item.Value).FirstOrDefault()); var orderNo1 = CreateOrderno(); var orderNo2 = CreateOrderno(); var inviteWallet = uwComponent.GetUserWallet(account.Id, cryptoId); if (inviteWallet == null) { inviteWallet = uwComponent.GenerateWallet(account.Id, cryptoId); } var beInvitedWallet = uwComponent.GetUserWallet(im.BeInvitedAccountId, cryptoId); if (beInvitedWallet == null) { beInvitedWallet = uwComponent.GenerateWallet(im.BeInvitedAccountId, cryptoId); } int inviteId; long profitId1 = 0; //邀请人奖励ID long profitId2 = 0; //被邀请人奖励ID long exProfitId1 = 0; //邀请人额外奖励ID decimal totalReward = pfDAC.GetTotalReward(account); int invitedCount = pfDAC.GetInvitedCount(account); using (var scope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, new TimeSpan(0, 0, 1, 30))) { //插入数据到inviterecord表中 inviteId = iDAC.Insert(new InviteRecord() { Type = (InviteType)im.Type, AccountId = im.BeInvitedAccountId, Timestamp = DateTime.UtcNow, InviterCode = im.InvitationCode, InviterAccountId = account.Id }); if (totalReward < maxCount) { profitId1 = pfDAC.Insert(new ProfitDetail() { InvitationId = inviteId, CryptoAmount = inviteMoney, AccountId = account.Id, Status = InviteStatusType.IssuedFrozen, Type = ProfitType.InvitePiiiPay, OrderNo = orderNo1, Timestamp = DateTime.UtcNow, CryptoId = cryptoId }); utDAC.Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = account.Id, CryptoId = cryptoCurrencty.Id, CryptoCode = cryptoCurrencty.Code, Type = UserTransactionType.Profit, DetailId = profitId1.ToString(), Status = (byte)InviteStatusType.IssuedFrozen, Timestamp = DateTime.UtcNow, Amount = inviteMoney, OrderNo = orderNo1 }); uwDAC.IncreaseFrozen(inviteWallet.Id, inviteMoney); uwsDAC.Insert(new UserWalletStatement { WalletId = inviteWallet.Id, Action = UserWalletStatementAction.Invite, Amount = 0, Balance = inviteWallet.Balance, FrozenAmount = inviteMoney, FrozenBalance = inviteWallet.FrozenBalance + inviteMoney, Timestamp = DateTime.UtcNow }); // 每当满50人时则可以奖励 采用了插入操作 所以只要满足为49个就可以了 if ((invitedCount + 1) % 50 == 0) { var pd50 = new ProfitDetail() { InvitationId = inviteId, CryptoAmount = rewardMoney, AccountId = account.Id, Status = InviteStatusType.IssuedFrozen, Type = ProfitType.Reward, OrderNo = CreateOrderno(), Timestamp = DateTime.UtcNow, CryptoId = cryptoId }; exProfitId1 = pfDAC.Insert(pd50); utDAC.Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = account.Id, CryptoId = cryptoCurrencty.Id, CryptoCode = cryptoCurrencty.Code, Type = UserTransactionType.Profit, DetailId = exProfitId1.ToString(), Status = (byte)InviteStatusType.IssuedFrozen, Timestamp = DateTime.UtcNow, Amount = rewardMoney, OrderNo = pd50.OrderNo }); uwDAC.IncreaseFrozen(inviteWallet.Id, rewardMoney); uwsDAC.Insert(new UserWalletStatement { WalletId = inviteWallet.Id, Action = UserWalletStatementAction.Invite, Amount = 0, Balance = inviteWallet.Balance, FrozenAmount = rewardMoney, FrozenBalance = inviteWallet.FrozenBalance + inviteMoney + rewardMoney, Timestamp = DateTime.UtcNow }); } profitId2 = pfDAC.Insert(new ProfitDetail() { InvitationId = inviteId, CryptoAmount = inviteMoney, AccountId = im.BeInvitedAccountId, Type = ProfitType.BeInvited, Status = InviteStatusType.IssuedActive, OrderNo = orderNo2, Timestamp = DateTime.UtcNow, CryptoId = cryptoId }); utDAC.Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = im.BeInvitedAccountId, CryptoId = cryptoCurrencty.Id, CryptoCode = cryptoCurrencty.Code, Type = UserTransactionType.Profit, DetailId = profitId2.ToString(), Status = (byte)InviteStatusType.IssuedActive, Timestamp = DateTime.UtcNow, Amount = inviteMoney, OrderNo = orderNo2 }); uwDAC.Increase(beInvitedWallet.Id, inviteMoney); uwsDAC.Insert(new UserWalletStatement { WalletId = beInvitedWallet.Id, Action = UserWalletStatementAction.BeInvite, Amount = inviteMoney, Balance = beInvitedWallet.Balance + inviteMoney, FrozenAmount = 0, FrozenBalance = beInvitedWallet.FrozenBalance, Timestamp = DateTime.UtcNow }); } scope.Complete(); } if (!(im.Type == (int)SystemPlatform.FiiiPay || im.Type == (int)SystemPlatform.FiiiPOS)) { throw new ArgumentException("只支持fiiipay和fiiipos邀请"); } if (im.Type == (int)SystemPlatform.FiiiPay) { UserMSMQ.PubUserInviteSuccessed(profitId2, 0); } //else if (im.Type == SystemPlatform.FiiiPOS) // MerchantMSMQ.PubUserInviteSuccessed(profitId2, 0); } //else //{ // var iDAC = new InviteRecordDAC(); // iDAC.Insert(new InviteRecord() { Type = im.Type, AccountId = im.BeInvitedAccountId, Timestamp = DateTime.UtcNow, InviterCode = im.InvitationCode, InviterAccountId = account.Id }); //} }
/// <summary> /// 用户主动支付 /// </summary> /// <param name="user"></param> /// <param name="im"></param> /// <returns></returns> public PayOrderOM Pay(UserAccount user, PayIM im) { if (im.Amount <= 0) { throw new CommonException(ReasonCode.GENERAL_ERROR, MessageResources.AmountGreater); } new SecurityComponent().VerifyPin(user, im.Pin); var isAllowExpense = user.IsAllowExpense ?? true; if (!isAllowExpense) { throw new CommonException(ReasonCode.Not_Allow_Expense, MessageResources.PaymentForbidden); } var coin = new CryptocurrencyDAC().GetById(im.CoinId); if (!coin.Status.HasFlag(CryptoStatus.Pay) || coin.Enable == 0) { throw new CommonException(ReasonCode.CURRENCY_FORBIDDEN, MessageResources.CurrencyForbidden); } var merchantAccount = GetMerchantAccountByIdOrCode(im.MerchantId, im.MerchantCode); if (merchantAccount == null) { throw new CommonException(ReasonCode.INVALID_QRCODE, MessageResources.InvalidQRCode); } if (!merchantAccount.IsAllowAcceptPayment || merchantAccount.Status == AccountStatus.Locked) { throw new CommonException(ReasonCode.Not_Allow_AcceptPayment, MessageResources.MerchantExceptionTransClose); } var country = new CountryComponent().GetById(merchantAccount.CountryId); var orderData = new Order { Id = Guid.NewGuid(), OrderNo = IdentityHelper.OrderNo(), MerchantAccountId = merchantAccount.Id, CryptoId = coin.Id, CryptoCode = coin.Code, FiatAmount = im.Amount, PaymentType = im.PaymentType, FiatCurrency = merchantAccount.FiatCurrency, Status = OrderStatus.Completed, ExpiredTime = DateTime.UtcNow.AddMinutes(30), Markup = merchantAccount.Markup, ExchangeRate = GetExchangeRate(merchantAccount.CountryId, merchantAccount.FiatCurrency, coin), UnifiedExchangeRate = GetExchangeRate(merchantAccount.CountryId, country.FiatCurrency ?? "USD", coin), UnifiedFiatCurrency = country.FiatCurrency ?? "USD", MerchantIP = null, PaymentTime = DateTime.UtcNow, UserAccountId = user.Id, Timestamp = DateTime.UtcNow }; var order = Generate(merchantAccount, coin, country.FiatCurrency ?? "USD", im.Amount, im.PaymentType); order.UserAccountId = user.Id; var userWallet = new UserWalletDAC().GetByAccountId(user.Id, im.CoinId); if (userWallet.Balance < order.CryptoAmount) { throw new CommonException(ReasonCode.INSUFFICIENT_BALANCE, MessageResources.InsufficientBalance); } order.Status = OrderStatus.Completed; order.PaymentTime = DateTime.UtcNow; var merchantWallet = new MerchantWalletDAC().GetByAccountId(order.MerchantAccountId, order.CryptoId); if (merchantWallet == null || !merchantWallet.SupportReceipt) { throw new ApplicationException(MessageResources.MerchantNotSupperCrypto); } if (merchantAccount.WithdrawalFeeType != WithdrawalFeeType.FiiiCoin) { var calcModel = CalculateAmount(im.Amount, merchantAccount.Markup, merchantAccount.Receivables_Tier, orderData.ExchangeRate, coin); orderData.ActualFiatAmount = calcModel.FiatTotalAmount; orderData.CryptoAmount = calcModel.CryptoAmount; orderData.TransactionFee = calcModel.TransactionFee; orderData.ActualCryptoAmount = calcModel.ActualCryptoAmount; var model = CalculateUnifiedAmount(orderData.CryptoAmount, orderData.ActualCryptoAmount, orderData.UnifiedExchangeRate); orderData.UnifiedFiatAmount = model.UnifiedFiatAmount; orderData.UnifiedActualFiatAmount = model.UnifiedActualFiatAmount; var orderWithdrawalFee = new OrderWithdrawalFee { Timestamp = DateTime.UtcNow, CryptoId = orderData.CryptoId, Amount = 0 }; Execute(orderWithdrawalFee); } else { var orderWithdrawalFee = CalculateOrderAmount(ref orderData, new RedisOrderDTO() { CountryId = merchantAccount.CountryId, FiatAmount = im.Amount }, merchantAccount, coin); var wallet = new MerchantWalletDAC().GetByAccountId(merchantAccount.Id, new CryptocurrencyDAC().GetByCode("FIII").Id); if (orderWithdrawalFee.Amount != 0) { using (var scope = new TransactionScope()) { var dbOrder = new OrderDAC().Create(orderData); new UserTransactionDAC().Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = userWallet.UserAccountId, CryptoId = userWallet.CryptoId, CryptoCode = userWallet.CryptoCode, Type = UserTransactionType.Order, DetailId = dbOrder.Id.ToString(), Status = (byte)dbOrder.Status, Timestamp = dbOrder.Timestamp, Amount = dbOrder.CryptoAmount, OrderNo = dbOrder.OrderNo, MerchantName = merchantAccount.MerchantName }); orderWithdrawalFee.OrderId = dbOrder.Id; var id = new OrderWithdrawalFeeDAC().Insert(orderWithdrawalFee); new MerchantWalletDAC().Decrease(wallet.Id, orderWithdrawalFee.Amount); new MerchantWalletDAC().Increase(merchantWallet.Id, orderData.ActualCryptoAmount); new UserWalletDAC().Decrease(userWallet.Id, orderData.ActualCryptoAmount); new UserWalletStatementDAC().Insert(new UserWalletStatement { Action = UserWalletStatementAction.Consume, Amount = orderData.CryptoAmount, Balance = userWallet.Balance - orderData.CryptoAmount, FrozenAmount = 0, FrozenBalance = userWallet.FrozenBalance, Remark = null, Timestamp = DateTime.UtcNow, WalletId = userWallet.Id }); new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement { Action = MerchantWalletStatementAction.Receipt, Amount = orderData.ActualCryptoAmount, Balance = merchantWallet.Balance + orderData.ActualCryptoAmount, Remark = null, Timestamp = DateTime.UtcNow, WalletId = merchantWallet.Id }); new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement { Action = MerchantWalletStatementAction.Withdrawal, Amount = orderWithdrawalFee.Amount, Balance = merchantWallet.Balance - orderData.ActualCryptoAmount, Remark = null, Timestamp = DateTime.UtcNow, WalletId = wallet.Id }); scope.Complete(); } } else { Execute(orderWithdrawalFee); } } void Execute(OrderWithdrawalFee orderWithdrawalFee) { using (var scope = new TransactionScope()) { var dbOrder = new OrderDAC().Create(orderData); new UserTransactionDAC().Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = userWallet.UserAccountId, CryptoId = userWallet.CryptoId, CryptoCode = userWallet.CryptoCode, Type = UserTransactionType.Order, DetailId = dbOrder.Id.ToString(), Status = (byte)dbOrder.Status, Timestamp = dbOrder.Timestamp, Amount = dbOrder.CryptoAmount, OrderNo = dbOrder.OrderNo, MerchantName = merchantAccount.MerchantName }); orderWithdrawalFee.OrderId = dbOrder.Id; var id = new OrderWithdrawalFeeDAC().Insert(orderWithdrawalFee); new UserWalletDAC().Decrease(userWallet.Id, orderData.CryptoAmount); new MerchantWalletDAC().Increase(merchantWallet.Id, orderData.ActualCryptoAmount); new UserWalletStatementDAC().Insert(new UserWalletStatement { Action = UserWalletStatementAction.Consume, Amount = orderData.CryptoAmount, Balance = userWallet.Balance - orderData.CryptoAmount, FrozenAmount = 0, FrozenBalance = userWallet.FrozenBalance, Remark = null, Timestamp = DateTime.UtcNow, WalletId = userWallet.Id }); new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement { Action = MerchantWalletStatementAction.Receipt, Amount = orderData.ActualCryptoAmount, Balance = merchantWallet.Balance + orderData.ActualCryptoAmount, Remark = null, Timestamp = DateTime.UtcNow, WalletId = merchantWallet.Id }); scope.Complete(); } } UserMSMQ.PubOrderPayed(orderData.Id, 0); //PushConsume(order.Id); UserMSMQ.PubConsumeOrder(orderData.Id); return(new PayOrderOM { Amount = orderData.CryptoAmount.ToString(coin.DecimalPlace), Currency = new CryptocurrencyDAC().GetById(order.CryptoId).Code, OrderId = orderData.Id.ToString(), OrderNo = orderData.OrderNo, Timestamp = orderData.PaymentTime?.ToUnixTime().ToString() }); }
private WithdrawOM WithdrawalToUserAccount(UserWallet fromWallet, UserWithdrawal fromWithdraw, UserWallet toWallet) { var mastSettings = new MasterSettingDAC().SelectByGroup("UserWithdrawal"); UserDeposit model = new UserDeposit(); using (var scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 0, 1, 30))) { fromWithdraw.Status = TransactionStatus.Confirmed; fromWithdraw.TransactionId = toWallet.UserAccountId.ToString("N"); fromWithdraw.SelfPlatform = true;//平台内提币 fromWithdraw.Id = new UserWithdrawalDAC().Create(fromWithdraw); new UserTransactionDAC().Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = fromWithdraw.UserAccountId, CryptoId = fromWallet.CryptoId, CryptoCode = fromWallet.CryptoCode, Type = UserTransactionType.Withdrawal, DetailId = fromWithdraw.Id.ToString(), Status = (byte)fromWithdraw.Status, Timestamp = fromWithdraw.Timestamp, Amount = fromWithdraw.Amount, OrderNo = fromWithdraw.OrderNo }); var fromWithdrawFee = new UserWithdrawalFee { Amount = fromWithdraw.Amount, WithdrawalId = fromWithdraw.Id, Fee = fromWithdraw.Amount * Convert.ToDecimal(mastSettings.First(e => e.Name == "UserWithdrawal_ToUser").Value), Timestamp = DateTime.UtcNow }; new UserWithdrawalFeeDAC().Create(fromWithdrawFee); new UserWalletDAC().Decrease(fromWallet.Id, fromWithdraw.Amount); new UserWalletStatementDAC().Insert(new UserWalletStatement { WalletId = fromWallet.Id, Action = MerchantWalletStatementAction.Withdrawal, Amount = -fromWithdraw.Amount, Balance = fromWallet.Balance - fromWithdraw.Amount, FrozenAmount = 0, FrozenBalance = fromWallet.FrozenBalance, Timestamp = DateTime.UtcNow }); //充币 var amount = fromWithdraw.Amount - fromWithdrawFee.Fee; if (amount <= 0) { throw new CommonException(ReasonCode.GENERAL_ERROR, MessageResources.ArrivalAmountError); } new UserWalletDAC().Increase(toWallet.Id, amount); new UserWalletStatementDAC().Insert(new UserWalletStatement { WalletId = toWallet.Id, Action = UserWalletStatementAction.Deposit, Amount = amount, Balance = toWallet.Balance + amount, FrozenAmount = 0, FrozenBalance = toWallet.FrozenBalance, Timestamp = DateTime.UtcNow }); model = new UserDepositDAC().Insert(new UserDeposit { UserAccountId = toWallet.UserAccountId, UserWalletId = toWallet.Id, FromAddress = fromWallet.Address, FromTag = fromWallet.Tag, ToAddress = toWallet.Address, ToTag = toWallet.Tag, Amount = amount, Status = TransactionStatus.Confirmed, Timestamp = DateTime.UtcNow, OrderNo = IdentityHelper.OrderNo(), TransactionId = fromWallet.UserAccountId.ToString("N"), SelfPlatform = true, CryptoCode = fromWallet.CryptoCode }); new UserTransactionDAC().Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = model.UserAccountId, CryptoId = fromWallet.CryptoId, CryptoCode = fromWallet.CryptoCode, Type = UserTransactionType.Deposit, DetailId = model.Id.ToString(), Status = (byte)model.Status, Timestamp = model.Timestamp, Amount = model.Amount, OrderNo = model.OrderNo }); scope.Complete(); } UserMSMQ.PubUserWithdrawCompleted(fromWithdraw.Id, 0); UserMSMQ.PubUserDeposit(model.Id, 0); return(new WithdrawOM { OrderId = fromWithdraw.Id, OrderNo = fromWithdraw.OrderNo, Timestamp = fromWithdraw.Timestamp.ToUnixTime().ToString() }); }
//private static readonly bool IsPushProduction = Convert.ToBoolean(ConfigurationManager.AppSettings.Get("PushProduction")); public PayOrderOM PayExistedOrder(UserAccount user, string orderNo, string pin) { new SecurityComponent().VerifyPin(user, pin); var isAllowExpense = user.IsAllowExpense ?? true; if (!isAllowExpense) { throw new CommonException(ReasonCode.Not_Allow_Expense, MessageResources.PaymentForbidden); } var order = RedisHelper.Get <RedisOrderDTO>($"fiiipos:order:{orderNo}"); RedisHelper.KeyDelete($"fiiipos:order:{orderNo}"); if (order == null) { throw new ApplicationException(MessageResources.OrderNotFound); } //if (new OrderDAC().GetByOrderNo(orderNo) != null) //{ // throw new ApplicationException(Resources.订单已完成或者已退款); //} if (order.UserId != Guid.Empty) { if (order.UserId != user.Id) { throw new ApplicationException(MessageResources.AccountNotMatch); } } var coin = new CryptocurrencyDAC().GetById(order.CryptoId); if (!coin.Status.HasFlag(CryptoStatus.Pay) || coin.Enable == 0) { throw new CommonException(ReasonCode.CURRENCY_FORBIDDEN, MessageResources.CurrencyForbidden); } var userWallet = new UserWalletDAC().GetByAccountId(user.Id, order.CryptoId); if (userWallet == null) { throw new CommonException(ReasonCode.INSUFFICIENT_BALANCE, MessageResources.InsufficientBalance); } var exchangeRate = GetExchangeRate(order.CountryId, order.FiatCurrency, coin); decimal fiatTotalAmount = (order.FiatAmount * (1 + order.Markup)).ToSpecificDecimal(4); decimal cryptoAmount = (fiatTotalAmount / exchangeRate).ToSpecificDecimal(coin.DecimalPlace); if (userWallet.Balance < cryptoAmount) { throw new CommonException(ReasonCode.INSUFFICIENT_BALANCE, MessageResources.InsufficientBalance); } var merchantAccount = new MerchantAccountDAC().GetById(order.MerchantGuid); if (!merchantAccount.IsAllowAcceptPayment || merchantAccount.Status == AccountStatus.Locked) { throw new CommonException(ReasonCode.Not_Allow_Withdrawal, MessageResources.MerchantExceptionTransClose); } var merchantWallet = new MerchantWalletDAC().GetByAccountId(order.MerchantGuid, order.CryptoId); if (merchantWallet == null || !merchantWallet.SupportReceipt) { throw new ApplicationException(MessageResources.MerchantNotSupperCrypto); } var country = new CountryComponent().GetById(merchantAccount.CountryId); var orderData = new Order { Id = Guid.NewGuid(), OrderNo = order.OrderNo, MerchantAccountId = merchantAccount.Id, CryptoId = coin.Id, CryptoCode = coin.Code, FiatAmount = order.FiatAmount, PaymentType = order.Type, FiatCurrency = order.FiatCurrency, Status = OrderStatus.Completed, ExpiredTime = DateTime.UtcNow.AddMinutes(30), Markup = merchantAccount.Markup, ExchangeRate = GetExchangeRate(merchantAccount.CountryId, order.FiatCurrency, coin), UnifiedExchangeRate = GetExchangeRate(merchantAccount.CountryId, country.FiatCurrency ?? "USD", coin), UnifiedFiatCurrency = country.FiatCurrency ?? "USD", MerchantIP = order.ClientIP, PaymentTime = DateTime.UtcNow, Timestamp = DateTime.UtcNow, UserAccountId = user.Id }; if (merchantAccount.WithdrawalFeeType != WithdrawalFeeType.FiiiCoin) { var calcModel = CalculateAmount(order.FiatAmount, merchantAccount.Markup, merchantAccount.Receivables_Tier, orderData.ExchangeRate, coin); orderData.ActualFiatAmount = calcModel.FiatTotalAmount; orderData.CryptoAmount = calcModel.CryptoAmount; orderData.TransactionFee = calcModel.TransactionFee; orderData.ActualCryptoAmount = calcModel.ActualCryptoAmount; var model = CalculateUnifiedAmount(orderData.CryptoAmount, orderData.ActualCryptoAmount, orderData.UnifiedExchangeRate); orderData.UnifiedFiatAmount = model.UnifiedFiatAmount; orderData.UnifiedActualFiatAmount = model.UnifiedActualFiatAmount; var orderWithdrawalFee = new OrderWithdrawalFee() { Timestamp = DateTime.UtcNow }; orderWithdrawalFee.CryptoId = orderData.CryptoId; orderWithdrawalFee.Amount = 0; Execute(orderWithdrawalFee); } else { var orderWithdrawalFee = CalculateOrderAmount(ref orderData, order, merchantAccount, coin); var wallet = new MerchantWalletDAC().GetByAccountId(merchantAccount.Id, new CryptocurrencyDAC().GetByCode("FIII").Id); if (orderWithdrawalFee.Amount != 0) { using (var scope = new TransactionScope()) { var dbOrder = new OrderDAC().Create(orderData); new UserTransactionDAC().Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = userWallet.UserAccountId, CryptoId = userWallet.CryptoId, CryptoCode = userWallet.CryptoCode, Type = UserTransactionType.Order, DetailId = dbOrder.Id.ToString(), Status = (byte)dbOrder.Status, Timestamp = dbOrder.Timestamp, Amount = dbOrder.CryptoAmount, OrderNo = dbOrder.OrderNo, MerchantName = merchantAccount.MerchantName }); orderWithdrawalFee.OrderId = dbOrder.Id; var id = new OrderWithdrawalFeeDAC().Insert(orderWithdrawalFee); new MerchantWalletDAC().Decrease(wallet.Id, orderWithdrawalFee.Amount); new MerchantWalletDAC().Increase(merchantWallet.Id, orderData.ActualCryptoAmount); new UserWalletDAC().Decrease(userWallet.Id, cryptoAmount); new UserWalletStatementDAC().Insert(new UserWalletStatement { Action = UserWalletStatementAction.Consume, Amount = orderData.CryptoAmount, Balance = userWallet.Balance - orderData.CryptoAmount, FrozenAmount = 0, FrozenBalance = userWallet.FrozenBalance, Remark = null, Timestamp = DateTime.UtcNow, WalletId = userWallet.Id }); new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement { Action = MerchantWalletStatementAction.Receipt, Amount = orderData.ActualCryptoAmount, Balance = merchantWallet.Balance + orderData.ActualCryptoAmount, Remark = null, Timestamp = DateTime.UtcNow, WalletId = merchantWallet.Id }); new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement { Action = MerchantWalletStatementAction.Withdrawal, Amount = orderWithdrawalFee.Amount, Balance = merchantWallet.Balance - orderData.ActualCryptoAmount, Remark = null, Timestamp = DateTime.UtcNow, WalletId = wallet.Id }); scope.Complete(); } } else { Execute(orderWithdrawalFee); } } void Execute(OrderWithdrawalFee orderWithdrawalFee) { using (var scope = new TransactionScope()) { var dbOrder = new OrderDAC().Create(orderData); new UserTransactionDAC().Insert(new UserTransaction { Id = Guid.NewGuid(), AccountId = userWallet.UserAccountId, CryptoId = userWallet.CryptoId, CryptoCode = userWallet.CryptoCode, Type = UserTransactionType.Order, DetailId = dbOrder.Id.ToString(), Status = (byte)dbOrder.Status, Timestamp = dbOrder.Timestamp, Amount = dbOrder.CryptoAmount, OrderNo = dbOrder.OrderNo, MerchantName = merchantAccount.MerchantName }); orderWithdrawalFee.OrderId = dbOrder.Id; var id = new OrderWithdrawalFeeDAC().Insert(orderWithdrawalFee); new UserWalletDAC().Decrease(userWallet.Id, cryptoAmount); new MerchantWalletDAC().Increase(merchantWallet.Id, orderData.ActualCryptoAmount); new UserWalletStatementDAC().Insert(new UserWalletStatement { Action = UserWalletStatementAction.Consume, Amount = orderData.CryptoAmount, Balance = userWallet.Balance - orderData.CryptoAmount, FrozenAmount = 0, FrozenBalance = userWallet.FrozenBalance, Remark = null, Timestamp = DateTime.UtcNow, WalletId = userWallet.Id }); new MerchantWalletStatementDAC().Insert(new MerchantWalletStatement { Action = MerchantWalletStatementAction.Receipt, Amount = orderData.ActualCryptoAmount, Balance = merchantWallet.Balance + orderData.ActualCryptoAmount, Remark = null, Timestamp = DateTime.UtcNow, WalletId = merchantWallet.Id }); scope.Complete(); } } UserMSMQ.PubOrderPayed(orderData.Id, 0); //PushConsume(orderData.Id); UserMSMQ.PubConsumeOrder(orderData.Id); return(new PayOrderOM { Amount = orderData.CryptoAmount.ToString(coin.DecimalPlace), Currency = new CryptocurrencyDAC().GetById(order.CryptoId).Code, OrderId = orderData.Id.ToString(), OrderNo = orderData.OrderNo, Timestamp = orderData.PaymentTime?.ToUnixTime().ToString() }); }