/// <summary>
        /// 增加一条数据
        /// 注:本方法没有插入创建时间,创建时间由数据创建
        /// </summary>
        public void Add(HKModifyOrderRequest model)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("insert into HK_ModifyOrderRequest(");
            strSql.Append("ID,ChannelID,TraderId,FundAccountId,TraderPassword,Code,EntrustNubmer,OrderPrice,OrderAmount,Message)");

            strSql.Append(" values (");
            strSql.Append("@ID,@ChannelID,@TraderId,@FundAccountId,@TraderPassword,@Code,@EntrustNubmer,@OrderPrice,@OrderAmount,@Message)");
            Database  db        = DatabaseFactory.CreateDatabase();
            DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString());

            db.AddInParameter(dbCommand, "ID", DbType.AnsiString, model.ID);
            db.AddInParameter(dbCommand, "ChannelID", DbType.AnsiString, model.ChannelID);
            db.AddInParameter(dbCommand, "TraderId", DbType.AnsiString, model.TraderId);
            db.AddInParameter(dbCommand, "FundAccountId", DbType.AnsiString, model.FundAccountId);
            db.AddInParameter(dbCommand, "TraderPassword", DbType.AnsiString, model.TraderPassword);
            db.AddInParameter(dbCommand, "Code", DbType.AnsiString, model.Code);
            db.AddInParameter(dbCommand, "EntrustNubmer", DbType.AnsiString, model.EntrustNubmer);
            db.AddInParameter(dbCommand, "OrderPrice", DbType.Decimal, model.OrderPrice);
            db.AddInParameter(dbCommand, "OrderAmount", DbType.Int32, model.OrderAmount);
            db.AddInParameter(dbCommand, "Message", DbType.AnsiString, model.Message);
            // db.AddInParameter(dbCommand, "ModifyOrderDateTime", DbType.DateTime, model.ModifyOrderDateTime);
            db.ExecuteNonQuery(dbCommand);
        }
        /// <summary>
        /// 更新类型2改单的各种状态变化
        /// </summary>
        /// <param name="entrustNumber"></param>
        public void ProcessType2ModifyOrder(string entrustNumber)
        {
            string desc = "M<---——ModifyOrderProcessor.ProcessType2ModifyOrder类型2改单——原始委托清算完毕,更新状态";

            LogHelper.WriteDebug(desc);

            //===update 2009-11-08 李健华
            //HK_TodayEntrustInfo tet = HKDataAccess.GetTodayEntrustTable(entrustNumber);

            //如果新单号与原始单号相同,那么代表是一个类型2的改单
            //tet.ModifyOrderNumber = entrustNumber;
            //tet.IsModifyOrder = true;
            //HKDataAccess.UpdateEntrustTable(tet);
            //为了不更新区他字段 和不用再查询一次再更新
            HKDataAccess.UpdateEntrustModifyOrderNumber(entrustNumber, entrustNumber);
            //记录成功改单委托记录明细,方便查询和关联查询
            HKDataAccess.AddModifyOrderSuccessDatils(entrustNumber, entrustNumber, 2);
            //=======================

            HK_ModifyOrderRequestDal dal     = new HK_ModifyOrderRequestDal();
            HKModifyOrderRequest     request = dal.GetModel(entrustNumber);

            if (request != null)
            {
                request.ModifyOrderDateTime = DateTime.Now;
                HKDataAccess.UpdateModifyOrderRequest(request);
            }

            DeleteType2Reqeust(entrustNumber);
        }
        /// <summary>
        /// 对象实体绑定数据
        /// </summary>
        public HKModifyOrderRequest ReaderBind(IDataReader dataReader)
        {
            HKModifyOrderRequest model = new HKModifyOrderRequest();
            object ojb;

            model.ID             = dataReader["ID"].ToString();
            model.ChannelID      = dataReader["ChannelID"].ToString();
            model.TraderId       = dataReader["TraderId"].ToString();
            model.FundAccountId  = dataReader["FundAccountId"].ToString();
            model.TraderPassword = dataReader["TraderPassword"].ToString();
            model.Code           = dataReader["Code"].ToString();
            model.EntrustNubmer  = dataReader["EntrustNubmer"].ToString();
            ojb = dataReader["OrderPrice"];
            if (ojb != null && ojb != DBNull.Value)
            {
                model.OrderPrice = float.Parse(ojb.ToString());
            }
            ojb = dataReader["OrderAmount"];
            if (ojb != null && ojb != DBNull.Value)
            {
                model.OrderAmount = float.Parse(ojb.ToString());
            }
            model.Message = dataReader["Message"].ToString();
            ojb           = dataReader["ModifyOrderDateTime"];
            if (ojb != null && ojb != DBNull.Value)
            {
                model.ModifyOrderDateTime = (DateTime)ojb;
            }
            return(model);
        }
        /// <summary>
        /// 类型1改单——生成新委托,下单,并回推改单结果到前台
        /// </summary>
        /// <param name="request"></param>
        internal void ProcessType1_NewOrder(HKModifyOrderRequest request)
        {
            LogHelper.WriteDebug("M——————>ModifyOrderProcessor.ProcessType1_NewOrder生成新委托,下单,并回推改单结果到前台" + request);

            HKOrderRequest        newRequest = CreateNewType1Request(request);
            HKModifyOrderPushBack pushBack   = new HKModifyOrderPushBack();

            pushBack.OriginalRequestNumber = request.EntrustNubmer;
            pushBack.TradeID          = request.TraderId;
            pushBack.CallbackChannlId = request.ChannelID;

            var res = OrderAccepterService.Service.DoHKOrder(newRequest);

            pushBack.IsSuccess = res.IsSuccess;
            pushBack.Message   = res.OrderMessage;


            if (res.IsSuccess)
            {
                HKDataAccess.UpdateEntrustModifyOrderNumber(res.OrderId, request.EntrustNubmer);
                //记录成功改单委托记录明细,方便查询和关联查询
                HKDataAccess.AddModifyOrderSuccessDatils(res.OrderId, request.EntrustNubmer, 1);

                pushBack.NewRequestNumber = res.OrderId;
            }
            else
            {
                request.Message = res.OrderMessage;
                HKDataAccess.UpdateModifyOrderRequest(request);
            }

            //将改单结果推给前台
            CounterOrderService.Instance.AcceptHKModifyOrder(pushBack);
        }
Ejemplo n.º 5
0
        public OrderResponse ModifyHKOrder(HKModifyOrderRequest order)
        {
            if (!IsServiceOk)
            {
                return new OrderResponse {
                           OrderMessage = ServiceErrorMsg
                }
            }
            ;

            order.ChannelID = Channelid;

            OrderResponse response = null;

            try
            {
                response = doOrderClient.DoHKModifyOrder(order);
            }
            catch (Exception ex)
            {
                LogHelper.WriteError(ex.Message, ex);
                response              = new OrderResponse();
                response.IsSuccess    = false;
                response.OrderMessage = ServiceErrorMsg;
                IsServiceOk           = false;
            }

            return(response);
        }
Ejemplo n.º 6
0
 /// <summary>
 /// 更新港股改单委托
 /// </summary>
 /// <param name="model"></param>
 public static void UpdateModifyOrderRequest(HKModifyOrderRequest model)
 {
     try
     {
         HK_ModifyOrderRequestDal dal = new HK_ModifyOrderRequestDal();
         dal.Update(model);
     }
     catch (Exception ex)
     {
         LogHelper.WriteError(ex.Message, ex);
     }
 }
        /// <summary>
        /// 类型3改单委托缓存是否存在对应的委托
        /// </summary>
        /// <param name="entrustNumber"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        public bool IsExistType3Request(string entrustNumber, out HKModifyOrderRequest request)
        {
            request = null;

            if (type3Cache.Contains(entrustNumber))
            {
                request = type3Cache.Get(entrustNumber);
                return(true);
            }

            return(false);
        }
 /// <summary>
 /// 港股改单校验
 /// </summary>
 /// <param name="request">改单请求对象</param>
 /// <param name="entrusInfo">原委托单对象</param>
 /// <param name="errMsg">异常信息</param>
 /// <returns>返回检验是否成功</returns>
 public static bool Validate(HKModifyOrderRequest request, ReckoningCounter.Entity.Model.HK.HK_TodayEntrustInfo entrusInfo, ref string errMsg)
 {
     try
     {
         bool result = McValidater.GetInstance().ValidateHKModifyOrderRule(request, entrusInfo, ref errMsg);
         return(result);
     }
     catch (Exception ex)
     {
         LogHelper.WriteError(ex.ToString(), ex);
         return(false);
     }
 }
Ejemplo n.º 9
0
        /// <summary>
        /// 记录港股改单操作
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static bool AddHKModifyOrderRequest(HKModifyOrderRequest model)
        {
            try
            {
                HK_ModifyOrderRequestDal dal = new HK_ModifyOrderRequestDal();
                dal.Add(model);

                return(true);
            }
            catch (Exception ex)
            {
                LogHelper.WriteError(ex.Message, ex);

                return(false);
            }
        }
        /// <summary>
        /// 港股改单委托规则检验
        /// </summary>
        /// <param name="request">改单请求实体</param>
        /// <param name="entrusInfo">原委托实体对象</param>
        /// <param name="errMsg">返回错误检验信息</param>
        /// <returns>是否成功</returns>
        public bool ValidateHKModifyOrderRule(HKModifyOrderRequest request, ReckoningCounter.Entity.Model.HK.HK_TodayEntrustInfo entrusInfo, ref string errMsg)
        {
            CM_BreedClass breedClass = MCService.CommonPara.GetBreedClassByCommodityCode(request.Code, Types.BreedClassTypeEnum.HKStock);

            bool result = false;

            if (breedClass != null)
            {
                if (!breedClass.BreedClassTypeID.HasValue || breedClass.BreedClassTypeID.Value != (int)Types.BreedClassTypeEnum.HKStock)
                {
                    errMsg = "当前代码不为港股类别--" + breedClass.BreedClassTypeID.Value;
                    return(false);
                }
                result = HKModifyOrderRuleContainer.Validate(request, entrusInfo, breedClass.BreedClassID, ref errMsg);
            }
            return(result);
        }
        private HKOrderRequest CreateNewType3Request(HKModifyOrderRequest request, HK_TodayEntrustInfo tet, float amount)
        {
            HKOrderRequest newRequest = new HKOrderRequest();

            newRequest.BuySell        = (Types.TransactionDirection)tet.BuySellTypeID;
            newRequest.ChannelID      = tet.CallbackChannlID;
            newRequest.Code           = request.Code;
            newRequest.FundAccountId  = request.FundAccountId;
            newRequest.OrderAmount    = amount;
            newRequest.OrderPrice     = request.OrderPrice;
            newRequest.OrderUnitType  = (Types.UnitType)tet.TradeUnitID;
            newRequest.OrderWay       = Types.HKPriceType.LO;
            newRequest.PortfoliosId   = tet.PortfolioLogo;
            newRequest.TraderId       = request.TraderId;
            newRequest.TraderPassword = request.TraderPassword;

            return(newRequest);
        }
        /// <summary>
        /// 根据港股改单委托创建新的委托
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private HKOrderRequest CreateNewType1Request(HKModifyOrderRequest request)
        {
            var tet = HKDataAccess.GetTodayEntrustTable(request.EntrustNubmer);

            HKOrderRequest newRequest = new HKOrderRequest();

            newRequest.BuySell        = (Types.TransactionDirection)tet.BuySellTypeID;
            newRequest.ChannelID      = tet.CallbackChannlID;
            newRequest.Code           = request.Code;
            newRequest.FundAccountId  = request.FundAccountId;
            newRequest.OrderAmount    = request.OrderAmount;
            newRequest.OrderPrice     = request.OrderPrice;
            newRequest.OrderUnitType  = (Types.UnitType)tet.TradeUnitID;
            newRequest.OrderWay       = Types.HKPriceType.LO;
            newRequest.PortfoliosId   = tet.PortfolioLogo;
            newRequest.TraderId       = request.TraderId;
            newRequest.TraderPassword = request.TraderPassword;

            return(newRequest);
        }
        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        public HKModifyOrderRequest GetModel(string ID)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("select ID,ChannelID,TraderId,FundAccountId,TraderPassword,Code,EntrustNubmer,OrderPrice,OrderAmount,Message,ModifyOrderDateTime from HK_ModifyOrderRequest ");
            strSql.Append(" where ID=@ID ");
            Database  db        = DatabaseFactory.CreateDatabase();
            DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString());

            db.AddInParameter(dbCommand, "ID", DbType.AnsiString, ID);
            HKModifyOrderRequest model = null;

            using (IDataReader dataReader = db.ExecuteReader(dbCommand))
            {
                if (dataReader.Read())
                {
                    model = ReaderBind(dataReader);
                }
            }
            return(model);
        }
        /// <summary>
        /// 处理Type1类型改单-未报
        /// </summary>
        /// <param name="request">改单委托</param>
        private void ProcessType1(HKModifyOrderRequest request)
        {
            LogHelper.WriteDebug("M————>ModifyOrderProcessor.ProcessType1接收类型1改单请求" + request);

            //如果不在交易时间内,那么直接到缓存中删除原来的委托,生成新委托
            if (!ValidateCenter.IsMatchTradingTime(Types.BreedClassTypeEnum.HKStock, request.Code))
            {
                LogHelper.WriteDebug("类型1改单请求" + request + "不在交易时间时间内,直接到缓存中删除原来的委托,生成新委托");
                //1.删除缓存中的委托信息
                OrderOfferCenter.Instance._orderCache.DeleteHKOrder(request.Code, request.EntrustNubmer);

                //2.进行内存撤单
                var tet = HKDataAccess.GetTodayEntrustTable(request.EntrustNubmer);
                OrderOfferCenter.Instance.IntelnalCancelHKOrder(tet, "预委托被改单,作废");
                //tet.OrderStatusID = (int)Entity.Contants.Types.OrderStateType.DOSCanceled;
                //tet.OrderMessage = "未报的委托被改单,作废";
                //HKDataAccess.UpdateEntrustTable(tet);

                //3.回推原始委托变化到前台
                ReckonEndObject <HK_TodayEntrustInfo, HK_TodayTradeInfo> reckonEndObject =
                    new ReckonEndObject <HK_TodayEntrustInfo, HK_TodayTradeInfo>();
                reckonEndObject.IsSuccess      = true;
                reckonEndObject.EntrustTable   = tet;
                reckonEndObject.TradeTableList = new List <HK_TodayTradeInfo>();
                reckonEndObject.TradeID        = request.TraderId;
                reckonEndObject.Message        = "";

                CounterOrderService.Instance.AcceptHKDealOrder(reckonEndObject);

                ProcessType1_NewOrder(request);
            }
            else
            {
                //否则的话,放入类型1改单缓存,等原始委托报盘时再处理
                LogHelper.WriteDebug("M————>ModifyOrderProcessor.ProcessType1类型1改单请求在交易时间内,放入缓存等待报盘时查找核对" + request);

                AddType1Reqest(request);
            }
        }
        /// <summary>
        /// 处理Type3类型改单-价变量变
        /// </summary>
        /// <param name="request">改单委托</param>
        private void ProcessType3(HKModifyOrderRequest request)
        {
            LogHelper.WriteDebug("M————>ModifyOrderProcessor.ProcessType3接收类型3改单请求" + request);

            string strMessage = "";

            Entity.Contants.Types.OrderStateType ost;
            int errType;

            //先进行主动撤单
            bool result = OrderAccepterService.Service.CancelHKOrder(request.EntrustNubmer, ref strMessage, out ost,
                                                                     out errType);

            //如果发送撤单委托都进行不成功,那么整个改单委托直接作废
            if (!result)
            {
                HKModifyOrderPushBack pushBack = new HKModifyOrderPushBack();
                pushBack.IsSuccess             = false;
                pushBack.Message               = strMessage;
                pushBack.OriginalRequestNumber = request.EntrustNubmer;
                pushBack.TradeID               = request.TraderId;
                pushBack.CallbackChannlId      = request.ChannelID;

                request.Message = strMessage;
                HKDataAccess.UpdateModifyOrderRequest(request);

                LogHelper.WriteDebug("M————>ModifyOrderProcessor.ProcessType3发送撤单委托不成功,整个改单委托直接作废" + request +
                                     "Message=" + strMessage);

                //将类型3改单失败结果推给前台
                CounterOrderService.Instance.AcceptHKModifyOrder(pushBack);

                return;
            }

            //成功的话,放入类型3改单缓存,等撤单成交回报清算完毕时再处理
            AddType3Reqest(request);
        }
        /// <summary>
        /// 更新一条数据
        /// </summary>
        public void Update(HKModifyOrderRequest model)
        {
            if (model.ModifyOrderDateTime == DateTime.MaxValue || model.ModifyOrderDateTime == DateTime.MinValue)
            {
                model.ModifyOrderDateTime = DateTime.Now;
            }
            StringBuilder strSql = new StringBuilder();

            strSql.Append("update HK_ModifyOrderRequest set ");
            strSql.Append("ChannelID=@ChannelID,");
            strSql.Append("TraderId=@TraderId,");
            strSql.Append("FundAccountId=@FundAccountId,");
            strSql.Append("TraderPassword=@TraderPassword,");
            strSql.Append("Code=@Code,");
            strSql.Append("EntrustNubmer=@EntrustNubmer,");
            strSql.Append("OrderPrice=@OrderPrice,");
            strSql.Append("OrderAmount=@OrderAmount,");
            strSql.Append("Message=@Message,");
            strSql.Append("ModifyOrderDateTime=@ModifyOrderDateTime");
            strSql.Append(" where ID=@ID ");
            Database  db        = DatabaseFactory.CreateDatabase();
            DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString());

            db.AddInParameter(dbCommand, "ID", DbType.AnsiString, model.ID);
            db.AddInParameter(dbCommand, "ChannelID", DbType.AnsiString, model.ChannelID);
            db.AddInParameter(dbCommand, "TraderId", DbType.AnsiString, model.TraderId);
            db.AddInParameter(dbCommand, "FundAccountId", DbType.AnsiString, model.FundAccountId);
            db.AddInParameter(dbCommand, "TraderPassword", DbType.AnsiString, model.TraderPassword);
            db.AddInParameter(dbCommand, "Code", DbType.AnsiString, model.Code);
            db.AddInParameter(dbCommand, "EntrustNubmer", DbType.AnsiString, model.EntrustNubmer);
            db.AddInParameter(dbCommand, "OrderPrice", DbType.Decimal, model.OrderPrice);
            db.AddInParameter(dbCommand, "OrderAmount", DbType.Int32, model.OrderAmount);
            db.AddInParameter(dbCommand, "Message", DbType.AnsiString, model.Message);
            db.AddInParameter(dbCommand, "ModifyOrderDateTime", DbType.DateTime, model.ModifyOrderDateTime);
            db.ExecuteNonQuery(dbCommand);
        }
        /// <summary>
        /// 处理Type2类型改单-价不变量减
        /// </summary>
        /// <param name="request">改单委托</param>
        private void ProcessType2(HKModifyOrderRequest request)
        {
            LogHelper.WriteDebug("M————>ModifyOrderProcessor.ProcessType2接收类型2改单请求" + request);

            OrderOfferCenter.Instance.OfferHKModifyOrder(request);
        }
        /// <summary>
        /// 当原始委托撤单清算完毕后,由此方法进行后继处理
        /// 生成新的委托进行下单,并修改原始委托相关信息
        /// </summary>
        /// <param name="request"></param>
        public void ProcessType3NewOrder(HKModifyOrderRequest request)
        {
            string desc = "M<---——ModifyOrderProcessor.ProcessType3NewOrder类型3改单——原始委托撤单清算完毕,生成新的委托下单,改单对象" + request;

            LogHelper.WriteDebug(desc);

            HK_TodayEntrustInfo tet = HKDataAccess.GetTodayEntrustTable(request.EntrustNubmer);

            string        strMessage = "";
            OrderResponse res        = null;

            HKModifyOrderPushBack pushBack = new HKModifyOrderPushBack();

            pushBack.OriginalRequestNumber = request.EntrustNubmer;
            pushBack.TradeID          = request.TraderId;
            pushBack.CallbackChannlId = request.ChannelID;

            //计算出需要下的量
            float amount = request.OrderAmount - tet.TradeAmount;

            //如果成交量已经大于等于当前改单量,那么无法再进行改单操作,改单失败
            if (amount <= 0)
            {
                string format = "GT-2456:[港股改单委托]当前委托已成交数量{0}大于等于改单量{1}";
                strMessage = string.Format(format, tet.TradeAmount, request.OrderAmount);
                LogHelper.WriteDebug("M<---——ModifyOrderProcessor.ProcessType3NewOrder类型3改单失败" + request + "Message=" +
                                     strMessage);

                pushBack.Message   = strMessage;
                pushBack.IsSuccess = false;

                //将改单结果推给前台
                CounterOrderService.Instance.AcceptHKModifyOrder(pushBack);

                //更新改单委托记录表的信息
                request.Message = strMessage;
                HKDataAccess.UpdateModifyOrderRequest(request);
            }
            else
            {
                HKOrderRequest newRequest = CreateNewType3Request(request, tet, amount);

                res = OrderAccepterService.Service.DoHKOrder(newRequest);
                pushBack.NewRequestNumber = res.OrderId;
                pushBack.Message          = res.OrderMessage;

                string txtMsg = "";
                if (res.IsSuccess)
                {
                    txtMsg = "类型3改单成功";
                    //更新改单后成功下单的委托单,--更新是一笔改单下单委托,和原来被改单的委托单号
                    HKDataAccess.UpdateEntrustModifyOrderNumber(res.OrderId, tet.EntrustNumber);
                    //记录成功改单委托记录明细,方便查询和关联查询
                    HKDataAccess.AddModifyOrderSuccessDatils(res.OrderId, tet.EntrustNumber, 3);
                }
                else
                {
                    string desc2 = "M<---——ModifyOrderProcessor.ProcessType3NewOrder类型3改单——生成新的委托下单失败,改单对象" + request +
                                   "Message=" + res.OrderMessage;
                    LogHelper.WriteDebug(desc2);

                    txtMsg = "GT-2457:类型3改单生成新的委托下单失败" + res.OrderMessage;

                    //更新改单委托记录表的信息
                    request.Message = txtMsg;
                    HKDataAccess.UpdateModifyOrderRequest(request);
                }

                //将改单结果推给前台
                CounterOrderService.Instance.AcceptHKModifyOrder(pushBack);

                ////修改原始委托信息
                //tet.ModifyOrderNumber = request.EntrustNubmer;
                //tet.IsModifyOrder = true;
                //HKDataAccess.UpdateEntrustTable(tet);

                //request.ModifyOrderDateTime = DateTime.Now;

                //=====add 李健华 2009-11-07=========
                //则更新原始委托单信息
                HKDataAccess.UpdateEntrustOrderMessage(tet.EntrustNumber, txtMsg);
                //===========
            }

            DeleteType3Reqeust(request.EntrustNubmer);
        }
 /// <summary>
 /// 添加类型3改单委托到缓存中
 /// </summary>
 /// <param name="request"></param>
 private void AddType3Reqest(HKModifyOrderRequest request)
 {
     type3Cache.Add(request.EntrustNubmer, request);
 }
 /// <summary>
 /// 添加类型2改单委托到缓存中
 /// </summary>
 /// <param name="request"></param>
 public void AddType2Reqest(HKModifyOrderRequest request)
 {
     type2Cache.Add(request.EntrustNubmer, request);
 }
        /// <summary>
        /// 根据改单请求和改单类型,改单委托的买卖方向,检验相关验证方法
        /// </summary>
        /// <param name="hkModifyOrder"></param>
        /// <param name="modifyType"></param>
        /// <param name="entrusInfo"></param>
        /// <param name="strMessage"></param>
        /// <returns></returns>
        public bool Validate(HKModifyOrderRequest hkModifyOrder, HK_TodayEntrustInfo entrusInfo, int breedClassID,
                             ref string strMessage)
        {
            BreedClassID = breedClassID;
            bool reust      = false;
            int  modifyType = 0; //改单类型

            #region 判断改单类型

            //未注报
            if (entrusInfo.OrderStatusID == (int)Types.OrderStateType.DOSUnRequired)
            {
                modifyType = 1;
            }


            //已报、部成
            if (entrusInfo.OrderStatusID == (int)Types.OrderStateType.DOSIsRequired ||
                entrusInfo.OrderStatusID == (int)Types.OrderStateType.DOSPartDealed)
            {
                if ((decimal)hkModifyOrder.OrderPrice == entrusInfo.EntrustPrice &&
                    hkModifyOrder.OrderAmount < entrusInfo.EntrustAmount)
                {
                    modifyType = 2;
                }
                else
                {
                    modifyType = 3;
                }
            }

            #endregion

            if (modifyType == 0)
            {
                strMessage = "GT-2250:[港股改单委托验证]当前委托无法改单";
                return(false);
            }

            #region 为适用之前的方法组装下单请求实体

            HKOrderRequest request = new HKOrderRequest();
            request.Code          = hkModifyOrder.Code;
            request.ChannelID     = hkModifyOrder.ChannelID;
            request.BuySell       = (CommonObject.Types.TransactionDirection)entrusInfo.BuySellTypeID;
            request.OrderAmount   = hkModifyOrder.OrderAmount;
            request.OrderPrice    = hkModifyOrder.OrderPrice;
            request.FundAccountId = entrusInfo.CapitalAccount;
            request.OrderUnitType = (GTA.VTS.Common.CommonObject.Types.UnitType)entrusInfo.TradeUnitID;
            request.OrderWay      = (GTA.VTS.Common.CommonObject.Types.HKPriceType)entrusInfo.OrderPriceType;

            #endregion

            #region 1.零股检验

            //零股检验
            HKStockZeroVolumeOfBusinessCommand zerovolume = new HKStockZeroVolumeOfBusinessCommand(BreedClassID);
            reust = zerovolume.Validate(request, ref strMessage);
            if (!reust)
            {
                return(false);
            }

            #endregion

            #region 2.单笔最大委托量检验命令

            //单笔最大委托量检验命令
            HKStockMaxLeaveQuantityRangeValueCommand maxLeave =
                new HKStockMaxLeaveQuantityRangeValueCommand(BreedClassID);
            reust = maxLeave.Validate(request, ref strMessage);
            if (!reust)
            {
                return(false);
            }

            #endregion

            #region 3.不是第二种类型量减的并且价格有改动的验证最小变动价格

            //不是第二种类型量减的并且价格有改动的验证最小变动价格
            if (modifyType != 2 && (decimal)hkModifyOrder.OrderPrice != entrusInfo.EntrustPrice)
            {
                HKStockMinChangePriceValueCommand minChange = new HKStockMinChangePriceValueCommand(BreedClassID);
                reust = minChange.Validate(request, ref strMessage);
                if (!reust)
                {
                    return(false);
                }
            }

            #endregion

            #region 委托量有所改变则验证相关持仓(宋涛1116:此处不需要进行校验,等待原委托撤单成功后,由新单校验处检验)

            ////if (modifyType != 2)
            //{
            //if (hkModifyOrder.OrderAmount != entrusInfo.EntrustAmount)
            //{
            //    if (entrusInfo.BuySellTypeID == (int)Types.TransactionDirection.Buying)
            //    {
            //        reust = PO_HoldValidate_Buy(ref strMessage, entrusInfo, request);
            //    }
            //    else
            //    {
            //        reust = PO_HoldValidate_Sell(ref strMessage, entrusInfo, request);
            //    }
            //    if (!reust)
            //    {
            //        return false;
            //    }
            //}
            ////}

            //不考虑持仓量,只考虑委托最小单位的验证
            HKModifyStockMinVolumeOfBusinessCommand minVolume = new HKModifyStockMinVolumeOfBusinessCommand(BreedClassID);
            reust = minVolume.Validate(request, ref strMessage);
            if (!reust)
            {
                return(false);
            }

            #endregion

            return(true);
        }
        public OrderResponse Process(HKModifyOrderRequest hkOrder)
        {
            LogHelper.WriteDebug("M——>ModifyOrderProcessor.Process接收改单入口" + hkOrder);

            bool          canModifyOrder  = false;
            OrderResponse orResult        = new OrderResponse();
            string        strErrorMessage = "";

            //hkOrder.ID = HKCommonLogic.BuildHKOrderNo();
            hkOrder.ID = Guid.NewGuid().ToString();

            #region 原始单位及成交量转换

            var            code        = hkOrder.Code;
            var            oriUnitType = hkOrder.OrderUnitType;
            decimal        scale;
            Types.UnitType matchUnitType;

            bool canConvert = OrderAccepter.ConvertUnitType(Types.BreedClassTypeEnum.HKStock, code, oriUnitType, out scale, out matchUnitType);
            if (!canConvert)
            {
                strErrorMessage = @"GT-2450:[港股委托]无法进行行情单位转换.";
                goto EndProcess;
            }
            LogHelper.WriteDebug("委托单:" + hkOrder.EntrustNubmer + "当前改单获取到的转换倍数为: " + scale);
            hkOrder.OrderUnitType = matchUnitType;
            hkOrder.OrderAmount   = hkOrder.OrderAmount * (float)scale;

            #endregion

            //记录改单操作记录数据
            bool canSave = HKDataAccess.AddHKModifyOrderRequest(hkOrder);
            if (!canSave)
            {
                strErrorMessage = @"GT-2451:[港股改单委托]无法保持改单委托,请查看错误日志.";
                LogHelper.WriteInfo(strErrorMessage + "," + hkOrder);

                goto EndProcess;
            }

            #region 校验

            if ((string.IsNullOrEmpty(hkOrder.TraderId) && string.IsNullOrEmpty(hkOrder.FundAccountId)))
            {
                strErrorMessage = @"GT-2452:[港股改单委托]交易员ID或资金帐户无效.";
                LogHelper.WriteInfo(strErrorMessage + "," + hkOrder);

                goto EndProcess;
            }

            //柜台委托时间判断
            if (!ValidateCenter.IsCountTradingTime(Types.BreedClassTypeEnum.HKStock, hkOrder.Code, ref strErrorMessage))
            {
                LogHelper.WriteInfo("ModifyOrderProcessor.Process" + strErrorMessage);
                string oriMsg = "当前时间不接受委托";
                if (strErrorMessage.Length > 0)
                {
                    oriMsg = strErrorMessage;
                }

                strErrorMessage = @"GT-2453:[港股改单委托]" + oriMsg;
                LogHelper.WriteInfo(strErrorMessage + "," + hkOrder);
                goto EndProcess;
            }

            HK_TodayEntrustInfo tet = HKDataAccess.GetTodayEntrustTable(hkOrder.EntrustNubmer);
            if (tet == null)
            {
                strErrorMessage = "GT-2454:[港股改单委托]无委托对象信息";
                LogHelper.WriteInfo(strErrorMessage + "," + hkOrder);

                goto EndProcess;
            }

            if ((float)tet.EntrustPrice == hkOrder.OrderPrice && tet.EntrustAmount == (int)hkOrder.OrderAmount)
            {
                strErrorMessage = "GT-2455:[港股改单委托]无效改单,改单量、改单价与原始委托相同";
                LogHelper.WriteInfo(strErrorMessage + "," + hkOrder);

                goto EndProcess;
            }

            //港股改单规则检验,这里有些与真实下单有些重复,但这样可以提高改单的成功率
            if (!McValidater.GetInstance().ValidateHKModifyOrderRule(hkOrder, tet, ref strErrorMessage))
            {
                LogHelper.WriteInfo(strErrorMessage + "," + hkOrder);
                goto EndProcess;
            }

            #endregion

            //未报
            if (tet.OrderStatusID == (int)Entity.Contants.Types.OrderStateType.DOSUnRequired)
            {
                ProcessType1(hkOrder);
                canModifyOrder = true;
                goto EndProcess;
            }

            #region 已报、部成

            if (tet.OrderStatusID == (int)Entity.Contants.Types.OrderStateType.DOSIsRequired ||
                tet.OrderStatusID == (int)Entity.Contants.Types.OrderStateType.DOSPartDealed)
            {
                //如果不在交易时间内,那么直接到缓存中删除原来的委托,生成新委托
                if (!ValidateCenter.IsMatchTradingTime(Types.BreedClassTypeEnum.HKStock, hkOrder.Code))
                {
                    strErrorMessage = "GT-2456:[港股改单委托]不在交易时间内";
                    LogHelper.WriteInfo(strErrorMessage + "," + hkOrder);

                    goto EndProcess;
                }

                if ((decimal)hkOrder.OrderPrice == tet.EntrustPrice && hkOrder.OrderAmount < tet.EntrustAmount)
                {
                    ProcessType2(hkOrder);
                    canModifyOrder = true;
                }
                else
                {
                    ProcessType3(hkOrder);
                    canModifyOrder = true;
                    goto EndProcess;
                }
            }

            #endregion

EndProcess:
            //结束
            if (canModifyOrder)
            {
                hkOrder.ModifyOrderDateTime = DateTime.Now;
                orResult.OrderDatetime      = DateTime.Now;
            }
            else
            {
                int  type            = 0;
                bool canGetErrorCode = Utils.GetErrorCode(strErrorMessage, out type);
                if (canGetErrorCode)
                {
                    orResult.ErrorType = type;
                }

                hkOrder.Message       = strErrorMessage;
                orResult.OrderMessage = strErrorMessage;
            }

            //更新改单委托
            HKDataAccess.UpdateModifyOrderRequest(hkOrder);

            orResult.IsSuccess = canModifyOrder;
            orResult.OrderId   = hkOrder.ID;
            return(orResult);
        }