add new schemes

This commit is contained in:
Andrey
2024-05-27 11:13:41 +03:00
parent e084f73d6b
commit 44480f67cf
13 changed files with 520 additions and 162 deletions

View File

@@ -1,33 +1,33 @@
@startuml
scale 1200*1200
mainframe Получение свободных остатков
actor Пользователь as user
participant ARM as ARM
participant OMS as OMS
collections Cache as cache
participant Shcat as Shcat
participant Susanin as Susanin
autonumber
user -> ARM: Нажимает на остатки товара\nв товарной строке заказа
ARM -> OMS: API GET /quantity-list-by-office
activate OMS
OMS -> OMS: валидирует запрос
OMS -> cache: Забрать все офисы из кэша
activate cache
return answer
OMS -> Shcat: POST method rests.get
activate Shcat
return answer API POST
OMS -> Susanin: POST method get_logistic_chains_with_priority
activate Susanin
return answer API POST
OMS -> OMS: Формирует два массива:\n1. По лог.цепям\n2. Прочие склады
return answer API GET
ARM --> user: Рендерит данные в модальном окне
@startuml
scale 1200*1200
mainframe Получение свободных остатков
actor Пользователь as user
participant ARM as ARM
participant OMS as OMS
collections Cache as cache
participant Shcat as Shcat
participant Susanin as Susanin
autonumber
user -> ARM: Нажимает на остатки товара\nв товарной строке заказа
ARM -> OMS: API GET /quantity-list-by-office
activate OMS
OMS -> OMS: валидирует запрос
OMS -> cache: Забрать все офисы из кэша
activate cache
return answer
OMS -> Shcat: POST method rests.get
activate Shcat
return answer API POST
OMS -> Susanin: POST method get_logistic_chains_with_priority
activate Susanin
return answer API POST
OMS -> OMS: Формирует два массива:\n1. По лог.цепям\n2. Прочие склады
return answer API GET
ARM --> user: Рендерит данные в модальном окне
@enduml

View File

@@ -1,24 +1,24 @@
@startuml
scale 1200*1200
mainframe Получение остатков под резервом
actor Пользователь as user
participant ARM as ARM
participant OMS as OMS
participant Susanin as Susanin
autonumber
user -> ARM: Нажимает на остатки товара\nв товарной строке заказа
ARM -> OMS: API GET /quantity-list-by-office
activate OMS
OMS -> OMS: валидирует запрос
OMS -> Susanin: POST method get_logistic_chains_with_priority
activate Susanin
return answer API POST
OMS -> OMS: запрос в mongodb Order с фильтрами по товару
OMS -> OMS: Формирует два массива:\n1. По лог.цепям\n2. Прочие склады
return answer API GET
ARM --> user: Рендерит данные в модальном окне
@startuml
scale 1200*1200
mainframe Получение остатков под резервом
actor Пользователь as user
participant ARM as ARM
participant OMS as OMS
participant Susanin as Susanin
autonumber
user -> ARM: Нажимает на остатки товара\nв товарной строке заказа
ARM -> OMS: API GET /quantity-list-by-office
activate OMS
OMS -> OMS: валидирует запрос
OMS -> Susanin: POST method get_logistic_chains_with_priority
activate Susanin
return answer API POST
OMS -> OMS: запрос в mongodb Order с фильтрами по товару
OMS -> OMS: Формирует два массива:\n1. По лог.цепям\n2. Прочие склады
return answer API GET
ARM --> user: Рендерит данные в модальном окне
@enduml

View File

@@ -0,0 +1,52 @@
@startuml
mainframe Получение заказов для отображения фильтров
autonumber
actor user
participant ARM
participant OMS
collections Redis
participant MSKB
database Database
user -> ARM: Устанавливает фильтры
alt устанавливает фильтр по ПВЗ
user -> ARM: Начинает вводить наименование ПВЗ
ARM -> OMS: Запрашивает список подходящих ПВЗ
OMS -> Redis: Запрашивает список ПВЗ
Redis --> OMS: Возвращает список ПВЗ
OMS --> ARM: Возвращает список ПВЗ
user -> ARM: Выбирает необходимый ПВЗ
ARM -> ARM: Запоминает идентификатор ПВЗ
else устанавливает фильтр по менеджеру
user -> ARM: Начинает вводить ФИО менеджера
ARM -> OMS: Запрашивает список подходящих менеджеров
OMS -> Redis: Запрашивает список менеджеров
Redis --> OMS: Возвращает список менеджеров
OMS --> ARM: Возвращает список менеджеров
user -> ARM: Выбирает необходимого менеджера
ARM -> ARM: Запоминает идентификатор менеджера
else устанавливает фильтр по КА
user -> ARM: Нажимает на фильтр по КА
ARM --> user: Открывает модальное окно "Поиск КА"
user -> ARM: Ищет необходимого КА
ARM -> OMS: Запрашивает список подходящих КА
OMS -> MSKB: Запрашивает список КА
MSKB --> OMS: Возвращает список КА
OMS --> ARM: Возвращает список КА
user -> ARM: Выбирает необходимого КА
ARM -> ARM: Запоминает идентификатор КА
end
alt Необходимы сортировки
user -> ARM: Выбирает необходимую сортировку
ARM -> ARM: Запоминает выбор пользователя
else Не устанавливаются сортировки
end
user -> ARM: Нажимает кнопку Enter или "Обновить"
ARM -> ARM: Формирует запрос на bf
ARM -> OMS: Отправляет запрос
OMS -> Database: Запрашивает список заказов\nс установленными фильтрами
Database --> OMS: Ответ
OMS --> ARM: Ответ
ARM --> user: Отображает журнал заказов
@enduml

View File

@@ -0,0 +1,29 @@
@startuml
mainframe Получение заказов для отображения фильтров
autonumber
actor user
participant ARM
participant OMS
database Database
user -> ARM: Вводит один или несколько номеров заказов
ARM -> ARM: Делит строку по пробелам
alt Необходимы сортировки
user -> ARM: Выбирает необходимую сортировку
ARM -> ARM: Запоминает выбор пользователя
else Не устанавливаются сортировки
end
user -> ARM: Нажимает кнопку Enter или "Обновить"
ARM -> ARM: Формирует запрос
ARM -> OMS: Отправляет запрос на bf
OMS -> OMS: Проверяет есть ли объекты длиной 5 символов
alt Если такие объекты есть
OMS -> OMS: Формирует запрос с регулярным выражением,\nгде поиск осуществляется\nпо последним 5 символам строки
else Если таких объектов нет
OMS -> OMS: Формирует стандартный запрос в БД
end
OMS -> Database: Запрашивает список заказов по выбранным параметрам
Database --> OMS: Ответ
OMS --> ARM: Ответ
ARM --> user: Отображает журнал заказов
@enduml

View File

@@ -1,23 +1,23 @@
@startuml
mainframe Добавление/удаление заметки пользователя в ЛК
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant personalCabinet
autonumber
user -> ARM: Нажимает кнопку "Главная"
alt Пользователь ввел текст и снял фокус с поля
ARM -> Gateway: Отправляет запрос на\nPUT personal-cabinet/v1/note
else Пользователь нажал кнопку "Очистить"
ARM -> Gateway: Отправляет запрос на\nDELETE personal-cabinet/v1/note
end
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
Gateway -> personalCabinet: Вызывает методы для\nизменения заметок по пользователю
personalCabinet --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: answer
@startuml
mainframe Добавление/удаление заметки пользователя в ЛК
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant personalCabinet
autonumber
user -> ARM: Нажимает кнопку "Главная"
alt Пользователь ввел текст и снял фокус с поля
ARM -> Gateway: Отправляет запрос на\nPUT personal-cabinet/v1/note
else Пользователь нажал кнопку "Очистить"
ARM -> Gateway: Отправляет запрос на\nDELETE personal-cabinet/v1/note
end
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
Gateway -> personalCabinet: Вызывает методы для\nизменения заметок по пользователю
personalCabinet --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: answer
@enduml

View File

@@ -1,23 +1,23 @@
@startuml
mainframe Взаимодействие с избранным
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant Order
autonumber
user -> ARM: Нажимает иконку\nсердечка в любом заказе
alt Поле было предварительно выделено (активное состояние)
ARM -> Gateway: Отправляет запрос на\nDELETE orders/v1/{orderID}/favorite
else Поле было предварительно не выделено (не активное состояние)
ARM -> Gateway: Отправляет запрос на\nPOST orders/v1/{orderID}/favorite
end
Gateway -> Order: Вызывает метод\nвзаимодействия с заказом
Order -> Order: Обновляет модель order\n(Либо добавляет uuid юзера\nлибо удаляет)
Order --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: answer
@startuml
mainframe Взаимодействие с избранным
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant Order
autonumber
user -> ARM: Нажимает иконку\nсердечка в любом заказе
alt Поле было предварительно выделено (активное состояние)
ARM -> Gateway: Отправляет запрос на\nDELETE orders/v1/{orderID}/favorite
else Поле было предварительно не выделено (не активное состояние)
ARM -> Gateway: Отправляет запрос на\nPOST orders/v1/{orderID}/favorite
end
Gateway -> Order: Вызывает метод\nвзаимодействия с заказом
Order -> Order: Обновляет модель order\n(Либо добавляет uuid юзера\nлибо удаляет)
Order --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: answer
@enduml

View File

@@ -1,17 +1,17 @@
@startuml
mainframe Получение данных о заказах для ЛК пользователя
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant Order
autonumber
user -> ARM: Нажимает кнопку "Главная"
user -> ARM: Нажимает кнопку "Статистика по заказам"
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/stats
Gateway -> Order: Вызывает методы для получения всех необходимых срезов по заказам
Order --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: Рендерит информационные блоки
@startuml
mainframe Получение данных о заказах для ЛК пользователя
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant Order
autonumber
user -> ARM: Нажимает кнопку "Главная"
user -> ARM: Нажимает кнопку "Статистика по заказам"
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/stats
Gateway -> Order: Вызывает методы для получения всех необходимых срезов по заказам
Order --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: Рендерит информационные блоки
@enduml

View File

@@ -1,16 +1,16 @@
@startuml
mainframe Получение заметки пользователя для ЛК
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant personalCabinet
autonumber
user -> ARM: Нажимает кнопку "Главная"
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
Gateway -> personalCabinet: Вызывает методы для получения заметок по пользователю
personalCabinet --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: Рендерит текст в блоке заметок
@startuml
mainframe Получение заметки пользователя для ЛК
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant personalCabinet
autonumber
user -> ARM: Нажимает кнопку "Главная"
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
Gateway -> personalCabinet: Вызывает методы для получения заметок по пользователю
personalCabinet --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: Рендерит текст в блоке заметок
@enduml

View File

@@ -0,0 +1,85 @@
@startuml
mainframe Получение данных о заказах для ЛК пользователя
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant Order
autonumber
user -> ARM: Нажимает кнопку "Главная"
user -> ARM: Нажимает кнопку "Статистика по заказам"
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/stats
Gateway -> Order: Вызывает методы для получения всех необходимых срезов по заказам
Order --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: Рендерит информационные блоки
@enduml
@startuml
mainframe Получение заметки пользователя для ЛК
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant personalCabinet
autonumber
user -> ARM: Нажимает кнопку "Главная"
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
Gateway -> personalCabinet: Вызывает методы для получения заметок по пользователю
personalCabinet --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: Рендерит текст в блоке заметок
@enduml
@startuml
mainframe Взаимодействие с избранным
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant Order
autonumber
user -> ARM: Нажимает иконку\nсердечка в любом заказе
alt Поле было предварительно выделено (активное состояние)
ARM -> Gateway: Отправляет запрос на\nDELETE orders/v1/{orderID}/favorite
else Поле было предварительно не выделено (не активное состояние)
ARM -> Gateway: Отправляет запрос на\nPOST orders/v1/{orderID}/favorite
end
Gateway -> Order: Вызывает метод\nвзаимодействия с заказом
Order -> Order: Обновляет модель order\n(Либо добавляет uuid юзера\nлибо удаляет)
Order --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: answer
@enduml
@startuml
mainframe Добавление/удаление заметки пользователя в ЛК
scale 1500x1500
actor user as user
participant ARM
participant Gateway
participant personalCabinet
autonumber
user -> ARM: Нажимает кнопку "Главная"
alt Пользователь ввел текст и снял фокус с поля
ARM -> Gateway: Отправляет запрос на\nPUT personal-cabinet/v1/note
else Пользователь нажал кнопку "Очистить"
ARM -> Gateway: Отправляет запрос на\nDELETE personal-cabinet/v1/note
end
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
Gateway -> personalCabinet: Вызывает методы для\nизменения заметок по пользователю
personalCabinet --> Gateway: answer
Gateway --> ARM: answer
ARM --> user: answer
@enduml

View File

@@ -0,0 +1,58 @@
@startuml
mainframe TO BE применение акций и скидок в заказе B2C
scale 1500x1500
actor user as user
participant ARM
participant Sherlock
participant Gateway
participant Order
participant PDM
participant Druz
participant SCROOGE
participant Promo
autonumber
user -> ARM: Нажимает кнопку "Применить скидки"
ARM -> ARM: Рендерит модальное окно
ARM -> ARM: Акции сайта - чекбокс активен
ARM -> ARM: Скидки, выбрано: Без скидки
autonumber 5.1
alt Выбирает только скидки уровня ОПТ
user -> ARM: Выбирает тип ОПТа для клиента
user -> ARM: Снимает чекбокс "Акции сайта"
user -> ARM: Нажимает кнопку "Применить"
ARM -> Gateway: Передает запрос
Gateway -> Gateway: Получает название региона из кэша
Gateway -> SCROOGE: Запрашивает цены из SCROOGE согласно уровню ОПТа
SCROOGE --> Gateway: answer
autonumber 6.1
else Выбирает только акции сайта
user -> ARM: Оставляет чекбокс "Акции сайта"
user -> ARM: Оставляет скидку с типом "Без скидки"
user -> ARM: Нажимает кнопку "Применить"
ARM -> Gateway: Передает запрос
Gateway -> Gateway: Получает название региона из кэша
Gateway -> Gateway: Готовит запрос в promo
Gateway -> Promo: Запрашивает акции и цены по товарам из Promo
Promo --> Gateway: answer
autonumber 7.1
else Выбирает акции и скидки ОПТ
user -> ARM: Выбирает тип ОПТа для клиента
user -> ARM: Оставляет чекбокс "Акции сайта"
user -> ARM: Нажимает кнопку "Применить"
ARM -> Gateway: Передает запрос
Gateway -> Gateway: Получает название региона из кэша
Gateway -> Gateway: Готовит запрос в promo
Gateway -> Promo: Запрашивает акции и цены по товарам из Promo
Promo --> Gateway: answer
Gateway -> SCROOGE: Запрашивает цены из SCROOGE согласно уровню ОПТа
SCROOGE --> Gateway: answer
Gateway -> Gateway: Применяет наименьшие цены\nк каждому из товаров
end
autonumber 8
Gateway -> Order: Записывает изменения в модель
Order --> Gateway: Изменения успешно применены
Gateway -> Gateway: Собирает ответ для frontend
Gateway --> ARM: Answer
ARM -> user: Отображает примененные акции
@enduml

251
oms/order mongoDB.puml Normal file
View File

@@ -0,0 +1,251 @@
@startjson
<style>
' Общий стиль схемы задан здесь
jsonDiagram {
node {
LineColor #000
FontName Helvetica
FontColor black
FontSize 18
FontStyle bold
}
arrow {
LineColor #000
LineThickness 3
LineStyle 2
}
highlight {
BackGroundColor #e5e5e5
FontColor black
}
}
' Здесь находятся расцветки изменений. Необходимо создать новый объект по образу .firstChange
.firstChange {
FontColor blue
}
</style>
' Здесь указываем какие атрибуты нужно подсвечивать в схеме
#highlight "order" / "Recipient" / "ID" <<firstChange>>
#highlight "order" / "Recipient" / "RecipientAddress" <<firstChange>>
#highlight "order" / "Recipient" / "RecipientPhone" <<firstChange>>
#highlight "order" / "Recipient" / "RecipientName" <<firstChange>>
{
"order": {
"orderID": "uuid || Номер заказа",
"managerInfo": {
"CreatedBy": "uuid || Идентификатор автора заказа из AD",
"CreatedFullName": "string || ФИО автора заказа",
"UpdatedBy": "uuid || Идентификатор последнего обновлявшего заказ",
"UpdatedFullName": "string || ФИО последнего обновлявшего заказ",
"ManagerGroup": "int || Идентификатор группы менеджера",
"ManagerPhoneNumber": "string || Номер телефона менеджера",
"ManagerExtensionNumber": "string || Добавочный номер телефона менеджера"
},
"RootOrder": "uuid || UUID корневого заказа",
"Number": "string || Номер заказа в формате ****-******-*****",
"OrderStatus": "int || Идентификатор статуса заказа (от 0 до 7)",
"Contractor": {
"Type": "int || Тип контрагента.",
"B2CContractor": {
"Person": {
"ID": "uuid || Идентификатор (UUID) контрагента",
"FullName": "string || Полное ФИО КА",
"Phone": "string || Номер телефона КА",
"Email": "string || Email адрес КА"
}
},
"B2BContractor": {
"ID": "uuid || Идентификатор (UUID) контрагента",
"Name": "string || Полное наименование КА",
"TIN": "string || Номер ИНН",
"ContactPersons (array)": {
"Person": {
"ID": "uuid || Идентификатор (UUID) контрагента",
"FullName": "string || Полное ФИО КА",
"Phone": "string || Номер телефона КА",
"Email": "string || Email адрес КА"
},
"SmsPhoneNumber": "string || Номер телефона для СМС"
},
"CurrentContactPersonID": "uuid || ID выбранного КЛ для заказа",
"Curator": {
"ID": "uuid || Идентификатор куратора",
"FullName": "string || ФИО куратора"
},
"Contract": {
"ID": "uuid || Идентификатор договора",
"Number": "string || Номер договора",
"Kind": "int || Тип договора"
},
"BaseDocumentSettings": {
"GovernmentContractID": "string || Идентификатор государственного контракта",
"InvoiceTransferBasis": "string || Основание передачи в счете на оплату",
"ShippingDocuments": {
"TransferBasisDocument": "string || документ-основание передачи(сдачи)/получения(приемки)",
"TransferBasisAdditionalDetails": "string || Дополнительные сведения основания передачи",
"OtherInformation": "string || Иные сведения"
}
}
}
},
"Recipient": {
"ID": "uuid || Идентификатор (UUID) грузополучателя",
"RecipientName": "string || Имя грузополучателя заказа",
"RecipientPhone": "string || Номер телефона грузополучателя",
"RecipientAddress": "string || Адрес грузополучателя"
},
"Properties": {
"BasicTimestamps": {
"CreatedAt": "date-time || Дата и время создания заказа",
"UpdatedAt": "date-time || Дата и время последнего обновления заказа"
},
"OriginID": "int || Идентификатор источника заказа",
"SiteOrderDate": "date-time || Дата и время заказа выбранное на сайте",
"OrderComment": "string || Комментарий к заказу. Во wtis: primSklad",
"TtnNumber": "string || Номер ТТН",
"TtnDate": "string || Дата ТТН",
"IsPartialShipmentFromSite": "bool || Признак ЧО с сайта",
"PaymentAmount": "float || Сумма внесенной оплаты",
"BookingEndDates": "array || Массив с датами истечения бронирования заказа",
"IsPrepaymentRequired": "bool || Признак Необходима предоплата",
"RegionGUID": "uuid || Идентификатор (UUID) региона",
"RegionName": "string || Наименование региона",
"TypeOrderFromSite": "string || Тип заказа с сайта. normal / fast",
"Firma": "GUID фирмы отгружающей товар."
},
"Artifacts": {
"PartialShipment": "bool || Признак Частичная отгрузка",
"OrderMasterSystem": "string || Признак мастер-система по заказу",
"KkmDate": "string || Дата ККМ",
"KkmAmount": "float || Сумма оплаты через ККМ",
"PaymentKkm": "bool || Признак оплата через ККМ",
"PaymentCb": "bool || Признак оплата по счету",
"PaymentCard": "bool || Признак картой",
"IsEwalletPayment": "bool || Признак оплата с сайта",
"OrderStateWtis": "int || Состояние заказа из WTIS",
"AttbOplata": "int || Статус оплаты (0 - Не оплачено, 1 - Частичная оплата, 2 - Оплачено). || deprecated",
"OrderStatusWtis": "int || Статус заказа из WTIS",
"IsPromoEnabled": "bool || Признак, что сайт взаимодействует с МС Promo и берет распродажную инфу оттуда.",
"IsYandexEnabled": "bool || Признак, что адрес передается в новом формате для курьерки."
},
"Supplies (array)": {
"ID": "uuid || Идентификатор поставки",
"ShipmentID": "uuid || Идентификатор шипмента",
"ProductID": "uuid || Идентификатор номенклатуры",
"SourceOffice": "uuid || Идентификатор склада на котором находится товар",
"ReserveTo": "date-time || Дата резерв до",
"PurchaseIDs": "array || Массив идентификаторов закупки",
"UnreserveDate": "date-time || Дата фактического снятия с резерва товара",
"Quantity": "int || Количество товара в доставке. Суммарное количество должно быть равно quantity в items",
"StatusItem": "int || Идентификатор статуса товара",
"Artifacts": {
"StatusItemWtis": "int || Клиентский статус товара из WTIS",
"Attb": "Состоние товара из WTIS",
"FlagReturn": "bool || Признак Возврат товара. 1 - товар с вкладки Возвраты, 0 - для товаров с вкладки Товары.",
"FlagReturnedToSklad": "bool || Принят на склад",
"AppendUser": "uuid || ID пользователя кто добавил поставку",
"ChangeUser": "uuid || ID пользователя кто последний изменил поставку"
},
"DateCanDeliver": "date-time || Дата 'Сможем доставить'.",
"CreatedAt": "date-time || Дата создания поставки",
"UpdatedAt": "date-time || Дата последнего обновления поставки",
"Prices": {
"DiscountPrice": "float || Сумма скидки",
"DiscountCategory": "string || Категория скидки",
"DiscountReason": "string || Причина скидки",
"InitialPrice": "float || Начальная цена",
"PurchasePrice": "float || Цена закупки",
"Price": "float || Цена товара",
"Discount": "float || Процент скидки",
"ClearanceSaleID": "uuid || Идентификатор распродажи",
"IsPromoCodeUsed": "bool || Флаг использования промокода",
"PromotionID": "int || Идентификатор акции из МС Promo",
"ExtraCost": "float || Цена доставки на единицу товара"
},
"IsRestored": "bool || Признак восстановления поставки.",
"DeliveryDate": "date-time || Дата доставки"
},
"Shipment": {
"Meta": {
"ID": "uuid || Идентификатор shipment",
"OrderID": "uuid || Идентификатор заказа",
"MethodID": "int || Идентификатор шипмента",
"Status": "int || Статус доставки",
"DeliveryDate": "date-time || Дата доставки",
"Services": {
"Settings": {
"SpreadExtraCost": "bool || Размазать стоимость доставки по товарам связанным с доставкой"
}
},
"CreatedAt": "date-time || Дата создания доставки",
"UpdatedAt": "date-time || Дата последнего обновления доставки"
},
"ShipmentPickup": {
"OfficeGUID": "uuid || Идентификатор офиса"
},
"ShipmentCourier": {
"FactDeliveryBoy": "uuid || Идентификатор курьера который отдал заказ",
"FreeReason": "int || Причина бесплатной доставки",
"FiasID": "uuid || FIAS идентификатор адреса доставки",
"IntervalGUID": "uuid || Идентификатор интервала курьерской доставки",
"DeliveryAregGUID": "uuid || Идентификатор AREG адреса доставки",
"AddressTail": {
"AddressTailID": "uuid || Идентификатор хвоста адреса",
"Flat": "int || Номер квартиры",
"Entrance": "int || Подъезд",
"Floor": "int || Этаж",
"AddressComment": "string || Комментарий к адресу",
"ContactNumber": "string || Контактный номер в адресе доставки"
},
"IntervalValue": "string || Значение интервала доставки",
"Latitude": "string || Широта адреса доставки",
"Longitude": "string || Долгота адреса доставки",
"CourierGUID": "uuid || Идентификатор курьера в заказе",
"DeliveryBoyName": "string || ФИО курьера в заказе",
"AddrDostav": "string || Адрес доставки",
"CourierDeliveryCost": "int || Стоимость доставки",
"CourierComment": "string || Комментарий для курьера"
},
"ShipmentTKPickup": {
"TransportCompanyID": "uuid || Идентификатор транспортной компании",
"TransportCompanyCityID": "uuid || Идентификатор города ТК",
"TransportCompanyCityName": "string || Название города ТК",
"TransportCompanyExternalCode": "string || Внешний код офиса ТК в системе CDEK",
"TransportCompanyTariffID": "uuid || Идентификатор тарифа ТК",
"TransportCompanyTariffName": "string || Наименование тарифа",
"CourierDeliveryCost": "int || Стоимость доставки",
"CourierComment": "string || Комментарий для курьера"
},
"shipmentTKCourier": {
"TransportCompanyID": "uuid || Идентификатор транспортной компании",
"TransportCompanyCityID": "uuid || Идентификатор города ТК",
"TransportCompanyCityName": "string || Название города ТК",
"TransportCompanyExternalCode": "string || Внешний код офиса ТК в системе CDEK",
"TransportCompanyTariffID": "uuid || Идентификатор тарифа ТК",
"TransportCompanyTariffName": "string || Наименование тарифа",
"IntervalValue": "string || Значение интервала доставки",
"Latitude": "string || Широта адреса доставки",
"Longitude": "string || Долгота адреса доставки",
"AddrDostav": "string || Адрес доставки",
"FiasID": "uuid || FIAS идентификатор адреса доставки",
"IntervalGUID": "uuid || Идентификатор интервала курьерской доставки",
"DeliveryAregGUID": "uuid || Идентификатор AREG адреса доставки",
"AddressTail": {
"AddressTailID": "uuid || Идентификатор хвоста адреса",
"Flat": "int || Номер квартиры",
"Entrance": "int || Подъезд",
"Floor": "int || Этаж",
"AddressComment": "string || Комментарий к адресу",
"ContactNumber": "string || Контактный номер в адресе доставки"
},
"CourierDeliveryCost": "int || Стоимость доставки",
"DeliveryWay": "int || Тип доставки, через транспортную компанию",
"CourierComment": "string || Комментарий для курьера"
}
}
}
}
@endjson

119
oms/process/ordering.puml Normal file
View File

@@ -0,0 +1,119 @@
@startuml
title Проверка лимитов заказа
autonumber
actor User
participant ARM as ARM
participant Gateway as Gateway
participant Workflow as Workflow
participant Temporal as Temporal
User -> ARM: Нажатие кнопки "Оформить заказ"
ARM -> Gateway: Отправляет запрос на /orders/{orderID}/validate
Gateway -> Temporal: Отправка данных на\nоформление заказа и его проверку
Temporal --> Workflow: Получение сообщения
Workflow -> Workflow: Проверка лимитов ПВЗ и размеров товаров
Workflow -> Workflow: Завершает выполнение workflow
Workflow -> Temporal: Отдает результат проверки в Temporal.
Gateway --> Temporal: Слушает temporal и получает результат проверки
Gateway --> ARM: Ответ в виде кодов ответа с /orders/{orderID}/validate
alt Проверки пройдены
ARM -> ARM: Проверки пройдены успешно
ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway
else Проверки не пройдены
ARM -> User: Показывает Пользователю модальное\nокно с лимитами ПВЗ и выбором\nдальнейших действий - продолжить\nоформление или отменить.
alt Отмена оформления
User -> ARM: Нажимает кнопку "Отменить оформление"
ARM -> ARM: Закрывает модальное окно и ждет следующего действия от менеджера (Конец процесса)
else Продолжение оформления
User -> ARM: Нажимает кнопку "Продолжить оформление"
ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway
end
end
note across: Продолжение описания алгоритма начинается с Workflow оформления заказа
@enduml
@startuml
title Оформление заказа
autonumber
participant User
participant ARM
participant Gateway
participant Temporal
participant Workflow
queue Kafka
participant Wtis
participant Order
ARM -> Gateway: Вызов метода bf orders/{orderID}/ordering
ARM -> User: Блокирует заказ на изменение\nи выводит оповещения: "Оформление заказа",
Gateway -> Temporal: Отправляет данные\nна оформление заказа
Workflow --> Temporal: Получает сообщения о заказе
Workflow -> Workflow: Создает WorkflowOrdering
Workflow -> Temporal: Отправляет workflowID и runID
Temporal -> Gateway: Получает workflowID и runID
Gateway -> ARM: Отправка workflowID и runID\nв ответ на метод bf orders/{orderID}/ordering
ARM -> ARM: Сохранение workflowID и runID в куки на 5 минут
loop Раз в 5 секунд
ARM -> Gateway: Периодическая проверка состояния workflow\nзапросом на orders/{orderID}/workflow/{workflowID}
Gateway -> Temporal: Отправляет запрос на\nпроверку состояния workflow
Workflow -> Temporal: Слушает и получает запрос\nна состояние workflow
Workflow -> Temporal: Уточнение состояния workflow\n(в работе или завершен успешно\nили завершен с ошибкой)\n WorkflowOrdering
Gateway -> Temporal: Слушает и получает состояния\nworkflow
Gateway -> ARM: Получает ответ
end
alt До тех пор пока workflow не завершен
ARM -> User: ARM блокирует интерфейс пользователю
else workflow завершен успешно
ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ оформлен". И обновляет все данные\nсодержащие статусы, подробнее описано ниже.
else workflow завершен с ошибкой "Втис не доступен"
ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ не оформлен"
else workflow завершен с ошибкой "Не удалось взять в резерв товары"
ARM -> User: АРМ снимает блокировку и показывает\nоповещение "Не удалось товары взять в резерв".\nИ обновляет все данных содержащие статусы,\nподробнее описано ниже.
end
Workflow -> Order: Забирает структуру заказа
Workflow -> Workflow: Конвертирует структуру заказа\nв нужную для Wtis
Workflow -> Workflow: Создает таймер ответа\nна запрос и ждет ответ от Wtis\nTBD: Сколько таймер?
Workflow -> Kafka: Записывает данные в топик\nKafka oms.orders.sync
alt Успешный сценарий
Wtis -> Kafka: Читает данные по заказу
Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД
Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв"
Wtis -> Temporal: Отправляет сигнал что закончил свои флоу
else WTIS не доступен
Wtis -> Kafka: Не забрал данные по заказу
Temporal -> Temporal: по таймауту понимает что\nвтис не ответил\nTBD: Где таймер?\nНа воркфлоу или на темпорал?
Workflow -> Temporal: Слушает Temporal и\nполучает информацию об ошибке
Workflow -> Order: Ничего не обновляет в БД Order
else WTIS частично взял товары в резерв
Wtis -> Kafka: Читает данные по заказу
Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД
Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв"\n(частичный резерв)
Wtis -> Temporal: Отправляет сигнал что закончил\nсвои флоу частично
Workflow -> Temporal: Слушает Temporal и получает\nинформацию о проведенном резерв
Workflow -> Order: Обновляет ту часть товаров что была зарезервирована
Workflow -> Workflow: Меняет мастер систему\nв заказе на WTIS
Workflow -> Gateway: Возвращает ответ
Gateway -> ARM: Возвращает ответ
ARM -> User: Пишет сообщение пользователю:\n"Заказ не оформлен товары не зарезервировались"
end
Wtis -> Kafka: Записывает обновленные\nданные заказа
Temporal -> Kafka: Слушает топик wtis.orders.sync и получает структуру даных
Workflow -> Order: Маппит структуру и сохранет ее в Order, обновляя статусы заказов и товаров
Workflow -> Workflow: Запускает дочерний\nworkflow SendSMSMessage
Workflow -> Workflow: Завершает wf WorkflowOrdering
Workflow -> Temporal: Сообщает о завершении workflow
Gateway -> Temporal: Слушает Temporal и\nполучает сигнал что wf завершен
Gateway --> ARM: Возвращает ответ на bf orders/{orderID}/ordering
ARM -> User: Разблокирует интерфейс, меняет управляющие кнопки заказа
ARM -> Gateway: Вызывает метод bf /orders/{orderID}/products\nтоварного блока обновляет статусы товаров.
Gateway -> ARM: answer
ARM -> Gateway: Вызывает метод bf /orders/{orderID}\nзаказа обновляет статус заказа.
Gateway -> ARM: answer
ARM -> Gateway: Вызывает метод bf /orders/{orderID}/deliveries\nобновляет статус доставки.
Gateway -> ARM: answer
@enduml