/// <summary>初始化 <see cref="TrainHbAvailableEventArgs" /> 类的新实例。</summary>
 public TrainHbAvailableEventArgs(QueryResult result, QueryResultItem resultItem, LeftTicketData ticketData, HbQueueInfoCacheItem cacheItem)
 {
     Result     = result;
     ResultItem = resultItem;
     TicketData = ticketData;
     CacheItem  = cacheItem;
 }
예제 #2
0
        public QueryResultItem SelectFromCollection(CollectionItem collectionItem, FilterDefinition <HumitureItem> filter)
        {
            try
            {
                QueryResultItem item = new QueryResultItem();

                if (_database == null)
                {
                    return(item);
                }

                var collection = _database.GetCollection <HumitureItem>(collectionItem.FullEncodedName);

                if (collection == null)
                {
                    return(item);
                }

                item.HumitureItems = collection.Find(filter).ToList();
                item.Name          = collectionItem.Name;

                return(item);
            }
            catch (Exception ex)
            {
                LoggingManager.LogError(System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }
            return(new QueryResultItem());
        }
예제 #3
0
 /// <summary>
 /// 创建 <see cref="AutoSelectResult" />  的新实例(AutoSelectResult)
 /// </summary>
 /// <param name="train"></param>
 /// <param name="seat"></param>
 /// <param name="count"></param>
 /// <param name="passengers"></param>
 public AutoSelectResult(QueryResultItem train, char seat, int count, PassengerInTicket[] passengers)
 {
     Train      = train;
     Seat       = seat;
     Count      = count;
     Passengers = passengers;
 }
예제 #4
0
 private EFontAwesomeIcon BestFittingIcon(QueryResultItem result)
 {
     return(result.ResultType switch
     {
         ResultType.Directory => EFontAwesomeIcon.Regular_Folder,
         ResultType.File => BestFileIcon(result),
         ResultType.Unknown => EFontAwesomeIcon.Solid_Question,
         ResultType.Volume => EFontAwesomeIcon.Regular_Hdd,
         _ => EFontAwesomeIcon.Solid_Question
     });
예제 #5
0
        protected OrderSubmitDialogUiBase(Session session, QueryResultItem train, char seat, IEnumerable <PassengerInTicket> passengers, QueryParam queryParam, bool byAuto)
            : base(session, train, seat, passengers, queryParam, byAuto)
        {
            InitializeComponent();

            Load += (s, e) =>
            {
                InitUI();
            };
        }
예제 #6
0
        /// <summary>
        /// 查询车次停靠站信息
        /// </summary>
        /// <param name="train"></param>
        /// <param name="fromStatCode"></param>
        /// <param name="toStatCode"></param>
        /// <param name="depDate"></param>
        public void Query(QueryResultItem train)
        {
            if (IsBusy)
            {
                return;
            }

            _operation = AsyncOperationManager.CreateOperation(null);
            ThreadPool.QueueUserWorkItem(_ => QueryInternal(train));
        }
예제 #7
0
 /// <summary>
 /// 创建 <see cref="QueryResultListViewItem" />  的新实例(QueryResultListViewItem)
 /// </summary>
 public QueryResultListViewItem(QueryResultItem resultItem, Font[] font, bool showStartEndStation = false, QueryResultItem originalItem = null)
     : base(CreateSubItems(resultItem, font, showStartEndStation, originalItem), 0)
 {
     _showStartEndStation    = showStartEndStation;
     _resultItem             = resultItem;
     _originalItem           = originalItem;
     UseItemStyleForSubItems = false;
     RefreshIcon();
     _fonts = font;
 }
 /// <summary>
 /// 创建 <see cref="TrainToStationNameSubItem" />  的新实例(SubItemBase)
 /// </summary>
 public TrainToStationNameSubItem(QueryResultItem resultItem, Font[] font)
     : base(resultItem, font)
 {
     if (resultItem != null)
     {
         Text = resultItem.ToStation.StationName + "\n" + resultItem.ToStation.ArriveTime.Value.ToString("HH:mm");
     }
     else
     {
         Text = "数据\n无效";
     }
 }
예제 #9
0
        public SubmitOrder(Session session, QueryResultItem train, Entity.QueryParam query, char seat, IEnumerable <PassengerInTicket> passengers, bool byAuto)
            : base(session, train, seat, passengers, query, byAuto)
        {
            InitializeComponent();
            Icon = Properties.Resources.shoppingcart;

            tc.InitSession(session);
            ps.InitSession(session);
            //VerifyCodeBox = verifyCodeBox1;
            AttachVerifyCodeControl(tc);

            if (Session == null)
            {
                return;
            }

            Resign = Query.Resign;

            _config = Configuration.SubmitOrder.Current;

            //初始化票类型
            _validTicketTypes = new Dictionary <int, string>();
            if (Query.QueryStudentTicket)
            {
                _validTicketTypes.Add(3, "学生票");
            }
            else
            {
                _validTicketTypes.Add(1, "成人票");
                _validTicketTypes.Add(2, "儿童票");
                _validTicketTypes.Add(3, "学生票");
                _validTicketTypes.Add(4, "残军票");
            }
            //初始化席别类型
            var allSeatCodes = Train.TicketCount.Keys.Where(s => Train.TicketCount[s].Count > 0 && ParamData.SeatTypeFull.ContainsKey(s)).Select(s => Train.FindCorrectSeat(s)).Where(s => s != 0).Distinct().ToArray();

            _validSeatTypes = allSeatCodes.ToDictionary(s => s, s => ParamData.SeatTypeFull[s]);
            //_validSeatTypesInTicket = _validTicketTypes.Keys.ToDictionary(s => s, s => allSeatCodes);

            _worker = new SubmitOrderWorker(Session, Train, Query);
            //_ticketQueryWorker = new TicketQueryWorker(null, Query);
            _queueWorker          = new QueueOrderWorker(Session);
            _queueWorker.TourFlag = "dc";

            AttachWorker(_worker, _queueWorker);

            //初始化事件
            InitEditor();
            InitSubmit();

            PostInitialize();
        }
예제 #10
0
 /// <summary>
 /// 创建 <see cref="TrainFromStationNameSubItem" />  的新实例(SubItemBase)
 /// </summary>
 public TrainFromStationNameSubItem(QueryResultItem resultItem, Font[] font)
     : base(resultItem, font)
 {
     if (resultItem != null)
     {
         Text = resultItem.FromStation.StationName + "\n" + resultItem.FromStation.DepartureTime.Value.ToString("HH:mm");
     }
     else
     {
         Text = "数据\n无效";
     }
     //var vi = new BetterListViewItem(resultItem.From.StationName + "\n" + resultItem.From.DepartureTime.Value.ToString("HH:mm"));
 }
예제 #11
0
        public EverythingResult(QueryResultItem item) : base(
                item.ResultType != ResultType.Directory ? item.Name : Path.GetFileName(item.FullPath),
                item.FullPath
                )
        {
            _item = item;

            Options.Add(new RunAsAdminOption(item.FullPath));

            if (item.ResultType == ResultType.File)
            {
                Options.Add(new OpenLocationOption(item.FullPath));
            }
        }
예제 #12
0
 /// <summary>
 /// 创建 <see cref="TrainToStationDateSubItem"/>  的新实例(TrainToStationDateSubItem)
 /// </summary>
 public TrainToStationDateSubItem(QueryResultItem resultItem, Font[] font)
     : base(resultItem, font)
 {
     var(days, strinfo) = resultItem.ElapsedTimeInfo;
     if (days > 0)
     {
         Text = ("第" + (days + 1).ToString("#0") + "天");
     }
     else
     {
         Text = ("当天");
     }
     Text += "\n" + strinfo;
 }
예제 #13
0
        /// <summary>
        /// 查询车次停靠站信息
        /// </summary>
        /// <param name="train"></param>
        public void QueryInternal(QueryResultItem train)
        {
            var trainid          = train.Id;
            var fromStatCode     = train.FromStation.Code;
            var toStatCode       = train.ToStation.Code;
            var depDate          = train.FromStation.DepartureTime.Value;
            var firstStationTime = train.StartStation.DepartureTime;

            var data = new
            {
                train_no = trainid,
                from_station_telecode = fromStatCode,
                to_station_telecode   = toStatCode,
                depart_date           = depDate.ToString("yyyy-MM-dd")
            };

            var task = Session.NetClient.Create <TrainStopResponse>(HttpMethod.Get, "czxx/queryByTrainNo",
                                                                    "leftTicket/init", data).Send();

            if (task == null || !task.IsSuccess || task.Result?.Data?.Data == null)
            {
                Error   = task?.Exception;
                Success = false;

                if (_operation == null)
                {
                    OnLoadFailed();
                }
                else
                {
                    _operation.PostOperationCompleted(_ => OnLoadFailed(), null);
                }
            }
            else
            {
                Result = task.Result.Data.Data;
                Result.ApplyTime(train, firstStationTime, depDate);

                Success = true;
                if (_operation == null)
                {
                    OnLoadComplete();
                }
                else
                {
                    _operation.PostOperationCompleted(_ => OnLoadComplete(), null);
                }
            }
        }
        public void AddDisableTicketData(QueryResultItem train)
        {
            var key = CreateTicketDataSign(train);

            lock (_cache)
            {
                if (_cache.ContainsKey(key))
                {
                    _cache[key].Enqueue(DateTime.Now);
                }
                else
                {
                    _cache.Add(key, new Queue <DateTime>(new[] { DateTime.Now }));
                }
            }
        }
        /// <summary>
        /// 创建 <see cref="SubItemBase" />  的新实例(SubItemBase)
        /// </summary>
        public TrainMemoSubItem(QueryResultItem resultItem, Font[] font)
            : base(resultItem, font)
        {
            Font      = font.Last();
            ForeColor = Color.Chocolate;

            var feature = new List <string>(3);

            if (!resultItem.HasAc)
            {
                feature.Add("无空调");
            }
            if (resultItem.SupportIdCard)
            {
                feature.Add("可身份证进站");
            }
            if (resultItem.CanExchangeByCredit)
            {
                feature.Add("可积分兑换");
            }

            //起售信息?
            if (!resultItem.IsAvailable && resultItem.BeginSellTime != null)
            {
                //查找高级软卧并显示
                var tip = resultItem.BeginSellTime.Value == DateTime.MinValue ? "不在预售期里啊.." : new[]
                {
                    resultItem.BeginSellTime.Value.MakeDateFriendly(),
                    resultItem.BeginSellTime.Value.Hour + "点",
                    (resultItem.BeginSellTime.Value.Minute > 0 ? resultItem.BeginSellTime.Value.Minute + "分" : ""),
                    "起售"
                }.Where(s => !string.IsNullOrEmpty(s)).JoinAsString("");

                feature.Add(tip);
            }
            if (!resultItem.IsAvailable && resultItem.IsLimitSell)
            {
                //暂售
                feature.Add(resultItem.ButtonTextInfo);
            }


            //
            Text = feature.JoinAsString("\n");
        }
        public bool IsTicketDataDisabledExists(QueryResultItem train)
        {
            var key = CreateTicketDataSign(train);
            Queue <DateTime> queue;

            if (!_cache.TryGetValue(key, out queue))
            {
                return(false);
            }

            if (queue.Count >= OrderConfiguration.Instance.SubmitFailedNoTicketControlRate)
            {
                queue.Enqueue(DateTime.Now);
                return(true);
            }

            return(false);
        }
예제 #17
0
        static BetterListViewSubItem[] CreateSubItems(QueryResultItem result, Font[] font, bool showStartEndStation, QueryResultItem originalItem = null)
        {
            var array = new BetterListViewSubItem[]
            {
                new TrainCodeSubItem(result, font),
                showStartEndStation ? new StartOrEndStation(result, font, true) : null,
                new TrainFromStationNameSubItem(result, font),
                new TrainToStationNameSubItem(result, font),
                showStartEndStation ? new StartOrEndStation(result, font, false) : null,
                new TrainToStationDateSubItem(result, font)
            }.ExceptNull().ToArray();

            //var baseTicketPriceIndex = array.Length;

            array = array.Concat(Configuration.QueryViewConfiguration.Instance.SeatOrder.Select(s => new TicketCellSubItem(result, s, font)))
                    .Concat(new[] { new TrainMemoSubItem(result, font) })
                    .ToArray();
            return(array);
        }
예제 #18
0
        protected OrderSubmitDialogBase(Session session, QueryResultItem train, char seat, IEnumerable <PassengerInTicket> passengers, QueryParam queryParam, bool byAuto)
        {
            InitSession(session);
            Train              = train;
            OriginalSeat       = seat;
            Seat               = train.FindCorrectSeat(seat);;
            PassengerInTickets = queryParam.PrepareTicketInfoForPassengers(train, passengers, Seat);
            Query              = queryParam;

            if (Program.IsRunning)
            {
                Icon = MainForm.Instance.Icon;
                if (byAuto)
                {
                    QueryResumeManager.Controller.Instance[session].Register(this);
                }
            }
            Session.Logout += Session_Logout;
            Session.QueueOrderCancelled += Session_QueueOrderCancelled;
            CaptchaLoaded += OrderSubmitDialogBase_CaptchaLoaded;
            OnOrderDialogOpen(this);

            //冲突检测
            OrderDialogOpen += OrderSubmitDialogBase_OrderDialogOpen;
            FormClosing     += (s, e) =>
            {
                if (PreventCloseFlag)
                {
                    this.ShowToast("窗口正在忙碌...请等待当前操作完成后再关闭。");
                    e.Cancel = true;
                    return;
                }

                IsFormClosed = true;
                _safeTimer?.Stop();
                Session.Logout              -= Session_Logout;
                OrderDialogOpen             -= OrderSubmitDialogBase_OrderDialogOpen;
                Session.QueueOrderCancelled -= Session_QueueOrderCancelled;
            };

            //安全期
            InitSafeTimer();
        }
예제 #19
0
        /// <summary>
        /// 创建 <see cref="TrainToStationNameSubItem" />  的新实例(SubItemBase)
        /// </summary>
        public StartOrEndStation(QueryResultItem resultItem, Font[] font, bool start)
            : base(resultItem, font)
        {
            _start = start;
            if (resultItem == null || (start && resultItem.FromStation.IsFirst) || (!start && resultItem.ToStation.IsEnd))
            {
                Text = "";
            }
            else
            {
                if (start)
                {
                    Text = resultItem.StartStation.StationName;
                }
                else
                {
                    Text = resultItem.EndStation.StationName;
                }
            }

            ForeColor = Configuration.QueryViewConfiguration.Instance.StartEndStationColor;
        }
예제 #20
0
        public (bool allow, string message) CanAdd(QueryResultItem train, char seat)
        {
            //已经添加过?
            if (Items.Any(s => s.Train.Id == train.Id && s.Seat == seat && s.Train.Date == train.Date))
            {
                return(false, "已经在候选列表中");
            }

            if (seat == '0' || seat == '*')
            {
                return(false, "无座或其它不可候补");
            }

            if (Items.Count == 4)
            {
                return(false, "不能超过四个候选");
            }

            var dates = Items.Select(s => s.Train.QueryResult.Date).Concat(new[] { train.QueryResult.Date }).Distinct().ToArray();

            if (dates.Length > 2)
            {
                return(false, "候补最多只能选择两个日期");
            }

            if (dates.Length == 2 && Math.Round((dates[1] - dates[0]).TotalDays) > 1)
            {
                return(false, "候补订单日期必须相邻");
            }

            //每日只能选择两个组合
            if (Items.Select(s => s.Train.QueryResult.Date).Concat(new[] { train.QueryResult.Date }).GroupBy(s => s).Any(s => s.Count() > 2))
            {
                return(false, "每日选择的车次+席别组合不能超过两个");
            }

            return(true, null);
        }
예제 #21
0
        public FastSubmitOrder(Session session, QueryResultItem train, char seat, IEnumerable <PassengerInTicket> passengers, QueryParam queryParam, bool byAuto)
            : base(session, train, seat, passengers, queryParam, byAuto)
        {
            InitializeComponent();

            //vc.InitSession(session);
            tc.InitSession(session);
            tc.ResizeParent(this, ProgramConfiguration.Instance.CaptchaZoom, ClientSize.Width - tc.Width - tc.Location.X - 10 - 10);

            //VerifyCodeBox = vc;
            AttachVerifyCodeControl(tc);
            VerifyCodeBox.RandType = RandCodeType.Randp;
            //imglist.Images.Add(FSLib.Windows.Utility.Get24PxImageFrom16PxImg(Properties.Resources.user_16));

            PostInitialize();

            tc.EnableAutoVc = ProgramConfiguration.Instance.AutoSubmitOrderVcCode && Query.EnableAutoVC && VerifyCodeRecognizeServiceLoader.VerifyCodeRecognizeEngine?.IsLoggedIn == true;

            //TODO: 快速下单模式
            _submitWoker = Query.Resign || Query.TemporaryDisableFastSubmitOrder || !ApiConfiguration.Instance.EnableAutoSubmitAPI ? (SubmitOrderBase) new SubmitOrderWorker(Session, Train, Query)
            {
                Passengers = PassengerInTickets.ToArray()
            } : new AutoSubmitWorker(Session, Train, Query, PassengerInTickets.ToArray())
            {
            };
            _queueWorker = new QueueOrderWorker(Session)
            {
                TourFlag = "dc"
            };

            AttachWorker(_submitWoker, _queueWorker);

            Load += async(x, y) =>
            {
                await PrepareOrderAsync().ConfigureAwait(true);
            };
        }
예제 #22
0
        public void ShowTrain(QueryResultItem train)
        {
            Train          = train;
            pTools.Enabled = false;
            if (train == null)
            {
                pLoading.Visible = false;
                dgv.DataSource   = null;
                return;
            }

            dgv.DataSource = null;

            pInfo.Text = $"<b><font color='Red'>{train.Code}</font></b> <b>{train.StartStation.StationName}</b>-&gt;<b>{train.EndStation.StationName}</b>   ";
            if (train.IsTicketStationInfoLoaded)
            {
                LoadStopInfo();
            }
            else
            {
                var worker = new QueryTrainStopInfoWorker
                {
                    Session = Session
                };
                worker.LoadComplete += worker_LoadComplete;
                worker.LoadFailed   += worker_LoadFailed;

                pLoading.ForeColor = SystemColors.ControlText;
                pictureBox1.Image  = Properties.Resources._16px_loading_1;
                lblStatus.Text     = "正在查询中...ヽ(≧Д≦)ノ";
                pLoading.BringToFront();
                pLoading.Show();

                //获得数据
                worker.Query(train);
            }
        }
 /// <summary>
 /// 创建 <see cref="SubmitOrderWorker" />  的新实例(SubmitOrderWorker)
 /// </summary>
 public SubmitOrderWorker(Session session, QueryResultItem train, QueryParam query)
     : base(session, train, query)
 {
 }
예제 #24
0
 /// <summary>
 /// 判断指定的选项是否符合规则。
 /// </summary>
 /// <param name="query">当前的查询</param>
 /// <param name="result">当前的结果</param>
 /// <param name="currentItem">当前的车次</param>
 /// <param name="ticket">当前的车票</param>
 /// <returns>
 /// 如果返回 <see langword="true" />,则说明此记录符合结果,将会继续处理;否则则会跳过
 /// </returns>
 public bool IsMatch(QueryParam query, QueryResult result, QueryResultItem currentItem, LeftTicketData ticket)
 {
     return((ticket.Count >= Count) ^ IsLessThan);
 }
예제 #25
0
        public OrderNotification(Session session, QueryParam query, QueryResultItem train, IEnumerable <PassengerInTicket> passengers, string error, string orderid)
        {
            _query      = query;
            _train      = train;
            _passengers = passengers;
            _error      = error;
            _orderid    = orderid;
            InitializeComponent();

            InitSession(session);
            Icon = Properties.Resources.icon_warning;
            imglist.Images.Add(UiUtility.Get24PxImageFrom16PxImg(Properties.Resources.user_16));

            lblTrainCode.Text = train.Code;
            lblDate.Text      = train.FromStation.DepartureTime.Value.ToString("M月d日");
            lblFrom.Text      = train.FromStation.StationName;
            lblTo.Text        = train.ToStation.StationName;
            lblTimeInfo.Text  = lblTimeInfo.Text.FormatWith(
                train.FromStation.DepartureTime.Value.ToString("HH:mm"),
                train.ToStation.ArriveTime.Value.ToString("HH:mm"),
                train.ElapsedTime.ToString("dd'天'hh'时'mm'分'"));

            if (passengers != null)
            {
                lstPas.Items.AddRange(passengers.Select(s => new ListViewItem(new[]
                {
                    ParamData.GetTicketType(s.TicketType).DisplayName,
                    ParamData.SeatTypeFull[s.SeatType],
                    s.Name,
                    ParamData.PassengerIdType[s.IdType],
                    s.IdNo
                })
                {
                    ImageIndex = 0
                }).ToArray());
            }

            if (string.IsNullOrEmpty(error))
            {
                Gif.SetSuccessImage(pbAnimate);
                lblError.ForeColor = Color.RoyalBlue;
                lblError.Text      = "订票成功!订单号为:" + orderid.DefaultForEmpty("<未知>") + ",请尽快付款!如果订单没有立刻查询到,请刷新订单列表!";

                btnOK.Click += btnOK_Click;
                btnOK.Text   = "乖~~戳我去付款啦~~要截图留念请速度并打码哦 ლ(^o^ლ) ";

                Operation.Instance.PlayMusicForSuccess();
            }
            else
            {
                lblError.Text = error;
                btnOK.Text    = "同学不哭,站起来擦干眼泪继续刷 ლ(╹◡╹ლ)";
                Gif.SetFailedImage(pbAnimate);
                btnOK.Click += (s, e) => Close();

                if (error.IndexOf("未完成") != -1)
                {
                    session.OnRequestShowPanel(PanelIndex.Orders);
                    session.OnOrderChanged();
                }
            }

            if (ProgramConfiguration.Instance.OrderDlgCenterMainform)
            {
                UiUtility.PlaceFormAtCenter(this, show: false);
            }
            else
            {
                StartPosition = FormStartPosition.CenterScreen;
            }
            FormPlacementManager.Instance.Control(this);

            Load += async(s, e) =>
            {
                WindowState = FormWindowState.Normal;
                BringToFront();
                Activate();

                if (_error.IsNullOrEmpty())
                {
                    await CheckNotification().ConfigureAwait(true);
                    await SendWebNotification().ConfigureAwait(true);
                }
            };
        }
 string CreateTicketDataSign(QueryResultItem item)
 {
     return(item.Id + item.TicketCount.OrderBy(s => s.Key).Select(s => s.Key + s.Value.Count).JoinAsString(""));
 }
 static string GetPrefix(QueryResultItem item)
 {
     return($"{item.QueryResult.Date:yyyyMMdd}{item.Id}");
 }
예제 #28
0
 /// <summary>
 /// 创建 <see cref="TrainAlterToStationName" />  的新实例(SubItemBase)
 /// </summary>
 public TrainAlterToStationName(QueryResultItem resultItem, Font[] font)
     : base(resultItem, font)
 {
     Text = resultItem.ToStation.StationName + "\n" + resultItem.ToStation.ArriveTime.Value.ToString("HH:mm");
 }
예제 #29
0
 /// <summary>
 /// 创建 <see cref="SubmitOrderWorker" />  的新实例(SubmitOrderWorker)
 /// </summary>
 public SubmitOrderBase(Session session, QueryResultItem train, TOBA.Entity.QueryParam query)
     : base(session)
 {
     Train = train;
     Query = query;
 }
 /// <summary>
 /// 创建 <see cref="TicketCellSubItem"/>  的新实例(TicketCellSubItem)
 /// </summary>
 public TicketCellSubItem(QueryResultItem resultItem, char code, Font[] font)
     : base(resultItem, font)
 {
     Code = code;
     Bind();
 }