220 lines
8.3 KiB
Plaintext
220 lines
8.3 KiB
Plaintext
@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 |