Example #1
0
 public void Enqueue(StoneDelegateSellOrderInfo sellOrder)
 {
     lock (_lockList)
     {
         ListOrders.Add(sellOrder);
     }
 }
Example #2
0
        public StoneDelegateSellOrderInfo DeleteOrder(string orderNumber)
        {
            StoneDelegateSellOrderInfo sellOrder = null;

            lock (_lockList)
            {
                if (ListOrders.Count > 0)
                {
                    int index = -1;
                    for (int i = 0; i < ListOrders.Count; i++)
                    {
                        if (ListOrders[i].OrderNumber == orderNumber)
                        {
                            index = i;
                            break;
                        }
                    }

                    if (index >= 0)
                    {
                        sellOrder = ListOrders[index];
                        ListOrders.RemoveAt(index);
                    }
                }
            }

            return(sellOrder);
        }
Example #3
0
        private void InsertToSellQueue(StoneDelegateSellOrderInfo item, CustomerMySqlTransaction myTrans)
        {
            //需要分别处理Waiting和Splited两种情况
            if (item.SellState != StoneDelegateSellState.Waiting && item.SellState != StoneDelegateSellState.Splited)
            {
                return;
            }

            int index = this._todayTradeInfo.InsertSellUnit(item.SellUnit);

            ListStoneDelegateSellOrderInfoCollection queueSell = null;

            if (_dicWaitingSellInfos.ContainsKey(item.SellUnit.Price))
            {
                queueSell = _dicWaitingSellInfos[item.SellUnit.Price];
            }
            else
            {
                queueSell = new ListStoneDelegateSellOrderInfoCollection();
                _dicWaitingSellInfos[item.SellUnit.Price] = queueSell;
            }

            queueSell.Enqueue(item);

            if (myTrans != null)
            {
                DBProvider.StoneStackDBProvider.SaveWaitingStoneDelegateSellOrderInfo(item, myTrans);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="sellOrder"></param>
        /// <param name="myTrans"></param>
        /// <returns></returns>
        public bool CancelSellStoneOrder(StoneDelegateSellOrderInfo sellOrder, CustomerMySqlTransaction myTrans)
        {
            MySqlCommand mycmd = null;

            try
            {
                mycmd = myTrans.CreateCommand();

                //string cmdTextA = "update  notfinishedstonedelegatesellorderinfo set `SellState`=@SellState,`FinishedTime`=@FinishedTime where `OrderNumber` = @OrderNumber";

                //mycmd.CommandText = cmdTextA;
                //mycmd.Parameters.AddWithValue("@SellState", (int)sellOrder.SellState);
                //mycmd.Parameters.AddWithValue("@FinishedTime", sellOrder.FinishedTime.ToDateTime());
                //mycmd.Parameters.AddWithValue("@OrderNumber", sellOrder.OrderNumber);

                //mycmd.ExecuteNonQuery();
                //return true;


                string cmdTextA = "insert into stonedelegatesellordercanceledinfo " +
                                  "(`OrderNumber`, `UserID`, `Price`, `TradeStoneHandCount`, `FinishedStoneTradeHandCount`, `SellState`, `DelegateTime`, `IsSubOrder`, `ParentOrderNumber`, `FinishedTime` ) " +
                                  " values " +
                                  "(@OrderNumber, @UserID, @Price, @TradeStoneHandCount, @FinishedStoneTradeHandCount, @SellState, @DelegateTime, @IsSubOrder, @ParentOrderNumber, @FinishedTime); ";

                string cmdTextB = "delete from notfinishedstonedelegatesellorderinfo where `OrderNumber` = @OrderNumber ;";

                mycmd.CommandText = cmdTextA + cmdTextB;
                mycmd.Parameters.AddWithValue("@OrderNumber", sellOrder.OrderNumber);
                mycmd.Parameters.AddWithValue("@UserID", sellOrder.UserID);
                mycmd.Parameters.AddWithValue("@Price", sellOrder.SellUnit.Price);
                mycmd.Parameters.AddWithValue("@TradeStoneHandCount", sellOrder.SellUnit.TradeStoneHandCount);
                mycmd.Parameters.AddWithValue("@FinishedStoneTradeHandCount", sellOrder.FinishedStoneTradeHandCount);
                mycmd.Parameters.AddWithValue("@SellState", (int)sellOrder.SellState);
                mycmd.Parameters.AddWithValue("@DelegateTime", sellOrder.DelegateTime.ToDateTime());
                mycmd.Parameters.AddWithValue("@IsSubOrder", sellOrder.IsSubOrder);
                if (sellOrder.ParentOrderNumber == null)
                {
                    mycmd.Parameters.AddWithValue("@ParentOrderNumber", DBNull.Value);
                }
                else
                {
                    mycmd.Parameters.AddWithValue("@ParentOrderNumber", sellOrder.ParentOrderNumber);
                }
                mycmd.Parameters.AddWithValue("@FinishedTime", sellOrder.FinishedTime);

                //myconn.Open();
                mycmd.ExecuteNonQuery();
                return(true);
            }
            finally
            {
                if (mycmd != null)
                {
                    mycmd.Dispose();
                }
            }
        }
Example #5
0
        public int CancelDelegateSellStone(string token, MetaData.Game.StoneStack.StoneDelegateSellOrderInfo sellOrder)
        {
            if (RSAProvider.LoadRSA(token))
            {
                string userName = "";
                try
                {
                    userName = ClientManager.GetClientUserName(token);
                    var playerRunner = PlayerController.Instance.GetRunnable(userName);
                    if (playerRunner == null)
                    {
                        return(OperResult.RESULTCODE_USER_NOT_EXIST);
                    }

                    CustomerMySqlTransaction myTrans = MyDBHelper.Instance.CreateTrans();
                    try
                    {
                        StoneDelegateSellOrderInfo canceledSellOrder = null;
                        var resultObj = OrderController.Instance.StoneStackController.PlayerCancelSellStone(sellOrder.OrderNumber, sellOrder.SellUnit.Price, myTrans, out canceledSellOrder);
                        if (resultObj.OperResultCode != OperResult.RESULTCODE_TRUE)
                        {
                            return(resultObj.OperResultCode);
                        }
                        if (canceledSellOrder == null)
                        {
                            return(OperResult.RESULTCODE_FALSE);
                        }
                        playerRunner.CancelDelegateSellStoneOrder(canceledSellOrder, myTrans);

                        myTrans.Commit();

                        LogHelper.Instance.AddInfoLog("玩家[" + userName + "], 撤消矿石委托卖单。Order: " + canceledSellOrder.ToString());
                        return(OperResult.RESULTCODE_TRUE);
                    }
                    catch (Exception exc)
                    {
                        myTrans.Rollback();
                        LogHelper.Instance.AddErrorLog("ServiceToClient.CancelDelegateSellStone Exception userName: "******"玩家[" + userName + "] CancelDelegateSellStone Exception", exc);
                    return(OperResult.RESULTCODE_EXCEPTION);
                }
            }
            else
            {
                throw new Exception();
            }
        }
Example #6
0
        public void AsyncCancelDelegateSellStoneOrder(StoneDelegateSellOrderInfo sellOrder)
        {
            if (GlobalData.Client == null || !GlobalData.Client.IsEnable)
            {
                return;
            }

            App.BusyToken.ShowBusyWindow("正在提交数据...");
            GlobalData.Client.CancelDelegateSellStone(sellOrder, null);
        }
Example #7
0
        public StoneDelegateSellOrderInfo Dequeue()
        {
            StoneDelegateSellOrderInfo sellOrder = null;

            lock (_lockList)
            {
                if (ListOrders.Count > 0)
                {
                    sellOrder = ListOrders[0];
                    ListOrders.RemoveAt(0);
                }
            }
            return(sellOrder);
        }
Example #8
0
        private void AddLogNotifySeller(StoneDelegateSellOrderInfo sellOrder)
        {
            //PlayerActionController.Instance.AddLog(sellOrder.UserName, MetaData.ActionLog.ActionType.DelegateSellStoneSucceed, sellOrder.FinishedStoneTradeHandCount * GlobalConfig.GameConfig.HandStoneCount);

            string tokenBuyer = ClientManager.GetToken(sellOrder.UserName);

            if (!string.IsNullOrEmpty(tokenBuyer))
            {
                if (DelegateStoneOrderTradeSucceedNotifyPlayer != null)
                {
                    DelegateStoneOrderTradeSucceedNotifyPlayer(tokenBuyer, sellOrder.OrderNumber, AlipayTradeInType.StackStoneSell);
                    LogHelper.Instance.AddInfoLog("委托卖单。订单号: " + sellOrder.OrderNumber + " 矿石交易成功,Order:" + sellOrder.ToString());
                }
            }
        }
Example #9
0
        public OperResultObject PlayerDelegateSellStone(StoneDelegateSellOrderInfo sellOrder, CustomerMySqlTransaction myTrans)
        {
            OperResultObject result = new OperResultObject();

            //只有开市期间才可挂单,间休期间暂时也不可挂单
            if (this._todayTradeInfo.MarketState != StackMarketState.Opening)
            {
                result.OperResultCode = OperResult.RESULTCODE_STACK_DELEGATEORDER_FAILED_MARKETISCLOSED;
                return(result);
            }
            if (sellOrder.SellUnit.Price < this._todayTradeInfo.DailyInfo.LimitDownPrice || sellOrder.SellUnit.Price > this._todayTradeInfo.DailyInfo.LimitUpPrice)
            {
                result.OperResultCode = OperResult.RESULTCODE_STACK_PRICE_OUTOFRANGE;
                return(result);
            }

            InsertToSellQueue(sellOrder, myTrans);

            result.OperResultCode = OperResult.RESULTCODE_TRUE;
            return(result);
        }
        /// <summary>
        /// 保存到未完成表
        /// </summary>
        /// <param name="sellOrder"></param>
        /// <returns></returns>
        public bool SaveWaitingStoneDelegateSellOrderInfo(StoneDelegateSellOrderInfo sellOrder)
        {
            CustomerMySqlTransaction myTrans = MyDBHelper.Instance.CreateTrans();

            try
            {
                SaveWaitingStoneDelegateSellOrderInfo(sellOrder, myTrans);
                myTrans.Commit();
                return(true);
            }
            catch (Exception exc)
            {
                myTrans.Rollback();
                throw exc;
            }
            finally
            {
                if (myTrans != null)
                {
                    myTrans.Dispose();
                }
            }
        }
 public StoneDelegateSellOrderInfoUIModel(StoneDelegateSellOrderInfo parent)
 {
     ParentObject = parent;
 }
Example #12
0
 public void CancelDelegateSellStone(StoneDelegateSellOrderInfo sellOrder, object userState)
 {
     this._invoker.InvokeUserState <int>(this._context, "CancelDelegateSellStone", this.CancelDelegateSellStoneCompleted, userState, GlobalData.Token, sellOrder);
 }
Example #13
0
        /// <summary>
        /// 返回买单处理结果
        /// </summary>
        /// <param name="sellPrice"></param>
        /// <param name="queueSellOrders"></param>
        /// <param name="listTradeSucceedSellOrders"></param>
        /// <param name="buyOrder"></param>
        /// <returns></returns>
        private StackTradeResult TradeSamePriceSellOrder(decimal sellPrice, ListStoneDelegateSellOrderInfoCollection queueSellOrders,
                                                         List <StoneDelegateSellOrderInfo> listTradeSucceedSellOrders, StackTradeUnit buyUnit, string buyerUserName)
        {
            StackTradeResult buyOrderResult = new StackTradeResult();

            //取出卖价对应的卖单
            StoneDelegateSellOrderInfo sellOrder = queueSellOrders.Dequeue();

            if (sellOrder == null)
            {
                return(buyOrderResult);
            }

            int surplusStoneHandCount = buyUnit.TradeStoneHandCount - sellOrder.SellUnit.TradeStoneHandCount;

            //买单量大于或等于卖单量
            while (surplusStoneHandCount > 0)//继续找其他卖单凑量
            {
                sellOrder.SellState = StoneDelegateSellState.Succeed;
                sellOrder.FinishedStoneTradeHandCount = sellOrder.SellUnit.TradeStoneHandCount;
                sellOrder.FinishedTime = new MyDateTime(DateTime.Now);
                listTradeSucceedSellOrders.Add(sellOrder);

                var operResult = this._todayTradeInfo.DecreaseSellUnit(sellOrder.SellUnit.Price, sellOrder.SellUnit.TradeStoneHandCount);
                if (operResult.OperResultCode != OperResult.RESULTCODE_TRUE)
                {
                    LogHelper.Instance.AddErrorLog("TradeBuy1Orders DecreaseSellUnit Error1. " + operResult.Message, null);
                }

                var nextSellOrder = queueSellOrders.Dequeue();
                if (nextSellOrder == null)
                {
                    //说明已经没有当前价格的卖单了。
                    //买单只消化一部,需要被拆分
                    buyOrderResult.State = StackTradeState.Splited;
                    buyOrderResult.SucceedStoneHandCount = buyUnit.TradeStoneHandCount - surplusStoneHandCount;
                    return(buyOrderResult);
                }
                else
                {
                    //判断下一卖单
                    sellOrder             = nextSellOrder;
                    surplusStoneHandCount = surplusStoneHandCount - sellOrder.SellUnit.TradeStoneHandCount;
                }
            }
            //卖单量等于买单量
            if (surplusStoneHandCount == 0)
            {
                sellOrder.SellState = StoneDelegateSellState.Succeed;
                sellOrder.FinishedStoneTradeHandCount = sellOrder.SellUnit.TradeStoneHandCount;
                sellOrder.FinishedTime = new MyDateTime(DateTime.Now);
                listTradeSucceedSellOrders.Add(sellOrder);

                var operResult = this._todayTradeInfo.DecreaseSellUnit(sellOrder.SellUnit.Price, sellOrder.SellUnit.TradeStoneHandCount);
                if (operResult.OperResultCode != OperResult.RESULTCODE_TRUE)
                {
                    LogHelper.Instance.AddErrorLog("TradeBuy1Orders DecreaseSellUnit Error2. " + operResult.Message, null);
                }
            }
            else
            {
                //卖单量大于买单量,需要将当前卖单拆分。将已成功的部分拆成一新订单添加到数据库中;将老订单缩减到剩余部分,继续留在市场中。
                sellOrder.SellState = StoneDelegateSellState.Splited;
                sellOrder.FinishedStoneTradeHandCount = sellOrder.SellUnit.TradeStoneHandCount + surplusStoneHandCount;
                sellOrder.FinishedTime = new MyDateTime(DateTime.Now);
                listTradeSucceedSellOrders.Add(sellOrder);

                var operResult = this._todayTradeInfo.DecreaseSellUnit(sellOrder.SellUnit.Price, sellOrder.FinishedStoneTradeHandCount);
                if (operResult.OperResultCode != OperResult.RESULTCODE_TRUE)
                {
                    LogHelper.Instance.AddErrorLog("TradeBuy1Orders DecreaseSellUnit Error3. " + operResult.Message, null);
                }


                DateTime nowTime = DateTime.Now;

                //拆分后的订单,再保存到数据库,并添加到集合中。
                StoneDelegateSellOrderInfo newSellOrder = new StoneDelegateSellOrderInfo()
                {
                    OrderNumber  = OrderController.Instance.CreateOrderNumber(sellOrder.UserName, nowTime, AlipayTradeInType.StackStoneSell),
                    UserID       = sellOrder.UserID,
                    UserName     = sellOrder.UserName,
                    SellState    = StoneDelegateSellState.Waiting,
                    DelegateTime = new MyDateTime(nowTime),
                    SellUnit     = new StackTradeUnit()
                    {
                        Price = sellOrder.SellUnit.Price,
                        TradeStoneHandCount = sellOrder.SellUnit.TradeStoneHandCount - sellOrder.FinishedStoneTradeHandCount
                    },
                    IsSubOrder = true
                };

                try
                {
                    DBProvider.StoneStackDBProvider.SaveWaitingStoneDelegateSellOrderInfo(newSellOrder);
                    queueSellOrders.Enqueue(newSellOrder);
                }
                catch (Exception exc)
                {
                    LogHelper.Instance.AddErrorLog("股票操作。TradeSamePriceSellOrder.SaveWaitingStoneDelegateSellOrderInfo 异常。信息为:" + newSellOrder.ToString(), exc);
                }
            }

            //买单已全部被消化
            buyOrderResult.State = StackTradeState.Succeed;
            buyOrderResult.SucceedStoneHandCount = buyUnit.TradeStoneHandCount;
            return(buyOrderResult);
        }
Example #14
0
        public OperResultObject PlayerCancelSellStone(string orderNumber, decimal sellPrice, CustomerMySqlTransaction myTrans, out StoneDelegateSellOrderInfo canceledSellOrder)
        {
            canceledSellOrder = null;
            OperResultObject result = new OperResultObject();

            ////开市期间不可撤单
            //if (this._todayTradeInfo.MarketState == StackMarketState.Opening)
            //{
            //    result.OperResultCode = OperResult.RESULTCODE_STACK_CANCELORDER_FAILED_MARKETISOPENING;
            //    return result;
            //}

            canceledSellOrder = this._dicWaitingSellInfos[sellPrice].DeleteOrder(orderNumber);
            if (canceledSellOrder != null)
            {
                result = this._todayTradeInfo.DeleteSellUnit(canceledSellOrder.SellUnit);
                if (result.OperResultCode != OperResult.RESULTCODE_TRUE)
                {
                    return(result);
                }

                canceledSellOrder.SellState    = StoneDelegateSellState.Cancel;
                canceledSellOrder.FinishedTime = new MyDateTime(DateTime.Now);
                DBProvider.StoneStackDBProvider.CancelSellStoneOrder(canceledSellOrder, myTrans);

                result.OperResultCode = OperResult.RESULTCODE_TRUE;
            }
            else
            {
                result.OperResultCode = OperResult.RESULTCODE_FALSE;
            }

            return(result);
        }
Example #15
0
        public int DelegateSellStone(string token, int sellStoneHandsCount, decimal price)
        {
            if (RSAProvider.LoadRSA(token))
            {
                string userName = "";
                try
                {
                    if (sellStoneHandsCount <= 0)
                    {
                        return(OperResult.RESULTCODE_PARAM_INVALID);
                    }

                    userName = ClientManager.GetClientUserName(token);
                    var playerRunner = PlayerController.Instance.GetRunnable(userName);
                    if (playerRunner == null)
                    {
                        return(OperResult.RESULTCODE_USER_NOT_EXIST);
                    }

                    int sellStoneCount    = sellStoneHandsCount * GlobalConfig.GameConfig.HandStoneCount;
                    int feeNeedStoneCount = (int)(sellStoneHandsCount * GlobalConfig.GameConfig.HandStoneCount * (GlobalConfig.GameConfig.ExchangeExpensePercent / 100));

                    if (playerRunner.SellableStonesCount < sellStoneCount + feeNeedStoneCount)
                    {
                        return(OperResult.RESULTCODE_ORDER_SELLABLE_STONE_LACK);
                    }

                    DateTime timenow = DateTime.Now;
                    StoneDelegateSellOrderInfo sellOrder = new StoneDelegateSellOrderInfo()
                    {
                        UserID       = playerRunner.BasePlayer.SimpleInfo.UserID,
                        UserName     = playerRunner.BasePlayer.SimpleInfo.UserName,
                        DelegateTime = new MyDateTime(timenow),
                        OrderNumber  = OrderController.Instance.CreateOrderNumber(userName, timenow, MetaData.Trade.AlipayTradeInType.StackStoneSell),
                        SellState    = StoneDelegateSellState.Waiting,
                        IsSubOrder   = false,
                        SellUnit     = new StackTradeUnit()
                        {
                            Price = price,
                            TradeStoneHandCount = sellStoneHandsCount
                        }
                    };

                    CustomerMySqlTransaction myTrans = MyDBHelper.Instance.CreateTrans();
                    try
                    {
                        var resultObj = OrderController.Instance.StoneStackController.PlayerDelegateSellStone(sellOrder, myTrans);
                        if (resultObj.OperResultCode != OperResult.RESULTCODE_TRUE)
                        {
                            //卖单提交失败,不再进行数据库操作
                            return(resultObj.OperResultCode);
                        }

                        playerRunner.AddNewSellStonesByDelegate(sellStoneCount, feeNeedStoneCount, myTrans);

                        myTrans.Commit();

                        //PlayerActionController.Instance.AddLog(userName, MetaData.ActionLog.ActionType.DelegateSellStone, sellStoneHandsCount, "");
                        LogHelper.Instance.AddInfoLog("玩家[" + userName + "] 挂单委托出售 " + sellStoneHandsCount + " 手矿石,Price:" + price);
                        return(OperResult.RESULTCODE_TRUE);
                    }
                    catch (Exception exc)
                    {
                        myTrans.Rollback();
                        LogHelper.Instance.AddErrorLog("ServiceToClient.DelegateSellStone Exception userName: "******"玩家[" + userName + "] DelegateSellStone Exception", exc);
                    return(OperResult.RESULTCODE_EXCEPTION);
                }
            }
            else
            {
                throw new Exception();
            }
        }