В одной стандартной организации работает достаточно много людей. Большой отдел маркетинга, который постоянно генерирует миллион классных идей, большой отдел продаж, которому требуется оперативно видеть все изменения в 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, либо поставить задачу в очередь. 

Модуль перехватывает событие, обрабатывает как надо, добавляет в него необходимые данные и отправляет событие обратно. 

Супервайзер в свою очередь перехватывает ответ модуля, фиксирует изменения, вычисляет следующий шаг и т.д. до тех пор пока не дойдет до конца бизнес-процесса. 

На текущий момент реализованы следующие модули: 

И основные модули: 

Пример реальной схемы бизнес-процессов, построенных с помощью этих модулей: 

Комментарии (4)


  1. Irlaer
    06.10.2021 17:20
    +3

    А как же BPMN? :-)

    Про Camunda не слышали? Рекомендую.

    Клиент для php точно есть.


    1. SergioMadness Автор
      06.10.2021 17:23

      Да, слышал о таком. Просто люблю изобретать велосипеды)


      1. oxidmod
        06.10.2021 19:38

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


        1. SergioMadness Автор
          06.10.2021 20:16

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