Exemplo n.º 1
0
 /// <summary>
 /// 交易
 /// </summary>
 public void Transaction()
 {
     try
     {
         while (true)
         {
             TransactionInfo transactionInfo = _transactionQueue.ReadQueue();
             if (transactionInfo == null)
             {
                 Thread.Sleep(100);
                 continue;
             }
             List <TransactionServerDal.PayCurrencyEntity> borrowInfoList    = new List <TransactionServerDal.PayCurrencyEntity>();
             List <TransactionServerDal.PayCurrencyEntity> loansInfoEntities = new List <TransactionServerDal.PayCurrencyEntity>();
             foreach (var borrowTransaction in transactionInfo.BorrowTransactions)
             {
                 TransactionServerDal.PayCurrencyEntity borrowInfoEntity = new TransactionServerDal.PayCurrencyEntity();
                 borrowInfoEntity.CurrencyId = borrowTransaction.CurrencyId;
                 borrowInfoEntity.Amount     = borrowTransaction.Amount;
                 borrowInfoList.Add(borrowInfoEntity);
             }
             foreach (var loansTransaction in transactionInfo.LoansTransactions)
             {
                 TransactionServerDal.PayCurrencyEntity loansInfoEntity = new TransactionServerDal.PayCurrencyEntity();
                 loansInfoEntity.CurrencyId = loansTransaction.CurrencyId;
                 loansInfoEntity.Amount     = loansTransaction.Amount;
                 loansInfoEntities.Add(loansInfoEntity);
             }
             string transactioned = _transactionServerDal.RunTransaction(transactionInfo.No, transactionInfo.OrderId, transactionInfo.PayUserId,
                                                                         transactionInfo.PayeeUserId, borrowInfoList, loansInfoEntities, transactionInfo.Type);
             //LogHelper.info("交易记录:" + transactionInfo.OrderId + "                     交易结果:" + transactioned);
             transactionInfo.ExectionedAction(transactioned);
         }
     }
     catch (Exception exception)
     {
         LogHelper.error("交易服务出现异常:" + exception);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// 矿机产币和分润
        /// </summary>
        private void RunCloudMinerServer()
        {
            //处查询矿机产币比例
            DataTable dtCloudMinerManufacture = _cloudMinerDal.QueryCloudMinerManufacture();
            IList <CloudMinerManufactureModelResult> cloudMinerManufactureModelResults =
                ModelConvertHelper <CloudMinerManufactureModelResult> .ConvertToModel(dtCloudMinerManufacture);

            //查询运行中的矿机
            DataTable dtRuningCloudMiner = _userCloudMinerDal.QueryRuningCloudMiner();

            if (dtRuningCloudMiner.Rows.Count <= 0)
            {
                LogHelper.warn("云矿机运行:矿机数量为空" + DateTime.Now);
                return;
            }
            IList <RunCloudMinerModel> runCloudMinerModels = ModelConvertHelper <RunCloudMinerModel> .ConvertToModel(dtRuningCloudMiner);

            //获取VIP等级
            DataTable dt = _vipInfoDal.QueryVipUrCloudminerDistribution();
            IList <VipUrCloudminerDistribution> vipUrCloudminerDistributions =
                ModelConvertHelper <VipUrCloudminerDistribution> .ConvertToModel(dt);

            //查询每代分销比例
            DataTable dtDistributionMechanism = _cloudMinerDistributionMechanismDal.QueryDistributionMechanism();
            IList <DistributionMechanismCloudMinerModel> distributionMechanismCloudMinerModels = ModelConvertHelper <DistributionMechanismCloudMinerModel> .ConvertToModel(dtDistributionMechanism);

            //收款信息
            List <TransactionPayDetail> borrowTransactions = new List <TransactionPayDetail>();
            List <TransactionServerDal.PayCurrencyEntity> borrowInfoEntities = new List <TransactionServerDal.PayCurrencyEntity>();
            List <TransactionPayDetail> dBorrowTransactions = new List <TransactionPayDetail>();
            List <TransactionServerDal.PayCurrencyEntity> dBorrowInfoEntities = new List <TransactionServerDal.PayCurrencyEntity>();

            //循环遍历在运行的云矿机
            foreach (RunCloudMinerModel runCloudMinerModel in runCloudMinerModels)
            {
                _userCloudMinerDal.RunUserCloudMiner(runCloudMinerModel.Id);
                if (runCloudMinerModel.ProductionCount == 149)
                {
                    _userCloudMinerDal.UpdateUserCloudMinerState(runCloudMinerModel.Id, "1");
                }

                DateTime buyDateTime;
                try
                {
                    buyDateTime = Convert.ToDateTime(runCloudMinerModel.BuyTime);
                }
                catch (Exception)
                {
                    continue;
                }
                int runDays = (DateTime.Now.Date - buyDateTime.Date).Days;
                if (runCloudMinerModel.ProductionCycle == runDays + 1)
                {
                    _userCloudMinerDal.UpdateUserCloudMinerState(runCloudMinerModel.Id, "1");
                }
                if (runCloudMinerModel.ProductionCycle <= runDays)
                {
                    _userCloudMinerDal.UpdateUserCloudMinerState(runCloudMinerModel.Id, "1");
                    continue;
                }

                #region 产币
                borrowTransactions.Clear();
                borrowInfoEntities.Clear();
                //循环遍历云矿机产币比例(针对拥有者)
                foreach (var cloudMinerModel in cloudMinerManufactureModelResults.Where(n => n.CommodityId == runCloudMinerModel.CommodityId))
                {
                    if (cloudMinerModel.Amount <= 0)
                    {
                        continue;
                    }

                    TransactionPayDetail borrowTransaction = new TransactionPayDetail();
                    borrowTransaction.CurrencyId = cloudMinerModel.CurrencyId;
                    borrowTransaction.Amount     = cloudMinerModel.Amount * (runCloudMinerModel.ProductionAmount / runCloudMinerModel.ProductionCycle);
                    borrowTransactions.Add(borrowTransaction);

                    TransactionServerDal.PayCurrencyEntity borrowInfoEntity = new TransactionServerDal.PayCurrencyEntity();
                    borrowInfoEntity.CurrencyId = borrowTransaction.CurrencyId;
                    borrowInfoEntity.Amount     = borrowTransaction.Amount;
                    borrowInfoEntities.Add(borrowInfoEntity);
                }
                int recordId = _cloudMinerProductionDal.InsertCloudMinerProductionRecord(runCloudMinerModel.Id, runCloudMinerModel.CommodityId, runCloudMinerModel.UserId, borrowInfoEntities, runCloudMinerModel.ProductionCount + 1);
                TransactionService.AddCloudMinerProduce("03", runCloudMinerModel.UserId, recordId, borrowTransactions);
                _productionAmount += borrowTransactions.Sum(n => n.Amount);
                #endregion

                #region 分销
                int fansId = runCloudMinerModel.UserId;
                //循环遍历云矿机拨出比例(针对分销者)
                foreach (var distributionMechanismModel in distributionMechanismCloudMinerModels)
                {
                    try
                    {
                        try
                        {
                            dBorrowTransactions.Clear();
                            dBorrowInfoEntities.Clear();
                            fansId = Convert.ToInt32(_fansDal.QueryParent(fansId));
                            if (fansId <= 0)
                            {
                                break;
                            }

                            #region 判断用户当前真实等级是否满足分销等级
                            RunCloudMinerModel parentRunCloudMinerModel = runCloudMinerModels.FirstOrDefault(n => n.UserId == fansId);
                            if (parentRunCloudMinerModel == null)
                            {
                                continue;
                            }
                            int userRealRank = -1;
                            foreach (var item in vipUrCloudminerDistributions)
                            {
                                if (item.CommodityId == parentRunCloudMinerModel.CommodityId)
                                {
                                    userRealRank = item.Rank;
                                    break;
                                }
                            }
                            if (userRealRank == -1)
                            {
                                continue;
                            }
                            if (distributionMechanismModel.Rank > userRealRank)
                            {
                                continue;
                            }
                            #endregion

                            foreach (var borrowTransaction in borrowTransactions)
                            {
                                TransactionPayDetail dBorrowTransaction = new TransactionPayDetail();
                                dBorrowTransaction.CurrencyId = borrowTransaction.CurrencyId;
                                dBorrowTransaction.Amount     = borrowTransaction.Amount * distributionMechanismModel.Proportion;
                                dBorrowTransactions.Add(dBorrowTransaction);

                                TransactionServerDal.PayCurrencyEntity tempBorrowInfoEntity = new TransactionServerDal.PayCurrencyEntity();
                                tempBorrowInfoEntity.CurrencyId = borrowTransaction.CurrencyId;
                                tempBorrowInfoEntity.Amount     = borrowTransaction.Amount * distributionMechanismModel.Proportion;
                                dBorrowInfoEntities.Add(tempBorrowInfoEntity);
                            }
                            int cmdrId = _cloudMinerDistributionMechanismDal.InsertCloudMinerDistributionRecord(runCloudMinerModel.Id, runCloudMinerModel.CommodityId, fansId, dBorrowInfoEntities);
                            TransactionService.AddCloudMinerProduceDistribution("04", fansId, cmdrId, dBorrowTransactions);
                            _distributionAmount += dBorrowTransactions.Sum(n => n.Amount);
                        }
                        catch (Exception exception)
                        {
                            LogHelper.error(exception.Message);
                            break;
                        }
                    }
                    catch (Exception exception)
                    {
                        LogHelper.error(exception.Message);
                        break;
                    }
                }
                #endregion
            }
            State = "2";
        }
        /// <summary>
        /// 商户对个人交易
        /// </summary>
        /// <param name="modelGet"></param>
        /// <returns></returns>
        public IHttpActionResult TransactionB2C(TransactionB2CModelGet modelGet)
        {
            if (string.IsNullOrEmpty(modelGet.PayOpenId) || string.IsNullOrEmpty(modelGet.PayeeOpenId) || string.IsNullOrEmpty(modelGet.ExternalOrderNo) ||
                string.IsNullOrEmpty(modelGet.ExternalOrderName) || string.IsNullOrEmpty(modelGet.ExternalOrderType))
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = 4010, Messages = "数据参数有误",
                }));
            }

            if (modelGet.PayCurrencyList.Count(n => n.Amount <= 0) > 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = -1, Messages = "交易金额有误,通证数量不能小于等于0",
                }));
            }
            if (modelGet.PayCurrencyList.Count(n => n.Amount * 0.1M != n.ServiceCharge) > 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = -1, Messages = "转账通证数量不能小于等于0",
                }));
            }
            //检查付款账号是否存在
            DataTable dtPayAuthorizeUserInfo = _authorizeUserInfoDal.QueryCommodityInfo(modelGet.AppId, modelGet.PayOpenId);
            IList <AuthorizeUserInfoModelGet> listPayAuthorizeUserInfo =
                ModelConvertHelper <AuthorizeUserInfoModelGet> .ConvertToModel(dtPayAuthorizeUserInfo);

            AuthorizeUserInfoModelGet authorizePayUserInfoModelGet = listPayAuthorizeUserInfo.FirstOrDefault(n => n.State == "0");

            if (authorizePayUserInfoModelGet == null)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = -1, Messages = "付款账户未绑定个人钱包",
                }));
            }
            //检查收款账户是否存在
            DataTable dtPayeeAuthorizeUserInfo = _authorizeUserInfoDal.QueryCommodityInfo(modelGet.AppId, modelGet.PayeeOpenId);
            IList <AuthorizeUserInfoModelGet> listPayeeAuthorizeUserInfo = ModelConvertHelper <AuthorizeUserInfoModelGet> .ConvertToModel(dtPayeeAuthorizeUserInfo);

            AuthorizeUserInfoModelGet authorizePayeeUserInfoModelGet = listPayeeAuthorizeUserInfo.FirstOrDefault(n => n.State == "0");;

            if (authorizePayeeUserInfoModelGet == null)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = -1, Messages = "收款账户未绑定个人钱包",
                }));
            }
            //检查付款方是否实名认证
            string idCard = _userInfoDal.CheckBindIdCard(authorizePayUserInfoModelGet.UserId);

            if (string.IsNullOrEmpty(idCard))
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = 4204, Messages = "付款账号未实名认证,请先提交实名认证",
                }));
            }
            //检查支付密码是否正确
            bool checkPayPassword = _userInfoDal.CheckPayPassowrd(authorizePayeeUserInfoModelGet.UserId, modelGet.PayPassword);

            if (!checkPayPassword)
            {
                return(Json(new ResultDataModel <StoreOrderModelResult> {
                    Code = 4106, Messages = "支付密码错误"
                }));
            }
            //不能给自己转账
            if (authorizePayUserInfoModelGet.UserId == authorizePayeeUserInfoModelGet.UserId)
            {
                return(Json(new ResultDataModel <StoreOrderModelResult> {
                    Code = 4303, Messages = "不能转账给自己"
                }));
            }
            //查询用户钱包
            DataTable dtWalletInfo = _walletInfoDal.QueryWalletInfo(authorizePayUserInfoModelGet.UserId);
            IList <WalletInfoModelResult> currencyInfoModelResults =
                ModelConvertHelper <WalletInfoModelResult> .ConvertToModel(dtWalletInfo);

            if (currencyInfoModelResults.Count <= 0)
            {
                LogHelper.error("P2P交易时,查询用户钱包信息失败");
                throw new Exception();
            }
            //检查余额
            foreach (var item in modelGet.PayCurrencyList)
            {
                var first = currencyInfoModelResults.FirstOrDefault(n => n.CurrencyId == item.CurrencyId);

                if (first == null)
                {
                    continue;
                }
                decimal amount = first.CanUseAmount;
                if (amount < item.Amount + item.Amount * 0.5M)
                {
                    return(Json(new ResultDataModel <StoreOrderModelResult> {
                        Code = 4302, Messages = "余额不足"
                    }));
                }
            }
            //获取支付金额
            string orderNo = GetTransactionNo("01", authorizePayUserInfoModelGet.UserId);
            List <TransactionServerDal.PayCurrencyEntity> payCurrencyEntities = new List <TransactionServerDal.PayCurrencyEntity>();
            List <TransactionPayDetail> transactionPayDetails = new List <TransactionPayDetail>();

            foreach (var model in modelGet.PayCurrencyList)
            {
                TransactionServerDal.PayCurrencyEntity payCurrencyEntity = new TransactionServerDal.PayCurrencyEntity();
                payCurrencyEntity.Amount     = model.Amount;
                payCurrencyEntity.CurrencyId = model.CurrencyId;
                payCurrencyEntities.Add(payCurrencyEntity);

                TransactionPayDetail transactionPayDetail = new TransactionPayDetail();
                transactionPayDetail.Amount     = model.Amount;
                transactionPayDetail.CurrencyId = model.CurrencyId;
                transactionPayDetails.Add(transactionPayDetail);
            }
            //添加B2C交易订单
            int orderId = _transactionInfoDal.CreateTransactionB2C(orderNo, authorizePayUserInfoModelGet.UserId, authorizePayeeUserInfoModelGet.UserId, modelGet.Remark, payCurrencyEntities);

            if (orderId <= 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult>()
                {
                    Code = -1,
                    Messages = "当前服务器繁忙,请您稍后再试!",
                    Data = new TransactionP2PModelResult()
                    {
                        OrderNo = ""
                    }
                }));
            }

            //将订单添加到交易服务并执行交易
            bool reslut = TransactionService.AddTransactionB2C("02", authorizePayUserInfoModelGet.UserId, authorizePayeeUserInfoModelGet.UserId, orderId, transactionPayDetails);

            return(Json(new ResultDataModel <TransactionP2PModelResult>()
            {
                Code = reslut ? 0 : -1,
                Messages = reslut ? "" : "当前服务器繁忙,请您稍后再试!",
                Data = new TransactionP2PModelResult()
                {
                    OrderId = orderId,
                    OrderNo = orderNo,
                    OrderTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                }
            }));

            return(Json(new object()));
        }
        /// <summary>
        /// 个人对个人交易
        /// </summary>
        /// <param name="modelGet"></param>
        /// <returns></returns>
        public IHttpActionResult TransactionP2P(TransactionP2PModelGet modelGet)
        {
            if (modelGet.PayUserId <= 0 || string.IsNullOrEmpty(modelGet.PayeeWalletAddress) || string.IsNullOrEmpty(modelGet.PayPassword) || modelGet.PayCurrencyList.Count <= 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = 4010, Messages = "数据参数有误",
                }));
            }
            if (modelGet.PayCurrencyList.Count(n => n.Amount <= 0) > 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = -1, Messages = "转账通证数量不能小于等于0",
                }));
            }
            if (modelGet.PayCurrencyList.Count(n => n.ServiceCharge <= 0) > 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = -1, Messages = "转账手续费通证数量有误"
                }));
            }
            if (modelGet.PayCurrencyList.Count(n => n.Amount * 0.1M != n.ServiceCharge) > 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = -1, Messages = "转账通证数量不能小于等于0",
                }));
            }
            string idCard = _userInfoDal.CheckBindIdCard(modelGet.PayUserId);

            if (string.IsNullOrEmpty(idCard))
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult> {
                    Code = 4204, Messages = "该账号未实名认证,请先提交实名认证",
                }));
            }
            bool checkPayPassword = _userInfoDal.CheckPayPassowrd(modelGet.PayUserId, modelGet.PayPassword);

            if (!checkPayPassword)
            {
                return(Json(new ResultDataModel <StoreOrderModelResult> {
                    Code = 4106, Messages = "支付密码错误"
                }));
            }
            int payeeUserId = _userInfoDal.QueryUserIdByWalletAddress(modelGet.PayeeWalletAddress);

            if (payeeUserId == 0)
            {
                return(Json(new ResultDataModel <StoreOrderModelResult> {
                    Code = 4304, Messages = "钱包地址不存在"
                }));
            }
            if (payeeUserId < 0)
            {
                return(Json(new ResultDataModel <StoreOrderModelResult> {
                    Code = 4001, Messages = "服务器繁忙,请稍后再试"
                }));
            }
            DataTable dtWalletInfo = _walletInfoDal.QueryWalletInfo(modelGet.PayUserId);
            IList <WalletInfoModelResult> currencyInfoModelResults =
                ModelConvertHelper <WalletInfoModelResult> .ConvertToModel(dtWalletInfo);

            if (currencyInfoModelResults.Count <= 0)
            {
                LogHelper.error("P2P交易时,检测用户钱包信息失败");
                throw new Exception();
            }
            foreach (var item in modelGet.PayCurrencyList)
            {
                var first = currencyInfoModelResults.FirstOrDefault(n => n.CurrencyId == item.CurrencyId);
                if (first == null)
                {
                    continue;
                }
                decimal amount = first.CanUseAmount;
                if (amount < item.Amount + item.Amount * 0.1M)
                {
                    return(Json(new ResultDataModel <StoreOrderModelResult> {
                        Code = 4302, Messages = "余额不足"
                    }));
                }
            }
            if (currencyInfoModelResults.First().WalletAddress == modelGet.PayeeWalletAddress)
            {
                return(Json(new ResultDataModel <StoreOrderModelResult> {
                    Code = 4303, Messages = "收款账户不能为当前登录账户"
                }));
            }

            string orderNo = GetTransactionNo("02", modelGet.PayUserId);
            List <TransactionServerDal.PayCurrencyEntity> payCurrencyEntities = new List <TransactionServerDal.PayCurrencyEntity>();
            List <TransactionPayDetail> transactionPayDetails = new List <TransactionPayDetail>();

            foreach (var model in modelGet.PayCurrencyList)
            {
                TransactionServerDal.PayCurrencyEntity payCurrencyEntity = new TransactionServerDal.PayCurrencyEntity();
                payCurrencyEntity.Amount     = model.Amount;
                payCurrencyEntity.CurrencyId = model.CurrencyId;
                payCurrencyEntities.Add(payCurrencyEntity);

                TransactionPayDetail transactionPayDetail = new TransactionPayDetail();
                transactionPayDetail.Amount     = model.Amount;
                transactionPayDetail.CurrencyId = model.CurrencyId;
                transactionPayDetails.Add(transactionPayDetail);
            }

            //添加P2P交易订单
            int orderId = _transactionInfoDal.CreateTransactionP2P(orderNo, modelGet.PayUserId, payeeUserId, modelGet.Remark, payCurrencyEntities);

            if (orderId <= 0)
            {
                return(Json(new ResultDataModel <TransactionP2PModelResult>()
                {
                    Code = -1,
                    Messages = "当前服务器繁忙,请您稍后再试!",
                    Data = new TransactionP2PModelResult()
                    {
                        OrderNo = ""
                    }
                }));
            }

            //将订单添加到交易服务并执行交易
            bool reslut = TransactionService.AddTransactionP2P("02", modelGet.PayUserId, payeeUserId, orderId, transactionPayDetails);

            return(Json(new ResultDataModel <TransactionP2PModelResult>()
            {
                Code = reslut ? 0 : -1,
                Messages = reslut ? "" : "当前服务器繁忙,请您稍后再试!",
                Data = new TransactionP2PModelResult()
                {
                    OrderId = orderId,
                    OrderNo = orderNo,
                    OrderTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                }
            }));
        }