public SearchResult SearchToursWithPriceForMen(int cityKeyFrom, int countryKey, List <int> tourKeys, List <DateTime> tourDates, List <int> tourNights, List <int> hotelKeys, List <int> pansionKeys, List <int> roomTypeKeys, QuotesStates hotelQuotaMask, QuotesStates aviaQuotaMask, int rateKey, uint?maxTourPrice, ushort rowsPerPage, uint rowCounterFrom, SortingColumn sortingColumn, SortingDirection sortingDirection, FlightTicketState flightTicketState) { if (!IsCountryPriceForMen(countryKey)) { throw new ApplicationException( "Данная страна посчитана с ценами за номер. Используйте для поиска метод SearchToursWithRoomPrice."); } // ReSharper disable RedundantNameQualifier Seemplexity.Services.Wcf.ToursSearch.DataModel.SearchResult searchResult; // ReSharper restore RedundantNameQualifier using (var mtsDc = new MtSearchDbDataContext()) { using (var mtmDc = new MtMainDbDataContext()) { searchResult = // ReSharper disable RedundantNameQualifier new Seemplexity.Services.Wcf.ToursSearch.DataModel.SearchResult(mtsDc.PagingOnClient(mtmDc, // ReSharper restore RedundantNameQualifier cityKeyFrom, countryKey, tourKeys, tourDates, tourNights, hotelKeys, pansionKeys, null, null, null, null, roomTypeKeys, (QDSearch.DataModel.QuotesStates)hotelQuotaMask, (QDSearch.DataModel.QuotesStates)aviaQuotaMask, rateKey, maxTourPrice, rowsPerPage, rowCounterFrom, new Tuple <QDSearch.DataModel.SortingColumn, QDSearch.DataModel.SortingDirection>( (QDSearch.DataModel.SortingColumn)sortingColumn, (QDSearch.DataModel.SortingDirection)sortingDirection))); } } return(searchResult); }
/// <summary> /// Возвращает список всех QuotaParts's /// </summary> /// <param name="dc">Контекст базы данных</param> /// <returns></returns> public static List <QuotaPart> GetAllQuotaParts(this MtSearchDbDataContext dc) { List <QuotaPart> quotaParts; if ((quotaParts = CacheHelper.GetCacheItem <List <QuotaPart> >(TableName)) != null) { return(quotaParts); } lock (LockQuotaParts) { if ((quotaParts = CacheHelper.GetCacheItem <List <QuotaPart> >(TableName)) != null) { return(quotaParts); } quotaParts = (from qp in dc.QuotaParts where qp.QP_Date >= DateTime.Now.Date select qp) .ToList <QuotaPart>(); CacheHelper.AddCacheData(TableName, quotaParts, null, Globals.Settings.Cache.MediumCacheTimeout); } return(quotaParts); }
/// <summary> /// Возвращает список квот по заданным параметрам /// </summary> /// <param name="dc">Контекст базы данных</param> /// <param name="serviceClass">Класс услуги</param> /// <param name="code">Code услуги (для авиаперелетов - Charter, для проживания - ключ отеля)</param> /// <param name="subCode1">SubCode1 услуги, для перелета - класс, для проживания - тип номера (Room)</param> /// <param name="subCode2">SubCode1 услуги, для перелета - не используется, для проживания - категория номера (RoomCategory)</param> /// <param name="partnerKey">Ключ партнера по услуге</param> /// <param name="date">Дата проверки квоты</param> /// <param name="agentKey">Ключ агентства</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> public static List <QuotaPlain> GetPlainQuotasObjects(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code, Int32 subCode1, Int32?subCode2, Int32 partnerKey, int?agentKey, DateTime date, out string hash) { hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code, CacheHelper.GetCacheKeyHashed(new[] { partnerKey.ToString(), agentKey.ToString(), subCode1.ToString(), subCode2.ToString(), date.ToString("yyyy-MM-dd") })); List <QuotaPlain> result; if ((result = CacheHelper.GetCacheItem <List <QuotaPlain> >(hash)) != null) { return(result); } string cacheDep; result = (from pq in dc.GetPlainQuotasObjects(serviceClass, code, out cacheDep) where (pq.PartnerKey <= 0 || pq.PartnerKey == partnerKey) && ((agentKey != null && (pq.AgentKey == agentKey.Value || pq.AgentKey == 0)) || (agentKey == null && pq.AgentKey == 0)) && (pq.SubCode1 <= 0 || pq.SubCode1 == subCode1) && (subCode2 == null || pq.SubCode2 <= 0 || pq.SubCode2 == subCode2.Value) && (pq.Date == date) select pq) .ToList(); CacheHelper.AddCacheData(hash, result, new List <string>() { cacheDep }, Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Получение списка всех стопов на перелеты /// </summary> /// <param name="dc">Контекст базы данных</param> /// <returns></returns> public static List <StopAvia> GetAllStopAvia(this MtSearchDbDataContext dc) { List <StopAvia> stopAvia; if ((stopAvia = CacheHelper.GetCacheItem <List <StopAvia> >(TableName)) != default(List <StopAvia>)) { return(stopAvia); } lock (LockStopAvia) { if ((stopAvia = CacheHelper.GetCacheItem <List <StopAvia> >(TableName)) != default(List <StopAvia>)) { return(stopAvia); } stopAvia = (from s in dc.StopAvias where s.SA_DEND >= DateTime.Now.Date select s) .ToList <StopAvia>(); CacheHelper.AddCacheData(TableName, stopAvia, TableName); } return(stopAvia); }
/// <summary> /// Возвращает список всех отелей /// </summary> /// <param name="dc">Контекст базы данных</param> /// <returns></returns> public static List <tbl_Country> GetAllCountries(this MtSearchDbDataContext dc) { List <tbl_Country> countries; if ((countries = CacheHelper.GetCacheItem <List <tbl_Country> >(TableName)) != default(List <tbl_Country>)) { return(countries); } lock (LockCountries) { if ((countries = CacheHelper.GetCacheItem <List <tbl_Country> >(TableName)) != default(List <tbl_Country>)) { return(countries); } countries = (from c in dc.tbl_Countries select c) .ToList <tbl_Country>(); CacheHelper.AddCacheData(TableName, countries, TableName); } return(countries); }
public static IList <Tuple <int, string> > GetCharterScheduleCountriesTo(this MtSearchDbDataContext dc, out string hash) { List <Tuple <int, string> > result; hash = String.Format("{0}", MethodBase.GetCurrentMethod().Name); if ((result = CacheHelper.GetCacheItem <List <Tuple <int, string> > >(hash)) != null) { return(result); } string hashOut; var cacheDependencies = new List <string>(); var charterKeys = dc.GetAllCharterKeys(out hashOut); cacheDependencies.Add(hashOut); var homeCountry = dc.GetHomeCountry(out hashOut); cacheDependencies.Add(hashOut); result = (from ch in dc.GetAllCharters() join ct in dc.GetAllCities() on ch.CH_CITYKEYTO equals ct.CT_KEY join cn in dc.GetAllCountries() on ct.CT_CNKEY equals cn.CN_KEY where charterKeys.Contains(ch.CH_KEY) && cn.CN_KEY != homeCountry.CN_KEY select new Tuple <int, string>(cn.CN_KEY, cn.CN_NAME)) .Distinct() .ToList(); cacheDependencies.Add(CharterExtension.TableName); cacheDependencies.Add(CountriesExtension.TableName); cacheDependencies.Add(CitiesExtension.TableName); return(result); }
/// <summary> /// Валюты /// </summary> /// <param name="searchDc"></param> /// <param name="currencyKey">Ключ валюты</param> /// <param name="hash"></param> /// <returns></returns> public static List <Currency> GetCurrencies(this MtSearchDbDataContext searchDc, int?currencyKey, out string hash) { List <Currency> result; hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name, currencyKey); if ((result = CacheHelper.GetCacheItem <List <Currency> >(hash)) != null) { return(result); } result = new List <Currency>(); if (currencyKey == null) { result.AddRange(searchDc.GetCurrencies().Select(c => new Currency { Id = c.Key, Name = c.Value }).ToList()); } else { var currency = searchDc.GetCurrencies().Where(c => c.Key == currencyKey.Value).Select(c => new Currency { Id = c.Key, Name = c.Value }).SingleOrDefault(); if (currency != null) { result.Add(currency); } } CacheHelper.AddCacheData(hash, result, null, Globals.Settings.Cache.LongCacheTimeout); return(result); }
public static IList <CharterSchedulePlainInfo> GetCharterSchedules(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, int cityKeyFrom, int cityKeyTo, out string hash) { List <CharterSchedulePlainInfo> result; hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, cityKeyFrom, cityKeyTo); if ((result = CacheHelper.GetCacheItem <List <CharterSchedulePlainInfo> >(hash)) != null) { return(result); } result = new List <CharterSchedulePlainInfo>(); string hashOut; var cacheDependencies = new List <string>(); var charterKeys = dc.GetAllCharterKeys(out hashOut); cacheDependencies.Add(hashOut); var chartersTo = (from a in dc.GetAllAirSeasons() join ch in dc.GetAllCharters() on a.AS_CHKEY equals ch.CH_KEY where charterKeys.Contains(ch.CH_KEY) && ch.CH_CITYKEYFROM == cityKeyFrom && ch.CH_CITYKEYTO == cityKeyTo && a.AS_DATEFROM.HasValue && a.AS_DATETO.HasValue && a.AS_TIMEFROM.HasValue && a.AS_TIMETO.HasValue select new CharterSchedulePlainInfoInternal(a.AS_ID, ch.CH_KEY, a.AS_DATEFROM.Value, a.AS_DATETO.Value, a.AS_WEEK, a.AS_TIMEFROM.Value, a.AS_TIMETO.Value, ch.CH_PORTCODEFROM, ch.CH_PORTCODETO, ch.CH_AIRLINECODE, ch.CH_FLIGHT, ch.CH_AIRCRAFT)) .Distinct() .ToList(); var chartersFrom = (from a in dc.GetAllAirSeasons() join ch in dc.GetAllCharters() on a.AS_CHKEY equals ch.CH_KEY where charterKeys.Contains(ch.CH_KEY) && ch.CH_CITYKEYFROM == cityKeyTo && ch.CH_CITYKEYTO == cityKeyFrom && a.AS_DATEFROM.HasValue && a.AS_DATETO.HasValue && a.AS_TIMEFROM.HasValue && a.AS_TIMETO.HasValue select new CharterSchedulePlainInfoInternal(a.AS_ID, ch.CH_KEY, a.AS_DATEFROM.Value, a.AS_DATETO.Value, a.AS_WEEK, a.AS_TIMEFROM.Value, a.AS_TIMETO.Value, ch.CH_PORTCODEFROM, ch.CH_PORTCODETO, ch.CH_AIRLINECODE, ch.CH_FLIGHT, ch.CH_AIRCRAFT)) .Distinct() .ToList(); cacheDependencies.Add(AirSeasonExtension.TableName); cacheDependencies.Add(CharterExtension.TableName); var seasonKeysDone = new List <int>(); foreach (var chto in chartersTo) { var chto1 = chto; var chsFrom = chartersFrom.Where(c => c.AirCraft == chto1.AirCraft && c.AirlineCode == chto1.AirlineCode && Math.Abs(c.FlightNumber - chto1.FlightNumber) == 1 && c.PortCodeFrom == chto1.PortCodeTo && c.PortCodeTo == chto1.PortCodeFrom) .ToList(); var directCharterTimesFrom = chto.CharterDates.Select(d => d.Add(chto.TimeFrom.TimeOfDay)).ToList(); foreach (var chFrom in chsFrom) { var backCharterTimesFrom = chFrom.CharterDates.Select(d => d.Add(chFrom.TimeFrom.TimeOfDay)).ToList(); var fitedDates = new List <DateTime>(); foreach (var dt in backCharterTimesFrom) { // наши перелеты совершаются с разницей меньше суток, плюч у них сходятся параметры и разнятся номера на 1 // значит скорее всего они парные, других параметров проверить их парность у нас нет fitedDates.AddRange(directCharterTimesFrom.Where(d => Math.Abs(d.Subtract(dt).TotalHours) >= 0 && Math.Abs(d.Subtract(dt).TotalHours) < 24)); } if (fitedDates.Any()) { result.Add(new CharterSchedulePlainInfo { DaysOfWeek = fitedDates.Select(d => d.DayOfWeek).Distinct().ToList(), AirlineName = chto1.AirlineCode, DateFrom = fitedDates.Min(), DateTo = fitedDates.Max(), AircraftName = chto1.AirCraft, FlightNum = chto1.AirlineCode + " " + chto1.FlightNumber + "/" + chFrom.FlightNumber, DirectCharterTime = chto1.TimeFrom.ToString("HH:mm") + " - " + chto1.TimeTo.ToString("HH:mm"), DirectAirportFromName = chto1.PortCodeFrom, DirectAirportToName = chto1.PortCodeTo, BackCharterTime = chFrom.TimeFrom.ToString("HH:mm") + " - " + chFrom.TimeTo.ToString("HH:mm"), BackAirportFromName = chFrom.PortCodeFrom, BackAirportToName = chFrom.PortCodeTo }); if (!seasonKeysDone.Contains(chto1.AirSeasonKey)) { seasonKeysDone.Add(chto1.AirSeasonKey); } if (!seasonKeysDone.Contains(chFrom.AirSeasonKey)) { seasonKeysDone.Add(chFrom.AirSeasonKey); } } } } foreach (var chto in chartersTo.Where(c => !seasonKeysDone.Contains(c.AirSeasonKey))) { var chto1 = chto; result.Add(new CharterSchedulePlainInfo { DaysOfWeek = new List <DayOfWeek>(chto1.DaysOfWeek), AirlineName = chto1.AirlineCode, DateFrom = chto1.CharterDates.Min(), DateTo = chto1.CharterDates.Max(), AircraftName = chto1.AirCraft, FlightNum = chto1.AirlineCode + " " + chto1.FlightNumber, DirectCharterTime = chto1.TimeFrom.ToString("HH:mm") + " - " + chto1.TimeTo.ToString("HH:mm"), DirectAirportFromName = chto1.PortCodeFrom, DirectAirportToName = chto1.PortCodeTo, BackCharterTime = "---", BackAirportFromName = "---", BackAirportToName = "---" }); if (!seasonKeysDone.Contains(chto1.AirSeasonKey)) { seasonKeysDone.Add(chto1.AirSeasonKey); } } foreach (var chFrom in chartersFrom.Where(c => !seasonKeysDone.Contains(c.AirSeasonKey))) { var chFrom1 = chFrom; result.Add(new CharterSchedulePlainInfo { DaysOfWeek = new List <DayOfWeek>(chFrom1.DaysOfWeek), AirlineName = chFrom1.AirlineCode, DateFrom = chFrom1.CharterDates.Min(), DateTo = chFrom1.CharterDates.Max(), AircraftName = chFrom1.AirCraft, FlightNum = chFrom1.AirlineCode + " " + chFrom1.FlightNumber, DirectCharterTime = "---", DirectAirportFromName = "---", DirectAirportToName = "---", BackCharterTime = chFrom1.TimeFrom.ToString("HH:mm") + " - " + chFrom1.TimeTo.ToString("HH:mm"), BackAirportFromName = chFrom1.PortCodeFrom, BackAirportToName = chFrom1.PortCodeTo }); if (!seasonKeysDone.Contains(chFrom1.AirSeasonKey)) { seasonKeysDone.Add(chFrom1.AirSeasonKey); } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Данные по квотам на перелеты /// </summary> /// <param name="dc">Контекст БД</param> /// <param name="mainDc">Контекст БД</param> /// <param name="query">Параметры запроса</param> /// <returns></returns> public static QuotaPriceResult GetFlightQuotaPrices(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, QuotaPriceQuery query) { string hash; return(GetFlightQuotaPrices(dc, mainDc, query, out hash)); }
/// <summary> /// Метод по выдаче расписаний рейсов /// </summary> /// <param name="dc">Контекст БД</param> /// <param name="mainDc">Контекст БД</param> /// <param name="hash">Строка кэша</param> /// <returns></returns> public static FlightSchedule GetFlightSchedules(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, out string hash) { return(dc.GetFlightSchedules(mainDc, null, out hash)); }
/// <summary> /// Возвращает сопоставления пар перелетов /// </summary> /// <param name="dc">Контекст поисковой БД</param> /// <param name="mainDc">Контекст основной БД</param> /// <param name="packetType">Тип пакета (туда, обратно, туда/обратно)</param> /// <param name="flightVariants">Список перелетов</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> private static IEnumerable <DatesMatches> GetFlightMatches(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, PacketType packetType, IList <FlightVariant> flightVariants, out string hash) { List <DatesMatches> result; var hashBuilder = new StringBuilder(); foreach (var flightVaraint in flightVariants) { hashBuilder.AppendFormat("{0}_", flightVaraint); } hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, packetType, hashBuilder); if ((result = CacheHelper.GetCacheItem <List <DatesMatches> >(hash)) != null) { return(result); } result = new List <DatesMatches>(); string hashOut; var cacheDependencies = new List <string>(); if ((PacketType.TwoWayCharters & packetType) == packetType) { var twoWayTickets = (from flightDateTo in flightVariants join flightDateFrom in flightVariants on flightDateTo.CityKeyTo equals flightDateFrom.CityKeyFrom where flightDateTo.CityKeyFrom == Globals.Settings.HomeCityKey && flightDateTo.CityKeyFrom == flightDateFrom.CityKeyTo && flightDateTo.FlightParamKeys.CharterClassKey == flightDateFrom.FlightParamKeys.CharterClassKey && ((flightDateTo.FlightNumber == flightDateFrom.FlightNumber + 1) || (flightDateTo.FlightNumber == flightDateFrom.FlightNumber - 1) || (flightDateTo.FlightNumber == flightDateFrom.FlightNumber && flightDateTo.FlightParamKeys.CharterKey != flightDateFrom.FlightParamKeys.CharterKey)) && ( ((flightDateTo.ArrivalTime - flightDateTo.ArrivalTime.Date) <= (flightDateFrom.DepartTime - flightDateFrom.DepartTime.Date) && flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMin - 1) <= flightDateFrom.DepartTime.Date && flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMax - 1) >= flightDateFrom.DepartTime.Date) || ((flightDateTo.ArrivalTime - flightDateTo.ArrivalTime.Date) > (flightDateFrom.DepartTime - flightDateFrom.DepartTime.Date) && flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMin - 1) <= flightDateFrom.DepartTime.Date.AddDays(-1) && flightDateTo.ArrivalTime.Date.AddDays(flightDateTo.DurationMax - 1) >= flightDateFrom.DepartTime.Date.AddDays(-1)) ) select new Tuple <FlightVariant, FlightVariant>(new FlightVariant(flightDateTo), new FlightVariant(flightDateFrom))) .Distinct(new FlightParamsByDateTupleComparer()) .ToList(); foreach (var pair in twoWayTickets) { var query = new QuotaPriceQuery(); query.FlightParams.Add(new QuotaPriceParams { DepartTime = pair.Item1.DepartTime, Duration = pair.Item2.DepartTime.Date.Subtract(pair.Item1.DepartTime.Date).Days + 1, FlightParamKeys = new FlightVariantKeys { CharterKey = pair.Item1.FlightParamKeys.CharterKey, CharterClassKey = pair.Item1.FlightParamKeys.CharterClassKey, PacketKey = pair.Item1.FlightParamKeys.PacketKey, PartnerKey = pair.Item1.FlightParamKeys.PartnerKey } }); query.FlightParams.Add(new QuotaPriceParams { DepartTime = pair.Item2.DepartTime, Duration = pair.Item2.DepartTime.Date.Subtract(pair.Item1.DepartTime.Date).Days + 1, FlightParamKeys = new FlightVariantKeys { CharterKey = pair.Item2.FlightParamKeys.CharterKey, CharterClassKey = pair.Item2.FlightParamKeys.CharterClassKey, PacketKey = pair.Item2.FlightParamKeys.PacketKey, PartnerKey = pair.Item2.FlightParamKeys.PartnerKey } }); var quotaPrice = dc.GetFlightQuotaPrices(mainDc, query, out hashOut); if (!cacheDependencies.Contains(hashOut)) { cacheDependencies.Add(hashOut); } if (quotaPrice.FlightData.Count > 1) { pair.Item1.FlightQuotaPriceData = new QuotaPriceData { PriceValue = quotaPrice.FlightData[0].PriceValue, QuotaPlaces = quotaPrice.FlightData[0].QuotaPlaces, QuotaState = quotaPrice.FlightData[0].QuotaState }; pair.Item2.FlightQuotaPriceData = new QuotaPriceData { PriceValue = quotaPrice.FlightData[1].PriceValue, QuotaPlaces = quotaPrice.FlightData[1].QuotaPlaces, QuotaState = quotaPrice.FlightData[1].QuotaState }; result.Add(new DatesMatches { FlightParamsTo = pair.Item1, FlightParamsFrom = pair.Item2 }); } } } else if ((PacketType.DirectCharters & packetType) == packetType) { var directTickets = (from flightDateTo in flightVariants where flightDateTo.CityKeyFrom == Globals.Settings.HomeCityKey select flightDateTo) .Distinct(new FlightParamsByDateComparer()) .ToList(); foreach (var flight in directTickets) { var query = new QuotaPriceQuery(); query.FlightParams.Add(new QuotaPriceParams { DepartTime = flight.DepartTime, FlightParamKeys = new FlightVariantKeys { CharterKey = flight.FlightParamKeys.CharterKey, CharterClassKey = flight.FlightParamKeys.CharterClassKey, PacketKey = flight.FlightParamKeys.PacketKey, PartnerKey = flight.FlightParamKeys.PartnerKey } }); var quotaPrice = dc.GetFlightQuotaPrices(mainDc, query, out hashOut); if (!cacheDependencies.Contains(hashOut)) { cacheDependencies.Add(hashOut); } if (quotaPrice.FlightData.Count > 0) { flight.FlightQuotaPriceData = new QuotaPriceData { PriceValue = quotaPrice.FlightData[0].PriceValue, QuotaPlaces = quotaPrice.FlightData[0].QuotaPlaces, QuotaState = quotaPrice.FlightData[0].QuotaState }; result.Add(new DatesMatches { FlightParamsTo = flight, FlightParamsFrom = null }); } } } else if ((PacketType.BackCharters & packetType) == packetType) { var backTickets = (from flightDateTo in flightVariants where flightDateTo.CityKeyTo == Globals.Settings.HomeCityKey select flightDateTo) .Distinct(new FlightParamsByDateComparer()) .ToList(); foreach (var flight in backTickets) { var query = new QuotaPriceQuery(); query.FlightParams.Add(new QuotaPriceParams { DepartTime = flight.DepartTime, FlightParamKeys = new FlightVariantKeys { CharterKey = flight.FlightParamKeys.CharterKey, CharterClassKey = flight.FlightParamKeys.CharterClassKey, PacketKey = flight.FlightParamKeys.PacketKey, PartnerKey = flight.FlightParamKeys.PartnerKey } }); var quotaPrice = dc.GetFlightQuotaPrices(mainDc, query, out hashOut); if (!cacheDependencies.Contains(hashOut)) { cacheDependencies.Add(hashOut); } if (quotaPrice.FlightData.Count > 0) { flight.FlightQuotaPriceData = new QuotaPriceData { PriceValue = quotaPrice.FlightData[0].PriceValue, QuotaPlaces = quotaPrice.FlightData[0].QuotaPlaces, QuotaState = quotaPrice.FlightData[0].QuotaState }; result.Add(new DatesMatches { FlightParamsTo = null, FlightParamsFrom = flight }); } } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
private void LoadCitiesFrom(MtSearchDbDataContext mtsDc, SftWebDbDataContext sftDc, bool isReinit = false) { if (mtsDc == null) { throw new ArgumentNullException("mtsDc"); } if (DdlContriesToFilter.Items.Count == 0) { RblCitiesFromFilter.Items.Clear(); return; } // Код ниже реализует следующей алгоритм. При смене страны если пользователь ранее менял город вылета, выбирается ранее выбранный город вылета, // если такой город отсуствует в списке, пробуем выбрать город вылета из Web.config, если и этот город отсустствует в списке выбираем первый город из списка. // Если при смене города пользователь ранее не менял город вылета, то проем выбрать город вылета из Web.config, если не получилось то пробуем выбрать первый город из списака. // если это изменение фильтров пользователем и пользователь менял город вылета, // то запоминаем выбор пользователя, чтобы потом его повторить ListItem selectedItem = null; if (isReinit && IsCityFromChangedByUser) { selectedItem = RblCitiesFromFilter.SelectedItem; } //грузим города вылета RblCitiesFromFilter.DataSource = mtsDc.GetCitiesDeparture(sftDc, SelectedCountryToKey).ToDictionary(k => k.Key, v => HttpUtility.HtmlEncode(v.Value)); RblCitiesFromFilter.DataBind(); // если это изменение фильтров пользователем и пользователь менял город вылета, // то пытаемся восстановить выбор пользователя if (isReinit && IsCityFromChangedByUser && selectedItem != null && RblCitiesFromFilter.Items.FindByValue(selectedItem.Value) != null) { RblCitiesFromFilter.SelectedValue = selectedItem.Value; } // если пользователь не менял город вылета, то пробуем выбрать город вылета по значению в Web.config if (!IsCityFromChangedByUser && RblCitiesFromFilter.Items.FindByValue( Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture)) != null) { RblCitiesFromFilter.SelectedValue = Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture); } // если город вылета так и не выбран, но при этом список городов вылета содержит элементы, // пробуем еще раз выбрать город вылета из Web.config в случае не удачи, выбираем первый город вылета в списке. if (RblCitiesFromFilter.SelectedItem == null && RblCitiesFromFilter.Items.Count > 0) { if (RblCitiesFromFilter.Items.FindByValue( Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture)) != null) { RblCitiesFromFilter.SelectedValue = Globals.Settings.TourFilters.DefaultCityFromKey.ToString(CultureInfo.InvariantCulture); } else { RblCitiesFromFilter.SelectedIndex = 0; } } }
/// <summary> /// Получение списка параметров для квоты "мало" по классам услуг /// </summary> /// <param name="dc">Контекст базы данных</param> /// <returns></returns> public static Dictionary <uint, QuotaSmallServiceParams> GetQuotaSmallServiceParams(this MtSearchDbDataContext dc) { Dictionary <uint, QuotaSmallServiceParams> serviceSmallParams; const string hash = "ServiceSmallParams"; if ((serviceSmallParams = CacheHelper.GetCacheItem <Dictionary <uint, QuotaSmallServiceParams> >(hash)) != default(Dictionary <uint, QuotaSmallServiceParams>)) { return(serviceSmallParams); } serviceSmallParams = (from s in dc.GetAllServices() where (s.SV_KEY == 1 || s.SV_KEY == 3) select s ) .ToDictionary(s => (uint)s.SV_KEY, s => new QuotaSmallServiceParams { AndParam = s.SV_LittleAnd.HasValue && s.SV_LittleAnd.Value, PercentParam = (double?)s.SV_LittlePercent, PlaceParam = (uint?)s.SV_LittlePlace }); CacheHelper.AddCacheData(hash, serviceSmallParams, new List <string>() { TableName }, Globals.Settings.Cache.LongCacheTimeout); return(serviceSmallParams); }
public void ShowTours(int cityKeyFrom, int countryKey, int[] tourKeys, DateTime[] tourDates, int[] tourNights, int[] hotelKeys, int[] pansionKeys, ushort?mainPlaces, ushort?addPlaces, ushort?firstChildYears, ushort?secondChildYears, int[] roomTypeKeys, QuotesStates hotelQuotaMask, QuotesStates aviaQuotaMask, int rateKey, uint?maxTourPrice, ushort rowsPerPage) { if (tourKeys == null || !tourKeys.Any()) { throw new ArgumentNullException("tourKeys"); } if (tourDates == null || !tourDates.Any()) { throw new ArgumentNullException("tourDates"); } if (tourNights == null || !tourNights.Any()) { throw new ArgumentNullException("tourNights"); } if (hotelKeys == null || !hotelKeys.Any()) { throw new ArgumentNullException("hotelKeys"); } if (pansionKeys == null || !pansionKeys.Any()) { throw new ArgumentNullException("pansionKeys"); } if ((roomTypeKeys != null && roomTypeKeys.Any() && mainPlaces.HasValue) || ((roomTypeKeys == null || !roomTypeKeys.Any()) && !mainPlaces.HasValue)) { throw new ArgumentException("Одноверменно не могут быть указаны значение количество взрослых и тип номера", "roomTypeKeys"); } if (addPlaces > 0 && !firstChildYears.HasValue) { throw new ArgumentNullException("firstChildYears", "Не указан возраст первого ребенка"); } if (addPlaces > 1 && !secondChildYears.HasValue) { throw new ArgumentNullException("secondChildYears", "Не указан возраст второго ребенка"); } CityKeyFrom = cityKeyFrom; CountryKey = countryKey; TourKeys = tourKeys; TourDates = tourDates; TourNights = tourNights; HotelKeys = hotelKeys; PansionKeys = pansionKeys; MainPlaces = mainPlaces; AddPlaces = addPlaces; FirstChildYears = firstChildYears; SecondChildYears = secondChildYears; RoomTypeKeys = roomTypeKeys; HotelQuotaMask = hotelQuotaMask; AviaQuotaMask = aviaQuotaMask; RateKey = rateKey; MaxTourPrice = maxTourPrice; RowsPerPage = rowsPerPage; using (var mtmDc = new MtMainDbDataContext()) { using (var mtsDc = new MtSearchDbDataContext()) { var searchResult = mtsDc.PagingOnClient(mtmDc, CityKeyFrom.Value, CountryKey.Value, TourKeys, TourDates, TourNights, HotelKeys, PansionKeys, MainPlaces, AddPlaces, FirstChildYears, SecondChildYears, RoomTypeKeys, HotelQuotaMask, AviaQuotaMask | QuotesStates.None, RateKey.Value, MaxTourPrice, RowsPerPage, 0, CurrentSort); CurrentSort = searchResult.SortType; SearchPages.Clear(); if (!searchResult.SearchItems.Any()) { LtMessage.Text = @"<div id='SearchResultsMsg' class='TFS_SearchResultsMsg'><span>К сожалению по вашему запросу ничего не найдено. Попробуйте изменить параметры поиска. Например квоты или количество едущих людей и т.д.</span></div>"; Web.ShowMessage(this, @"К сожалению по вашему запросу ничего не найдено. Попробуйте изменить параметры поиска. Например квоты или количество едущих людей и т.д."); Web.ScrollToElement(this, "SearchResultsMsg"); //koshelev //сделал обработку того, что ни один тур не найден RepFindedTours.DataSource = null; RepFindedTours.DataBind(); RepPagesTop.DataSource = null; RepPagesTop.DataBind(); RepPagesBottom.DataSource = null; RepPagesBottom.DataBind(); return; } LtMessage.Text = String.Empty; // добовляем первую страницу SearchPages.Add(1, 0); CurrentPage = 1; // инициализируем следующую страницу if (searchResult.IsMorePages) { SearchPages.Add(CurrentPage + 1, searchResult.NextPageRowCounter); } RepPagesTop.DataSource = SearchPages; RepPagesTop.DataBind(); RepPagesBottom.DataSource = SearchPages; RepPagesBottom.DataBind(); RepFindedTours.DataSource = searchResult.SearchItems; RepFindedTours.DataBind(); } } }
/// <summary> /// ПОлучения плоского списка квот из БД по параметрам. Загружается сразу на все даты для уменьшения числа обращений к БД /// </summary> /// <param name="dc">Контекст БД</param> /// <param name="serviceClass">Класс услуги</param> /// <param name="code">Code услуги (для перелета - ключ чартера, для отеля - ключ отеля)</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> public static List <QuotaPlain> GetPlainQuotasObjects(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code, out string hash) { hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code); List <QuotaPlain> result; if ((result = CacheHelper.GetCacheItem <List <QuotaPlain> >(hash)) != null) { return(result); } var cacheDependencies = new List <string> { String.Format("{0}_{1}_{2}", CacheHelper.QuotaHash, (int)serviceClass, code) }; result = new List <QuotaPlain>(); var commandBuilder = new StringBuilder(); commandBuilder.AppendLine("select SS_QDID, QD_Type, SS_AllotmentAndCommitment, QP_Busy, QP_CheckInPlacesBusy, QP_Places, QP_CheckInPlaces, QP_Durations, QO_ID, SS_ID, QD_ID, ISNULL(QT_PRKey, 0) as QT_PRKey, ISNULL(QP_AgentKey, 0) as QP_AgentKey, ISNULL(QO_SubCode1, 0) as QO_SubCode1, ISNULL(QO_SubCode2, 0) as QO_SubCode2, QD_Date, QD_Release "); commandBuilder.AppendLine("from Quotas "); commandBuilder.AppendLine("join QuotaObjects on QO_QTID = QT_ID "); commandBuilder.AppendLine("join QuotaDetails on QD_QTID = QT_ID "); commandBuilder.AppendLine("join QuotaParts on QP_QDID = QD_ID "); commandBuilder.AppendLine("left join StopSales on SS_QDID = QD_ID and (SS_IsDeleted is null or SS_IsDeleted = 0) "); commandBuilder.AppendLine(String.Format("where QO_SVKey = {0} ", (int)serviceClass)); commandBuilder.AppendLine(String.Format("and QO_Code = {0} ", code)); commandBuilder.AppendLine("and (SS_Date is null or SS_Date = QD_Date) "); commandBuilder.AppendLine("and (QP_IsDeleted is null or QP_IsDeleted = 0) "); commandBuilder.AppendLine("and (QD_IsDeleted is null or QD_IsDeleted = 0) "); //commandBuilder.AppendLine("and (QP_AgentKey is null or QP_AgentKey = 0) "); commandBuilder.AppendLine("and (QP_IsNotCheckin is null or QP_IsNotCheckin = 0) "); commandBuilder.AppendLine(String.Format("and QD_Date >= '{0:yyyy-MM-dd}'", DateTime.Now.Date)); commandBuilder.AppendLine("union "); commandBuilder.AppendLine("select null as SS_QDID, null as QD_Type, SS_AllotmentAndCommitment, 0 as QP_Busy, 0 as QP_CheckInPlacesBusy, 0 as QP_Places, 0 as QP_CheckInPlaces, '' as QP_Durations, QO_ID, SS_ID, 0 as QD_ID, SS_PRKey as QT_PRKey, 0 as QP_AgentKey, ISNULL(QO_SubCode1, 0) as QO_SubCode1, ISNULL(QO_SubCode2, 0) as QO_SubCode2, SS_Date as QD_Date, null as QD_Release "); commandBuilder.AppendLine("from QuotaObjects "); commandBuilder.AppendLine("join StopSales on SS_QOID = QO_ID "); commandBuilder.AppendLine("where QO_QTID is null "); commandBuilder.AppendLine("and (SS_IsDeleted is null or SS_IsDeleted = 0) "); commandBuilder.AppendLine(String.Format("and QO_SVKey = {0} ", (int)serviceClass)); commandBuilder.AppendLine(String.Format("and QO_Code = {0} ", code)); commandBuilder.AppendLine(String.Format("and SS_Date >= '{0:yyyy-MM-dd}'", DateTime.Now.Date)); using (var command = dc.Connection.CreateCommand()) { command.CommandText = commandBuilder.ToString(); dc.Connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { result.Add(new QuotaPlain() { SsQdId = reader.GetInt32OrNull("SS_QDID"), Type = reader.GetInt16OrNull("QD_Type") == null || reader.GetInt16OrNull("QD_Type") == 1 ? QuotaType.Allotment : QuotaType.Commitment, IsAllotmentAndCommitment = reader.GetBooleanOrNull("SS_AllotmentAndCommitment") != null && reader.GetBooleanOrNull("SS_AllotmentAndCommitment") != false, Busy = reader.GetInt32("QP_Busy"), CheckInPlacesBusy = reader.GetInt32OrNull("QP_CheckInPlacesBusy"), Places = reader.GetInt32("QP_Places"), CheckInPlaces = reader.GetInt32OrNull("QP_CheckInPlaces"), Duration = reader.GetString("QP_Durations"), QoId = reader.GetInt32("QO_ID"), SsId = reader.GetInt32OrNull("SS_ID"), QdId = reader.GetInt32("QD_ID"), PartnerKey = reader.GetInt32("QT_PRKey"), AgentKey = reader.GetInt32("QP_AgentKey"), SubCode1 = reader.GetInt32("QO_SubCode1"), SubCode2 = reader.GetInt32("QO_SubCode2"), Date = reader.GetDateTime("QD_Date"), Release = reader.GetInt16OrNull("QD_Release") }); } } dc.Connection.Close(); } CacheHelper.AddCacheData(hash, result, cacheDependencies, Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Реальный курс на дату /// </summary> /// <param name="dc">Контекст базы данных</param> /// <param name="date">Дата курса</param> /// <param name="rateCodeFrom">Валюта, из которой конвертируем</param> /// <param name="rateCodeTo">Валюта, в которую конвертируем</param> /// <returns></returns> public static decimal GetRateRealCourse(this MtSearchDbDataContext dc, DateTime date, string rateCodeFrom, string rateCodeTo) { return(dc.GetRateRealCourse(date, dc.GetRateKeyByCode(rateCodeFrom), dc.GetRateKeyByCode(rateCodeTo))); }
private static void MakeToursXmlResponse(HttpContext context) { if (context == null) { throw new ArgumentNullException("context"); } var queryString = context.Request.QueryString; var offerId = QDSearch.Helpers.Converters.GetLongSafe(queryString["offerId"]); int currencyId; if (queryString.AllKeys.Contains("offerId") && !offerId.HasValue) { context.Response.Write("<error>Incorrect parametr.</error>"); return; } try { currencyId = int.Parse(queryString["currencyId"]); } catch (Exception) { context.Response.Write("<error>Incorrect parametr.</error>"); return; } if (offerId.HasValue) { using (var mtmDc = new MtMainDbDataContext()) { using (var mtsDc = new MtSearchDbDataContext()) { using (var sftDc = new SftWebDbDataContext()) { string hash; var elementsList = mtsDc.GetTours(mtmDc, sftDc, offerId.Value, currencyId, out hash).Item2.ConvertAll(c => c as IXmlCompatible); SaveXmlToResponse(context, @"getToursResult", elementsList, hash); } } } return; } int count; int countryId; int departCityId; DateTime dateFrom; DateTime dateTo; ushort adults; ushort kids; List <ushort> kidsAges; int nightsMin; int nightsMax; List <int> resorts; List <int> hotelCategories; List <int> hotels; List <int> meals; uint? priceMin; uint? priceMax; int? hotelIsNotInStop; int? ticketsIncluded; int? hasTickets; try { count = int.Parse(queryString["count"]); countryId = int.Parse(queryString["countryId"]); departCityId = int.Parse(queryString["departCityId"]); dateFrom = DateTime.ParseExact(queryString["dateFrom"], "dd.MM.yyyy", new CultureInfo("ru-RU")); dateTo = DateTime.ParseExact(queryString["dateTo"], "dd.MM.yyyy", new CultureInfo("ru-RU")); adults = ushort.Parse(queryString["adults"]); kids = ushort.Parse(queryString["kids"]); kidsAges = kids > 0 ? queryString["kidsAges"].Split(',').Select(ushort.Parse).ToList() : null; nightsMin = int.Parse(queryString["nightsMin"]); nightsMax = int.Parse(queryString["nightsMax"]); resorts = queryString.AllKeys.Contains("resorts") ? queryString["resorts"].Split(',').Select(int.Parse).ToList() : null; hotelCategories = queryString.AllKeys.Contains("hotelCategories") ? queryString["hotelCategories"].Split(',').Select(int.Parse).ToList() : null; hotels = queryString.AllKeys.Contains("hotels") ? queryString["hotels"].Split(',').Select(int.Parse).ToList() : null; meals = queryString.AllKeys.Contains("meals") ? queryString["meals"].Split(',').Select(int.Parse).ToList() : null; currencyId = int.Parse(queryString["currencyId"]); priceMin = queryString.AllKeys.Contains("priceMin") ? uint.Parse(queryString["priceMin"]) : (uint?)null; priceMax = queryString.AllKeys.Contains("priceMax") ? uint.Parse(queryString["priceMax"]) : (uint?)null; hotelIsNotInStop = queryString.AllKeys.Contains("hotelIsNotInStop") ? int.Parse(queryString["hotelIsNotInStop"]) : (int?)null; ticketsIncluded = queryString.AllKeys.Contains("ticketsIncluded") ? int.Parse(queryString["ticketsIncluded"]) : (int?)null; hasTickets = queryString.AllKeys.Contains("hasTickets") ? int.Parse(queryString["hasTickets"]) : (int?)null; } catch (Exception) { context.Response.Write("<error>Incorrect parametr.</error>"); return; } using (var mtmDc = new MtMainDbDataContext()) { using (var mtsDc = new MtSearchDbDataContext()) { using (var sftDc = new SftWebDbDataContext()) { string hash; var elementsList = mtsDc.GetTours(mtmDc, sftDc, count, countryId, departCityId, dateFrom, dateTo, adults, kids, kidsAges, nightsMin, nightsMax, resorts, hotelCategories, hotels, meals, currencyId, priceMin, priceMax, hotelIsNotInStop, ticketsIncluded, hasTickets, out hash).Item2.ConvertAll(c => c as IXmlCompatible); SaveXmlToResponse(context, "getToursResult", elementsList, hash); } } } }
/// <summary> /// Проверяет квоту на всю услугу по параметрам /// </summary> /// <param name="dc">Контекст базы данных</param> /// <param name="serviceClass">Класс услуги</param> /// <param name="code">Code услуги (для авиаперелетов - Charter, для проживания - ключ отеля)</param> /// <param name="subCode1">SubCode1 услуги, для перелета - класс, для проживания - тип номера (Room)</param> /// <param name="subCode2">SubCode1 услуги, для перелета - не используется, для проживания - категория номера (RoomCategory)</param> /// <param name="partnerKey">Ключ партнера по услуге</param> /// <param name="serviceDateFrom">Дата начала услуги</param> /// <param name="serviceDateTo">Дата окончания услуги</param> /// <param name="agentKey">Ключ агентства</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> public static QuotaStatePlaces CheckServiceQuota(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code, Int32 subCode1, Int32?subCode2, Int32 partnerKey, int?agentKey, DateTime serviceDateFrom, DateTime serviceDateTo, out string hash) { hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code, CacheHelper.GetCacheKeyHashed(new[] { subCode1.ToString(), subCode2.ToString(), partnerKey.ToString(), agentKey.ToString(), serviceDateFrom.ToString("yyyy-MM-dd"), serviceDateTo.ToString("yyyy-MM-dd") })); var cacheDependecies = new List <string>(); QuotaStatePlaces result; if ((result = CacheHelper.GetCacheItem <QuotaStatePlaces>(hash)) != null) { return(result); } int duration; result = new QuotaStatePlaces() { IsCheckInQuota = false, Places = 0, QuotaState = QuotesStates.Request }; if (serviceClass == ServiceClass.Flight) { DateTime linkedDate1, linkedDate2; if (serviceDateFrom <= serviceDateTo) { linkedDate1 = serviceDateFrom; linkedDate2 = serviceDateTo; } else { linkedDate1 = serviceDateTo; linkedDate2 = serviceDateFrom; } duration = linkedDate2.Subtract(linkedDate1).Days + 1; } else { duration = serviceDateTo.Subtract(serviceDateFrom).Days + 1; } if (serviceClass == ServiceClass.Flight) { serviceDateTo = serviceDateFrom; } var quotasStatusesByDays = new Dictionary <DateTime, QuotaStatePlaces>(duration); for (var date = serviceDateFrom; date <= serviceDateTo; date = date.AddDays(1)) { string hashOut; quotasStatusesByDays.Add(date, dc.CheckServiceQuotaByDay(serviceClass, code, subCode1, subCode2, partnerKey, agentKey, date, duration, date == serviceDateFrom, out hashOut)); cacheDependecies.Add(hashOut); } if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.No)) { result.QuotaState = QuotesStates.No; } else if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.Request)) { result.QuotaState = QuotesStates.Request; } else if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.Small)) { result.QuotaState = QuotesStates.Small; } else if (quotasStatusesByDays.Values.Any(s => s.QuotaState == QuotesStates.Availiable)) { result.QuotaState = QuotesStates.Availiable; } if (result.QuotaState == QuotesStates.Availiable || result.QuotaState == QuotesStates.Small) { result.Places = quotasStatusesByDays.Values.Min(s => s.Places); } if (quotasStatusesByDays.Values.Any(s => s.IsCheckInQuota)) { var checkInState = quotasStatusesByDays.Values.Where(s => s.IsCheckInQuota).Select(s => s).SingleOrDefault(); if (checkInState != null && QuotasExtension.OrderderQuotaStates[checkInState.QuotaState] > QuotasExtension.OrderderQuotaStates[result.QuotaState]) { result = checkInState; } } CacheHelper.AddCacheData(hash, result, cacheDependecies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
protected void RepPagesItem_Command(object sender, CommandEventArgs e) { var linkButton = sender as LinkButton; if (linkButton == null) { throw new ArgumentNullException("sender"); } if (e == null) { throw new ArgumentNullException("e"); } using (var mtmDc = new MtMainDbDataContext()) { using (var mtsDc = new MtSearchDbDataContext()) { switch (e.CommandName) { case "PreviosPage": CurrentPage--; break; case "PageToGo": CurrentPage = uint.Parse(e.CommandArgument.ToString()); break; case "NextPage": CurrentPage++; break; default: // ReSharper disable once NotResolvedInText throw new ArgumentOutOfRangeException("e.CommandName", e.CommandName, "Событие получено от незарегестрированого элемента."); } if (1 > CurrentPage || CurrentPage > SearchPages.Count) { throw new IndexOutOfRangeException( String.Format("Индекс текущей страницы поиска вышел за границы диапозона - {0}", CurrentPage)); } var searchResult = mtsDc.PagingOnClient(mtmDc, CityKeyFrom.Value, CountryKey.Value, TourKeys, TourDates, TourNights, HotelKeys, PansionKeys, MainPlaces, AddPlaces, FirstChildYears, SecondChildYears, RoomTypeKeys, HotelQuotaMask, AviaQuotaMask | QuotesStates.None, RateKey.Value, MaxTourPrice, RowsPerPage, SearchPages[CurrentPage], CurrentSort); CurrentSort = searchResult.SortType; if (searchResult.IsMorePages && !SearchPages.ContainsKey(CurrentPage + 1)) { SearchPages.Add(CurrentPage + 1, searchResult.NextPageRowCounter); } RepPagesTop.DataSource = SearchPages; RepPagesTop.DataBind(); RepPagesBottom.DataSource = SearchPages; RepPagesBottom.DataBind(); RepFindedTours.DataSource = searchResult.SearchItems; RepFindedTours.DataBind(); Web.ScrollToElement(this, RepPagesTop.ClientID); linkButton.Focus(); } } }
/// <summary> /// Метод по проверке квот на перелет /// </summary> /// <param name="dc">Контекст БД</param> /// <param name="mainDc">Контекст основной БД</param> /// <param name="charterKey">Ключ перелета</param> /// <param name="cityKeyFrom">Ключ города вылета</param> /// <param name="cityKeyTo">Ключ города прилета</param> /// <param name="charterDay">День вылета в туре</param> /// <param name="partnerKey">Ключ партнера по перелету</param> /// <param name="agentKey">Ключ агентства</param> /// <param name="packetKey">Ключ пакета</param> /// <param name="tourDate">Дата тура</param> /// <param name="linkedDay">День вылета парного перелета</param> /// <param name="findFlight">Признак "подбирать или не подбирать" перелет</param> /// <param name="placesToCheck">Количество мест, которые должны быть в квоте, чтобы она считалась подходящей</param> /// <param name="flightGroups">Группы перелетов (эконом, бизнес, премиум)</param> /// <param name="hash">Хэш кэша</param> /// <param name="aviaQuotaMask">Маска квот на перелет</param> /// <returns></returns> public static Dictionary <int, FlightPlainInfo> CheckCharterQuota(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, Int32 charterKey, Int32 cityKeyFrom, Int32 cityKeyTo, Int32 charterDay, int partnerKey, int?agentKey, int packetKey, DateTime tourDate, Int32?linkedDay, bool findFlight, QuotesStates aviaQuotaMask, Int32 placesToCheck, IDictionary <int, IEnumerable <int> > flightGroups, out string hash) { Dictionary <int, FlightPlainInfo> result; hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, charterKey, CacheHelper.GetCacheKeyHashed(new[] { cityKeyFrom.ToString(), cityKeyTo.ToString(), partnerKey.ToString(), agentKey.ToString(), charterDay.ToString(), packetKey.ToString(), tourDate.ToString("yyyy-MM-dd"), linkedDay.ToString(), findFlight.ToString(), aviaQuotaMask.ToString(), placesToCheck.ToString(), String.Join("_", flightGroups.Keys), String.Join("_", flightGroups.Values) })); if ((result = CacheHelper.GetCacheItem <Dictionary <int, FlightPlainInfo> >(hash)) != null) { return(result); } var cacheDependencies = new List <string>(); string hashOut; var flightsInfo = dc.GetCharterAllQuota(mainDc, charterKey, cityKeyFrom, cityKeyTo, charterDay, partnerKey, agentKey, packetKey, tourDate, linkedDay, findFlight, flightGroups, out hashOut); result = new Dictionary <int, FlightPlainInfo>(); foreach (var key in flightsInfo.Keys) { var quotaIsOk = false; var tempState = new FlightPlainInfo(); foreach (var flightInfo in flightsInfo[key]) { var quotaState = flightInfo.QuotaState; var maskIsOk = ((quotaState.QuotaState == QuotesStates.Small && (aviaQuotaMask & QuotesStates.Availiable) == QuotesStates.Availiable) || (quotaState.QuotaState & aviaQuotaMask) == quotaState.QuotaState); if (!maskIsOk) { continue; } if ((quotaState.QuotaState == QuotesStates.Availiable || quotaState.QuotaState == QuotesStates.Small) && quotaState.Places < placesToCheck && (aviaQuotaMask & QuotesStates.Request) != QuotesStates.Request) { continue; } if (QuotasExtension.OrderderQuotaStates[flightInfo.QuotaState.QuotaState] > QuotasExtension.OrderderQuotaStates[tempState.QuotaState.QuotaState] || (tempState.QuotaState.QuotaState == flightInfo.QuotaState.QuotaState && flightInfo.QuotaState.Places > tempState.QuotaState.Places)) { tempState = flightInfo; quotaIsOk = true; } if (tempState.QuotaState.QuotaState == QuotesStates.Availiable) { break; } } if (quotaIsOk) { result.Add(key, new FlightPlainInfo(tempState)); } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
public static List <FlightVariant> GetCharterDates(this MtSearchDbDataContext dc, FlightVariantKeys flightParams, out string hash) { List <FlightVariant> result; hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name, flightParams); if ((result = CacheHelper.GetCacheItem <List <FlightVariant> >(hash)) != null) { return(result); } var cacheDependencies = new List <string>(); var charterSchedules = (from a in dc.GetAllAirSeasons() where a.AS_CHKEY == flightParams.CharterKey && a.AS_TIMEFROM != null && a.AS_TIMETO != null select a) .ToList(); cacheDependencies.Add(QDSearch.Extensions.AirSeasonExtension.TableName); result = new List <FlightVariant>(); foreach (var airSeason in charterSchedules) { var dateFrom = airSeason.AS_DATEFROM.Value > DateTime.Now ? airSeason.AS_DATEFROM.Value : DateTime.Now; for (var date = dateFrom; date <= airSeason.AS_DATETO; date = date.AddDays(1)) { var dayOfWeek = (int)date.DayOfWeek; if (airSeason.AS_WEEK.Contains(dayOfWeek.ToString())) { var timeFrom = airSeason.AS_TIMEFROM; var timeTo = airSeason.AS_TIMETO; var dateTo = airSeason.AS_TIMEFROM <= airSeason.AS_TIMETO ? date : date.AddDays(1); var departTime = new DateTime(date.Year, date.Month, date.Day, timeFrom.Value.Hour, timeFrom.Value.Minute, 0); var arrivalTime = new DateTime(dateTo.Year, dateTo.Month, dateTo.Day, timeTo.Value.Hour, timeFrom.Value.Minute, 0); var flightParamsByDate = new FlightVariant { FlightParamKeys = flightParams, DepartTime = departTime, ArrivalTime = arrivalTime }; result.Add(flightParamsByDate); //string hashOut; // определяем есть ли цена на перелет в принципе //var cost = dc.GetFlightCost(flightParams.CharterKey, flightParams.CharterClassKey, // flightParams.PartnerKey, flightParams.PacketKey, departTime, -1, out hashOut); //cacheDependencies.Add(hashOut); //if (cost != null && cost.Price != null) //{ //var flightParamsByDate = new ParamsByDate() //{ // FlightParamKeys = flightParams, // DepartTime = departTime, // ArrivalTime = arrivalTime //}; //result.Add(flightParamsByDate); //} } } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Проверяет квоту на конкретный день по параметрам. Для услуг с продолжительностью этот метод нужно вызвать на каждый день /// </summary> /// <param name="dc">Контекст базы данных</param> /// <param name="serviceClass">Класс услуги</param> /// <param name="code">Code услуги (для авиаперелетов - Charter, для проживания - ключ отеля)</param> /// <param name="subCode1">SubCode1 услуги, для перелета - класс, для проживания - тип номера (Room)</param> /// <param name="subCode2">SubCode1 услуги, для перелета - не используется, для проживания - категория номера (RoomCategory)</param> /// <param name="partnerKey">Ключ партнера по услуге</param> /// <param name="date">Дата проверки квоты</param> /// <param name="duration">Продолжительность услуги (нужна для подбора квот на продолжительность)</param> /// <param name="isTheFirstDay">Является ли проверяемая дата первым днем или нет (нужно для подбора квот на заезд)</param> /// <param name="agentKey">КЛюч агентства</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> public static QuotaStatePlaces CheckServiceQuotaByDay(this MtSearchDbDataContext dc, ServiceClass serviceClass, Int32 code, Int32 subCode1, Int32?subCode2, Int32 partnerKey, int?agentKey, DateTime date, int duration, bool isTheFirstDay, out string hash) { QuotaStatePlaces result; hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, (int)serviceClass, code, CacheHelper.GetCacheKeyHashed(new[] { subCode1.ToString(), subCode2.ToString(), partnerKey.ToString(), agentKey.ToString(), date.ToString("yyyy-MM-dd"), duration.ToString(), isTheFirstDay.ToString() })); if ((result = CacheHelper.GetCacheItem <QuotaStatePlaces>(hash)) != null) { return(result); } var cacheDependecies = new List <string>(); result = new QuotaStatePlaces(); string hashOut; var plainQuotasByDate = dc.GetPlainQuotasObjects(serviceClass, code, subCode1, subCode2, partnerKey, agentKey, date, out hashOut); cacheDependecies.Add(hashOut); plainQuotasByDate = plainQuotasByDate.Where(q => q.Duration.Split(',').Contains(duration.ToString()) || q.Duration == String.Empty) .ToList(); if (!plainQuotasByDate.Any()) { result.QuotaState = QuotesStates.Request; } var ssQoIds = new List <bool>(); foreach (var plainQuota in plainQuotasByDate.OrderByDescending(p => p.SsId)) { ////стоит какой-то стоп if (plainQuota.SsId != null) { //стоит общий стоп if (plainQuota.SsQdId == null) { // стоп только на Allotment, или еще и на Commitment ssQoIds.Add(plainQuota.IsAllotmentAndCommitment); } if (result.QuotaState == QuotesStates.None) { result.QuotaState = QuotesStates.No; } continue; } //стопа на текущей строке нет, но есть общий стоп, который подходит под эту строку //в переменной result.QuotaState у нас и так уже QuotesStates.No, но проставлю еще раз для наглядности if (ssQoIds.Any(s => s || plainQuota.Type == QuotaType.Allotment)) { result.QuotaState = QuotesStates.No; continue; } //наступил релиз-период //todo: сделать настройку в web.config if (plainQuota.Release != null && (plainQuota.Date.Subtract(DateTime.Now).Days < plainQuota.Release)) { if (result.QuotaState == QuotesStates.None || result.QuotaState == QuotesStates.No) { result.QuotaState = QuotesStates.Request; } continue; } // проверяем квоту на заезд или на период if (serviceClass == ServiceClass.Flight || (serviceClass == ServiceClass.Hotel && ((plainQuota.CheckInPlaces ?? 0) <= 0 || plainQuota.CheckInPlacesBusy == null))) { var state = dc.GetQuotesStateByInt(serviceClass, plainQuota.Places - plainQuota.Busy, plainQuota.Places, out hashOut); cacheDependecies.Add(hashOut); // или на эту дату не было статуса квотирования, либо мы нашли статус на текущую дату и он лучше if (QuotasExtension.OrderderQuotaStates[result.QuotaState] < QuotasExtension.OrderderQuotaStates[state]) { result.QuotaState = state; result.Places += (uint)(plainQuota.Places - plainQuota.Busy); } } else if (isTheFirstDay) { // нашли квоту на заезд var checkInState = dc.GetQuotesStateByInt(serviceClass, plainQuota.Places - plainQuota.Busy, plainQuota.Places, out hashOut); cacheDependecies.Add(hashOut); result.Places = (uint)(plainQuota.Places - plainQuota.Busy); result.QuotaState = checkInState; result.IsCheckInQuota = true; } } CacheHelper.AddCacheData(hash, result, cacheDependecies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Возвращает список перелетов по пакету /// </summary> /// <param name="dc">Контекст поисковой БД</param> /// <param name="mainDc">Контекст основной БД</param> /// <param name="packetKey">Ключ пакета</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> private static IList <FlightVariant> GetFlightParamsByDate(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, int packetKey, out string hash) { List <FlightVariant> result; hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name, packetKey); if ((result = CacheHelper.GetCacheItem <List <FlightVariant> >(hash)) != null) { return(result); } string hashOut; var cacheDependencies = new List <string>(); result = new List <FlightVariant>(); var charterCosts = (from ch in dc.GetAllCharters() join cs in dc.GetFlightCostsByPacketKey(packetKey, out hashOut) on ch.CH_KEY equals cs.CS_CODE select new { CH_Key = ch.CH_KEY, CH_Flight = ch.CH_FLIGHT, CS_SubCode1 = cs.CS_SUBCODE1, CS_PRKey = cs.CS_PRKEY, CS_PKKey = cs.CS_PKKEY, CH_PortCodeFrom = ch.CH_PORTCODEFROM, CH_CityKeyFrom = ch.CH_CITYKEYFROM, CH_PortCodeTo = ch.CH_PORTCODETO, CH_CityKeyTo = ch.CH_CITYKEYTO, CH_AirlineCode = ch.CH_AIRLINECODE, CH_Aircraft = ch.CH_AIRCRAFT, CS_LongMin = cs.CS_LONGMIN, CS_Long = cs.CS_LONG }) .ToList(); cacheDependencies.Add(hashOut); cacheDependencies.Add(CharterExtension.TableName); foreach (var charterCost in charterCosts) { int flightNumber; if (!Int32.TryParse(charterCost.CH_Flight, out flightNumber)) { flightNumber = 0; } var flightParamKeys = new FlightVariantKeys { CharterKey = charterCost.CH_Key, CharterClassKey = charterCost.CS_SubCode1.Value, PartnerKey = charterCost.CS_PRKey, PacketKey = charterCost.CS_PKKey.Value }; var flightDatesTemp = dc.GetCharterDates(flightParamKeys, out hashOut); if (!cacheDependencies.Contains(hashOut)) { cacheDependencies.Add(hashOut); } var packetDatesTemp = mainDc.GetDatesByTours(new List <int> { packetKey }, out hashOut).Select(d => d.Item2).ToList(); if (!cacheDependencies.Contains(hashOut)) { cacheDependencies.Add(hashOut); } foreach (var flightParamsByDate in flightDatesTemp.Where(fd => packetDatesTemp.Contains(fd.DepartTime.Date))) { flightParamsByDate.CharterClassCode = dc.GetAirServiceByKey(charterCost.CS_SubCode1.Value).AS_CODE; flightParamsByDate.PortCodeFrom = charterCost.CH_PortCodeFrom; flightParamsByDate.CityKeyFrom = charterCost.CH_CityKeyFrom; flightParamsByDate.PortCodeTo = charterCost.CH_PortCodeTo; flightParamsByDate.CityKeyTo = charterCost.CH_CityKeyTo; flightParamsByDate.AirlineCode = charterCost.CH_AirlineCode; flightParamsByDate.FlightNumber = flightNumber; flightParamsByDate.AircraftType = charterCost.CH_Aircraft; var durationMin = charterCost.CS_LongMin; var durationMax = charterCost.CS_Long; flightParamsByDate.DurationMin = durationMin == null ? (short)0 : durationMin.Value; flightParamsByDate.DurationMax = durationMax ?? 999; result.Add(flightParamsByDate); } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Метод по проверке квот на перелет (можно использовать для вывода информации о перелетах п строке) /// </summary> /// <param name="dc">Контекст БД</param> /// <param name="mainDc">Контекст основной БД</param> /// <param name="charterKey">Ключ перелета</param> /// <param name="cityKeyFrom">Ключ города вылета</param> /// <param name="cityKeyTo">Ключ города прилета</param> /// <param name="charterDay">День вылета в туре</param> /// <param name="partnerKey">Ключ партнера по перелету</param> /// <param name="agentKey">Ключ агентства</param> /// <param name="packetKey">Ключ пакета</param> /// <param name="tourDate">Дата тура</param> /// <param name="linkedDay">День вылета парного перелета</param> /// <param name="findFlight">Признак "подбирать или не подбирать" перелет</param> /// <param name="flightGroups">Группы перелетов (эконом, бизнес, премиум)</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> public static Dictionary <int, List <FlightPlainInfo> > GetCharterAllQuota(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, Int32 charterKey, Int32 cityKeyFrom, Int32 cityKeyTo, Int32 charterDay, int partnerKey, int?agentKey, int packetKey, DateTime tourDate, Int32?linkedDay, bool findFlight, IDictionary <int, IEnumerable <int> > flightGroups, out string hash) { var cacheDependencies = new List <string>(); string cacheDep; hash = String.Format("{0}_{1}_{2}", MethodBase.GetCurrentMethod().Name, charterKey, CacheHelper.GetCacheKeyHashed(new[] { cityKeyFrom.ToString(), cityKeyTo.ToString(), partnerKey.ToString(), agentKey.ToString(), charterDay.ToString(), packetKey.ToString(), tourDate.ToString("yyyy-MM-dd"), linkedDay.ToString(), findFlight.ToString(), String.Join("_", flightGroups.Keys), String.Join("_", flightGroups.Values) })); Dictionary <int, List <FlightPlainInfo> > result; if ((result = CacheHelper.GetCacheItem <Dictionary <int, List <FlightPlainInfo> > >(hash)) != null) { return(result); } var charterDate = tourDate.AddDays(charterDay - 1).Date; // в случае, если перелета с ключом charterKey в БД нет, не найдутся ctKeyFrom и ctKeyTo // при этом мы возьмем данные, которые стоят в БД - cityKeyFrom и cityKeyTo int?ctKeyFrom, ctKeyTo; dc.GetCharterCityDirection(charterKey, out ctKeyFrom, out ctKeyTo); if (ctKeyFrom.HasValue) { cityKeyFrom = ctKeyFrom.Value; } if (ctKeyTo.HasValue) { cityKeyTo = ctKeyTo.Value; } result = findFlight ? dc.GetAltCharters(mainDc, cityKeyFrom, cityKeyTo, charterDate, packetKey, flightGroups, out cacheDep) : dc.GetAltCharters(mainDc, charterKey, charterDate, packetKey, flightGroups, out cacheDep); cacheDependencies.Add(cacheDep); foreach (var key in flightGroups.Keys) { foreach (var flight in result[key]) { if (dc.IsStopByDrection(cityKeyFrom, cityKeyTo, charterDate, linkedDay != null ? tourDate.AddDays(linkedDay.Value - 1) : charterDate, out cacheDep)) { flight.QuotaState = new QuotaStatePlaces { QuotaState = QuotesStates.No }; } else { flight.QuotaState = dc.CheckServiceQuota(ServiceClass.Flight, flight.CharterKey, flight.ClassKey, null, flight.PartnerKey, agentKey, charterDate, linkedDay != null ? tourDate.AddDays(linkedDay.Value - 1) : charterDate, out cacheDep); } cacheDependencies.Add(cacheDep); //if (flightInfo.QuotaState.QuotaState == QuotesStates.Undefined // || QuotasExtension.OrderderQuotaStates[tempState.QuotaState] > QuotasExtension.OrderderQuotaStates[flightInfo.QuotaState.QuotaState] // || (tempState.QuotaState == QuotesStates.Small && flightInfo.QuotaState.QuotaState == QuotesStates.Small && tempState.Places > flightInfo.QuotaState.Places)) //{ // flightInfo.QuotaState = tempState; //} //if (flightInfo.QuotaState.QuotaState == QuotesStates.Availiable) // break; } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Возвращает список пакетов, в которых лежат цены для бронирования авиабилетов /// </summary> /// <param name="dc">Контекст базы данных</param> /// <param name="searchDc">Контекст поисковой БД</param> /// <param name="hash">Хэш кэша</param> /// <returns>Tuple int, PacketType - ключ пакета, тип пакета (направление туда, обратно или туда/обратно)</returns> public static IList <Tuple <int, PacketType> > GetFlightPackets(this MtMainDbDataContext dc, MtSearchDbDataContext searchDc, out string hash) { List <Tuple <int, PacketType> > result; hash = String.Format("{0}", MethodBase.GetCurrentMethod().Name); if ((result = CacheHelper.GetCacheItem <List <Tuple <int, PacketType> > >(hash)) != null) { return(result); } var cacheDependencies = new List <string>(); result = new List <Tuple <int, PacketType> >(); string hashOut; var packetKeys = dc.GetCharterBookingPackets(out hashOut); cacheDependencies.Add(hashOut); var packetKeysDates = dc.GetDatesByTours(packetKeys, out hashOut); cacheDependencies.Add(hashOut); var allPacketServices = dc.GetClassServicesByTurListKeys(ServiceClass.Flight, packetKeysDates.Select(p => p.Item1).Distinct().ToList(), out hashOut); cacheDependencies.Add(hashOut); var homeCountryKey = (from ct in searchDc.GetAllCities() where ct.CT_KEY == Globals.Settings.HomeCityKey select ct.CT_CNKEY) .Single(); foreach (var packetKey in packetKeysDates.Select(p => p.Item1).Distinct().ToList()) { var services = (from s in allPacketServices where s.TS_PKKEY == packetKey select s) .ToList(); if (services.Count > 1) { result.Add(new Tuple <int, PacketType>(packetKey, PacketType.TwoWayCharters)); } else if (services.Count == 1) { var serviceCountryKey = (from cn in searchDc.GetAllCities() where cn.CT_KEY == services[0].TS_SUBCODE2 select cn.CT_CNKEY) .FirstOrDefault(); result.Add(serviceCountryKey == homeCountryKey ? new Tuple <int, PacketType>(packetKey, PacketType.DirectCharters) : new Tuple <int, PacketType>(packetKey, PacketType.BackCharters)); } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Возвращает информацию по туру для корзины по ключу цены /// </summary> /// <param name="mainDc">Контекст основной БД</param> /// <param name="searchDc">Контекст поисковой БД</param> /// <param name="priceKey">Ключ цены (таблица tp_prices)</param> /// <returns></returns> public static PriceInfo GetPriceInfoByTPKey(this MtMainDbDataContext mainDc, MtSearchDbDataContext searchDc, int priceKey) { var priceStartDate = mainDc.GetTPPriceByKey(priceKey).TP_DateBegin; var commandBuilder = new StringBuilder(); commandBuilder.AppendLine("select to_key, ts_key, ts_svkey, ts_code, ts_subcode1, ts_subcode2, ts_oppartnerkey, ts_oppacketkey, ts_day, ts_days, ts_men, ts_attribute "); commandBuilder.AppendLine("from tp_tours "); commandBuilder.AppendLine("join tp_services on ts_tokey = to_Key "); commandBuilder.AppendLine("join tp_servicelists on tl_tskey = ts_key "); commandBuilder.AppendLine("join tp_lists on ti_key = tl_tikey "); commandBuilder.AppendLine(String.Format("where tl_tikey in (select tp_tikey from tp_prices where tp_key = {0})", priceKey)); commandBuilder.AppendLine("order by ts_day, ts_key"); var priceInfo = new PriceInfo(); using (var command = mainDc.Connection.CreateCommand()) { command.CommandText = commandBuilder.ToString(); command.CommandTimeout = 100; mainDc.Connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { if (priceInfo.Tour == null) { priceInfo.Tour = (from tour in searchDc.GetAllTPTours() where tour.TO_Key == reader.GetInt32("to_key") select tour).Single(); } var sf = new ServiceInfo { Key = reader.GetInt32("ts_key"), ServiceClass = (ServiceClass)reader.GetInt32("ts_svkey"), Code = reader.GetInt32("ts_code"), SubCode1 = reader.GetInt32OrNull("ts_subcode1"), SubCode2 = reader.GetInt32OrNull("ts_subcode2"), PartnerKey = reader.GetInt32("ts_oppartnerkey"), PacketKey = reader.GetInt32("ts_oppacketkey"), StartDate = priceStartDate.AddDays(reader.GetInt16("ts_day") - 1), Days = reader.GetInt16("ts_days"), NMen = reader.GetInt16("ts_men"), Attribute = reader.GetInt32("ts_attribute"), Day = reader.GetInt16("ts_day") }; if (sf.ServiceClass != ServiceClass.Flight) { priceInfo.Services.Add(sf); } else { int?ctKeyFrom, ctKeyTo; searchDc.GetCharterCityDirection(sf.Code, out ctKeyFrom, out ctKeyTo); if (!ctKeyFrom.HasValue || !ctKeyTo.HasValue) { throw new KeyNotFoundException(String.Format("Перелет с ключом {0} не найден", sf.Code)); } var findFlight = (sf.Attribute & (int)ServiceAttribute.CodeEdit) != (int)ServiceAttribute.CodeEdit; var flightGroups = Globals.Settings.CharterClassesDictionary; string hashOut; var altCharters = findFlight ? searchDc.GetAltCharters(mainDc, ctKeyFrom.Value, ctKeyTo.Value, sf.StartDate, sf.PacketKey, flightGroups, out hashOut) : searchDc.GetAltCharters(mainDc, sf.Code, sf.StartDate, sf.PacketKey, flightGroups, out hashOut); foreach (var key in flightGroups.Keys) { var key1 = key; priceInfo.Flights.AddRange(altCharters[key].Select(info => new FlightInfo() { Key = sf.Key, Attribute = sf.Attribute, Code = info.CharterKey, SubCode1 = info.ClassKey, PartnerKey = info.PartnerKey, FlightTimeStart = info.FlightDateTimeFrom, FlightTimeEnd = info.FlightDateTimeTo, Days = sf.Days, Day = sf.Day, ServiceClass = sf.ServiceClass, SubCode2 = sf.SubCode2, PacketKey = sf.PacketKey, StartDate = sf.StartDate, NMen = sf.NMen, FlightGroupKey = key1 })); } } } } mainDc.Connection.Close(); } var priceEndDate = priceStartDate; var tempDate = DateTime.MinValue; foreach (var sf in priceInfo.Services) { string hashOut; // делаем расчет стоимости услуги //todo: переделать получение цены по разным валютам sf.Cost = mainDc.GetServiceCost((int)sf.ServiceClass, sf.Code, sf.SubCode1.HasValue ? sf.SubCode1.Value : 0, sf.SubCode2.HasValue ? sf.SubCode2.Value : 0, sf.PartnerKey, sf.PacketKey, sf.StartDate, sf.Days, "E", sf.NMen, out hashOut); // получаем конечную дату тура if (sf.ServiceClass == ServiceClass.Hotel || sf.ServiceClass == ServiceClass.AddHotelService) { tempDate = priceStartDate.AddDays(sf.Day + Math.Max((int)sf.Days, 1) - 1); } else { tempDate = priceStartDate.AddDays(sf.Day + Math.Max((int)sf.Days, 1) - 2); } if (priceEndDate < tempDate) { priceEndDate = tempDate; } } foreach (var fi in priceInfo.Flights) { string hashOut; // делаем расчет стоимости услуги //todo: переделать получение цены по разным валютам fi.Cost = mainDc.GetServiceCost((int)fi.ServiceClass, fi.Code, fi.SubCode1.HasValue ? fi.SubCode1.Value : 0, fi.SubCode2.HasValue ? fi.SubCode2.Value : 0, fi.PartnerKey, fi.PacketKey, fi.StartDate, priceInfo.Flights.Max(f => f.Day), "E", fi.NMen, out hashOut); // получаем направление перелета // первый перелет - прямой перелет // последний перелет - обратный // все остальные - промежуточные if (fi.Key == priceInfo.Flights.Min(f => f.Key)) { fi.Direction = FlightDirection.DirectFlight; } else if (fi.Key == priceInfo.Flights.Max(f => f.Key)) { fi.Direction = FlightDirection.BackFlight; } else { fi.Direction = FlightDirection.Intermediate; } // получаем конечную дату тура tempDate = priceStartDate.AddDays(fi.Day - 1); if (priceEndDate < tempDate) { priceEndDate = tempDate; } } priceInfo.TourDateBegin = priceStartDate; priceInfo.TourDateEnd = tempDate; var tst = priceInfo.GetTourHotelsAndPansions; return(priceInfo); }
/// <summary> /// Данные по квотам на перелеты /// </summary> /// <param name="dc">Контекст БД</param> /// <param name="mainDc">Контекст БД</param> /// <param name="query">Параметры запроса</param> /// <param name="hash">Строка кэша</param> /// <returns></returns> public static QuotaPriceResult GetFlightQuotaPrices(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, QuotaPriceQuery query, out string hash) { QuotaPriceResult result; hash = String.Format("{0}_{1}", MethodBase.GetCurrentMethod().Name, query); if ((result = CacheHelper.GetCacheItem <QuotaPriceResult>(hash)) != null) { return(result); } // определяем агента по логину / паролю пользователя int?agentKey = null; if (!string.IsNullOrEmpty(query.UserName)) { var user = mainDc.GetDupUser(query.UserName, query.UserPassword); if (user != null) { agentKey = user.US_PRKEY; } } var cacheDependencies = new List <string>(); result = new QuotaPriceResult(); foreach (var flightPars in query.FlightParams) { string hashOut; var cost = dc.GetFlightPriceByParams(flightPars.FlightParamKeys.CharterKey, flightPars.FlightParamKeys.CharterClassKey, flightPars.FlightParamKeys.PartnerKey, flightPars.FlightParamKeys.PacketKey, flightPars.DepartTime.Date, flightPars.Duration != null ? flightPars.Duration.Value : 1, out hashOut); if (!cacheDependencies.Contains(hashOut)) { cacheDependencies.Add(hashOut); } if (cost != null && cost.Price != null) { var quotaState = dc.CheckServiceQuotaByDay(ServiceClass.Flight, flightPars.FlightParamKeys.CharterKey, flightPars.FlightParamKeys.CharterClassKey, null, flightPars.FlightParamKeys.PartnerKey, agentKey, flightPars.DepartTime.Date, flightPars.Duration != null ? flightPars.Duration.Value : 1, true, out hashOut); if (!cacheDependencies.Contains(hashOut)) { cacheDependencies.Add(hashOut); } result.FlightData.Add(new QuotaPriceData { QuotaState = quotaState.QuotaState, QuotaPlaces = quotaState.Places, PriceValue = cost }); } } CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Возвращает список городов прилета /// </summary> /// <param name="dc">Контекст поисковой БД</param> /// <param name="mainDc">Контекст основной БД</param> /// <param name="isOneWay">Является ли перелет в одну сторону или туда/обратно</param> /// <param name="countryKey">Ключ страны прилета</param> /// <param name="cityKeyFrom">Ключ города вылета</param> /// <param name="hash">Хэш кэша</param> /// <returns></returns> public static IList <Tuple <int, string> > GetFlightCitiesTo(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc, bool isOneWay, int?countryKey, int cityKeyFrom, out string hash) { List <Tuple <int, string> > result; hash = String.Format("{0}_{1}_{2}_{3}", MethodBase.GetCurrentMethod().Name, isOneWay, countryKey, cityKeyFrom); if ((result = CacheHelper.GetCacheItem <List <Tuple <int, string> > >(hash)) != null) { return(result); } var cacheDependencies = new List <string>(); string hashOut; var packets = mainDc.GetFlightPackets(dc, out hashOut) .Where( p => !isOneWay && p.Item2 == PacketType.TwoWayCharters || isOneWay && p.Item2 != PacketType.TwoWayCharters) .ToList(); cacheDependencies.Add(hashOut); var schedule = dc.GetFlightSchedules(mainDc, packets, out hashOut); cacheDependencies.Add(hashOut); var cities = new List <int>(); if (isOneWay) { cities.AddRange(schedule.Schedule.Where(s => s.FlightParamsFrom == null && s.FlightParamsTo != null) .Where(s => s.FlightParamsTo.CityKeyFrom == cityKeyFrom) .Select(s => s.FlightParamsTo.CityKeyTo) .Distinct() .ToList()); cities.AddRange(schedule.Schedule.Where(s => s.FlightParamsTo == null && s.FlightParamsFrom != null) .Where(s => s.FlightParamsFrom.CityKeyFrom == cityKeyFrom) .Select(s => s.FlightParamsFrom.CityKeyTo) .Distinct() .ToList()); } else { cities.AddRange(schedule.Schedule.Where(s => s.FlightParamsFrom != null && s.FlightParamsTo != null) .Where(s => s.FlightParamsFrom.CityKeyTo == cityKeyFrom && s.FlightParamsTo.CityKeyFrom == cityKeyFrom) .Select(s => s.FlightParamsTo.CityKeyTo) .Distinct() .ToList()); } result = (from c in dc.GetAllCities() where cities.Contains(c.CT_KEY) && (countryKey == null || c.CT_CNKEY == countryKey.Value) select new Tuple <int, string>(c.CT_KEY, c.CT_NAME)) .OrderBy(c => c.Item2) .ToList(); cacheDependencies.Add(CitiesExtension.TableName); CacheHelper.AddCacheData(hash, result, cacheDependencies.ToList(), Globals.Settings.Cache.LongCacheTimeout); return(result); }
/// <summary> /// Метод по выдаче расписаний рейсов /// </summary> /// <param name="dc">Контекст БД</param> /// <param name="mainDc">Контекст БД</param> /// <returns></returns> public static FlightSchedule GetFlightSchedules(this MtSearchDbDataContext dc, MtMainDbDataContext mainDc) { string hash; return(GetFlightSchedules(dc, mainDc, out hash)); }
public static IList <SearchResultItem> ConvertCalcTourToNoSql(this MtMainDbDataContext mainDc, MtSearchDbDataContext searchDc, int tourKey) { var result = new List <SearchResultItem>(); string hashOut; var tours = searchDc.GetTPToursByKeys(new[] { tourKey }, out hashOut); TP_Tour tpTour; if (tours != null && tours.Count == 1) { tpTour = tours[0]; } else { throw new ArgumentException(String.Format("Неправильный параметр tourKey")); } var tourString = searchDc.GetTourStringsByKeys(new [] { tpTour.TO_Key }, out hashOut); var tpPrices = mainDc.TP_Prices.Where(t => t.TP_TOKey == tourKey && t.TP_Gross != null).ToList(); foreach (var tpPrice in tpPrices) { var item = new SearchResultItem(); // будет заполнен при выдаче результата в поиск item.PriceInRates = null; item.PriceKey = tpPrice.TP_Key; item.Price = tpPrice.TP_Gross.Value; item.RateCode = tpTour.TO_Rate; item.Date = tpPrice.TP_DateBegin; item.PriceFor = tpTour.TO_PriceFor == 0 ? PriceForType.PerMen : PriceForType.PerRoom; item.CountryKey = tpTour.TO_CNKey; } return(result); }