refine scheme implementation

This commit is contained in:
2026-02-14 01:03:15 +03:00
parent 91ff1642dc
commit 59558784f6
5 changed files with 905 additions and 0 deletions

View 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