В одной стандартной организации работает достаточно много людей. Большой отдел маркетинга, который постоянно генерирует миллион классных идей, большой отдел продаж, которому требуется оперативно видеть все изменения в CRM, и т.д. и т.п.
Деятельность организации, взаимодействие сотрудников порождает множество бизнес-процессов, которые хочется автоматизировать.
Вариант, когда множество систем общаются между собой напрямую уже был испробован и пришло понимание, что он не подходит, т.к. сложно поддерживать и развивать.
Чтобы избавиться от этого, принято решение реализовать центральную систему, которая будет обеспечивать взаимодействие сервисов. Некий оркестратор.
Получился конвейер обработки запросов. Пришедший набор данных встает на “конвейер” и обрабатывается по шагам. На каждом шаге данные получает один из модулей, который может быть как отдельным сервисом, так и частью целого.
Путь заявки по обработчикам задан в настройках. Пока настройки это массив PHP неограниченной вложенности, но когда-нибудь появится интерфейс.
Пример настроек:
'get-bitrix-deal' => [
'id' => 'get-bitrix-deal',
'subsystem' => 'find-deal',
'next' => ['remember-deal'],
'prev' => ['prev-step'],
'condition' => [
[
'field' => 'get-bitrix-deal.value',
'operation' => 'empty',
'success' => [
[
'field' => 'bitrix-find-contact.ID',
'operation' => 'empty',
'result' => ['bitrix-lead-set-default-values'],
],
],
],
[
'field' => 'get-bitrix-deal.value',
'operation' => '!|empty',
'result' => ['get-bitrix-deal-by-id'],
],
],
]
Верхнеуровнево система выглядит следующим образом:
Реализация на PHP и Laravel.
Т.к. все модули должны быть слабо связанными, напрямую друг к другу обращаться не могут, поэтому взаимодействие основано на событиях.
Еще одним требованием была универсальность системы. Нельзя было затачивать ее функционал под конкретные нужды, т.к. сегодня они одни, а завтра другие. Поэтому на вход могут поступать совершенно разные наборы данных, обработка которых настраивается.
Есть модуль API, который принимает запросы из-вне. Этот модуль имеет расширение, которое позволяет буферизировать запросы и выполнять их либо по расписанию, либо пачками, например, по 10 штук в минуту.
Далее формируется событие NewRequest, которое перехватывается модулем маршрутизации(supervisor). Супервайзер определяет следующий шаг и передаёт диспетчеру.
Диспетчер определяет как отправлять запрос в указанный модуль – событием внутри системы, по HTTP, либо поставить задачу в очередь.
Модуль перехватывает событие, обрабатывает как надо, добавляет в него необходимые данные и отправляет событие обратно.
Супервайзер в свою очередь перехватывает ответ модуля, фиксирует изменения, вычисляет следующий шаг и т.д. до тех пор пока не дойдет до конца бизнес-процесса.
На текущий момент реализованы следующие модули:
И основные модули:
Пример реальной схемы бизнес-процессов, построенных с помощью этих модулей:
Irlaer
А как же BPMN? :-)
Про Camunda не слышали? Рекомендую.
Клиент для php точно есть.
SergioMadness Автор
Да, слышал о таком. Просто люблю изобретать велосипеды)
oxidmod
Хорошо же изобретать велосипеды, когда тебе еще и платят за них, а потом еще и не уволят, так как некому больше их саппортить.
SergioMadness Автор
Внутренний проект не обязательно сразу должен быть устаревшей лапшой с кучей костылей, который невозможно отдать на поддержку новой команде.