refine scheme implementation
This commit is contained in:
412
oms/process/correction-new.puml
Normal file
412
oms/process/correction-new.puml
Normal file
@@ -0,0 +1,412 @@
|
||||
@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
|
||||
Reference in New Issue
Block a user