@startuml Order Edit Process 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: Запускает workflow 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: Определение редактируемых полей 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: запускает workflow 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 -> 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 -> H: gRPC: EndTransaction(orderID, userID, true) activate H H -> H: Закрытие транзакции\n(статус: Rejected) H -> DB: Обновление транзакции DB --> H: Подтверждение H --> W: Результат deactivate H W -> W: Unlock ресурса W --> G: Успешная отмена G --> F: Результат завершения транзакции F -> F: Обновление интерфейса F --> U: Редактирование завершено deactivate F else typeEndCorrection = "success" W -> W: Старт ручного действия коррекции W -> W: Подготовка заказа и шипментов\nконвертация в OrderToWtis W -> WTIS: API POST /api/v1/oms_sync\nСинхронизация заказа с WTIS activate WTIS WTIS -> WTIS: Обработка изменений\n(валидация, расчёты, статусы и т.п.) WTIS --> W: OrderSyncResponse\n(подтверждение или бизнес‑ошибки) deactivate WTIS W -> W: Проверка ответа (бизнес-ошибки или модель заказа) alt бизнес-ошибка от WTIS W --> G: Ошибка сохранения G --> F: Отображение ошибки\nЗавершения транзакции deactivate G F -> F: Обновление интерфейса с ошибкой F --> U: Редактирование не завершено deactivate F end W -> W: Преобразование ответа WTIS в модель заказа OMS W -> H: gRPC: EndTransaction(orderID, userID, false) activate H H -> H: Transaction Service\nEndTransaction() H -> H: Закрытие транзакции\n(статус: Finished) H -> DB: Обновление транзакции DB --> H: answer H -> H: publishEvents()\n(публикация событий) H --> W: Результат deactivate H W -> W: Сохранение изменений 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: Успешное сохранение deactivate W G --> F: Результат завершения транзакции deactivate G F -> F: Обновление интерфейса F --> U: Редактирование завершено deactivate F end @enduml @startuml EditOrder 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: Запускает workflow 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: Определение редактируемых полей 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: запускает workflow 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 -> H: gRPC: GetTransactionByOrder(orderID)\n(получение транзакции) activate H H -> DB: Поиск транзакции DB --> H: answer H --> W: answer deactivate H alt typeEndCorrection = "reject" W -> H: gRPC: EndTransaction(orderID, userID, true) activate H H -> DB: Обновление статуса транзакции\n(статус: Rejected) DB --> H: Подтверждение H --> W: answer deactivate H W -> W: Unlock ресурса W --> G: Успешная отмена G --> F: Результат завершения транзакции F -> F: Обновление интерфейса F --> U: Редактирование завершено deactivate F else typeEndCorrection = "success" W -> W: Старт workflow ManualActionWorkflow W -> WTIS: API POST /api/order/oms_sync\n(через ActionsB2CManualWorkflow) activate WTIS WTIS -> WTIS: Обработка изменений WTIS --> W: OrderSyncResponse\n(подтверждение или бизнес‑ошибки) deactivate WTIS alt бизнес-ошибка / ошибка синхронизации W -> W: Формирование ManualActionRes.BusinessError W -> W: Unlock ресурса W --> G: Ошибка завершения коррекции\n(B2CEndCorrectionsWorkflow возвращает res.Error) G --> F: Отображение ошибки\nзавершения транзакции deactivate G F -> F: Обновление интерфейса с ошибкой F --> U: Отображение в интерфейсе ошибки\n"Редактирование не завершено" deactivate F else успешный ответ WTIS W -> W: Преобразование ответа WTIS\nв модель заказа OMS W -> OS: Запись (orderFromWTIS) в БД, шипменты, события activate OS OS --> W: asnwer deactivate OS W -> OS: gRPC: GetOrder(orderID)\n(повторное чтение обновлённого заказа) activate OS OS -> DB: Поиск заказа (включая shipment) activate DB DB --> OS: Обновлённые данные заказа deactivate DB OS --> W: Order entity deactivate OS alt B2B Заказ W -> H: gRPC: GetEventsByDraft(draft) activate H H -> DB: Поиск событий по транзакции DB --> H: Events H --> W: Events deactivate H W -> H: gRPC: IsNeedInvoiceGenerate(events) activate H H -> H: Анализ событий\nнужна ли перегенерация счёта H --> W: IsNeedInvoiceGenerate deactivate H W -> W: Определение менялась ли закупочная цена alt IsNeedInvoiceGenerate == true W -> W: Вызов дочернего WF перегенерации счета\n(InvoiceGenerateWorkflow) W <- W: Результат генерации счёта\n(ошибка или успех).\nПри ошибке - возврат ошибки пользователю end end W -> H: gRPC: EndTransaction(orderID, userID, false) activate H H -> H: Transaction Service\nEndTransaction() H -> DB: Обновление транзакции\n(статус: Finished) DB --> H: Подтверждение H -> Kafka: публикация в топик oms.order.before_publish. activate Kafka Kafka --> H: Подтверждение публикации deactivate Kafka H --> W: Результат deactivate H W -> W: Unlock ресурса W --> G: Успешное завершение коррекции deactivate W G --> F: Результат завершения транзакции deactivate G F -> F: Обновление интерфейса F --> U: Редактирование завершено deactivate F end end @enduml