@startuml title Проверка лимитов заказа autonumber actor User participant ARM as ARM participant Gateway as Gateway participant Workflow as Workflow participant Temporal as Temporal User -> ARM: Нажатие кнопки "Оформить заказ" ARM -> Gateway: Отправляет запрос на /orders/{orderID}/validate Gateway -> Temporal: Отправка данных на\nоформление заказа и его проверку Temporal --> Workflow: Получение сообщения Workflow -> Workflow: Проверка лимитов ПВЗ и размеров товаров Workflow -> Workflow: Завершает выполнение workflow Workflow -> Temporal: Отдает результат проверки в Temporal. Gateway --> Temporal: Слушает temporal и получает результат проверки Gateway --> ARM: Ответ в виде кодов ответа с /orders/{orderID}/validate alt Проверки пройдены ARM -> ARM: Проверки пройдены успешно ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway else Проверки не пройдены ARM -> User: Показывает Пользователю модальное\nокно с лимитами ПВЗ и выбором\nдальнейших действий - продолжить\nоформление или отменить. alt Отмена оформления User -> ARM: Нажимает кнопку "Отменить оформление" ARM -> ARM: Закрывает модальное окно и ждет следующего действия от менеджера (Конец процесса) else Продолжение оформления User -> ARM: Нажимает кнопку "Продолжить оформление" ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway end end note across: Продолжение описания алгоритма начинается с Workflow оформления заказа @enduml @startuml title Оформление заказа autonumber participant User participant ARM participant Gateway participant Temporal participant Workflow queue Kafka participant Wtis participant Order ARM -> Gateway: Вызов метода bf orders/{orderID}/ordering ARM -> User: Блокирует заказ на изменение\nи выводит оповещения: "Оформление заказа", Gateway -> Temporal: Отправляет данные\nна оформление заказа Workflow --> Temporal: Получает сообщения о заказе Workflow -> Workflow: Создает WorkflowOrdering Workflow -> Temporal: Отправляет workflowID и runID Temporal -> Gateway: Получает workflowID и runID Gateway -> ARM: Отправка workflowID и runID\nв ответ на метод bf orders/{orderID}/ordering ARM -> ARM: Сохранение workflowID и runID в куки на 5 минут loop Раз в 5 секунд ARM -> Gateway: Периодическая проверка состояния workflow\nзапросом на orders/{orderID}/workflow/{workflowID} Gateway -> Temporal: Отправляет запрос на\nпроверку состояния workflow Workflow -> Temporal: Слушает и получает запрос\nна состояние workflow Workflow -> Temporal: Уточнение состояния workflow\n(в работе или завершен успешно\nили завершен с ошибкой)\n WorkflowOrdering Gateway -> Temporal: Слушает и получает состояния\nworkflow Gateway -> ARM: Получает ответ end alt До тех пор пока workflow не завершен ARM -> User: ARM блокирует интерфейс пользователю else workflow завершен успешно ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ оформлен". И обновляет все данные\nсодержащие статусы, подробнее описано ниже. else workflow завершен с ошибкой "Втис не доступен" ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ не оформлен" else workflow завершен с ошибкой "Не удалось взять в резерв товары" ARM -> User: АРМ снимает блокировку и показывает\nоповещение "Не удалось товары взять в резерв".\nИ обновляет все данных содержащие статусы,\nподробнее описано ниже. end Workflow -> Order: Забирает структуру заказа Workflow -> Workflow: Конвертирует структуру заказа\nв нужную для Wtis Workflow -> Workflow: Создает таймер ответа\nна запрос и ждет ответ от Wtis\nTBD: Сколько таймер? Workflow -> Kafka: Записывает данные в топик\nKafka oms.orders.sync alt Успешный сценарий Wtis -> Kafka: Читает данные по заказу Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв" Wtis -> Temporal: Отправляет сигнал что закончил свои флоу else WTIS не доступен Wtis -> Kafka: Не забрал данные по заказу Temporal -> Temporal: по таймауту понимает что\nвтис не ответил\nTBD: Где таймер?\nНа воркфлоу или на темпорал? Workflow -> Temporal: Слушает Temporal и\nполучает информацию об ошибке Workflow -> Order: Ничего не обновляет в БД Order else WTIS частично взял товары в резерв Wtis -> Kafka: Читает данные по заказу Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв"\n(частичный резерв) Wtis -> Temporal: Отправляет сигнал что закончил\nсвои флоу частично Workflow -> Temporal: Слушает Temporal и получает\nинформацию о проведенном резерв Workflow -> Order: Обновляет ту часть товаров что была зарезервирована Workflow -> Workflow: Меняет мастер систему\nв заказе на WTIS Workflow -> Gateway: Возвращает ответ Gateway -> ARM: Возвращает ответ ARM -> User: Пишет сообщение пользователю:\n"Заказ не оформлен товары не зарезервировались" end Wtis -> Kafka: Записывает обновленные\nданные заказа Temporal -> Kafka: Слушает топик wtis.orders.sync и получает структуру даных Workflow -> Order: Маппит структуру и сохранет ее в Order, обновляя статусы заказов и товаров Workflow -> Workflow: Запускает дочерний\nworkflow SendSMSMessage Workflow -> Workflow: Завершает wf WorkflowOrdering Workflow -> Temporal: Сообщает о завершении workflow Gateway -> Temporal: Слушает Temporal и\nполучает сигнал что wf завершен Gateway --> ARM: Возвращает ответ на bf orders/{orderID}/ordering ARM -> User: Разблокирует интерфейс, меняет управляющие кнопки заказа ARM -> Gateway: Вызывает метод bf /orders/{orderID}/products\nтоварного блока обновляет статусы товаров. Gateway -> ARM: answer ARM -> Gateway: Вызывает метод bf /orders/{orderID}\nзаказа обновляет статус заказа. Gateway -> ARM: answer ARM -> Gateway: Вызывает метод bf /orders/{orderID}/deliveries\nобновляет статус доставки. Gateway -> ARM: answer @enduml