/// <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); }
/// <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); }