412 lines
14 KiB
Plaintext
412 lines
14 KiB
Plaintext
@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.<stage>
|
||
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 |