Files
plantUML/oms/process/correction-new.puml
2026-02-14 01:03:15 +03:00

412 lines
14 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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