コード例 #1
0
        /// <summary>
        /// 检查是否可以进行查询
        /// </summary>
        /// <returns></returns>
        public string CanQuery()
        {
            var lastResult = LastQueryResult;

            LastQueryResult = null;

            if (FromStationCode.IsNullOrEmpty())
            {
                return("请选择始发站");
            }
            if (ToStationCode.IsNullOrEmpty())
            {
                return("请选择到达站");
            }
            //日期
            if (!QueryStudentTicket && !ParamData.IsCommonTicketSell(CurrentDepartureDate))
            {
                AppContext.HostForm.ShowToast("超出预售期,无法正常查询,仅供12306系统维护期间值守查询用。", backColor: System.Drawing.Color.DarkRed, glowColor: eToastGlowColor.Red, timeout: 2000);
            }
            //席别选择有误
            if (SelectedSeatClass.Count > 0 && EnableAutoPreSubmit && AutoPreSubmitConfig.SeatList.Count > 0 && AutoPreSubmitConfig.SeatList.Any(s => !SelectedSeatClass.Contains(s)))
            {
                var seats = AutoPreSubmitConfig.SeatList.Except(SelectedSeatClass).ToArray();

                seats.ForEach(s => SelectedSeatClass.Add(s));
            }
            //出发时间和到达时间
            if (DepartureTimeTo < DepartureTimeFrom)
            {
                return("出发时间的结束时间不得大于开始时间");
            }
            if (ArriveTimeTo < ArriveTimeFrom)
            {
                return("到达时间的结束时间不得大于开始时间");
            }

            //学生票?
            if (QueryStudentTicket && (IsAutoSubmitEnabled && AutoPreSubmitConfig.Passenger.Any(s => s.TicketType != 3)))
            {
                return("选择了查询学生票,可是为嘛儿添加的乘客不全是学生嘞,你个臭流氓 o(>_<)o ~~");
            }

            LastQueryResult = lastResult;

            return(null);
        }
コード例 #2
0
        /// <summary>
        /// 返回按照要求进行过滤的结果
        /// </summary>
        /// <param name="trainList"></param>
        /// <returns></returns>
        public AutoSelectResult FindMatchedTrain(IEnumerable <QueryResultItem> trainList, out AutoSelectStat stat, bool forceAutoSelect = false)
        {
            stat = null;

            if (trainList?.Any() != true)
            {
                return(null);
            }

            var cfg = AutoPreSubmitConfig;

            stat = new AutoSelectStat();

            //过滤可用的车次以及secureStr已经被禁用的车次
            IEnumerable <QueryResultItem> trainQuery = trainList;

            //如果已选择车次,则过滤没有选择的车次并进行排序
            if (!forceAutoSelect && EnableAutoPreSubmit)
            {
                if (AutoPreSubmitConfig.TrainReg.Count > 0)
                {
                    trainQuery = trainQuery.Select(s =>
                    {
                        return(new KeyValuePair <int, QueryResultItem>(
                                   AutoPreSubmitConfig.TrainReg.FindIndex(x => x.IsMatch(s.Code)),
                                   s
                                   ));
                    }).Where(s => s.Key >= 0).OrderBy(s => s.Key).Select(s => s.Value).ToArray();
                }

                var flag1 = trainQuery.Any();                   //是否有车次
                //如果已选择席别,则忽略没有指定席别的车次
                if (AutoPreSubmitConfig.SeatList.Count > 0)
                {
                    trainQuery = trainQuery.Where(s => AutoPreSubmitConfig.SeatListForSelect.Any(x => s.TicketCount.ContainsKey(x))).ToArray();
                }

                var flag2 = trainQuery.Any();

                if (flag1 && !flag2)
                {
                    stat.IsTrainSeatMismatch = true;
                }
            }

            //过滤不可订票以及车票黑数据
            trainQuery = trainQuery.Where(s => s.IsAvailable && !IsTrainTicketDataDisabled(s));

            //过滤可能无效的车次
            if (IgnoreIllegalData)
            {
                trainQuery = trainQuery.Where(s => !s.AlmostIllegalResult);
            }
            var trains       = trainQuery.ToArray();
            var pasCount     = cfg.Passenger.Count;
            var selectedSeat = SelectedSeatClass?.Select(ParamData.GetSeatCompatibleMap).ExceptNull().SelectMany(s => s).Distinct().ToArray();
            var seatOrder    = AutoPreSubmitConfig.SeatList.Count == 0 ? Configuration.SubmitOrder.Current.DefaultSeatPreferOrder.Where(s => (selectedSeat?.Length ?? 0) == 0 || selectedSeat.Contains(s)).ToArray() : AutoPreSubmitConfig.SeatListForSelect.Where(s => (selectedSeat?.Length ?? 0) == 0 || selectedSeat.Contains(s)).ToArray();

            Dictionary <bool, Tuple <QueryResultItem, LeftTicketData, int, bool>[]>[] data;

            if (cfg.SeatFirst)
            {
                //席别优先,先过滤所有车次并生成候选列表
                //按照席别顺序找,每个席别里优先找车票最多的
                data = seatOrder.Select(seat =>
                {
                    var rules   = AutoPreSubmitConfig.SeatCheckRules.GetValue(seat);
                    var tTrains = trains.Select(x =>
                    {
                        var ticket = x.TicketCount.GetTicketData(seat, false);
                        if (ticket == null || ticket.NotAvailable || ticket.NotSell || ticket.NoTicket)
                        {
                            return(null);
                        }

                        var count = ticket.TicketForCompute;
                        if (count < pasCount && !AutoPreSubmitConfig.EnablePartialSubmit)
                        {
                            return(null);
                        }
                        //规则限制
                        if (rules?.Any(yx => !yx.IsMatch(this, null, x, ticket)) == true)
                        {
                            return(null);
                        }

                        return(Tuple.Create(x, ticket, ticket.TicketForCompute, pasCount <= ticket.TicketForCompute));
                    }).ExceptNull().GroupBy(x => x.Item4).ToDictionary(x => x.Key, x => cfg.AutoSelectTrain ? x.OrderByDescending(y => y.Item3).ToArray() : x.ToArray());

                    return(tTrains);
                }).ToArray();
            }
            else
            {
                //车次优先。按照trains的顺序查找,每个车次里面选定所有席别,选择优先保证全部提交的席别。
                data = trains.Select(train =>
                {
                    return(seatOrder.Select(seat =>
                    {
                        var rules = AutoPreSubmitConfig.SeatCheckRules.GetValue(seat);
                        var ticket = train.TicketCount.GetTicketData(seat, false);
                        if (ticket == null || ticket.NotAvailable || ticket.NotSell || ticket.NoTicket)
                        {
                            return null;
                        }

                        var count = ticket.TicketForCompute;
                        if (count < pasCount && !AutoPreSubmitConfig.EnablePartialSubmit)
                        {
                            return null;
                        }
                        //规则限制
                        if (rules?.Any(yx => !yx.IsMatch(this, null, train, ticket)) == true)
                        {
                            return null;
                        }

                        return Tuple.Create(train, ticket, ticket.TicketForCompute, pasCount <= ticket.TicketForCompute);
                    }).ExceptNull().GroupBy(x => x.Item4).ToDictionary(x => x.Key, x => cfg.AutoSelectTrain ? x.OrderByDescending(y => y.Item3).ToArray() : x.ToArray()));;
                }).ToArray();
            }

            {
                //找第一个满足要求的车次
                var tTrain = data.Select(s => s.GetValue(true)?.FirstOrDefault()).ExceptNull().FirstOrDefault()
                             ?? data.Select(s => s.GetValue(false)?.FirstOrDefault()).ExceptNull().FirstOrDefault();
                if (tTrain != null)
                {
                    pasCount = Math.Min(pasCount, tTrain.Item3);
                    return(new AutoSelectResult(tTrain.Item1, tTrain.Item2.Code, pasCount, AutoPreSubmitConfig.Passenger.Take(pasCount).ToArray()));
                }
            }

            return(null);
        }