Web-сервисы: Сервис поиска — различия между версиями

Материал из Megatec
Перейти к: навигация, поиск
[досмотренная версия][досмотренная версия]
(Описание класса SearchParams)
 
(не показано 28 промежуточных версий 6 участников)
Строка 1: Строка 1:
 
==Введение==
 
==Введение==
 
Данный модуль предназначен для осуществления поиска и подбора туров из внешних приложений.
 
Данный модуль предназначен для осуществления поиска и подбора туров из внешних приложений.
 +
 +
===Ссылка на тестовый сервис===
 +
С работой тестового [http://demo.megatec.ru/DS_Search/Search.asmx сервиса поиска] вы можете ознакомиться на нашем демо-сервере.
 +
 
==Установка==
 
==Установка==
Для установки Поискового сервиса нужно создать директорию WebServices в каталоге c:/inetpub/wwwroot/MasterWeb и выложить туда распакованные файлы из архива mw-megatecwebservices-2007.2.XX.XXXX.zip.
+
Для установки Поискового сервиса нужно создать директорию WebServices в каталоге c:/inetpub/wwwroot/  и выложить туда распакованные файлы из архива mw-megatecwebservices-2007.2.XX.XXXX.zip.
 
В управлении IIS необходимо создать виртуальный каталог для папки WebServices.
 
В управлении IIS необходимо создать виртуальный каталог для папки WebServices.
 
===Создание виртуального каталога===
 
===Создание виртуального каталога===
Строка 24: Строка 28:
 
В файле web.config, расположенном в папке WebServices пропишите необходимые параметры подключения (курсивом выделены значения, которые необходимо ввести).
 
В файле web.config, расположенном в папке WebServices пропишите необходимые параметры подключения (курсивом выделены значения, которые необходимо ввести).
 
Строка подключения к базе данных ПК «Мастер-Тур»:
 
Строка подключения к базе данных ПК «Мастер-Тур»:
*1. <add key = "connectionString" value = "Data Source=ip-адрес сервера базы данных ПК Мастер-тур;Initial Catalog=название базы данных ПК Мастер-тур;User ID=логин пользователя ПК Мастер-тур;Password=пароль пользователя ПК Мастер-тур"/>
+
*1. <add key = "connectionString" value = "Data Source=''ip-адрес сервера базы данных ПК Мастер-тур'';Initial Catalog=''название базы данных ПК Мастер-тур'';User ID=''логин пользователя ПК Мастер-тур'';Password=''пароль пользователя ПК Мастер-тур''"/>
*2. <add key = "connectionStringShort" value = "Data Source= ip-адрес сервера базы данных ПК Мастер-Тур;Initial Catalog= название базы данных ПК Мастер-Тур;"/>  
+
*2. <add key = "connectionStringShort" value = "Data Source=''ip-адрес сервера базы данных ПК Мастер-Тур'';Initial Catalog=''название базы данных ПК Мастер-Тур''"/>
 +
<br>При использовании репликации в строке подключения необходимо указать подключение к поисковой базе. Настройка '''searchConnectionString''' веб-сервисом не поддерживается.
 +
 
 
==Настройка==
 
==Настройка==
После установки «Поисковый сервис» доступен по адресу http: //ip- адрес сервера Мастер-Веб/WebServices/Search.asmx.
+
После установки «Поисковый сервис» доступен по адресу <code><nowiki>http://ip-адрес сервера Мастер-Веб/WebServices/Search.asmx</nowiki></code>.
 +
 
 +
===Настройки web.config «Поискового сервиса»===
 +
Дополнительные настройки, задаваемые в секции <code><appSettings></code> файла web.config, находящемся в папке WebServices, позволяют задать дополнительные условия для отображения и проверки данных по турам от удаленных источников.
 +
{| border="1" cellpadding="8" style="background-color:#F9F9F9; border:#AAAAAA; border-collapse:collapse"
 +
 
 +
|- style="background-color:#F2F2F2"
 +
 
 +
! width="2%" | №
 +
! width="28%" | Описание
 +
! width="35%" | Значение
 +
! width="35%" | Настройка
 +
 
 +
|- style="vertical-align:text-top"
 +
| 1
 +
| Отображение наличия мест в экранах, '''если релиз-период = 0'''
 +
|
 +
*'''true''' – отображается “запрос”, даже если в квоте еще есть свободные места;
 +
*'''false''' или '''отсутствие настройки''' – отображается статус в соответствии с обычными правилами
 +
| <syntaxhighlight lang="xml" enclose="div">
 +
<add key="setRequestIfReleaseIsZero" value="true" />
 +
</syntaxhighlight>
 +
 
 +
|- style="vertical-align:text-top"
 +
| 2
 +
| Проверка агентской квоты
 +
|
 +
*'''true''' или '''отсутствие настройки''' – квоты разделяются на агентские/общие;
 +
*'''false''' – агентские квоты игнорируются, и проверяется только общая квота
 +
| <syntaxhighlight lang="xml" enclose="div">
 +
<add key="checkAgentQuotesEnabled" value="true" />
 +
</syntaxhighlight>
 +
 
 +
|- style="vertical-align:text-top"
 +
| 3
 +
| Проверка общей квоты, если закончились места в агентской
 +
|
 +
*'''true''' или '''отсутствие настройки''' – если агентская квота закончилась, то проверяется общая квота;
 +
*'''false''' – если агентская квота закончилась, общая не проверяется
 +
| <syntaxhighlight lang="xml" enclose="div">
 +
<add key="checkAgentAndCommonQuote" value="true" />
 +
</syntaxhighlight>
 +
 
 +
|- style="vertical-align:text-top"
 +
| 4
 +
| Проверка квот без продолжительности после того, как заканчиваются квоты на продолжительность
 +
|
 +
*'''true''' или '''отсутствие настройки''' – проверять квоты без продолжительности после того, как закончатся квоты на продолжительность;
 +
*'''false''' – не проверять квоты без продолжительности
 +
| <syntaxhighlight lang="xml" enclose="div">
 +
<add key="checkNoLongQuota" value="true" />
 +
</syntaxhighlight>
 +
 
 +
|- style="vertical-align:text-top"
 +
| 5
 +
| Наличие мест, отображаемое при наступлении релиз-периода
 +
|
 +
*'''request''' – запрос;
 +
*'''no''' – нет
 +
| <syntaxhighlight lang="xml" enclose="div">
 +
<add key="expiredReleaseQuoteResult" value="request" />
 +
</syntaxhighlight>
 +
 
 +
|- style="vertical-align:text-top"
 +
|}
 +
 
 
===Настройки web.config приложения ПК Мастер-Web===
 
===Настройки web.config приложения ПК Мастер-Web===
Дополнительные настройки, задаваемые в файле web.config, находящемся в папке MasterWeb позволяют задать дополнительные условия для отображения и проверки данных.
 
<table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width=645
 
style='width:483.4pt;margin-left:-.5pt;border-collapse:collapse'>
 
<tr>
 
  <td width=46 valign=top style='width:34.25pt;border:solid black 1.0pt;
 
  border-right:none;padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=TitleTable style='layout-grid-mode:char'>№</p>
 
  </td>
 
  <td width=138 valign=top style='width:103.65pt;border:solid black 1.0pt;
 
  border-right:none;padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=TitleTable style='layout-grid-mode:char'>Описание</p>
 
  </td>
 
  <td width=204 valign=top style='width:153.0pt;border:solid black 1.0pt;
 
  border-right:none;padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=TitleTable style='layout-grid-mode:char'>Значение</p>
 
  </td>
 
  <td width=257 valign=top style='width:192.5pt;border:solid black 1.0pt;
 
  padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=TitleTable style='layout-grid-mode:char'>Настройка</p>
 
  </td>
 
</tr>
 
<tr>
 
  <td width=46 valign=top style='width:34.25pt;border-top:none;border-left:
 
  solid black 1.0pt;border-bottom:solid black 1.0pt;border-right:none;
 
  padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=Tabletext style='layout-grid-mode:char'><span lang=EN-US>1</span></p>
 
  </td>
 
  <td width=138 valign=top style='width:103.65pt;border-top:none;border-left:
 
  solid black 1.0pt;border-bottom:solid black 1.0pt;border-right:none;
 
  padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=Tabletext style='layout-grid-mode:char'>Путь к приложению <span
 
  lang=EN-US>WebServices</span></p>
 
  </td>
 
  <td width=204 valign=top style='width:153.0pt;border-top:none;border-left:
 
  solid black 1.0pt;border-bottom:solid black 1.0pt;border-right:none;
 
  padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=Tabletext>Ссылка на приложение <span lang=EN-US>WebServices</span></p>
 
  </td>
 
  <td width=257 valign=top style='width:192.5pt;border:solid black 1.0pt;
 
  border-top:none;padding:0cm 5.4pt 0cm 5.4pt'>
 
  <p class=MsoNormal style='layout-grid-mode:char'><span lang=EN-US>&lt;add
 
  key=&quot;<b>webServicesSource</b>&quot; value=&quot;<b><i><span
 
  style='color:blue'>http: //localhost/MasterWeb/WebService</span></i></b>&quot;/&gt;</span></p>
 
  </td>
 
</tr>
 
</table>
 
 
====Добавление секций====
 
====Добавление секций====
 
*1. В секции <ConfigSections> необходимо добавить подсекцию:
 
*1. В секции <ConfigSections> необходимо добавить подсекцию:
 +
<TABLE STYLE="border: 0.1em dashed #2F6FAB; margin: 8px; padding: 8px" WIDTH="100%"><TR><TD>
 +
<syntaxhighlight lang="xml">
 
  <sectionGroup name="Megatec.Web.Services">
 
  <sectionGroup name="Megatec.Web.Services">
 
  <section name="servicesAccessibility" type="Megatec.Configuration.WebServicesSection, Megatec.Configuration"/>
 
  <section name="servicesAccessibility" type="Megatec.Configuration.WebServicesSection, Megatec.Configuration"/>
 
  </sectionGroup>
 
  </sectionGroup>
 +
</syntaxhighlight>
 +
</TD></TR></TABLE>
  
 
*2. На одном уровне с секцией <ConfigSections> необходимо добавить секцию:
 
*2. На одном уровне с секцией <ConfigSections> необходимо добавить секцию:
 +
<span style="color:#808080">В данной секции необходимо указать адрес поискового веб-сервиса.</span>
 +
<TABLE STYLE="border: 0.1em dashed #2F6FAB; margin: 8px; padding: 8px" WIDTH="100%"><TR><TD>
 +
<syntaxhighlight lang="xml">
 
  <Megatec.Web.Services>
 
  <Megatec.Web.Services>
 
  <servicesAccessibility Enabled="true">
 
  <servicesAccessibility Enabled="true">
 
  <Services>
 
  <Services>
  <add name="DoSearch" enabled="true"/>
+
  <add name="DoSearch" enabled="true" url="http://somesite/Webservices/Search.asmx"/>
 
  </Services>
 
  </Services>
 
  </servicesAccessibility>
 
  </servicesAccessibility>
 
  </Megatec.Web.Services>
 
  </Megatec.Web.Services>
 +
</syntaxhighlight>
 +
</TD></TR></TABLE>
 +
 
==Подготовка данных==
 
==Подготовка данных==
 
===Описание класса SearchFilter===
 
===Описание класса SearchFilter===
 +
 +
[[Файл: mb_030.png|left|Предупреждение]] <BR>
 +
Параметр '''PageSize''' является ''обязательным'' и его значение должно быть менее 1000.
 +
<BR><BR><BR><BR><BR>
 +
Возможные значения '''HotelQuotaMask''':
 +
*'''None'''    - Ничего не выбрано
 +
*'''Yes'''      - Есть гарантированные места
 +
*'''Request'''  - Места под запрос
 +
*'''NoFlight''' - Гарантированные места + места под запрос
 +
*'''All'''      - Гарантированные места + места под запрос + мест нет
 +
<br>
 +
Возможные значения '''AviaQuotaMask''':
 +
*'''None'''    - Ничего не выбрано
 +
*'''Yes'''      - Есть гарантированные места
 +
*'''Request'''  - Места под запрос
 +
*'''NoFlight''' - Гарантированные места + места под запрос
 +
*'''All'''      - Гарантированные места + места под запрос + мест нет
 +
<br>
 
  <nowiki>/// <summary>
 
  <nowiki>/// <summary>
 
     /// Поисковый фильтр
 
     /// Поисковый фильтр
Строка 231: Строка 284:
  
 
         /// <summary>
 
         /// <summary>
         /// Поставлен ли флажок все авиакомпании
+
         /// Поставлен ли флажок все авиакомпании (данный параметр еще не реализован)
 
         /// </summary>
 
         /// </summary>
 
         [XmlAttribute]
 
         [XmlAttribute]
Строка 362: Строка 415:
  
 
         /// <summary>
 
         /// <summary>
         /// Ключ города прибытия
+
         /// Ключ города прибытия (данный параметр еще не реализован)
 
         /// </summary>
 
         /// </summary>
 
         [XmlAttribute]
 
         [XmlAttribute]
Строка 740: Строка 793:
 
         }
 
         }
 
         /// <summary>
 
         /// <summary>
         /// Список ключей авиакомпаний
+
         /// Список кодов авиакомпаний
 
         /// </summary>
 
         /// </summary>
         public ArrayList AirlineKeys
+
         public ArrayList AirlineCodes
 
         {
 
         {
 
             get
 
             get
 
             {
 
             {
                 return this._airlineKeys;
+
                 return this._airlineCodes;
 
             }
 
             }
 
         }
 
         }
Строка 1000: Строка 1053:
 
     }
 
     }
 
}</nowiki>
 
}</nowiki>
 +
 
===Описание класса SearchParams===
 
===Описание класса SearchParams===
 
  <nowiki>/// <summary>
 
  <nowiki>/// <summary>
Строка 1014: Строка 1068:
 
         /// <summary>
 
         /// <summary>
 
         /// Разделять квоты на агентские/неагентские или игнорировать агентские квоты.
 
         /// Разделять квоты на агентские/неагентские или игнорировать агентские квоты.
         /// Настройка web.config: "checkAgentQuotesEnabled".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkAgentQuotesEnabled".
 
         /// Значение по умолчанию: true.
 
         /// Значение по умолчанию: true.
 
         /// </summary>
 
         /// </summary>
Строка 1022: Строка 1076:
 
         /// <summary>
 
         /// <summary>
 
         /// Проверять общую квоту, если агентская закончилась.
 
         /// Проверять общую квоту, если агентская закончилась.
         /// Настройка web.config: "checkAgentAndCommonQuote".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkAgentAndCommonQuote".
 
         /// Значение по умолчанию: true.
 
         /// Значение по умолчанию: true.
 
         /// </summary>
 
         /// </summary>
Строка 1032: Строка 1086:
 
         /// иначе цены в расчет на принимается, а используется только расписание перелетов.
 
         /// иначе цены в расчет на принимается, а используется только расписание перелетов.
 
         /// Используется только, если FindFlight = true.
 
         /// Используется только, если FindFlight = true.
         /// Настройка web.config: "checkFlightPacket".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkFlightPacket".
 
         /// Значение по умолчанию: true.
 
         /// Значение по умолчанию: true.
 
         /// </summary>
 
         /// </summary>
Строка 1040: Строка 1094:
 
         /// <summary>
 
         /// <summary>
 
         /// Проверять квоты без продолжительности после того, как закончатся квоты на продолжительность.
 
         /// Проверять квоты без продолжительности после того, как закончатся квоты на продолжительность.
         /// Настройка web.config: "checkNoLongQuota".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkNoLongQuota".
 
         /// Значение по умолчанию: true
 
         /// Значение по умолчанию: true
 
         /// </summary>
 
         /// </summary>
Строка 1048: Строка 1102:
 
         /// <summary>
 
         /// <summary>
 
         /// Проверять квоты от всех различных партнеров.
 
         /// Проверять квоты от всех различных партнеров.
         /// Настройка web.config: "checkAllPartnersQuota".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkAllPartnersQuota".
 
         /// Значение по умолчанию: false
 
         /// Значение по умолчанию: false
 
         /// </summary>
 
         /// </summary>
Строка 1056: Строка 1110:
 
         /// <summary>
 
         /// <summary>
 
         /// Результат возвращаемый, если у квоты истек релиз-период.
 
         /// Результат возвращаемый, если у квоты истек релиз-период.
         /// Настройка web.config: "expiredReleaseQuoteResult".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "expiredReleaseQuoteResult".
 
         /// Значение по умолчанию: QuotaResult.Status.Request.
 
         /// Значение по умолчанию: QuotaResult.Status.Request.
 
         /// </summary>
 
         /// </summary>
Строка 1076: Строка 1130:
 
         /// <summary>
 
         /// <summary>
 
         /// Использовать таблицу TP_Tours как источник данных, иначе - таблицу tbl_TurList
 
         /// Использовать таблицу TP_Tours как источник данных, иначе - таблицу tbl_TurList
         /// Настройка web.config: "quotedDynamicPriceTour".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "quotedDynamicPriceTour".
 
         /// Значение по умолчанию: true.
 
         /// Значение по умолчанию: true.
 
         /// </summary>
 
         /// </summary>
Строка 1084: Строка 1138:
 
         /// <summary>
 
         /// <summary>
 
         /// Результат возвращаемый при наличии квоты, но отсутствии свободных мест.
 
         /// Результат возвращаемый при наличии квоты, но отсутствии свободных мест.
         /// Настройка web.config: "noPlacesQuoteResult".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "noPlacesQuoteResult".
 
         /// Значение по умолчанию: QuotaResult.Status.No.
 
         /// Значение по умолчанию: QuotaResult.Status.No.
 
         /// </summary>
 
         /// </summary>
Строка 1092: Строка 1146:
 
         /// <summary>
 
         /// <summary>
 
         /// Тип отбора
 
         /// Тип отбора
 +
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "PagingType".
 
         /// </summary>
 
         /// </summary>
 
         [XmlAttribute("PagingType")]
 
         [XmlAttribute("PagingType")]
Строка 1097: Строка 1152:
  
 
         /// <summary>
 
         /// <summary>
         /// Возращать ли поле, содержащее список ключей классов услуг по туру
+
         /// Возвращает поле, содержащее список ключей классов услуг по туру
 
         /// </summary>
 
         /// </summary>
 
         [XmlAttribute("Services")]
 
         [XmlAttribute("Services")]
Строка 1104: Строка 1159:
 
         /// <summary>
 
         /// <summary>
 
         /// Отображать статус "Запрос", если релиз-период = 0, независимо от количества свободных мест.
 
         /// Отображать статус "Запрос", если релиз-период = 0, независимо от количества свободных мест.
         /// Настройка web.config: "setRequestIfReleaseIsZero".
+
         /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "setRequestIfReleaseIsZero".
 
         /// Значение по умолчанию: false.
 
         /// Значение по умолчанию: false.
 
         /// </summary>
 
         /// </summary>
Строка 1122: Строка 1177:
 
         public bool SortInDB = true;
 
         public bool SortInDB = true;
  
        /// <summary>
 
        /// Интерфейс, реализующий функцию межвалютной конвертации цен по туру
 
        /// </summary>
 
        [XmlIgnore]
 
        public Megatec.Types.IMoneyConverter MoneyConverter = null;
 
 
     }</nowiki>
 
     }</nowiki>
 +
 
===Описание класса SearchResult===
 
===Описание класса SearchResult===
 
  <nowiki>[XmlInclude(typeof(SearchResultItem))]
 
  <nowiki>[XmlInclude(typeof(SearchResultItem))]
Строка 1622: Строка 1673:
  
 
*SearchFilter filter – объект класса, описывающего критерии подбора тура
 
*SearchFilter filter – объект класса, описывающего критерии подбора тура
*int pageNumber – порядковый номер запрашиваемой страницы
+
*int pageNumber – порядковый номер запрашиваемой страницы (нумерация начинается с 0)
 
*SearchParams searchParams – объект класса, описывающего параметры подбора тура
 
*SearchParams searchParams – объект класса, описывающего параметры подбора тура
  
 
Сервис возвращает объект класса SearchResult, содержащий коллекцию объектов класса SearchResultItem.
 
Сервис возвращает объект класса SearchResult, содержащий коллекцию объектов класса SearchResultItem.
  
 +
===Примеры запросов к сервису===
 +
 +
{| border="1" cellpadding="8" style="background-color:#F9F9F9; border:#AAAAAA; border-collapse:collapse"
 +
 +
|- style="background-color:#F2F2F2"
 +
|- style="vertical-align:text-top"
 +
 +
| <syntaxhighlight lang="xml">
 +
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 +
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 +
    <soap:Body>
 +
        <DoSearch xmlns="http://megatec.ru/">
 +
            <filter CountryKey="90" ExcludeNoPlaces="true" DepartFromKey="1" IsAllHotels="true" IsAllTourType="false"
 +
                IsAllTourTypeDetails="false" Adults="2" Childs="0" PageSize="15" IsNullPriceMinimum="true" IsAllPansion="false">
 +
                <ExcludeTourType>false</ExcludeTourType>
 +
                <KindOfToursMask>All</KindOfToursMask>
 +
                <TurListAttributeMask>0</TurListAttributeMask>
 +
                <CruiseCountryKey>0</CruiseCountryKey>
 +
                <HotelPartnerKey>0</HotelPartnerKey>
 +
                <CruisePortKey>0</CruisePortKey>
 +
                <TurDateRange DateFrom="2016-09-12" DateTo="2016-09-20" />             
 +
                <PansionKeys>1</PansionKeys>
 +
            </filter>
 +
            <pageNumber>0</pageNumber>
 +
            <searchParams Sort="PT_Price">
 +
                <CalculateVisaDeadline>false</CalculateVisaDeadline>
 +
                <NotDefaultSort>false</NotDefaultSort>
 +
                <IsShowCOName>false</IsShowCOName>
 +
            </searchParams>
 +
        </DoSearch>
 +
    </soap:Body>
 +
</soap:Envelope>
 +
</syntaxhighlight>
 +
|}
 +
<br />
 +
 +
{| border="1" cellpadding="8" style="background-color:#F9F9F9; border:#AAAAAA; border-collapse:collapse"
 +
 +
|- style="background-color:#F2F2F2"
 +
|- style="vertical-align:text-top"
 +
 +
| <syntaxhighlight lang="xml">
 +
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 +
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 +
  <soap:Body>
 +
      <DoSearch xmlns="http://megatec.ru/">
 +
          <filter CountryKey="90" ExcludeNoPlaces="false" DepartFromKey="1" IsAllHotels="true"
 +
          IsAllTourType="false"  IsAllTourTypeDetails="false" Adults="2" Childs="0" PageSize="15"
 +
          IsNullPriceMinimum="true" IsAllPansion="false">
 +
              <DurationRange DurationFrom="0" DurationTo="0" />
 +
              <PansionKeys>
 +
                  <anyType xsi:type="xsd:int">1</anyType>
 +
                  <anyType xsi:type="xsd:int">2</anyType>
 +
              </PansionKeys>
 +
              <HotelStars>
 +
                  <anyType xsi:type="xsd:string">1*</anyType>
 +
                  <anyType xsi:type="xsd:string">2*</anyType>
 +
              </HotelStars>
 +
              <HotelKeys>
 +
                  <anyType xsi:type="xsd:int">1</anyType>
 +
                  <anyType xsi:type="xsd:int">2</anyType>
 +
              </HotelKeys>
 +
              <CityKeys>
 +
                  <anyType xsi:type="xsd:int">2</anyType>
 +
                  <anyType xsi:type="xsd:int">3</anyType>
 +
              </CityKeys>
 +
              <ResortKeys>
 +
                  <anyType xsi:type="xsd:int">4</anyType>
 +
                  <anyType xsi:type="xsd:int">5</anyType>
 +
              </ResortKeys>
 +
              <ExcludeTourType>false</ExcludeTourType>
 +
              <KindOfToursMask>All</KindOfToursMask>
 +
              <TurListAttributeMask>0</TurListAttributeMask>
 +
              <CruiseCountryKey>0</CruiseCountryKey>
 +
              <HotelPartnerKey>0</HotelPartnerKey>
 +
              <CruisePortKey>0</CruisePortKey>
 +
              <TurDateRange DateFrom="2017-05-12" DateTo="2017-05-12" />             
 +
              <PansionKeys>1</PansionKeys>
 +
          </filter>
 +
          <pageNumber>0</pageNumber>
 +
          <searchParams Sort="PT_Price, pt_hdstars desc, pt_tourdate" CheckCQ="false" CheckNLQ="false">
 +
              <CalculateVisaDeadline>false</CalculateVisaDeadline>
 +
              <NotDefaultSort>false</NotDefaultSort>
 +
              <IsShowCOName>false</IsShowCOName>
 +
          </searchParams>
 +
      </DoSearch>
 +
  </soap:Body>
 +
</soap:Envelope>
 +
</syntaxhighlight>
 +
|}
 +
<br />
  
[[Category:Мастер-Web_Дополнительные_модули]]
+
[[Category:Web-сервисы]]

Текущая версия на 09:36, 14 июня 2017

Введение

Данный модуль предназначен для осуществления поиска и подбора туров из внешних приложений.

Ссылка на тестовый сервис

С работой тестового сервиса поиска вы можете ознакомиться на нашем демо-сервере.

Установка

Для установки Поискового сервиса нужно создать директорию WebServices в каталоге c:/inetpub/wwwroot/ и выложить туда распакованные файлы из архива mw-megatecwebservices-2007.2.XX.XXXX.zip. В управлении IIS необходимо создать виртуальный каталог для папки WebServices.

Создание виртуального каталога

По умолчанию корневым каталогом IIS является C:/Inetpub/wwwroot. Для создания виртуального каталога для приложения находящегося в этом каталоге нужно выполнить следующие действия:

  • 1. Зайти в Пуск (Start) – Настройки (Settings) – Панель управления (Control Panel)


799.PNG

  • 2. В открывшемся окне выбрать Администрирование (Administrative Tools).


800.PNG

  • 3. Запустить Internet Information Services (IIS) Manager.


801.PNG

  • 4. В открывшемся дереве каталогов выбрать Web Sites – Default Web Site. В открывшемся списке найти папку, для которой нужно создать виртуальный каталог, кликнуть по ней правой кнопкой мыши и зайти в Свойства (Properties).


802.PNG

  • 5. В открывшемся окне, в закладке Directory нужно нажать кнопку «Create», а затем кнопку «ОК».


803.PNG

Подключение к базе данных ПК «Мастер-Тур»

В файле web.config, расположенном в папке WebServices пропишите необходимые параметры подключения (курсивом выделены значения, которые необходимо ввести). Строка подключения к базе данных ПК «Мастер-Тур»:

  • 1. <add key = "connectionString" value = "Data Source=ip-адрес сервера базы данных ПК Мастер-тур;Initial Catalog=название базы данных ПК Мастер-тур;User ID=логин пользователя ПК Мастер-тур;Password=пароль пользователя ПК Мастер-тур"/>
  • 2. <add key = "connectionStringShort" value = "Data Source=ip-адрес сервера базы данных ПК Мастер-Тур;Initial Catalog=название базы данных ПК Мастер-Тур"/>


При использовании репликации в строке подключения необходимо указать подключение к поисковой базе. Настройка searchConnectionString веб-сервисом не поддерживается.

Настройка

После установки «Поисковый сервис» доступен по адресу http://ip-адрес сервера Мастер-Веб/WebServices/Search.asmx.

Настройки web.config «Поискового сервиса»

Дополнительные настройки, задаваемые в секции <appSettings> файла web.config, находящемся в папке WebServices, позволяют задать дополнительные условия для отображения и проверки данных по турам от удаленных источников.

Описание Значение Настройка
1 Отображение наличия мест в экранах, если релиз-период = 0
  • true – отображается “запрос”, даже если в квоте еще есть свободные места;
  • false или отсутствие настройки – отображается статус в соответствии с обычными правилами
<add key="setRequestIfReleaseIsZero" value="true" />
2 Проверка агентской квоты
  • true или отсутствие настройки – квоты разделяются на агентские/общие;
  • false – агентские квоты игнорируются, и проверяется только общая квота
<add key="checkAgentQuotesEnabled" value="true" />
3 Проверка общей квоты, если закончились места в агентской
  • true или отсутствие настройки – если агентская квота закончилась, то проверяется общая квота;
  • false – если агентская квота закончилась, общая не проверяется
<add key="checkAgentAndCommonQuote" value="true" />
4 Проверка квот без продолжительности после того, как заканчиваются квоты на продолжительность
  • true или отсутствие настройки – проверять квоты без продолжительности после того, как закончатся квоты на продолжительность;
  • false – не проверять квоты без продолжительности
<add key="checkNoLongQuota" value="true" />
5 Наличие мест, отображаемое при наступлении релиз-периода
  • request – запрос;
  • no – нет
<add key="expiredReleaseQuoteResult" value="request" />

Настройки web.config приложения ПК Мастер-Web

Добавление секций

  • 1. В секции <ConfigSections> необходимо добавить подсекцию:
 <sectionGroup name="Megatec.Web.Services">
 <section name="servicesAccessibility" type="Megatec.Configuration.WebServicesSection, Megatec.Configuration"/>
 </sectionGroup>
  • 2. На одном уровне с секцией <ConfigSections> необходимо добавить секцию:

В данной секции необходимо указать адрес поискового веб-сервиса.

 <Megatec.Web.Services>
 <servicesAccessibility Enabled="true">
 <Services>
 <add name="DoSearch" enabled="true" url="http://somesite/Webservices/Search.asmx"/>
 </Services>
 </servicesAccessibility>
 </Megatec.Web.Services>

Подготовка данных

Описание класса SearchFilter

Предупреждение


Параметр PageSize является обязательным и его значение должно быть менее 1000.




Возможные значения HotelQuotaMask:

  • None - Ничего не выбрано
  • Yes - Есть гарантированные места
  • Request - Места под запрос
  • NoFlight - Гарантированные места + места под запрос
  • All - Гарантированные места + места под запрос + мест нет


Возможные значения AviaQuotaMask:

  • None - Ничего не выбрано
  • Yes - Есть гарантированные места
  • Request - Места под запрос
  • NoFlight - Гарантированные места + места под запрос
  • All - Гарантированные места + места под запрос + мест нет


/// <summary>
    /// Поисковый фильтр
    /// </summary>
    public class SearchFilter
    {
        public enum SearchSource : short
        {
            PriceTables = 0,
            BindingTables = 1,
        }

        public enum KindOfTours : int
        {
            All = 0,
            PacketTours = 1,
            LandTours = 2
        }

        /// <summary>
        /// Вид тура 
        /// </summary>
        public KindOfTours KindOfToursMask
        {
            get
            {
                return this.kindOfTours;
            }
            set
            {
                this.kindOfTours = value;
            }
        }

        /// <summary>
        /// Маска аттрибутов тура
        /// </summary>
        public int TurListAttributeMask
        {
            get
            {
                return this.turlistAttributeMask;
            }
            set
            {
                this.turlistAttributeMask = value;
            }
        }

        /// <summary>
        /// Партнер по отелю
        /// </summary>
        public int HotelPartnerKey
        {
            get
            {
                return this.hotelPartnerKey;
            }
            set
            {
                this.hotelPartnerKey = value;
            }
        }

        [XmlAttribute]
        public int MaxChildAge
        {
            get
            {
                return this.maxChildAge;
            }
            set
            {
                this.maxChildAge = value;
            }
        }

        /// <summary>
        /// Интервал дат
        /// </summary>
        public DateInterval TurDateRange
        {
            get
            {
                return this._turDateRange;
            }
            set
            {
                this._turDateRange = value;
            }
        }

        /// <summary>
        /// Интервал продолжительностей
        /// </summary>
        public DurationInterval DurationRange
        {
            get
            {
                return this._durationRange;
            }
            set
            {
                this._durationRange = value;
            }
        }

        /// <summary>
        /// Ключ страны
        /// </summary>
        [XmlAttribute]
        public int CountryKey
        {
            get
            {
                if (this._countryKeys.Count == 0)
                    return -1;

                return (int)this._countryKeys[0];
            }
            set
            {
                this._countryKeys.Clear();
                if (value > 0)
                    this._countryKeys.Add(value);
            }
        }

        /// <summary>
        /// Массив ключей стран
        /// </summary>
        public ArrayList CountryKeys
        {
            get
            {
                return this._countryKeys;
            }
        }


        /// <summary>
        /// Поставлен ли флажок все авиакомпании (данный параметр еще не реализован)
        /// </summary>
        [XmlAttribute]
        public bool IsAllAirlines
        {
            get
            {
                return this._isAllAirlines;
            }
            set
            {
                this._isAllAirlines = value;
            }
        }

        /// <summary>
        /// Поставлен ли флажок все страны
        /// </summary>
        [XmlAttribute]
        public bool IsAllCountries
        {
            get
            {
                return this._isAllCountries;
            }
            set
            {
                this._isAllCountries = value;
            }
        }

        /// <summary>
        /// Поиск на все продолжительности
        /// </summary>
        [XmlAttribute]
        public bool IsAllDurations
        {
            get
            {
                return this._isAllDurations;
            }
            set
            {
                this._isAllDurations = value;
            }
        }

        /// <summary>
        /// Массив продолжительностей
        /// </summary>
        public ArrayList Durations
        {
            get
            {
                return durations;
            }
        }

        [XmlAttribute]
        public bool ExcludeNoPlaces
        {
            get
            {
                return excludeNoPlaces;
            }
            set
            {
                excludeNoPlaces = value;
            }
        }

        /// <summary>
        /// Массив продолжительностей в днях
        /// </summary>
        public ArrayList Days
        {
            get
            {
                return days;
            }
        }

        /// <summary>
        /// Массив продолжительностей в ночах
        /// </summary>
        public ArrayList Nights
        {
            get
            {
                return nights;
            }
        }

        /// <summary>
        /// Проверять ли квоты
        /// </summary>
        [XmlAttribute]
        public bool CheckQuotes
        {
            get
            {
                return checkQuotes;
            }
            set
            {
                checkQuotes = value;
            }
        }

        /// <summary>
        /// Ключ города отправления
        /// </summary>
        [XmlAttribute]
        public int DepartFromKey
        {
            get
            {
                if (this._departFromKeys.Count == 0)
                    return -1;

                return (int)this._departFromKeys[0];
            }
            set
            {
                this._departFromKeys.Clear();
                if (value >= 0)
                    this._departFromKeys.Add(value);
            }
        }

        /// <summary>
        /// Ключ города прибытия (данный параметр еще не реализован)
        /// </summary>
        [XmlAttribute]
        public int DepartToKey
        {
            get
            {
                if (this._departToKeys.Count == 0)
                    return -1;

                return (int)this._departToKeys[0];
            }
            set
            {
                this._departToKeys.Clear();
                if (value > 0)
                    this._departToKeys.Add(value);
            }
        }

        /// <summary>
        /// Массив ключей городов вылета
        /// </summary>
        public ArrayList DepartFromKeys
        {
            get
            {
                return this._departFromKeys;
            }
        }


        /// <summary>
        /// Поставлен ли флажок все города вылетов
        /// </summary>
        [XmlAttribute]
        public bool IsAllDepartsFrom
        {
            get
            {
                return this._isAllDepartsFrom;
            }
            set
            {
                this._isAllDepartsFrom = value;
            }
        }

        /// <summary>
        /// Массив ключей городов прибытия
        /// </summary>
        public ArrayList DepartToKeys
        {
            get
            {
                return this._departToKeys;
            }
        }


        /// <summary>
        /// Поставлен ли флажок все города вылетов
        /// </summary>
        [XmlAttribute]
        public bool IsAllDepartsTo
        {
            get
            {
                return this._isAllDepartsTo;
            }
            set
            {
                this._isAllDepartsTo = value;
            }
        }


        /// <summary>
        /// Массив ключей аэропортов вылета
        /// </summary>
        public ArrayList AirportFromKeys
        {
            get
            {
                return this._airportFromKeys;
            }
        }


        /// <summary>
        /// Поставлен ли флажок все города вылетов
        /// </summary>
        [XmlAttribute]
        public bool IsAllAirportsFrom
        {
            get
            {
                return this._isAllAirportsFrom;
            }
            set
            {
                this._isAllAirportsFrom = value;
            }
        }

        /// <summary>
        /// Массив ключей аэропортов прибытия
        /// </summary>
        public ArrayList AirportToKeys
        {
            get
            {
                return this._airportToKeys;
            }
        }


        /// <summary>
        /// Поставлен ли флажок все города вылетов
        /// </summary>
        [XmlAttribute]
        public bool IsAllAirportsTo
        {
            get
            {
                return this._isAllAirportsTo;
            }
            set
            {
                this._isAllAirportsTo = value;
            }
        }

        /// <summary>
        /// Ключ отеля
        /// </summary>
        [XmlAttribute]
        public int HotelKey
        {
            get
            {
                if (this._hotelKeys.Count == 0)
                    return -1;

                return (int)this._hotelKeys[0];
            }
            set
            {
                this._hotelKeys.Clear();
                if (value > 0)
                    this._hotelKeys.Add(value);
            }
        }
        /// <summary>
        /// Ключ тура
        /// </summary>
        [XmlAttribute]
        public int TourKey
        {
            get
            {
                return this._tourKey;
            }
            set
            {
                this._tourKey = value;
            }
        }
        /// <summary>
        /// Ограничение цены
        /// </summary>
        [XmlAttribute]
        public double PriceLimit
        {
            get
            {
                return this._priceLimit;
            }
            set
            {
                this._priceLimit = value;
            }
        }
        /// <summary>
        /// Список ключей курортов
        /// </summary>  
        public ArrayList ResortKeys
        {
            get
            {
                return this._resortKeys;
            }
        }

        /// <summary>
        /// Поставлен ли флажок все курорты
        /// </summary>
        [XmlAttribute]
        public bool IsAllResort
        {
            get
            {
                return this._isAllResort;
            }
            set
            {
                this._isAllResort = value;
            }
        }
        /// <summary>
        /// Список ключей городов
        /// </summary>
        public ArrayList CityKeys
        {
            get
            {
                return this._cityKeys;
            }
        }

        /// <summary>
        /// Установлен ли в фильтре флаг все города
        /// </summary>
        [XmlAttribute]
        public bool IsAllCity
        {
            get
            {
                return this._isAllCity;
            }
            set
            {
                this._isAllCity = value;
            }
        }

        /// <summary>
        /// Список ключей городов
        /// </summary>
        public ArrayList HotelKeys
        {
            get
            {
                return this._hotelKeys;
            }
        }

        /// <summary>
        /// Список ключей сервисов в отеле
        /// </summary>
        public ArrayList HotelOptionsKeys
        {
            get
            {
                return this._hotelOptionsKeys;
            }
        }

        /// <summary>
        /// Установлен ли в фильтре флаг все отели
        /// </summary>
        [XmlAttribute]
        public bool IsAllHotels
        {
            get
            {
                return this._isAllHotels;
            }
            set
            {
                this._isAllHotels = value;
            }
        }
        /// <summary>
        /// Список ключей типов туров
        /// </summary>
        public ArrayList TourTypeKeys
        {
            get
            {
                return this._tourTypeKeys;
            }
        }

        /// <summary>
        /// Установлен ли флаг все типы тура
        /// </summary>
        [XmlAttribute]
        public bool IsAllTourType
        {
            get
            {
                return this._isAllTourType;
            }
            set
            {
                this._isAllTourType = value;
            }
        }
        /// <summary>
        /// Список ключей типов туров
        /// </summary>
        public ArrayList TourTypeDetailKeys
        {
            get
            {
                return this._tourTypeDetailKeys;
            }
        }

        /// <summary>
        /// Установлен ли флаг все типы тура
        /// </summary>
        [XmlAttribute]
        public bool IsAllTourTypeDetails
        {
            get
            {
                return this._isAllTourTypeDetails;
            }
            set
            {
                this._isAllTourTypeDetails = value;
            }
        }
        /// <summary>
        /// Список звездностей отелей
        /// </summary>
        public ArrayList HotelStars
        {
            get
            {
                return this._hotelStars;
            }
        }

        /// <summary>
        /// Поиск по всем звездностям
        /// </summary>
        [XmlAttribute]
        public bool IsAllHotelStars
        {
            get
            {
                return this._isAllHotelStars;
            }
            set
            {
                this._isAllHotelStars = value;
            }
        }
        /// <summary>
        /// Список ключей питаний
        /// </summary>
        public ArrayList PansionKeys
        {
            get
            {
                return this._pansionKeys;
            }
        }

        /// <summary>
        /// Поиск по всем питаниях
        /// </summary>
        [XmlAttribute]
        public bool IsAllPansion
        {
            get
            {
                return this._isAllPansion;
            }
            set
            {
                this._isAllPansion = value;
            }
        }
        /// <summary>
        /// Список кодов авиакомпаний
        /// </summary>
        public ArrayList AirlineCodes
        {
            get
            {
                return this._airlineCodes;
            }
        }
        /// <summary>
        /// Список ключей типов номеров
        /// </summary>
        public ArrayList RoomKeys
        {
            get
            {
                return this.roomKeys;
            }
        }
        /// <summary>
        /// Список ключей категорий проживания
        /// </summary>
        public ArrayList RoomCategoryKeys
        {
            get
            {
                return this.roomCategoryKeys;
            }
        }
        /// <summary>
        /// Список ключей типов размещения
        /// </summary>
        public ArrayList AccomodationKeys
        {
            get
            {
                return this.accomodationKeys;
            }
        }
        /// <summary>
        /// Список ключей дополнительных услуг в отеле
        /// </summary>
        public ArrayList AddHotelServiceKeys
        {
            get
            {
                return this._addHotelServiceKeys;
            }
        }

        /// <summary>
        /// Поиск по все услугам в отеле
        /// </summary>
        [XmlAttribute]
        public bool IsAllAddHotelService
        {
            get
            {
                return this._isAllAddHotelService;
            }
            set
            {
                this._isAllAddHotelService = value;
            }
        }

        /// <summary>
        /// Искать только основные типы размещения
        /// </summary>
        [XmlAttribute]
        public bool MainOnly
        {
            get
            {
                return mainOnly;
            }
            set
            {
                mainOnly = value;
            }
        }

        /// <summary>
        /// Искать только туры для групп агентов, в которые входит данное агентство
        /// </summary>
        [XmlAttribute]
        public bool GroupOnly
        {
            get
            {
                return groupOnly;
            }
            set
            {
                groupOnly = value;
            }
        }

        /// <summary>
        /// Количество взрослых
        /// </summary>
        [XmlAttribute]
        public int Adults
        {
            get
            {
                return adults;
            }
            set
            {
                adults = value;
            }
        }

        /// <summary>
        /// Количество детей
        /// </summary>
        [XmlAttribute]
        public int Childs
        {
            get
            {
                return childs;
            }
            set
            {
                childs = value;
            }
        }

        /// <summary>
        /// Возраст первого ребенка
        /// </summary>
        [XmlAttribute]
        public int FirstChildAge
        {
            get
            {
                return firstChildAge;
            }
            set
            {
                firstChildAge = value;
            }
        }

        /// <summary>
        /// Возраст второго ребенка
        /// </summary>
        [XmlAttribute]
        public int SecondChildAge
        {
            get
            {
                return secondChildAge;
            }
            set
            {
                secondChildAge = value;
            }
        }

        /// <summary>
        /// Маска квот на проживание
        /// </summary>
        [XmlAttribute]
        public QuotaResult.Status HotelQuotaMask
        {
            get
            {
                return hotelQuotaMask;
            }
            set
            {
                hotelQuotaMask = value;
            }
        }

        /// <summary>
        /// Маска квот на перелет
        /// </summary>
        [XmlAttribute]
        public QuotaResult.Status AviaQuotaMask
        {
            get
            {
                return aviaQuotaMask;
            }
            set
            {
                aviaQuotaMask = value;
            }
        }

        /// <summary>
        /// Количество строк на странице
        /// </summary>
        [XmlAttribute]
        public int PageSize
        {
            get
            {
                return this.pageSize;
            }
            set
            {
                this.pageSize = value;
            }
        }

        /// <summary>
        /// Ограничение цены снизу
        /// </summary>
        [XmlAttribute]
        public double PriceMinimum
        {
            get
            {
                return this._priceMinimum;
            }
            set
            {
                this._priceMinimum = value;
                this.isNullPriceMinimum = false;
            }
        }

        /// <summary>
        /// Ограничена ли цена снизу
        /// </summary>
        [XmlAttribute]
        public bool IsNullPriceMinimum
        {
            get
            {
                return this.isNullPriceMinimum;
            }
            set
            {
                this.isNullPriceMinimum = value;
            }
        }

        /// <summary>
        /// Дополнительный фильтр
        /// </summary>
        [XmlAttribute]
        public string AddFilter
        {
            get
            {
                return addFilter;
            }
            set
            {
                addFilter = value;
            }
        }
    }
}

Описание класса SearchParams

/// <summary>
    /// Класс, описывающий параметры подбора тура
    /// </summary>
    public class SearchParams
    {
        /// <summary>
        /// Идентификатор агенства, от имени которого производится поиск
        /// </summary>
        [XmlAttribute("Agent")]
        public int AgentKey = 0;

        /// <summary>
        /// Разделять квоты на агентские/неагентские или игнорировать агентские квоты.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkAgentQuotesEnabled".
        /// Значение по умолчанию: true.
        /// </summary>
        [XmlAttribute("CheckAQ")]
        public bool CheckAgentQuota = true;

        /// <summary>
        /// Проверять общую квоту, если агентская закончилась.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkAgentAndCommonQuote".
        /// Значение по умолчанию: true.
        /// </summary>
        [XmlAttribute("CheckCQ")]
        public bool CheckCommonQuota = true;

        /// <summary>
        /// При подборе перелета поиск производится в том же пакете цен, что и перелет в обсчитанном туре,
        /// иначе цены в расчет на принимается, а используется только расписание перелетов.
        /// Используется только, если FindFlight = true.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkFlightPacket".
        /// Значение по умолчанию: true.
        /// </summary>
        [XmlAttribute("CheckFP")]
        public bool CheckFlightPacket = true;

        /// <summary>
        /// Проверять квоты без продолжительности после того, как закончатся квоты на продолжительность.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkNoLongQuota".
        /// Значение по умолчанию: true
        /// </summary>
        [XmlAttribute("CheckNLQ")]
        public bool CheckNoLongQuota = true;

        /// <summary>
        /// Проверять квоты от всех различных партнеров.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "checkAllPartnersQuota".
        /// Значение по умолчанию: false
        /// </summary>
        [XmlAttribute("CheckAPQ")]
        public bool CheckAllPartnersQuota = true;

        /// <summary>
        /// Результат возвращаемый, если у квоты истек релиз-период.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "expiredReleaseQuoteResult".
        /// Значение по умолчанию: QuotaResult.Status.Request.
        /// </summary>
        [XmlAttribute("ExpRelRes")]
        public QuotaResult.Status ExpiredReleaseResult = QuotaResult.Status.Request;

        /// <summary>
        /// Подбирать авиаперелет по туру, на который есть свободные места.
        /// </summary>
        [XmlAttribute("FindFlight")]
        public bool FindFlight = true;

        /// <summary>
        /// Список классов перелета (ключи бизнес- и эконом-класса)
        /// </summary>
        [XmlAttribute("FlightGroups")]
        public string FlightGroups = String.Empty;

        /// <summary>
        /// Использовать таблицу TP_Tours как источник данных, иначе - таблицу tbl_TurList
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "quotedDynamicPriceTour".
        /// Значение по умолчанию: true.
        /// </summary>
        [XmlAttribute("IsPT")]
        public bool IsPriceTour = true;

        /// <summary>
        /// Результат возвращаемый при наличии квоты, но отсутствии свободных мест.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "noPlacesQuoteResult".
        /// Значение по умолчанию: QuotaResult.Status.No.
        /// </summary>
        [XmlAttribute("NPResult")]
        public QuotaResult.Status NoPlacesResult = QuotaResult.Status.No;

        /// <summary>
        /// Тип отбора
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "PagingType".
        /// </summary>
        [XmlAttribute("PagingType")]
        public short PagingType = Megatec.Search.PagingType.Simple;

        /// <summary>
        /// Возвращает поле, содержащее список ключей классов услуг по туру
        /// </summary>
        [XmlAttribute("Services")]
        public bool Services = false;

        /// <summary>
        /// Отображать статус "Запрос", если релиз-период = 0, независимо от количества свободных мест.
        /// Не обрабатывается входным запросом. Регулируется настройкой web.config: "setRequestIfReleaseIsZero".
        /// Значение по умолчанию: false.
        /// </summary>
        [XmlAttribute("SetRequestOnRelease")]
        public bool SetRequestOnRelease = false;

        /// <summary>
        /// Параметры сортировки (выражение ORDER BY)
        /// </summary>
        [XmlAttribute("Sort")]
        public string Sort = string.Empty;

        /// <summary>
        /// Производить сортировку на сервере БД или на клиенте
        /// </summary>
        [XmlAttribute("SortInDB")]
        public bool SortInDB = true;

    }

Описание класса SearchResult

[XmlInclude(typeof(SearchResultItem))]
    public class SearchResult
    {
        /// <summary>
        /// Общее количество найденных записей
        /// </summary>
        [XmlAttribute("Total")]
        public int TotalCount

        /// <summary>
        /// Количество отобранных записей
        /// </summary>
        [XmlAttribute("Parsed")]
        public int ParsedCount

        /// <summary>
        /// Не используется
        /// </summary>
        [XmlAttribute("Step")]
        public double DynamicPriceStepValue

        /// <summary>
        /// Коллекция найденных результатов
        /// </summary>
        [XmlElement("SearchResultItem")]
        public List<SearchResultItem> Items
    }

Описание класса SearchResultItem

public class SearchResultItem: IRoomDescription
    {
        /// <summary>
        /// Количество основных мест
        /// </summary>
        [XmlAttribute]
        public int MainPlaces

        /// <summary>
        /// Количество неосновных мест
        /// </summary>
        [XmlAttribute]
        public int AddPlaces

        /// <summary>
        /// Основное или неосновное размещение
        /// </summary>
        [XmlAttribute]
        public bool IsMain

        /// <summary>
        /// Дата, до которой актуален тур
        /// </summary>
        [XmlAttribute]
        public DateTime TourValid

        /// <summary>
        /// Дата создания тура
        /// </summary>
        [XmlAttribute]
        public DateTime TourCreated

        /// <summary>
        /// Дата заезда
        /// </summary>
        [XmlAttribute]
        public DateTime TourDate

        /// <summary>
        /// Продолжительность тура в днях
        /// </summary>
        [XmlAttribute]
        public int Days

        /// <summary>
        /// Количество ночей проживания в туре
        /// </summary>
        [XmlAttribute]
        public int Nights

        /// <summary>
        /// Ключ страны
        /// </summary>
        [XmlAttribute]
        public int CountryKey

        /// <summary>
        /// Ключ города отправления
        /// </summary>
        [XmlAttribute]
        public int CityFromKey

        /// <summary>
        /// Ключ города прилета
        /// </summary>
        [XmlAttribute]
        public int CityToKey

        /// <summary>
        /// Ключ аэропорта вылета
        /// </summary>
        [XmlAttribute]
        public int AirportFromKey

        /// <summary>
        /// Ключ аэропорта прилета
        /// </summary>
        [XmlAttribute]
        public int AirportToKey

        /// <summary>
        /// Ключ расчитанного тура (TP_Tours)
        /// </summary>
        [XmlAttribute]
        public int TourKey

        /// <summary>
        /// Ключ типа тура (TipTur)
        /// </summary>
        [XmlAttribute]
        public int TourTypeKey

        /// <summary>
        /// Ключ тура из конструктора туров (turList)
        /// </summary>
        [XmlAttribute]
        public int TurListKey

        /// <summary>
        /// Ключ расчитанного варианта (TP_Lists)
        /// </summary>
        [XmlAttribute]
        public int PriceListKey

        /// <summary>
        /// Ключ цены (TP_Prices)
        /// </summary>
        [XmlAttribute]
        public int PriceKey

        /// <summary>
        /// Цена
        /// </summary>
        [XmlAttribute]
        public decimal Price

        /// <summary>
        /// Ключ главного отеля
        /// </summary>
        [XmlAttribute]
        public int HotelKey

        /// <summary>
        /// Ключ партнера для главного отеля
        /// </summary>
        [XmlAttribute]
        public int HotelPartnerKey

        /// <summary>
        /// Ключ курорта главного отеля
        /// </summary>
        [XmlAttribute]
        public int ResortKey

        /// <summary>
        /// Ключ города главного отеля
        /// </summary>
        [XmlAttribute]
        public int CityKey

        /// <summary>
        /// Звездность главного отеля
        /// </summary>
        [XmlAttribute]
        public string HotelCategory

        /// <summary>
        /// Ключ питания главного отеля
        /// </summary>
        [XmlAttribute]
        public int PansionKey

        /// <summary>
        /// Ключ номера в главном отеле
        /// </summary>
        [XmlAttribute]
        public int HotelRoomKey

        /// <summary>
        /// Ключ типа номера в главном отеле
        /// </summary>
        [XmlAttribute]
        public int RoomKey

        /// <summary>
        /// Ключ категории номера в главном отеле
        /// </summary>
        [XmlAttribute]
        public int RoomCategoryKey

        /// <summary>
        /// Ключ размещения в главном отеле
        /// </summary>
        [XmlAttribute]
        public int AccomodationKey

        /// <summary>
        /// Минимальный возраст первого ребенка
        /// </summary>
        [XmlAttribute]
        public int ChildAgeFrom

        /// <summary>
        /// Максимальный возраст первого ребенка
        /// </summary>
        [XmlAttribute]
        public int ChildAgeTo

        /// <summary>
        /// Минимальный возраст второго ребенка
        /// </summary>
        [XmlAttribute]
        public int ChildAgeFrom2

        /// <summary>
        /// Максимальный возраст второго ребенка
        /// </summary>
        [XmlAttribute]
        public int ChildAgeTo2

        /// <summary>
        /// Название отеля
        /// </summary>
        [XmlAttribute]
        public string HotelName

        /// <summary>
        /// Название тура
        /// </summary>
        [XmlAttribute]
        public string TourName

        /// <summary>
        /// Название питания
        /// </summary>
        [XmlAttribute]
        public string PansionName

        /// <summary>
        /// Код питания
        /// </summary>
        [XmlAttribute]
        public string PansionCode

        /// <summary>
        /// Название типа номера
        /// </summary>
        [XmlAttribute]
        public string RoomName

        /// <summary>
        /// Код типа номера
        /// </summary>
        [XmlAttribute]
        public string RoomCode

        /// <summary>
        /// Название категории номера
        /// </summary>
        [XmlAttribute]
        public string RoomCategoryName

        /// <summary>
        /// Код категории номера
        /// </summary>
        [XmlAttribute]
        public string RoomCategoryCode

        /// <summary>
        /// Название размещения
        /// </summary>
        [XmlAttribute]
        public string AccomodationName

        /// <summary>
        /// Код размещения
        /// </summary>
        [XmlAttribute]
        public string AccomodationCode

        /// <summary>
        /// Название курорта
        /// </summary>
        [XmlAttribute]
        public string ResortName

        /// <summary>
        /// Название города
        /// </summary>
        [XmlAttribute]
        public string CityName

        /// <summary>
        /// Порядок сортировки типа номера
        /// </summary>
        [XmlAttribute]
        public int RoomOrder

        /// <summary>
        /// Порядок сортировки категории номера
        /// </summary>
        [XmlAttribute]
        public int RoomCategoryOrder

        /// <summary>
        /// Порядок сортировки размещения
        /// </summary>
        [XmlAttribute]
        public int AccomodationOrder

        /// <summary>
        /// Валюта
        /// </summary>
        [XmlAttribute]
        public string Currency

        /// <summary>
        /// Ключи услуг, входящих в тур (через запятую)
        /// </summary>
        [XmlAttribute]
        public string Services

        /// <summary>
        /// Ключ прямого перелета (Charter)
        /// </summary>
        [XmlAttribute]
        public int CharterKey

        /// <summary>
        /// Ключ обратного перелета (Charter)
        /// </summary>
        [XmlAttribute]
        public int CharterBackKey

        /// <summary>
        /// День предоставления проживания
        /// </summary>
        [XmlAttribute]
        public int HotelDay

        /// <summary>
        /// Количество ночей проживания в отеле
        /// </summary>
        [XmlAttribute]
        public int HotelNights

        /// <summary>
        /// День прямого перелета
        /// </summary>
        [XmlAttribute]
        public int CharterDay

        /// <summary>
        /// День обратного перелета
        /// </summary>
        [XmlAttribute]
        public int CharterBackDay

        /// <summary>
        /// Пакет прямого перелета
        /// </summary>
        [XmlAttribute]
        public int CharterPacketKey

        /// <summary>
        /// Партнер прямого перелета
        /// </summary>
        [XmlAttribute]
        public int CharterPartnerKey

        /// <summary>
        /// Пакет обратного перелета
        /// </summary>
        [XmlAttribute]
        public int CharterBackPacketKey

        /// <summary>
        /// Партнер обратного перелета
        /// </summary>
        [XmlAttribute]
        public int CharterBackPartnerKey

        /// <summary>
        /// Наличие мест в отеле: больше нуля - места есть (количество мест в квоте), 0 - мест нет, меньше 0 - места по запросу + через двоеточие общее кол-во мест. Пример
        /// 10:100
        /// </summary>
        [XmlAttribute]
        public string HotelQuota

        /// <summary>
        /// Наличие мест на прямом перелете: больше нуля - места есть (количество мест в квоте), 0 - мест нет, меньше 0 - места по запросу + через двоеточие общее кол-во мест, по каждому классу. Пример:
        /// 10:100|0:100|10:100
        /// </summary>
        [XmlAttribute]
        public string CharterThereQuota

        /// <summary>
        /// Наличие мест на обратном перелете: больше нуля - места есть (количество мест в квоте), 0 - мест нет, меньше 0 - места по запросу
        /// </summary>
        [XmlAttribute]
        public string CharterBackQuota

        /// <summary>
        /// Номер строки
        /// </summary>
        [XmlAttribute]
        public int Id

        /// <summary>
        /// Номер строки
        /// </summary>
        [XmlAttribute]
        public int Key

        /// <summary>
        /// URL с описанием отеля
        /// </summary>
        [XmlAttribute]
        public string HotelURL
/// <summary>
        /// URL с описанием тура
        /// </summary>
        [XmlAttribute]
        public string TourURL

        /// <summary>
        /// Текстовая строка с информацией о прямом перелете (авиакомпания, рейс, время, аэропорт вылета/прилета)
        /// </summary>
        [XmlAttribute]
        public string CharterInfo

        /// <summary>
        /// Текстовая строка с информацией об обратном перелете (авиакомпания, рейс, время, аэропорт вылета/прилета)
        /// </summary>
        [XmlAttribute]
        public string CharterBackInfo

        /// <summary>
        /// Текстовая строка, содержащая ключи всех отелей в пакете услуг (через запятую)
        /// </summary>
        [XmlAttribute]
        public string AllHotelKeys

        /// <summary>
        /// Текстовая строка, содержащая ключи всех номеров в пакете услуг (через запятую)
        /// </summary>
        [XmlAttribute]
        public string AllHotelRoomKeys

        /// <summary>
        /// Текстовая строка, содержащая все продолжительности проживаний в пакете услуг (через запятую)
        /// </summary>
        [XmlAttribute]
        public string AllHotelNights

        /// <summary>
        /// Текстовая строка, содержащая все категории проживаний в пакете услуг (через запятую)
        /// </summary>
        [XmlAttribute]
        public string AllHotelStars

        /// <summary>
        /// Текстовая строка, содержащая ключи всех питаний в пакете услуг (через запятую)
        /// </summary>
        [XmlAttribute]
        public string AllPansionKeys

        /// <summary>
        /// Текущий индекс динамического изменения цены для отеля (текущая цена = базовая цена + значение шага изменения цены * текущий индекс динамического изменения цены)
        /// </summary>
        [XmlAttribute]
        public int DynamicHotelPriceStepIndex

        /// <summary>
        /// Корректировка базовой цены для отеля (пока в шагах)
        /// </summary>
        [XmlAttribute]
        public double DynamicHotelPriceCorrection
    }

Работа в системе

Использование сервиса подборов тура

Для использования сервиса подборов тура необходимо вызвать метод DoSearch у сервиса Search.asmx со следующими параметрами:

  • SearchFilter filter – объект класса, описывающего критерии подбора тура
  • int pageNumber – порядковый номер запрашиваемой страницы (нумерация начинается с 0)
  • SearchParams searchParams – объект класса, описывающего параметры подбора тура

Сервис возвращает объект класса SearchResult, содержащий коллекцию объектов класса SearchResultItem.

Примеры запросов к сервису

 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <DoSearch xmlns="http://megatec.ru/">
            <filter CountryKey="90" ExcludeNoPlaces="true" DepartFromKey="1" IsAllHotels="true" IsAllTourType="false"
                IsAllTourTypeDetails="false" Adults="2" Childs="0" PageSize="15" IsNullPriceMinimum="true" IsAllPansion="false">
                <ExcludeTourType>false</ExcludeTourType>
                <KindOfToursMask>All</KindOfToursMask>
                <TurListAttributeMask>0</TurListAttributeMask>
                <CruiseCountryKey>0</CruiseCountryKey>
                <HotelPartnerKey>0</HotelPartnerKey>
                <CruisePortKey>0</CruisePortKey>
                <TurDateRange DateFrom="2016-09-12" DateTo="2016-09-20" />               
                <PansionKeys>1</PansionKeys> 
            </filter>
            <pageNumber>0</pageNumber>
            <searchParams Sort="PT_Price">
                <CalculateVisaDeadline>false</CalculateVisaDeadline>
                <NotDefaultSort>false</NotDefaultSort>
                <IsShowCOName>false</IsShowCOName>
            </searchParams>
        </DoSearch>
    </soap:Body>
 </soap:Envelope>


 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
       <DoSearch xmlns="http://megatec.ru/">
           <filter CountryKey="90" ExcludeNoPlaces="false" DepartFromKey="1" IsAllHotels="true"
           IsAllTourType="false"  IsAllTourTypeDetails="false" Adults="2" Childs="0" PageSize="15"
           IsNullPriceMinimum="true" IsAllPansion="false">
               <DurationRange DurationFrom="0" DurationTo="0" />
               <PansionKeys>
                   <anyType xsi:type="xsd:int">1</anyType>
                   <anyType xsi:type="xsd:int">2</anyType>
               </PansionKeys>
               <HotelStars>
                   <anyType xsi:type="xsd:string">1*</anyType>
                   <anyType xsi:type="xsd:string">2*</anyType>
               </HotelStars>
               <HotelKeys>
                   <anyType xsi:type="xsd:int">1</anyType>
                   <anyType xsi:type="xsd:int">2</anyType>
               </HotelKeys>
               <CityKeys>
                   <anyType xsi:type="xsd:int">2</anyType>
                   <anyType xsi:type="xsd:int">3</anyType>
               </CityKeys>
               <ResortKeys>
                   <anyType xsi:type="xsd:int">4</anyType>
                   <anyType xsi:type="xsd:int">5</anyType>
               </ResortKeys>
               <ExcludeTourType>false</ExcludeTourType>
               <KindOfToursMask>All</KindOfToursMask>
               <TurListAttributeMask>0</TurListAttributeMask>
               <CruiseCountryKey>0</CruiseCountryKey>
               <HotelPartnerKey>0</HotelPartnerKey>
               <CruisePortKey>0</CruisePortKey>
               <TurDateRange DateFrom="2017-05-12" DateTo="2017-05-12" />               
               <PansionKeys>1</PansionKeys> 
           </filter>
           <pageNumber>0</pageNumber>
           <searchParams Sort="PT_Price, pt_hdstars desc, pt_tourdate" CheckCQ="false" CheckNLQ="false">
               <CalculateVisaDeadline>false</CalculateVisaDeadline>
               <NotDefaultSort>false</NotDefaultSort>
               <IsShowCOName>false</IsShowCOName>
           </searchParams>
       </DoSearch>
   </soap:Body>
 </soap:Envelope>