/// <summary>
        /// 正式提交订单
        /// </summary>
        protected override bool SubmitOrderInternal()
        {
            if (!base.SubmitOrderInternal())
            {
                return(false);
            }

            if (!_orderInfoChecked && !CheckOrderInfo())
            {
                return(false);
            }

            if (NeedVc == true && RandCode.IsNullOrEmpty())
            {
                SetSubmitOrderError("[NEEDVC] 请输入验证码");
                return(false);
            }


            if (NeedVcTime > 0)
            {
                var safeTime = NeedVcTime - (int)(DateTime.Now - VcBaseTime.Value).TotalMilliseconds;
                StateMessage = $"Delayed for {safeTime}ms";
                Trace.TraceInformation($"SUMITORDER: DELAY {safeTime}ms");
                if (safeTime > 0)
                {
                    Thread.Sleep(safeTime);
                }
            }
            if (!RandCode.IsNullOrEmpty())
            {
                StateMessage = "正在校验验证码...";

                //var result = Session.NetClient.RunRequestLoop(
                //											 () => Session.NetClient.Create(HttpMethod.Post,
                //																			"passcodeNew/checkRandCodeAnsyn",
                //																			currentPage,
                //																			new {randCode = RandCode, rand = "randp", _json_att = Session.Attributes ?? "", REPEAT_SUBMIT_TOKEN = Token},
                //																			new {data = new {result = 0}}, isXhr: true
                //														),
                //											_ => StateMessage = $"[{_}] 正在校验验证码...");
                //Session.LastCheckRandCodeTime = DateTime.Now;
                //if (!result.IsValid())
                //{
                //	SetSubmitOrderError("校验验证码时网络错误,请重试");
                //	return;
                //}
                //if (result.Result.data.result != 1)
                //{
                //	SetSubmitOrderError("验证码错误,请重试。");
                //	return;
                //}
                var result = Session.NetClient.VerifyRandCode(Query.Resign ? RandCodeType.RandpResign : RandCodeType.Randp, RandCode, null, _ => StateMessage = $"[{_}] 正在检查验证码……");

                if (!result.IsNullOrEmpty())
                {
                    SetSubmitOrderError(result.DefaultForEmpty("验证码错误"));
                    return(false);
                }
            }

            //检测队列信息。仅异步模式下需要。
            if (Async)
            {
                var queueSeat = Passengers[0].SeatType;
                StateMessage = "正在检测排队信息....";
                var checkQueueData = new NameValueCollection
                {
                    { "train_date", Date.Date.ToString("R") },
                    //checkQueueData.Add("train_date", "Mon Apr 28 2014 00:00:00 GMT+0800 (中国标准时间)");
                    { "train_no", Train.Id },
                    { "stationTrainCode", Train.Code },
                    { "seatType", queueSeat.ToString() },
                    { "fromStationTelecode", Train.FromStation.Code },
                    { "toStationTelecode", Train.ToStation.Code },
                    { "leftTicket", LeftTicketStr },
                    { "purpose_codes", _purposeCode }
                };
                if (_isCheckOrderInfo != null)
                {
                    checkQueueData.Add("isCheckOrderInfo", _isCheckOrderInfo);
                }
                checkQueueData.Add("_json_att", Session.Attributes ?? "");
                checkQueueData.Add("train_location", TrainLocation);
                checkQueueData.Add("REPEAT_SUBMIT_TOKEN", Token);

                var checkQueueResult = Session.NetClient.RunRequestLoop(
                    _ => Session.NetClient.Create <GetQueueCountResponse>(HttpMethod.Post, "confirmPassenger/getQueueCount", _currentPage, checkQueueData), _ => StateMessage = $"[{_}] 正在检测排队信息...."
                    );

                if (!checkQueueResult.IsValid())
                {
                    SetSubmitOrderError("网络错误:" + checkQueueResult?.GetErrorMsg());
                    return(false);
                }

                if (!checkQueueResult.Result.Status || checkQueueResult.Result.Data == null)
                {
                    SetSubmitOrderError(checkQueueResult.Result.Messages.JoinAsString("").DefaultForEmpty("系统忙,请重试"));
                    return(false);
                }

                if (checkQueueResult.Result.Data.isRelogin == "Y")
                {
                    SetSubmitOrderError("登录状态异常,请重新登录。");
                    return(false);
                }

                SetTicketCount(queueSeat, checkQueueResult.Result.Data.ticket);
                if (!CheckTicketCount())
                {
                    return(false);
                }

                WaitCount = checkQueueResult.Result.Data.countT.ToInt32();
                if (checkQueueResult.Result.Data.op_2 == "true")
                {
                    if (OrderConfiguration.Instance.IgnoreQueueError)
                    {
                        QueueWarning = true;
                    }
                    else
                    {
                        SetSubmitOrderError("排队人数过多,不允许提交订单。排队人数=" + (WaitCount > 0 ? WaitCount.ToString() : "<已无票>"));
                        return(false);
                    }
                }
            }

            //开始提交订单
            StateMessage = "正在提交订单...";

            //座位
            var(seats, beds) = BuildSeatInfo();

            var orderData = new NameValueCollection
            {
                { "passengerTicketStr", PassengerString[0] },
                { "oldPassengerStr", PassengerString[1] },
                { "purpose_codes", _purposeCode },
                { "key_check_isChange", KeyCheckIsChange },
                { "leftTicketStr", LeftTicketStr },
                { "train_location", TrainLocation },
                { "choose_seats", seats },
                { "seatDetailType", beds },
                { "whatsSelect", "1" },               //受让人为0
                { "roomType", "00" },                 //动卧需要
                { "dwAll", BuyAllSeat ? "Y" : "N" },
                { "_json_att", Session.Attributes ?? "" },
                { "REPEAT_SUBMIT_TOKEN", Token }
            };

            if (!RandCode.IsNullOrEmpty())
            {
                orderData.Add("randCode", RandCode);
            }

            //Thread.Sleep(Configuration.SubmitOrder.Current.OrderSubmitDelay);

#if DEBUG
            if (TestFlag.BlockOrderSubmit)
            {
                SetSubmitOrderError("[测试]余票不足!");
            }

            if (TestFlag.BlockOrderSubmit || TestFlag.FakeOrderSubmit)
            {
                return(false);
            }
#endif
            //confirmPassenger/confirmSingle
            //confirmPassenger/confirmGo
            //confirmPassenger/confirmBack
            //confirmPassenger/confirmResign

            //延迟
            var submiturl     = Async ? (Query.Resign ? "confirmPassenger/confirmResignForQueue" : "confirmPassenger/confirmSingleForQueue") : (Query.Resign ? "confirmPassenger/confirmResign" : "confirmPassenger/confirmSingle");
            var orderResponse = Session.NetClient.RunRequestLoop(
                _ => Session.NetClient.Create(
                    FSLib.Network.Http.HttpMethod.Post,
                    submiturl,
                    _currentPage,
                    orderData,
                    new
            {
                status = false,
                data   = new
                {
                    submitStatus = true,
                    errMsg       = ""
                },
                messages = new string[0]
            }),
                _ => StateMessage = $"[{_}] 正在提交订单..."
                );
            if (orderResponse == null || !orderResponse.IsSuccess)
            {
                SetSubmitOrderError("网络错误:[SUBMITORDER] " + orderResponse?.GetErrorMsg());
                return(false);
            }
            var orderresult = orderResponse.Result;
            if (orderresult.status)
            {
                if (!orderresult.data.submitStatus)
                {
                    SetSubmitOrderError("提交订单错误:" + orderresult.data.errMsg);
                }
                else if (!Async)
                {
                    LoadOrderIdFromNotComplete();
                }
            }
            else
            {
                SetSubmitOrderError(orderresult.messages.JoinAsString("").DefaultForEmpty("系统忙"));
            }

            return(true);
        }
        protected override void PrepareInternal()
        {
            base.PrepareInternal();

            var(ok, msg) = PreparePassenger();
            if (!ok)
            {
                SetPrepareOrderError(msg);
                return;
            }

            //如果在进入查票页后没有加载联系人,则自动加载一次联系人。

            //创建信息
            var json_att    = !string.IsNullOrEmpty(Session.Attributes) ? "&_json_att=" + System.Web.HttpUtility.UrlEncode(Session.Attributes) : "";
            var purposeCode = IsStudent ? "0X00" : "ADULT";

            //检测
            StateMessage = "检测订单信息....";

            var exdata = "";

            if (Session.DynamicJsData != null)
            {
                exdata = HttpUtility.UrlEncode(Session.DynamicJsData.Key) + "=" + HttpUtility.UrlEncode(Session.DynamicJsData.EncodedValue) + "&";
            }
            //引发强退
            var data = exdata;

            data += "secretStr" + "=" + Train.SubmitOrderInfo + "&" +
                    "train_date" + "=" + Date.ToString("yyyy-MM-dd") + "&" +
                    "tour_flag" + "=" + "dc" + "&" +
                    "purpose_codes" + "=" + purposeCode + "&" +
                    "query_from_station_name" + "=" + Query.FromStationName + "&" +
                    "query_to_station_name" + "=" + Query.ToStationName + "&" + json_att + "&" +
                    "cancel_flag" + "=2&" +
                    "bed_level_order_num" + "=000000000000000000000000000000&" +
                    "passengerTicketStr" + "=" + PassengerString[0] + "&" +
                    "oldPassengerStr" + "=" + PassengerString[1];
            var autosubmitresponse =
                Session.NetClient.RunRequestLoop(_ =>
                                                 Session.NetClient.Create <AutoSubmitOrderResponse>(HttpMethod.Post, "confirmPassenger/autoSubmitOrderRequest", "leftTicket/init", data, isXhr: true),
                                                 _ => StateMessage = $"[{_}] 检测订单信息...."
                                                 );

            if (!autosubmitresponse.IsValid())
            {
                SetPrepareOrderError("网络错误:" + autosubmitresponse.GetErrorMsg());
                return;
            }

            //for test

            if (!autosubmitresponse.Result.Status)
            {
                SetPrepareOrderError(autosubmitresponse.Result.Messages.JoinAsString("").DefaultForEmpty("系统忙。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。"));
                return;
            }

            var submitOrderResult = autosubmitresponse.Result.Data;

            if (submitOrderResult == null)
            {
                SetPrepareOrderError(autosubmitresponse.Result.Messages.JoinAsString("").DefaultForEmpty("系统返回正常,但是结果不对。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。"));
                return;
            }

            if (submitOrderResult.isRelogin == "Y")
            {
                SetPrepareOrderError("登录状态异常,请重新登录。");
                return;
            }
            if (submitOrderResult.isNoActive || !submitOrderResult.submitStatus || !submitOrderResult.CheckSeatNum.IsNullOrEmpty())
            {
                SetPrepareOrderError("提交订单失败:" + autosubmitresponse.Result.Data.errMsg);
                return;
            }

            object isCheckOrderInfo;
            var    infoarr = submitOrderResult.result.Split('#');

            TrainLocation    = infoarr[0];
            KeyCheckIsChange = infoarr[1];
            LeftTicketStr    = infoarr[2];
            Async            = infoarr[3] == "1";
            isCheckOrderInfo = submitOrderResult.isCheckOrderInfo;
            //是否需要验证码?
            NeedVc     = submitOrderResult.IfShowPassCode == "Y";
            NeedVcTime = submitOrderResult.IfShowPassCodeTime;
            VcBaseTime = DateTime.Now;

            //判断席别选择是否可用
            CanChooseBed       = submitOrderResult.canChooseBeds == "Y";
            CanChooseSeat      = submitOrderResult.canChooseSeats == "Y";
            CanChooseBedMiddle = submitOrderResult.isCanChooseMid == "Y";
            ChooseSeatTypes    = submitOrderResult.choose_Seats;


            //检测排队
            if (Async)
            {
                StateMessage = "正在检测排队信息....";
                var seatType = Passengers[0].SeatType;

                var checkQueueData = new NameValueCollection();
                checkQueueData.Add("train_date", Date.ToUniversalTime().ToString("R"));
                checkQueueData.Add("train_no", Train.Id);
                checkQueueData.Add("stationTrainCode", Train.Code);
                checkQueueData.Add("seatType", seatType.ToString());
                checkQueueData.Add("fromStationTelecode", Train.FromStation.Code);
                checkQueueData.Add("toStationTelecode", Train.ToStation.Code);
                checkQueueData.Add("leftTicket", LeftTicketStr);
                checkQueueData.Add("purpose_codes", purposeCode);
                if (isCheckOrderInfo != null)
                {
                    checkQueueData.Add("isCheckOrderInfo", isCheckOrderInfo.ToString());
                }
                checkQueueData.Add("_json_att", Session.Attributes ?? "");

                var checkQueueResult = Session.NetClient.RunRequestLoop(_ => Session.NetClient.Create <GetQueueCountResponse>(HttpMethod.Post, "confirmPassenger/getQueueCountAsync", "leftTicket/init", checkQueueData, isXhr: true),
                                                                        _ => StateMessage = $"[{_}] 正在检测排队信息...."
                                                                        );
                checkQueueResult.Request.Accept = "application/json, text/javascript, */*; q=0.01";
                checkQueueResult.Send();

                if (!checkQueueResult.IsValid())
                {
                    SetPrepareOrderError("网络错误:[ASW-CQ] " + checkQueueResult.GetErrorMsg());
                    return;
                }

                if (!checkQueueResult.Result.Status)
                {
                    SetPrepareOrderError(checkQueueResult.Result.Messages.JoinAsString("").DefaultForEmpty("系统忙。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。"));
                    return;
                }
                if (checkQueueResult.Result.Data == null)
                {
                    SetPrepareOrderError(checkQueueResult.Result.Messages.JoinAsString("").DefaultForEmpty("系统返回正常,但是结果不对。可能是这次登录已经被限制,请等待几分钟再操作,或点击『注销登录』后重新登录。无法解决时请暂时改用浏览器订票。"));
                    return;
                }

                if (checkQueueResult.Result.Data.isRelogin == "Y")
                {
                    SetPrepareOrderError("登录状态异常,请重新登录。");
                    return;
                }

                WaitCount = checkQueueResult.Result.Data.countT.ToInt32();
                SetTicketCount(seatType, checkQueueResult.Result.Data.ticket);
                if (!CheckTicketCount())
                {
                    return;
                }


                if (checkQueueResult.Result.Data.op_2 == "true")
                {
                    if (OrderConfiguration.Instance.IgnoreQueueError)
                    {
                        QueueWarning = true;
                    }
                    else
                    {
                        SetPrepareOrderError("排队人数过多,不允许提交订单。排队人数=" + (WaitCount > 0 ? WaitCount.ToString() : "<已无票>"));
                    }
                }
            }
        }