Ранее (более десяти лет) в «РосГосСтрахе» (РГС) для договоров ОСОПО (обязательного страхования опасных производственных объектов) не было интеграции между системами оформления договоров (АПО) и учётной системой (АРМ).
Информация о договорах ОСОПО подлежит обязательной передаче в регулирующий орган, которым является НССО (Национальный Союз Страховщиков Ответственности), в 3-х месячный срок с даты получения номера договора.
Договора ОСОПО – являются сложными договорами страхования. При их оформлении и учёте возникает множество проблем, в связи с чем информация не обо всех договорах передаётся регулятору вовремя.
Если непереданных договоров много (для них существует специальный норматив), регулятор выставляет штраф.
Долгое время в РГС существовала практика ручного ввода договоров ОСОПО в учётную систему, что увеличивало время на передачу информации между системами в РГС и последующей передачей в НССО.
Передо мной была поставлена задача доработки модуля оформления договоров ОСОПО для автоматической передачи информации в учётную систему (АРМ).
Система АПО была успешно доработана. После ввода в эксплуатацию, информация о договорах ОСОПО стала попадать в систему АРМ автоматически. Количество проблемных договоров уменьшилось до приемлемого показателя. «РосГосСтрах» перестал выплачивать штрафы.
Технически, интеграция с системой АРМ реализована на основании Веб-Сервисов, которые предоставляет система АРМ.
Упрощённо, система АРМ предоставляет следующие End-Point-ы:
Методов Веб-Сервисов чуть больше.
Более подробную информацию можно посмотреть в файле-Спецификации веб-сервисов
Проект интеграции состоял из нескольких этапов:
Со стороны системы АПО, доработка системы по интеграции с системой АРМ не выглядела слишком сложной: нужно было сформировать xml-запрос, обратиться к соответствующему Веб-Сервису со сформированным запросом и обработать ответ от Веб-сервиса.
Однако, особенности реализации Веб-Сервисов АРМ таковы, что:
Проект интеграции с АРМ предусматривал прохождение формально-логического контроля (ФЛК) договора с помощью Веб-Сервисов НССО. Для этого, система АПО решала задачу, схожую с задачей передачи информации по договору в АРМ.
А именно: формировался xml-запрос с описанием договора для Веб-сервиса НССО.
Хотя оба Веб-сервиса (НССО и АРМ) требуют передачи информации по договору, однако Веб-Сервис НССО реализован проще на несколько порядков, с обращением к сервису НССО не возникало никаких сложностей.
Для реализации задач по интеграции, в системе АПО был реализован отдельный механизм по автоматической передаче информации по договорам, механизм, функционирующий в фоновом режиме, незаметно для пользователя, – процесс взаимодействия с АРМ.
Для передачи информации о договорах в АРМ, процесс взаимодействия обращается к нескольким Веб-Сервисам АРМ.
Во-первых, формируется xml-запрос к Веб-Сервису createAgentStatement для передачи в АРМ отчета агента (ОА) с договором ОСОПО. Веб-сервис присылает ответ createAgentStatementResponse со статусом, принят или не принят договор в обработку.
Во-вторых, если запрос принят в обработку, нужно периодически обращаться к Веб-Сервису getResultProcessing, ожидая статуса того, завершена ли обработка договора в АРМе, успешно или не успешно, либо продолжается.
<s:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<createAgentStatement xmlns="http://rgs.ru/arm4/integration">
<createRequest>
<requestAttributes>
<requestId>4621a3a0-3148-4342-8ca2-0aa20cc1ddfd</requestId>
<version>3.3.53</version>
</requestAttributes>
<agentStatement>
<sysCreateUser>WebSU</sysCreateUser>
<sysCreateDate>2019-08-20T12:34:40</sysCreateDate>
<!-- Параметры отчета агента пропущены -->
<contract>
<!-- Параметры блока contract пропущены -->
</contract>
</agentStatement>
</createRequest>
</createAgentStatement>
</s:Body>
</s:Envelope>
Важная информация в ответе:
<S:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<work:WorkContext xmlns:work="http://oracle.com/weblogic/soap/workarea/">rO0ABXdbABp3ZWJsb2dpYy5hcHAuYXJtNC1zZXJ2aWNlcwAAANYAAAAjd2VibG9naWMud29ya2FyZWEuU3RyaW5nV29ya0NvbnRleHQAEHJlbGVhc2UtNC4zNy4wMTEAAA==
</work:WorkContext>
</env:Header>
<S:Body>
<ns0:createAgentStatementResponse xmlns:ns0="http://rgs.ru/arm4/integration">
<ns0:createResponse>
<ns0:responseAttributes>
<ns0:responseId>d37e1c00c32e11e99a1d00505</ns0:responseId>
<ns0:status>18</ns0:status>
<ns0:version>3.3.55</ns0:version>
</ns0:responseAttributes>
</ns0:createResponse>
</ns0:createAgentStatementResponse>
</S:Body>
</S:Envelope>
В запросе указывается идентификатор, который возвратился в ответе createAgentStatementResponse
<s:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<s:Body>
<getResultProcessing xmlns="http://rgs.ru/arm4/integration">
<processRequest>
<requestAttributes>
<requestId>8301b733-c56d-4bc4-88cc-87d12ce16dda</requestId>
<version>3.3.53</version>
</requestAttributes>
<identifierType>Arm4CorrelationId</identifierType>
<identifierList>
<id>d37e1c00c32e11e99a1d00505</id>
</identifierList>
</processRequest>
</getResultProcessing>
</s:Body>
</s:Envelope>
Важная информация в ответе:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<WorkContext xmlns="http://oracle.com/weblogic/soap/workarea/">rO0ABXdbABp3ZWJsb2dpYy5hcHAuYXJtNC1zZXJ2aWNlcwAAANYAAAAjd2VibG9naWMud29ya2FyZWEuU3RyaW5nV29ya0NvbnRleHQAEHJlbGVhc2UtNC4zNy4wMTEAAA==
</WorkContext>
</S:Header>
<S:Body>
<getResultProcessingResponse xmlns="http://rgs.ru/arm4/integration">
<resultProcessingResponse>
<responseAttributes>
<status>6</status>
<version>3.3.55</version>
</responseAttributes>
<resultList>
<result>
<id>30650010-4206025687-140819</id>
<status>FE1</status>
<violationList>
<violation>
<type>ERROR</type>
<code>0012600</code>
<fieldName>Краткое наименование</fieldName>
<message>У ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ПОДОРОЖНИК-КЕМЕРОВО" не заполнено поле Краткое наименование.</message>
</violation>
<!-- может быть несколько причин неудачной загрузки договора -->
</violationList>
</result>
</resultList>
</resultProcessingResponse>
</getResultProcessingResponse>
</S:Body>
</S:Envelope>
Работа механизма взаимодействия с АРМ основывается на статусной модели для договоров ОСОПО. Как отмечалось выше, передача информации по договору в АРМ занимает продолжительное время (более 40 минут), поэтому осуществляется в фоновом режиме, асинхронно, не мешая действиям пользователя.
После того, как договор создан, правильно заполнен и ошибок в договоре нет, договор переводится в статус «Согласован». При переходе в этот статус возможна печать страхового полиса.
После печати полиса, договор переходит в статус «Действующий». Начинается отправка информации по договору в АРМ. В это время работает механизм взаимодействия с АРМ.
Спустя некоторое время, в зависимости от того, чем завершится процесс передаччи договора в АРМ, статус договора изменится на «Загружен в АРМ» (если передача будет успешной) либо на «Ручной ввод в АРМ» (если в ответах от Веб-Сервиса АРМ придут ошибки).
Технически, работа механизма взаимодействия с АРМ реализована с помощью менеджера задач.
Менеджер задач – это глобальный объект.
Запуск менеджера задач осуществляется функцией StartTaskManager. Функция вызывается при старте модуля.
Объект менеджера задач запрашивается у фабрики по нужному имени. Могут быть различные реализации менеджера задач. У фабрики запрашивается та реализация, которая определена параметром OSOPO_TaskManager.
/*------------------------------------------------------------------------------
Создание глобальных структур.
------------------------------------------------------------------------------*/
void ConstructGlobals()
{
String TaskManagerName;
// пропущено
if(osopo::GV != NULL) {
TaskManagerName = osopo::GV->Get("OSOPO_TaskManager").Trim();
}
if(TaskManagerName.SubString(1, 11) != "TaskManager") {
TaskManagerName = "TaskManager";
}
osopo::StartTaskManager( TaskManagerName ); // менеджер задач
// пропущено
}
Запуск менеджера задач осуществляется функцией StopTaskManager. Функция вызывается при завершении работы модуля.
/*------------------------------------------------------------------------------
Уничтожение глобальных структур.
------------------------------------------------------------------------------*/
void DestructGlobals()
{
// пропущено
osopo::StopTaskManager(); // менеджер задач
// пропущено
}
TaskManager – это абстрактный класс, предоставляющий интерфейс для запуска задач.
Задача представляет собой некую последовательность действий для выполнения законченной операции. Например, обращение к сервису createAgentStatement.
Задачи могут объединяться в цепочку. Так, задача – это одно законченное действие (обращение к сервису), а цепочка – это несколько действий, представляющих собой общую операцию (например, отправку договора в АРМ).
Так, для того, чтобы выполнить отправку договора в АРМ необходимо совершить ряд шагов (обратиться к сервису поиска договоров, обратиться к сервису создания отчёта агента, несколько раз вызвать сервис проверки результата и т.д.)
Ниже приведён пример цепочки задач “Chain_01. Экспорт превоначального договора в АРМ”.