/// <summary>
        /// 挂单下单
        /// </summary>
        /// <param name="orderln">下单信息</param>
        /// <returns>下单结果</returns>
        public Orders GetOrders(OrdersLncoming orderln)
        {
            Orders orders = new Orders();
            orders.MoneyInventory = new MoneyInventory();
            orders.TradeHoldOrder = new TradeHoldOrder();
            ProductConfig ptc = new ProductConfig();
            DateTime dt = DateTime.Now;//服务器当前本地时间\
            TradeUser TdUser = new TradeUser();
            double _frozenMoney = 0;//冻结资金
            double fxrate = 0; //风险率
            string holdid = string.Empty;//挂单ID
            string userId = string.Empty; //被操作的用户ID
            string operUser = string.Empty;//操作人
            string ipmac = string.Empty;
            int operUserType = 0;
            try
            {

                #region 判断用户登陆标识是否过期

                if (!ComFunction.ExistUserLoginID(orderln.LoginID, ref TdUser))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL003;
                    orders.Desc = ResCode.UL003Desc;
                    return orders;
                }
                operUser = TdUser.Account;
                ipmac = ComFunction.GetIpMac(TdUser.Ip, TdUser.Mac);
                operUserType = (int)TdUser.UType;
                if (UserType.NormalType == TdUser.UType)
                {
                    userId = TdUser.UserID;
                }
                else
                {
                    userId = ComFunction.GetUserId(orderln.TradeAccount, ref TdUser);
                }

                #endregion

                #region 交易手数验证
                if (!ComFunction.ValidateQuantity(orderln.Quantity,TdUser.OrderUnit))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL044;
                    //orders.Desc = ResCode.UL044Desc;
                    orders.Desc = string.Format("交易手数必须是{0}的倍数", TdUser.OrderUnit);
                    return orders;
                }
                #endregion

                #region 判断用户是否允许挂买单或挂卖单
                if ("0" == orderln.OrderType) //挂买单
                {
                    if (!TdUser.PermitDhuo)
                    {
                        orders.Result = false;
                        orders.ReturnCode = ResCode.UL017;
                        orders.Desc = ResCode.UL017Desc;
                        return orders;
                    }
                }
                else if ("1" == orderln.OrderType) //挂卖单
                {
                    if (!TdUser.PermitHshou)
                    {
                        orders.Result = false;
                        orders.ReturnCode = ResCode.UL018;
                        orders.Desc = ResCode.UL018Desc;
                        return orders;
                    }
                }
                else
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL021;
                    orders.Desc = ResCode.UL021Desc;
                    return orders;
                }
                #endregion

                #region 获取商品信息

                ptc = ComFunction.GetProductInfo(orderln.ProductCode);
                //挂单类型(0买、1卖)
                if (string.IsNullOrEmpty(ptc.State)) //未能获取商品状态
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL024;
                    orders.Desc = ResCode.UL024Desc;
                    return orders;
                }

                #endregion

                #region 判断当前时间服务器是否允许交易

                if (!ComFunction.GetDateset(ptc.PriceCode,dt))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL022;
                    orders.Desc = ResCode.UL022Desc;
                    return orders;
                }

                #endregion

                #region 挂单有效期判断

                //判断有效期是否大于挂单时间
                DateTime vlidt =
                    Convert.ToDateTime(string.Format("{0}-{1}-{2} 23:59:59", orderln.ValidTime.Year,
                        orderln.ValidTime.Month, orderln.ValidTime.Day));
                if (!(vlidt > dt))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL023;
                    orders.Desc = ResCode.UL023Desc;
                    return orders;
                }

                #endregion

                #region 判断商品是否处于交易时段
                if (!ComFunction.ProductCanTrade(ptc.Starttime, ptc.Endtime))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL025;
                    orders.Desc = ResCode.UL025Desc;
                    return orders;
                }
                #endregion

                #region 判断商品是否允许交易

                //商品的状态(0 正常交易, 1 只报价, 2 只买, 3 只卖, 4 全部禁止)
                if ("0" == ptc.State) //商品允许正常交易
                {
                    if ("0" == orderln.OrderType) //买
                    {
                        orders.Desc = "买成功";
                    }
                    else if ("1" == orderln.OrderType) //卖
                    {
                        orders.Desc = "卖成功";
                    }
                    else
                    {
                        orders.Result = false;
                        orders.ReturnCode = ResCode.UL021;
                        orders.Desc = ResCode.UL021Desc;
                        return orders;
                    }
                }
                else if ("2" == ptc.State) //商品只允许买
                {
                    if ("0" == orderln.OrderType) //买
                    {
                        orders.Desc = "买成功";
                    }
                    else
                    {
                        orders.Result = false;
                        orders.ReturnCode = ResCode.UL026;
                        orders.Desc = ResCode.UL026Desc;
                        return orders;
                    }
                }
                else if ("3" == ptc.State) //商品只允许卖
                {
                    if ("1" == orderln.OrderType) //卖
                    {
                        orders.Desc = "卖成功";
                    }
                    else
                    {
                        orders.Result = false;
                        orders.ReturnCode = ResCode.UL027;
                        orders.Desc = ResCode.UL027Desc;
                        return orders;
                    }
                }
                else
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL025;
                    orders.Desc = ResCode.UL025Desc;
                    return orders;
                }

                #endregion

                #region 挂单价判断 (浮点数比较时,把两个数相减,然后和0.000001比较)

                //最小成交价格 < 挂单价 <最大成交价格
                if (!(orderln.HoldPrice - ptc.MinPrice >= ComFunction.dzero && orderln.HoldPrice - ptc.MaxPrice <= ComFunction.dzero))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL015;
                    orders.Desc = ResCode.UL015Desc;
                    return orders;
                }

                #endregion

                #region 最大交易时间差判断

                //当前客户端实时报价时间+允许最大交易时间差>=服务器时间
                if (!(orderln.CurrentTime.AddSeconds(ptc.MaxTime) >= dt))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL014;
                    orders.Desc = ResCode.UL014Desc;
                    return orders;
                }

                #endregion

                #region 风险率判断

                //获取帐户资金信息
                orders.MoneyInventory = ComFunction.GetMoneyInventoryByUserId(userId);
                if (!orders.MoneyInventory.Result)
                {
                    orders.Result = false;
                    orders.Desc = "未能获取资金库存";
                    return orders;
                }
                //冻结保证金=挂单价/[点差基值]*[点值]*下单数量*保证金百分比
                //风险率=([占用]+[冻结])/[账户结余]
                //风险率<=60%(加上本单的冻结保证金)
                //_frozenMoney =
                //    System.Math.Round(
                //        orderln.HoldPrice / ptc.AdjustBase * ptc.ValueDot * orderln.Quantity * orderln.OrderMoney, 2,
                //        MidpointRounding.AwayFromZero);
                _frozenMoney = System.Math.Round(ComFunction.Getfee(ptc.OrderMoneyFee, orderln.OrderMoney, orderln.HoldPrice, orderln.Quantity), 2, MidpointRounding.AwayFromZero);

                /* 老的风险率判断代码
                fxrate = (_frozenMoney + orders.MoneyInventory.FdInfo.OccMoney + orders.MoneyInventory.FdInfo.FrozenMoney) /
                         orders.MoneyInventory.FdInfo.Money;
                if (orders.MoneyInventory.FdInfo.Money - _frozenMoney - orders.MoneyInventory.FdInfo.OccMoney - orders.MoneyInventory.FdInfo.FrozenMoney<=ComFunction.dzero)
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL012;
                    orders.Desc = ResCode.UL012Desc;
                    return orders;
                }
                if (!(fxrate - ComFunction.fenxian_rate <= ComFunction.dzero))
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL013;
                    orders.Desc = ResCode.UL013Desc;
                    return orders;
                }
                */

                #region 新的风险率判断代码
                double DongJieMoney = 0;//冻结资金
                if (orders.MoneyInventory.FdInfo.DongJieMoney > ComFunction.dzero)
                {
                    DongJieMoney = orders.MoneyInventory.FdInfo.DongJieMoney;
                }
                double UseMoney = _frozenMoney + orders.MoneyInventory.FdInfo.OccMoney + orders.MoneyInventory.FdInfo.FrozenMoney;
                if (UseMoney <= ComFunction.dzero)//如果使用金额为0 则说明有问题 使用金额不可能小于0
                {
                    orders.Result = false;
                    orders.Desc = "挂单下单失败!";
                    return orders;
                }
                double yingkui = ComFunction.GetUserYingKui(userId);//用户的盈亏
                fxrate = (orders.MoneyInventory.FdInfo.Money - DongJieMoney + yingkui) / UseMoney;

                if (orders.MoneyInventory.FdInfo.Money - DongJieMoney - _frozenMoney - orders.MoneyInventory.FdInfo.OccMoney - orders.MoneyInventory.FdInfo.FrozenMoney <= ComFunction.dzero)
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL012;
                    orders.Desc = ResCode.UL012Desc;
                    return orders;
                }
                if (fxrate - ComFunction.fenxian_rate <= ComFunction.dzero)
                {
                    orders.Result = false;
                    orders.ReturnCode = ResCode.UL013;
                    orders.Desc = ResCode.UL013Desc;
                    return orders;
                }
                //
                #endregion

                #endregion

                holdid = ComFunction.GetOrderId(ComFunction.Hold);

                #region 数据库事务处理
                List<string> sqlList = new List<string>();
                sqlList.Add(string.Format("INSERT INTO Trade_HoldOrder([userId],[HoldOrderID],[productCode],[quantity],[OrderType],[HoldPrice],[lossPrice],[profitPrice],[frozenMoney],[validtime],[ordertime],[ip],[mac]) VALUES('{0}','{1}','{2}',{3},{4},{5},{6},{7},{8},'{9}','{10}','{11}','{12}')",
                            userId, holdid, orderln.ProductCode,
                            orderln.Quantity, orderln.OrderType, orderln.HoldPrice, orderln.LossPrice,
                            orderln.ProfitPrice, _frozenMoney, orderln.ValidTime.ToString("yyyy-MM-dd"),
                            dt.ToString("yyyy-MM-dd HH:mm:ss.fff"), ComFunction.GetClientIp(), orderln.Mac));

                sqlList.Add(string.Format("update Trade_FundInfo set frozenMoney = frozenMoney+{0} where userid='{1}' and [state]<>'4'", _frozenMoney, userId));
                //添加操作记录

                sqlList.Add(string.Format("insert into Base_OperrationLog([OperTime],[Account],[UserType],[Remark]) values('{0}','{1}',{2},'{3}')",
                    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), operUser, operUserType, string.Format("{1}委托订单{0}", holdid, ipmac)));

                if (!ComFunction.SqlTransaction(sqlList))
                {
                    orders.Result = false;
                    orders.Desc = "挂单时数据库事务处理出错";
                    return orders;
                }

                #endregion

                #region 给返回对象赋值

                orders.Result = true;
                orders.TradeHoldOrder.FrozenMoney = _frozenMoney;
                orders.TradeHoldOrder.HoldOrderID = holdid;
                orders.TradeHoldOrder.HoldPrice = orderln.HoldPrice;
                orders.TradeHoldOrder.LossPrice = orderln.LossPrice;
                orders.TradeHoldOrder.OrderTime = dt;
                orders.TradeHoldOrder.OrderType = orderln.OrderType;
                orders.TradeHoldOrder.ProductCode = orderln.ProductCode;
                orders.TradeHoldOrder.ProductName = ptc.ProductName;
                orders.TradeHoldOrder.ProfitPrice = orderln.ProfitPrice;
                orders.TradeHoldOrder.Quantity = orderln.Quantity;
                orders.TradeHoldOrder.ValidTime = orderln.ValidTime;

                orders.MoneyInventory.FdInfo.FrozenMoney += _frozenMoney;

                #endregion

            }
            catch (Exception ex)
            {
                ComFunction.WriteErr(ex);
                orders.Result = false;
                orders.Desc = "挂单下单失败";

            }
            return orders;
        }
Example #2
0
        public String AnalysisXml(string ReqXml)
        {
            string ResXml = string.Empty;
            string ReqCode = string.Empty;
            try
            {
                System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
                xmldoc.LoadXml(ReqXml);

                //请求指令
                ReqCode = xmldoc.SelectSingleNode("JTW91G/MsgData/ReqHeader/ReqCode").InnerText;

                Trade.CTrade trade = new Trade.CTrade();
                OrdersLncoming orderln = new OrdersLncoming();

                orderln.Mac = xmldoc.SelectSingleNode("JTW91G/MsgData/ReqHeader/Mac").InnerText;
                orderln.LoginID = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/LoginId").InnerText;
                orderln.TradeAccount = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/TradeAccount").InnerText;
                orderln.CurrentTime = Convert.ToDateTime(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/CurrentTime").InnerText);

                //可以不设置止盈止损价 如果为空 不能直接转换
                string ProfitPrice = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/ProfitPrice").InnerText;
                string LossPrice = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/LossPrice").InnerText;
                orderln.ProfitPrice = Convert.ToDouble(string.IsNullOrEmpty(ProfitPrice) ? "0" : ProfitPrice);
                orderln.LossPrice = Convert.ToDouble(string.IsNullOrEmpty(LossPrice) ? "0" : LossPrice);

                orderln.OrderType = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/OrderType").InnerText;
                orderln.ProductCode = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/ProductCode").InnerText;
                orderln.HoldPrice = Convert.ToDouble(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/HoldPrice").InnerText);
                orderln.Quantity = Convert.ToDouble(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/Quantity").InnerText);
                orderln.RtimePrices = Convert.ToDouble(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/RtimePrices").InnerText);
                orderln.ValidTime = Convert.ToDateTime(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/ValidTime").InnerText);//ValidTime

                orderln.UserType = 0; //客户端没有传递这个值 内部调用默认赋值0 表示普通用户
                orderln.OrderMoney = 0; //客户端没有传递这个值 这个值本身也没有使用 随便赋个值
                Orders orders = trade.GetOrders(orderln);

                if (!orders.Result)
                {
                    string CodeDesc = ResCode.UL005Desc;
                    string ReturnCode = GssGetCode.GetCode(orders.ReturnCode,orders.Desc, ref CodeDesc);
                    ResXml = GssResXml.GetResXml(ReqCode, ReturnCode, CodeDesc, string.Format("<DataBody></DataBody>"));
                }
                else
                {
                    //返回的结构不一样 不能直接转换
                    //string holdorder = XmlUtil.SerializeObjToXml(typeof(TradeHoldOrder), orders.TradeHoldOrder);

                    StringBuilder strb = new StringBuilder();
                    strb.AppendFormat("<HoldOrderId>{0}</HoldOrderId>", orders.TradeHoldOrder.HoldOrderID);
                    strb.AppendFormat("<ProductCode>{0}</ProductCode>", orders.TradeHoldOrder.ProductCode);
                    strb.AppendFormat("<HoldPrice>{0}</HoldPrice>", orders.TradeHoldOrder.HoldPrice);
                    strb.AppendFormat("<Quantity>{0}</Quantity>", orders.TradeHoldOrder.Quantity);
                    strb.AppendFormat("<FrozenMoney>{0}</FrozenMoney>", orders.TradeHoldOrder.FrozenMoney);
                    strb.AppendFormat("<ValidTime>{0}</ValidTime>", orders.TradeHoldOrder.ValidTime.ToString(Const.dateformat));
                    strb.AppendFormat("<LossPrice>{0}</LossPrice>", orders.TradeHoldOrder.LossPrice);
                    strb.AppendFormat("<ProfitPrice>{0}</ProfitPrice>", orders.TradeHoldOrder.ProfitPrice);
                    strb.AppendFormat("<OrderType>{0}</OrderType>", orders.TradeHoldOrder.OrderType);
                    strb.AppendFormat("<OrderTime>{0}</OrderTime>", orders.TradeHoldOrder.OrderTime.ToString(Const.dateformat));
                    strb.Append("<CancelTime></CancelTime>");
                    StringBuilder fundinfo = new StringBuilder();
                    fundinfo.Append("<FundInfo>");
                    fundinfo.AppendFormat("<Money>{0}</Money>", orders.MoneyInventory.FdInfo.Money);
                    fundinfo.AppendFormat("<OccMoney>{0}</OccMoney>", orders.MoneyInventory.FdInfo.OccMoney);
                    fundinfo.AppendFormat("<FrozenMoney>{0}</FrozenMoney>", orders.MoneyInventory.FdInfo.FrozenMoney);
                    fundinfo.Append("</FundInfo>");
                    //响应消息体
                    string DataBody = string.Format("<DataBody><HoldOrders><HoldOrder>{0}</HoldOrder></HoldOrders>{1}</DataBody>", strb.ToString(), fundinfo.ToString());

                    ResXml = GssResXml.GetResXml(ReqCode, ResCode.UL004, ResCode.UL004Desc, DataBody);
                }
            }
            catch (Exception ex)
            {
                com.individual.helper.LogNet4.WriteErr(ex);

                //业务处理失败
                ResXml = GssResXml.GetResXml(ReqCode, ResCode.UL005, ResCode.UL005Desc, string.Format("<DataBody></DataBody>"));
            }
            return ResXml;
        }