Обработка заказов через веб-сервис ERP системы компании
Для выполнения поставленной задачи специалистами компании, занимающейся поддержкой ERP системы предприятия, был разработан веб-сервис управления списком заказов. Он предоставляет следующие функции:
· Получение первого заказа в очереди на исполнение
· Удаление заказа из очереди на исполнение со статусом успешности его выполнения
· Получение информации необходимой для совершения перевода со счета компании на счет фирмы-поставщика.
· Добавление в очередь новых заказов (используется на период тестирования системы).
Рассмотрим интерфейс веб-сервиса, заданный на языке C# через объявление соответствующих функций:
/// <summary>
/// Заполняет очередь заказов тестовыми данными
/// </summary>
[WebMethod(Description = "Заполняет очередь заказов тестовыми данными")]
public void OrdersReload()
{
}
/// <summary>
/// Возвращает первый заказ в очереди
/// </summary>
/// <returns> Заказ в случае наличия заказов, null иначе</returns>
[WebMethod(Description = "Возвращает первый заказ в очереди")]
public Order OrderGet()
{
}
/// <summary>
/// Удаляет первый заказ из очереди
/// </summary>
/// <param name="successfully">Успешно или нет проведен заказ</param>
[WebMethod(Description = "Удаляет первый заказ из очереди")]
public void OrderComplete(bool successfully)
{
}
/// <summary>
/// Данные для оплаты в платежной системе
/// </summary>
/// <param name="password">Пароль</param>
/// <returns>Номер счета</returns>
[WebMethod(Description = "Данные для оплаты в платежной системе")]
public long GetPaymentInfo(out string password)
{
}
Для начала разработаем архитектуру интеграционного приложения. Весь процесс проведения заказов необходимого оборудования удобно разбить на три последовательно вызываемые оркестровки:
1. Циклическое обслуживание очереди заказов.
2. Оформление заказа в фирме-поставщике и оплата в платежной системе.
3. Перевод суммы из долларов в рубли по курсу ЦБ.
Рассмотрим первую оркестровку. Ее условно можно разделить на две части: инициализация процесса (Рис. 8.1) и цикл обработки очереди заказов (Рис. 8.2).
Работа оркестровки начинается с получения сообщения по порту «StartPort». Затем конструируется пустое сообщение на запрос инициализации списка заказов тестовыми данными, после чего соответствующая операция сервиса ERP приложения выполняется. Аналогичные действия производятся для операции получения информации о счете компании, за тем исключением, что полученные данные (номер счета и пароль) в дальнейшем передаются в оркестровку, производящую оформление заказа. Также конструируется пустое сообщение для запроса о получении заказа из очереди, которое затем многократно используется в цикле.
Для организации работы цикла используется локальная переменная «orderIsNull» типа bool с начальным значением = true. Таким образом, условие работы цикла выглядит следующим образом: !orderIsNull.
Можно было бы ожидать, что раз функция получения заказа из очереди в случае, когда очередь пуста, возвращает null, то в цикле достаточно проверять соответствующее сообщение на наличие в нем данных. Однако на практике любое сообщение веб-сервиса рассматривается сервером BizTalk как сообщение, состоящее из нескольких частей. Например, у результата операции получения заказа имеется только одна часть: OrderGetRes.OrderGetResult. В то же время у результата операции получения информации о счете компании имеются две части сообщения: PaymentInfo.GetPaymentInfoResult и PaymentInfo.password. Принцип, по которому производится разбивка сообщения на части, можно проследить, посмотрев объявление соответствующих функций веб-сервиса.
Рис. 8.1. Инициализация процесса обработки очереди заказов.
Итак, возвращаясь к проблеме выхода из цикла можно было бы предположить, что условие выхода выглядит следующим образом: OrderGetRes.OrderGetResult != null. Однако, когда сервер BizTalk получает от веб-сервиса значение null в качестве одной из частей сообщения, он генерирует ошибку типа «MissingPartException». Поэтому для выхода из цикла используется конструкция Scope, которая при получении ошибки заданного типа прекращает выполнение заданного внутри нее процесса и переходит к обработчику ошибок, внутри которого выполняется выражение «orderIsNull = true;», что и обеспечивает завершение цикла обработки очереди заказов и всего процесса в целом.
Рис. 8.2. Цикл обработки очереди заказов.
Внутри цикла обработки заказов происходит последовательно получение заказа из очереди, затем вызов оркестровки его исполняющий. В качестве параметров в нее передается заказ, информация о счете компании. После исполнения заказа возвращается его статус, который затем заполняется в сообщении о выполнении заказа: «OrderCompleteReq.successfully = ordered;».
Как видно из структуры полученной оркестровки (Рис. 8.3), она использует два порта – веб-сервис ERP системы и порт получения определенных XML-сообщений, запускающий всю оркестровку. За это отвечает свойство Activate, которое фигуры «Start Message», связанной с соответствующим портом, выставлено в True.
Рис. 8.3. Структура оркестровки обработки очереди заказов.
Как уже говорилось выше, при вызове оркестровки «Call Make Order» ей передается информация о заказе, информация о счете компании и она возвращает статус успешности операции заказа. Эти параметры можно наблюдать на Рис. 8.4.
Рис. 8.4. Параметры вызова оркестровки заказа в интернет-магазине.
Дата добавления: 2015-02-28; просмотров: 993;