@startuml scale 1500x1500 mainframe Автооформление заказов actor user as user participant SITE queue kafka participant Gateway participant workflow participant wtis participant CRM user -> SITE: Оформляет заказ SITE -> SITE: Сохраняет заказ в БД SITE --> kafka: Пишет заказ в kafka Gateway --> kafka: Забирает заказ Gateway -> workflow: CreateB2CAO workflow -> workflow: Проверяет условия АО workflow -> workflow: Проверяет тип доставки workflow -> wtis: синк заказа во втис через kafka alt Тип доставки "Курьером" workflow -> workflow: Устанавливает таймер на N минут alt Поступила оплата в заказ до истечения срока таймера workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа workflow -> wtis: Синхронизирует заказ со WTIS else Не поступила оплата в заказ до истечения срока таймера workflow -> CRM: Ставится задача с типом 21 в CRM end else Тип доставки "Самовывоз" workflow -> workflow: Проверяет наличие\nкрупногабаритных товаров\nв заказе alt Крупногабаритных товаров в заказе нет workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа workflow -> wtis: Синхронизирует заказ со WTIS else Крупногабаритные товары в заказе есть workflow -> workflow: Устанавливает таймер на N минут alt Поступила оплата в заказ до истечения срока таймера workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа workflow -> wtis: Синхронизирует заказ со WTIS else Не поступила оплата в заказ до истечения срока таймера workflow -> CRM: Ставится задача с типом 21 в CRM end end end @enduml @startuml Редактирование заказа процесс skinparam backgroundColor #FFFFFF skinparam componentStyle rectangle title Бизнес-процесс редактирования заказа actor User as U participant "Frontend ARM" as F participant "Gateway" as G participant "Workflow" as W participant "Order" as OS participant "History" as H participant "WTIS" as WTIS participant "MongoDB" as DB == Инициация редактирования == U -> F: Клик на кнопку "Редактирование заказа" activate F F -> G: GET /orders/v1/{orderID}/start-correction activate G G -> W: ExecuteWorkflow(B2CGetEditableFieldsWorkflow) activate W == Workflow: Получение редактируемых полей == W -> OS: gRPC: GetOrder(orderID) activate OS OS -> DB: Поиск заказа DB --> OS: Данные заказа OS --> W: Order entity deactivate OS W -> H: gRPC: IsTransactionExist(orderID) activate H H -> H: Transaction Service\nIsTransactionExist() H -> DB: Поиск открытой транзакции DB --> H: TransactionID или null H --> W: TransactionID или uuid.Nil deactivate H alt Транзакция не существует W -> H: gRPC: StartTransaction(orderID, userID) activate H H -> H: Transaction Service\nStartTransaction() H -> H: Создание новой транзакции\n(статус: Opened) H -> DB: Сохранение транзакции DB --> H: Подтверждение H --> W: TransactionID deactivate H end W -> W: Определение редактируемых полей\n(editorder.FieldsDispatcher) W -> W: Activity: GetEditableFieldsFromWTIS(orderID) W -> WTIS: API GET GetEditableFieldsFromWTIS(orderID) activate WTIS WTIS --> W: Права на редактирование атрибутов deactivate WTIS W -> W: Проверка прав пользователя\n(permissions) W -> W: Формирование ответа\n(CorrectionAnswer) W --> G: Результат workflow deactivate W G --> F: CorrectionAnswer\n(редактируемые поля) deactivate G F -> F: Показать уведомление\n"У вас есть 5 минут на редактирование" F --> U: Интерфейс редактирования активирован deactivate F == Мониторинг транзакции == loop Каждые 30 секунд F -> F: checkOrderHasTransaction() F -> G: GET /orders/v1/{orderID} G --> F: hasTransaction: boolean alt hasTransaction = false F -> F: Показать ошибку\n"Время на редактирование вышло" F -> F: Перезагрузить страницу end end == Завершение редактирования == U -> F: Клик "Сохранить" или "Отменить" activate F F -> G: GET /orders/v1/{orderID}/end-correction\n?typeCorrection=...&typeEndCorrection=... activate G G -> W: ExecuteWorkflow(B2CEndCorrectionsWorkflow) activate W == Workflow: Завершение редактирования == W -> W: Lock ресурса (mutex)\n(10 минут блокировка) W -> OS: gRPC: GetOrder(orderID) activate OS OS -> DB: Поиск заказа DB --> OS: Данные заказа OS --> W: Order entity deactivate OS W -> W: Activity: IsTransactionExist(orderID) W -> H: gRPC: IsTransactionExist(orderID) activate H H -> H: Transaction Service\nIsTransactionExist() H -> DB: Поиск транзакции DB --> H: TransactionID H --> W: TransactionID deactivate H alt typeEndCorrection = "reject" W -> W: Activity: EndTransaction(orderID, userID, true) W -> H: gRPC: EndTransaction(orderID, userID, true) activate H H -> H: Transaction Service\nEndTransaction() H -> H: Закрытие транзакции\n(статус: Rejected) H -> DB: Обновление транзакции DB --> H: Подтверждение H --> W: Результат deactivate H W -> W: Unlock ресурса W --> G: Успешная отмена else typeEndCorrection = "success" W -> W: ManualActionWorkflow.ExecuteAsChild()\n(синхронизация с WTIS) W -> W: Activity: GetOrderByID(orderID)\n(обновленные данные) W -> OS: gRPC: GetOrder(orderID) activate OS OS -> DB: Поиск заказа DB --> OS: Обновленные данные заказа OS --> W: Order entity deactivate OS W -> W: Activity: EndTransaction(orderID, userID, false) W -> H: gRPC: EndTransaction(orderID, userID, false) activate H H -> H: Transaction Service\nEndTransaction() H -> H: Закрытие транзакции\n(статус: Finished) H -> DB: Обновление транзакции H -> H: publishEvents()\n(публикация событий) H --> W: Результат deactivate H W -> W: SaveOrderWithShipment()\n(сохранение изменений) W -> OS: gRPC: UpsertOrderWithShipment(orderID) activate OS OS -> H: Transaction Service\nIsTransactionExist() activate H H -> DB: Поиск транзакции DB --> H: TransactionID H --> OS: TransactionID deactivate H OS -> DB: Сохранение заказа DB --> OS: Подтверждение OS --> W: Order entity deactivate OS W -> W: Unlock ресурса W --> G: Успешное сохранение end deactivate W G --> F: Результат завершения транзакции deactivate G F -> F: Обновление интерфейса F --> U: Редактирование завершено deactivate F @enduml