commit 072ced2815f69f57f3db1e4b684ef15c60fb53a2 Author: Andrey Date: Mon Apr 8 19:15:50 2024 +0300 Initial commit diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..4351daa --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..f324872 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/plantUML.iml b/.idea/plantUML.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/plantUML.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/example.proto b/example.proto new file mode 100644 index 0000000..274e408 --- /dev/null +++ b/example.proto @@ -0,0 +1,255 @@ +syntax = "proto3"; + +package promo; + +option go_package = "./;pb"; +option php_namespace = "GRPC"; +option php_metadata_namespace = "GRPC\\GPBMetadata"; + +import "google/api/annotations.proto"; + +service PromoService { + // ListProductsPromotion проверяет наличие акционных цен по товарам + rpc ListProductsPromotion(ListProductsPromotionRequest) returns (ListProductsPromotionResponse) { + option (google.api.http) = { + post: "/ListProductsPromotion" + body: "*" + }; + } + + // GetPromotionsDetails возвращает общую информацию по акциям + rpc GetPromotionsDetails(GetPromotionsDetailsRequest) returns (GetPromotionsDetailsResponse) { + option (google.api.http) = { + post: "/GetPromotionsDetails" + body: "*" + }; + } + + // ListPromotionsV0 список активных акций + // возвращает список активных акций в порядке приоритета + // для кажого типа акции может вернуться максимум 2 акции среди которых нужно выбрать первую, + // которая подходит для текущего типа пользователя. + // Метод сделан для переходного периода, пока сайт не может получать тип пользователя + rpc ListPromotionsV0(ListPromotionsV0Request) returns (ListPromotionsV0Response) { + option deprecated = true; + option (google.api.http) = { + post: "/ListPromotionsV0" + body: "*" + }; + } + + // ListPromotionsV1 список активных акций + // возвращает по одной самой приоритетной акции каждого типа в порядке приоритета + rpc ListPromotionsV1(ListPromotionsV1Request) returns (ListPromotionsV1Response) { + option (google.api.http) = { + post: "/ListPromotionsV1" + body: "*" + }; + } + + // GetPromotionDetails получает общую информацию об акции + rpc GetPromotionDetails(GetPromotionDetailsRequest) returns (GetPromotionDetailsResponse) { + option (google.api.http) = { + post: "/GetPromotionDetails" + body: "*" + }; + } + + // GetPromotionRubrics возвращает список рубрик, в которых есть акционные товары + rpc GetPromotionRubrics(GetPromotionRubricsRequest) returns (GetPromotionRubricsResponse) { + option (google.api.http) = { + post: "/GetPromotionRubrics" + body: "*" + }; + } + + // GetPromotionID возвращает ID акции по ее UUID + rpc GetPromotionID(GetPromotionIDRequest) returns (GetPromotionIDResponse) { + option (google.api.http) = { + post: "/GetPromotionID" + body: "*" + }; + } + + // ListPromotion листинг акции + rpc ListPromotion(ListPromotionRequest) returns (ListPromotionResponse) { + option (google.api.http) = { + post: "/ListPromotion" + body: "*" + }; + } +} + +message Product { + string id = 1; + Price promotion_price = 2; + // availability_quantity - минимальное из 2х значений: + // "лимит в заказе" или "максимальное количество товара которое может быть продано по акционной цене" + float availability_quantity = 3; + // order_limit - максимальное количество товара в заказе + int32 order_limit = 4; + // is_upload_to_feed - выгружать ли товар в фиды + bool is_upload_to_feed = 5; +} + +message Price { + int64 rubles = 1; +} + +enum OrderBy { + ORDER_BY_UNSPECIFIED = 0; + ORDER_BY_PROMO_PRICE = 1; + ORDER_BY_DISCOUNT = 2; + ORDER_BY_POPULARITY = 3; + ORDER_BY_RATING = 4; + ORDER_BY_REVIEWS = 5; +} + +enum OrderDirection { + ORDER_DIRECTION_UNSPECIFIED = 0; + ORDER_DIRECTION_ASC = 1; + ORDER_DIRECTION_DESC = 2; +} + +message ListProductsPromotionRequest { + repeated string product_ids = 1; + string locality_id = 2; + UserType user_type = 3; + bool disable_cache = 4; +} + +message ListProductsPromotionResponse { + repeated PromotionProducts promotion_products = 1; +} + +message PromotionProducts { + repeated Product products = 1; + PromotionDetails promotion_details = 2; +} + +message Nameplate { + string title = 1; + string hint_description = 2; + string color = 3; + string text_color = 4; +} + +message Meta { + string title = 1; + string description = 2; + string keywords = 3; +} + +enum PromotionType { + PROMOTION_TYPE_UNSPECIFIED = 0; + PROMOTION_TYPE_BLACK_FRIDAY = 1; + PROMOTION_TYPE_PRODUCT_OF_THE_MONTH = 2; + PROMOTION_TYPE_SALE_IN_THE_STORE = 3; + PROMOTION_TYPE_SUPER_PRICE = 4; +} + +message GetPromotionsDetailsRequest { + repeated int32 promotion_ids = 1; +} + +message GetPromotionsDetailsResponse { + repeated PromotionDetails promotion_details = 1; +} + +message PromotionDetails { + int32 id = 1; + string uuid = 2; + string slug = 3; + PromotionClientType client_type = 4; + string name = 5; + string title = 6; + Nameplate nameplate = 7; + Meta meta = 8; + PromotionType type = 100; + string description = 9; + string frameColor = 10; +} + +// PromotionClientType свойство акции определяющие контрагентов для которых действует акция +// PROMOTION_CLIENT_TYPE_ALL - акция подходит для любого клиента +// PROMOTION_CLIENT_TYPE_B2C - акция подходит только для b2c +// PROMOTION_CLIENT_TYPE_B2B - акция подходит только для b2b +enum PromotionClientType { + PROMOTION_CLIENT_TYPE_UNSPECIFIED = 0; + PROMOTION_CLIENT_TYPE_ALL = 1; + PROMOTION_CLIENT_TYPE_B2C = 2; + PROMOTION_CLIENT_TYPE_B2B = 3; +} + +message ListPromotionsV0Request { + string locality_id = 1; +} + +message ListPromotionsV0Response { + repeated PromotionDetails promotion_details = 1; +} + +message ListPromotionsV1Request { + string locality_id = 1; + UserType user_type = 2; +} + +message ListPromotionsV1Response { + repeated PromotionDetails promotion_details = 1; +} + +// UserType тип пользователя который делает запрос +enum UserType { + USER_TYPE_UNSPECIFIED = 0; + USER_TYPE_B2C = 1; + USER_TYPE_B2B = 2; +} + +message GetPromotionDetailsRequest { + string locality_id = 1; + UserType user_type = 2; + string promotion_slug = 3; +} + +message GetPromotionDetailsResponse { + PromotionDetails promotion_details = 1; +} + +message GetPromotionRubricsRequest { + string promotion_slug = 1; + string locality_id = 2; + UserType user_type = 3; +} + +message GetPromotionRubricsResponse { + repeated string rubric_ids = 1; +} + +message GetPromotionIDRequest { + string uuid = 1; +} + +message GetPromotionIDResponse { + int32 promotion_id = 1; +} + +message ListPromotionRequest { + string locality_id = 1; + UserType user_type = 2; + string promotion_slug = 3; + + string rubric_id = 4; + OrderBy order_by = 7; + OrderDirection order_direction = 8; + + int64 page_number = 9; + + bool disable_cache = 10; + + int32 limit = 11; +} + +message ListPromotionResponse { + repeated Product products = 1; + int64 total_products = 2; +} diff --git a/oms/autoorder/FRQ-1.puml b/oms/autoorder/FRQ-1.puml new file mode 100644 index 0000000..0ea58a3 --- /dev/null +++ b/oms/autoorder/FRQ-1.puml @@ -0,0 +1,46 @@ +@startuml +mainframe "FRQ-1 Заказ.ПолучениеДанных." +Actor USER +participant SITE +participant WTIS +queue Название_топика_1 +queue Название_топика_2 +participant OMS +participant Officer + + +autonumber 1 +USER -> USER: Создает заказ на сайте +USER -> SITE: Сущность "Заказ"\nс набором атрибутов +SITE -> WTIS: Сущность "Заказ"\nс набором атрибутов +WTIS -> WTIS: Проверка условий\nи отбор заказов +WTIS -> Название_топика_1: Записывает Сущность\n"Заказ" с набором\nатрибутов +OMS -> Название_топика_1: Читает Сущность\n"Заказ" с набором\nатрибутов +OMS -> OMS: Валидация КА +autonumber 7.1 +alt валидация пройдена +OMS -> OMS: Продолжение сценария +else валидация не пройдена +OMS -> Название_топика_2: Сущность "Заказ"\nс набором атрибутов +end +autonumber 8 +OMS <-> Officer: Получение лимитов офиса +OMS -> OMS: Валидация способа получения +alt валидация пройдена +autonumber 9.1 +OMS -> OMS: Продолжение сценария +else валидация не пройдена +OMS -> Название_топика_2: Сущность "Заказ"\nс набором атрибутов +end +autonumber 10 +OMS -> OMS: Валидация способа оплаты +alt валидация пройдена +autonumber 10.1 +OMS -> OMS: Продолжение сценария +else валидация не пройдена +OMS -> Название_топика_2: Сущность "Заказ"\nс набором атрибутов +end +autonumber 11 +OMS -> OMS: Данные о заказе\nполучены и провалидированы +OMS -> OMS: Переход к бизнес-проверкам +@enduml \ No newline at end of file diff --git a/oms/autoorder/FRQ-2.puml b/oms/autoorder/FRQ-2.puml new file mode 100644 index 0000000..5435ebc --- /dev/null +++ b/oms/autoorder/FRQ-2.puml @@ -0,0 +1,55 @@ +@startuml +mainframe "FRQ-2 Заказ.БизнесПроверки." + +queue Название_топика_2 +database ClickHouse +participant OMS +participant DRUZ +participant PDM + + +autonumber 1 +OMS -> PDM: Запрашивает\nGUID производителя товара +OMS -> OMS: Проверка на возможность\nпродажи товара + +alt валидация пройдена +autonumber 2.1 +OMS -> OMS: Продолжение сценария +else валидация не пройдена +OMS -> ClickHouse: Логирование не\nпройденных проверок +OMS -> Название_топика_2: Сущность "Заказ"\nс набором атрибутов +end +autonumber 3 + +OMS -> DRUZ: Запрашивает \nпризнак "Наличие" +OMS -> OMS: Проверка что товары\nиз заказа в наличии +alt валидация пройдена +autonumber 4.1 +OMS -> OMS: Продолжение сценария +else валидация не пройдена +OMS -> ClickHouse: Логирование не\nпройденных проверок +OMS -> Название_топика_2: Сущность "Заказ"\nс набором атрибутов +end +autonumber 5 +OMS -> PDM: Запрашивает ВГХ товара +OMS -> OMS: Расчитывает объем и\nобщий вес заказа +OMS -> OMS: Проверка на лимиты\nВГХ ТТ +alt валидация пройдена +autonumber 7.1 +OMS -> OMS: Продолжение сценария +else валидация не пройдена +OMS -> ClickHouse: Логирование не\nпройденных проверок +OMS -> Название_топика_2: Сущность "Заказ"\nс набором атрибутов +end +autonumber 8 +OMS -> OMS: Проверка способа\nоплаты на ТТ +alt валидация пройдена +autonumber 8.1 +OMS -> OMS: Продолжение сценария +else валидация не пройдена +OMS -> ClickHouse: Логирование не\nпройденных проверок +OMS -> Название_топика_2: Сущность "Заказ"\nс набором атрибутов +end + + +@enduml \ No newline at end of file diff --git a/oms/autoorder/change-ao.puml b/oms/autoorder/change-ao.puml new file mode 100644 index 0000000..cdd3abc --- /dev/null +++ b/oms/autoorder/change-ao.puml @@ -0,0 +1,39 @@ +@startuml +scale 1500x1500 +mainframe Автооформление заказов +actor user as user +participant SITE +queue kafka +participant Gateway +participant workflow +participant wtis + +user -> SITE: Оформляет заказ +SITE -> SITE: Сохраняет заказ в БД +SITE --> kafka: Пишет заказ в kafka +Gateway --> kafka: Забирает заказ + +Gateway -> workflow: CreateB2CAO +workflow -> workflow: Проверяет условия АО +workflow -> workflow: Проверяет тип доставки +alt Тип доставки "Курьером" +workflow -> workflow: Устанавливает таймер на N минут + alt Поступила оплата в заказ до истечения срока таймера + workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа + else Не поступила оплата в заказ до истечения срока таймера + workflow -> wtis: Заказ передается во WTIS\nМеняется мастер система + end +else Тип доставки "Самовывоз" +workflow -> workflow: Проверяет наличие\nкрупногабаритных товаров\nв заказе + alt Крупногабаритных товаров в заказе нет + workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа + else Крупногабаритные товары в заказе есть + workflow -> workflow: Устанавливает таймер на N минут + alt Поступила оплата в заказ до истечения срока таймера + workflow -> workflow: Заканчивает автооформление\nУстанавливает дату доставки\nзаказа + else Не поступила оплата в заказ до истечения срока таймера + workflow -> wtis: Заказ передается во WTIS\nМеняется мастер система + end + end +end +@enduml \ No newline at end of file diff --git a/oms/free-rest-and-reserve-journal/free-rest.puml b/oms/free-rest-and-reserve-journal/free-rest.puml new file mode 100644 index 0000000..144d38f --- /dev/null +++ b/oms/free-rest-and-reserve-journal/free-rest.puml @@ -0,0 +1,30 @@ +@startuml +scale 1200*1200 +mainframe Получение свободных остатков +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +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 -> 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: Сращивает ответы\nмежду собой +OMS -> OMS: Формирует два массива:\n1. По лог.цепям\n2. Прочие склады + +return answer API GET +ARM --> user: Рендерит данные в модальном окне +@enduml \ No newline at end of file diff --git a/oms/free-rest-and-reserve-journal/reserve-rest.puml b/oms/free-rest-and-reserve-journal/reserve-rest.puml new file mode 100644 index 0000000..d104df6 --- /dev/null +++ b/oms/free-rest-and-reserve-journal/reserve-rest.puml @@ -0,0 +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: Рендерит данные в модальном окне +@enduml \ No newline at end of file diff --git a/oms/interface-arm/contragent/add-contact.puml b/oms/interface-arm/contragent/add-contact.puml new file mode 100644 index 0000000..116be94 --- /dev/null +++ b/oms/interface-arm/contragent/add-contact.puml @@ -0,0 +1,15 @@ +@startuml +scale 800*800 +mainframe Добавление контакта к КА в заказе +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +autonumber + +user -> ARM: Добавляет контакт КА в кратком блоке КА +activate ARM +ARM -> OMS: API POST /orders/{orderId}/contacts/add +activate OMS +return API POST answer +return ок +@enduml \ No newline at end of file diff --git a/oms/interface-arm/contragent/add-contragent-to-order.puml b/oms/interface-arm/contragent/add-contragent-to-order.puml new file mode 100644 index 0000000..e0d20bf --- /dev/null +++ b/oms/interface-arm/contragent/add-contragent-to-order.puml @@ -0,0 +1,15 @@ +@startuml +scale 800*800 +mainframe Добавление КА к заказу +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +autonumber + +user -> ARM: Добавляет КА в заказ +activate ARM +ARM -> OMS: API POST /orders/{orderId}/contractors/add +activate OMS +return API POST answer +return ок +@enduml \ No newline at end of file diff --git a/oms/interface-arm/contragent/change-contractor.puml b/oms/interface-arm/contragent/change-contractor.puml new file mode 100644 index 0000000..d3407b3 --- /dev/null +++ b/oms/interface-arm/contragent/change-contractor.puml @@ -0,0 +1,30 @@ +@startuml +scale 800*800 +mainframe Обновление данных в модели КА +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +participant MSKB as MSKB +autonumber + +user -> ARM: Нажимает кнопку "Сохранить" +ARM -> OMS: API PUT /contractors/{contractorID} +activate OMS +OMS -> OMS: Разделяет модель КА\nна основные поля\n+ контакты +alt Если изменена только основная модель +OMS -> MSKB: API POST api/business/v2/physic/update +activate MSKB +return answer API POST +else Если добавлены контакты +OMS -> MSKB: API POST api/business/v2/contact/create +activate MSKB +return answer API POST +else Если удалены контакты +OMS -> MSKB: Удаление контакта КА:\n API DELETE api/business/v2/contact/delete +activate MSKB +return answer API DELETE +end + +return answer API PUT +ARM --> user: Показывает сообщение и\nзакрывает модалку +@enduml \ No newline at end of file diff --git a/oms/interface-arm/contragent/create-contractor.puml b/oms/interface-arm/contragent/create-contractor.puml new file mode 100644 index 0000000..ffdf0fc --- /dev/null +++ b/oms/interface-arm/contragent/create-contractor.puml @@ -0,0 +1,19 @@ +@startuml +scale 800*800 +mainframe Логика "Создание КА" +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +participant MSKB as MSKB +autonumber + +user -> ARM: Нажимает кнопку "Создать контрагента" +ARM -> OMS: API POST /contractors/create +activate OMS +OMS -> MSKB: API POST api/business/v2/physic/create +activate MSKB +return answer API POST + +return answer API POST +ARM --> user: Показывает сообщение и\nзакрывает модалку +@enduml \ No newline at end of file diff --git a/oms/interface-arm/contragent/get-contractor-info.puml b/oms/interface-arm/contragent/get-contractor-info.puml new file mode 100644 index 0000000..f133d26 --- /dev/null +++ b/oms/interface-arm/contragent/get-contractor-info.puml @@ -0,0 +1,19 @@ +@startuml +scale 800*800 +mainframe Получение данных для полной карточки КА +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +participant MSKB as MSKB +autonumber + +user -> ARM: Открывает карточку контрагента +ARM -> OMS: API GET /contractors/{contractorID} +activate OMS +OMS -> MSKB: GraphQL contractorPhysic +activate MSKB +return answer API GET + +return answer get_short_info_contact +ARM --> user: Рендерит карточку контрагента +@enduml \ No newline at end of file diff --git a/oms/interface-arm/contragent/get-contragent-info.puml b/oms/interface-arm/contragent/get-contragent-info.puml new file mode 100644 index 0000000..af39360 --- /dev/null +++ b/oms/interface-arm/contragent/get-contragent-info.puml @@ -0,0 +1,21 @@ +@startuml +scale 800*800 +mainframe Логика подблока "Информация о контрагенте" +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +participant WTIS as WTIS +autonumber + +user -> ARM: Нажимает кнопку раскрытия блока +activate ARM +ARM -> OMS: API GET\n/contractors/{contractorID}/orderInfo +activate OMS +OMS -> WTIS: API GET\napi/order/oms_export/contragent_info_oms/{guid} +activate WTIS +WTIS -> WTIS: prepare data +return API GET answer +return API GET answer + +return Рендерит блок +@enduml \ No newline at end of file diff --git a/oms/interface-arm/contragent/search-contractor.puml b/oms/interface-arm/contragent/search-contractor.puml new file mode 100644 index 0000000..6c83118 --- /dev/null +++ b/oms/interface-arm/contragent/search-contractor.puml @@ -0,0 +1,38 @@ +@startuml +scale 800*800 +mainframe Логика блока "Поиск КА" +actor Пользователь as user +participant ARM as ARM +participant OMS as OMS +participant MSKB as MSKB +autonumber + +user -> ARM: Нажимает кнопку "Поиск КА" + +return рендерит шаблон модального окна + +alt Если ищем только по номеру телефона +user -> ARM: Заполняет номер телефона полностью +else Если ищем только по email +user -> ARM: Заполняет email полностью +else Если ищем по номеру телефона И email +user -> ARM: Заполняет номер телефона И email полностью +end +ARM -> ARM: валидирует поля +alt Валидация не успешна +ARM -> user: Информирует пользователя об ошибках + +else Валидация успешно пройдена +ARM -> OMS: /contractors/search +activate OMS +end + +OMS -> MSKB: API POST /api/business/v2/physic/search +activate MSKB +MSKB -> MSKB: prepare_data +return answer API POST + +return success + +ARM -> user: Отображает результаты поиска +@enduml \ No newline at end of file diff --git a/oms/interface-arm/docs/get realizations MVP.puml b/oms/interface-arm/docs/get realizations MVP.puml new file mode 100644 index 0000000..bc29f55 --- /dev/null +++ b/oms/interface-arm/docs/get realizations MVP.puml @@ -0,0 +1,20 @@ +@startuml +scale 1000*1000 +mainframe Получение данных (Реализации, оплаты) от WTIS MVP +participant WTIS as WTIS +queue kafka +participant workflow as workflow +collections Redis as redis +autonumber +hnote over WTIS: После MVP WTIS изменится\nна сервис баланса + +loop Всегда +WTIS -> kafka: Пишет все инфо\nо документах по заказу +workflow -> kafka: Получает документы\nк заказу из очереди +alt данных нет в кэше по ключу +workflow -> redis: Сохраняет в кэш\nКраткую форму на 7 дней\nПолную форму на 3 дня +else данные есть в кэше по ключу +workflow -> redis: Удаляет запись по ключу +workflow -> redis: Сохраняет в кэш\nКраткую форму на 7 дней\nПолную форму на 3 дня +end +@enduml \ No newline at end of file diff --git a/oms/interface-arm/docs/payment-with-kafka.puml b/oms/interface-arm/docs/payment-with-kafka.puml new file mode 100644 index 0000000..391bf70 --- /dev/null +++ b/oms/interface-arm/docs/payment-with-kafka.puml @@ -0,0 +1,19 @@ +@startuml +scale 1000*1000 +mainframe Получение данных безналичная оплата / оплата по счету из kafka +participant paykeeper +participant 1C +queue kafka +participant workflow as workflow +collections PaymentsDb as PaymentsDb +autonumber + +loop Всегда +paykeeper -> kafka: Пишет все инфо\nо документах по заказу +1C -> kafka: Пишет все инфо\nо документах по заказу +workflow -> kafka: Получает документы\nк заказу из очереди +workflow -> workflow: Преобразовывает данные +workflow -> PaymentsDb: Записывает в коллекцию +end + +@enduml \ No newline at end of file diff --git a/oms/interface-arm/docs/payment.puml b/oms/interface-arm/docs/payment.puml new file mode 100644 index 0000000..3d94983 --- /dev/null +++ b/oms/interface-arm/docs/payment.puml @@ -0,0 +1,46 @@ +@startuml +scale 1000*1000 +mainframe Получение данных для отрисовки таблицы оплат MVP +participant WTIS as WTIS +collections Redis as redis +participant payments as payments +participant workflow as workflow +participant gateway as gateway +participant ARM as ARM +actor user as user +autonumber +hnote over WTIS: После MVP WTIS изменится\nна сервис баланса + +autonumber 1 +user -> ARM: Открывает заказ +ARM -> gateway: Запрашивает\nдокументы к заказу +activate gateway +== Получение данных о наличной оплате == +gateway -> redis: Проверяет наличие\nданных в кэше +alt данные есть в кэше +redis --> gateway: Возвращает\nдокументы\n к заказу +else данных нет в кэше +redis --> gateway: Возвращает\nпустой ответ +gateway -> workflow: Триггерит на\nобновление данных +activate workflow +workflow -> WTIS: API GET order_doc_info() +activate WTIS +WTIS --> workflow: answer +deactivate WTIS +workflow -> redis: Сохраняет в кэш\nКраткую форму на 7 дней\nПолную форму на 3 дня (спорно) +redis --> workflow: Сообщение об успешном сохранении +workflow --> gateway: Возвращает\nдокументы\n к заказу +end +== Получение данных о других типах оплаты == +workflow -> payments: Запрашивает данные\nоб онлайн оплате И\nпо счету +activate payments +payments --> workflow: answer +deactivate payments +workflow -> workflow: Агрегирует данные\nс источников +workflow --> gateway: answer +deactivate workflow +gateway --> ARM: возвращает\nданные об оплатах +deactivate gateway +ARM --> user: Рендерит блок\nдокументов + +@enduml \ No newline at end of file diff --git a/oms/interface-arm/docs/realizations-or-payment.puml b/oms/interface-arm/docs/realizations-or-payment.puml new file mode 100644 index 0000000..d657b4a --- /dev/null +++ b/oms/interface-arm/docs/realizations-or-payment.puml @@ -0,0 +1,36 @@ +@startuml +scale 1000*1000 +mainframe Получение данных для отрисовки модалки Реализации или оплаты наличными +participant WTIS as WTIS +collections Redis as redis +participant workflow as workflow +participant gateway as gateway +participant ARM as ARM +actor user as user + +autonumber +hnote over WTIS: После MVP WTIS изменится\nна сервис баланса + +user -> ARM: Открывает заказ +ARM -> gateway: Запрашивает\nдокументы к заказу +activate gateway +gateway -> redis: Проверяет наличие\nданных в кэше +alt данные есть в кэше +redis --> gateway: Возвращает\nдокументы\n к заказу +else данных нет в кэше +redis --> gateway: Возвращает\nпустой ответ +gateway -> workflow: Триггерит на\nобновление данных +activate workflow +workflow -> WTIS: API GET order_doc_info() +activate WTIS +return answer +deactivate WTIS +workflow -> redis: Сохраняет в кэш\nКраткую форму на 7 дней\nПолную форму на 3 дня (спорно) +redis --> workflow: Сообщение об успешном сохранении +workflow --> gateway: Возвращает\nдокументы\n к заказу +deactivate workflow +end +gateway --> ARM: данные по документу +ARM -> user: рендерит модальное\nокно с инфо\nо документе + +@enduml \ No newline at end of file diff --git a/oms/interface-arm/docs/realizations.puml b/oms/interface-arm/docs/realizations.puml new file mode 100644 index 0000000..f95ea46 --- /dev/null +++ b/oms/interface-arm/docs/realizations.puml @@ -0,0 +1,38 @@ +@startuml +scale 1000*1000 +mainframe Получение данных для отрисовки таблицы реализаций MVP +participant WTIS as WTIS +collections Redis as redis +participant workflow as workflow +participant gateway as gateway +participant ARM as ARM +actor user as user +autonumber +hnote over WTIS: После MVP WTIS изменится\nна сервис баланса + +autonumber 1 +user -> ARM: Открывает заказ +ARM -> gateway: Запрашивает\nдокументы к заказу +activate gateway +gateway -> redis: Проверяет наличие\nданных в кэше +alt данные есть в кэше +redis --> gateway: Возвращает\nдокументы\n к заказу +else данных нет в кэше +redis --> gateway: Возвращает\nпустой ответ +gateway -> workflow: Триггерит на\nобновление данных +activate workflow +workflow -> WTIS: API GET order_doc_info() +activate WTIS +return answer +deactivate WTIS +workflow -> redis: Сохраняет в кэш\nКраткую форму на 7 дней\nПолную форму на 3 дня (спорно) +redis --> workflow: Сообщение об успешном сохранении +workflow --> gateway: Возвращает\nдокументы\n к заказу +deactivate workflow +end + +gateway --> ARM: возвращает\nданные о заказе +deactivate gateway +ARM --> user: Рендерит блок\nдокументов + +@enduml \ No newline at end of file diff --git a/oms/interface-arm/order/get-region.puml b/oms/interface-arm/order/get-region.puml new file mode 100644 index 0000000..577662f --- /dev/null +++ b/oms/interface-arm/order/get-region.puml @@ -0,0 +1,41 @@ + @startuml +scale 800*800 +mainframe Получение списка регионов от Officer +actor Пользователь as user +participant ARM as ARM +participant gateway as gateway +collections redis as redis +participant workflow as workflow +participant officer as officer +autonumber + +user -> ARM: Открывает форму\nзаказа +activate ARM +ARM -> gateway: REST API GET\n инфо о регионах +activate gateway +gateway -> redis: Запрашивает\nсписок\nрегионов + +opt Данные о регионах есть в кэше +redis --> gateway: answer +else Данные необходимо обновить в кэше +gateway -> workflow: триггерит обновление +activate workflow +workflow -> officer: GraphQL method\noffices +activate officer +officer --> workflow: GraphQL answer +workflow -> officer: GraphQL method\nlocalities +officer --> workflow: GraphQL answer +deactivate officer +workflow -> workflow: Обработка\nданных +workflow -> redis: Записывает регионы\nи параметры в экш +workflow --> gateway: answer +deactivate workflow +end + +gateway --> ARM: REST API GET\nanswer +deactivate gateway +ARM --> user: Рендерит данные +deactivate ARM +@enduml + + \ No newline at end of file diff --git a/oms/personal-cabinet/change note.puml b/oms/personal-cabinet/change note.puml new file mode 100644 index 0000000..23fb7d4 --- /dev/null +++ b/oms/personal-cabinet/change note.puml @@ -0,0 +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 +@enduml \ No newline at end of file diff --git a/oms/personal-cabinet/favorites.puml b/oms/personal-cabinet/favorites.puml new file mode 100644 index 0000000..c023c14 --- /dev/null +++ b/oms/personal-cabinet/favorites.puml @@ -0,0 +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 +@enduml \ No newline at end of file diff --git a/oms/personal-cabinet/get-info-order.puml b/oms/personal-cabinet/get-info-order.puml new file mode 100644 index 0000000..912326f --- /dev/null +++ b/oms/personal-cabinet/get-info-order.puml @@ -0,0 +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: Рендерит информационные блоки +@enduml \ No newline at end of file diff --git a/oms/personal-cabinet/get-note.puml b/oms/personal-cabinet/get-note.puml new file mode 100644 index 0000000..a2ac929 --- /dev/null +++ b/oms/personal-cabinet/get-note.puml @@ -0,0 +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: Рендерит текст в блоке заметок +@enduml \ No newline at end of file diff --git a/oms/process/action.puml b/oms/process/action.puml new file mode 100644 index 0000000..34a5299 --- /dev/null +++ b/oms/process/action.puml @@ -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 \ No newline at end of file diff --git a/oms/process/basket-import.puml b/oms/process/basket-import.puml new file mode 100644 index 0000000..c6746e7 --- /dev/null +++ b/oms/process/basket-import.puml @@ -0,0 +1,26 @@ +@startuml +scale 800x800 +actor user as user +participant ARM +participant Gateway +participant SITE + +autonumber +user -> ARM: Вводит номер корзины +ARM -> Gateway: Запрос на info/cart +Gateway -> SITE: Запрос на api/v1/json/user-cart/ +SITE --> Gateway: answer +Gateway -> Gateway: Получает название региона из кэша +Gateway -> Gateway: Запрашивает цены из SCROOGE +Gateway -> Gateway: Запрашивает инфо о товаре из PDM +Gateway -> Gateway: Собирает ответ для frontend +Gateway --> ARM: answer +ARM -> ARM: Проверяет регионы\nв запросе и в заказе + +alt Регион корзины == регион заказа +ARM --> user: answer +else Регион корзины <> регион заказа +ARM -> user: Запрашивает\nподтверждение\nо смене региона +end + +@enduml \ No newline at end of file diff --git a/oms/process/booking.puml b/oms/process/booking.puml new file mode 100644 index 0000000..b27f44b --- /dev/null +++ b/oms/process/booking.puml @@ -0,0 +1,77 @@ +@startuml +scale 2000x2000 +mainframe Внесение изменения в заказ в статусе "В работе" +Actor USER +participant ARM +participant Gateway +participant Workflow +participant History +participant WTIS + +'-------------------------------------------action------------------- +autonumber + +USER -> ARM: Открывает заказ +USER -> ARM: Нажимает кнопку\n"Редактировать заказ" +ARM -> Gateway: Запрос с номером заказа +Gateway -> Workflow: Инициирует запуск workflow +Workflow -> History: Открывает транзакцию\nrpc StartTransaction(StartTransactionRequest) +History --> Workflow: Подтверждает открытие транзакции\nreturn StartTransactionResponse +Workflow --> Gateway: Возвращает поля доступные\nдля редактирования +Gateway --> ARM: Возвращает ответ что транзакция открыта +ARM --> USER: Разблокирует все элементы в\nинтерфейсе для редактирования + +loop Внесение корректировок пользователем и наполнение транзакции +USER -> ARM: Вносит корректировки +ARM -> Gateway: Использует стандартные\nendpoint заказа +Gateway -> Workflow: Передает запрос в workflow +Workflow -> Workflow: Проверяет что транзакция открыта:\nВ ТЗ: Проверка наличия открытой транзакции +autonumber 14.1.1 +alt Транзакция закрыта +Workflow -> Gateway: Возвращает ошибку +Gateway -> ARM: answer +ARM -> USER: Выводит сообщение:\n"Транзакция была закрыта,\nнеобходимо заново открыть\nзаказ на корректировку" + +autonumber 14.2.1 +else Транзакция открыта +Workflow -> History: Отправляет GRPC сигнал\nс корректировками в History\nrpc CreateEvent(CreateEventRequest) +History -> History: Сохраняет\nкорректировки +History --> Workflow: return CreateEventResponse +Workflow --> Gateway: answer +Gateway --> ARM: answer +end 'Это end alt +autonumber 15 + +end 'Это end loop + +USER -> ARM: Нажимает кнопку\n"Сохранить изменения"\nИЛИ "Отменить изменения" +ARM -> Gateway: Отправляет запрос на\n/orders/end-correction/orderID={orderGUID} +Gateway -> Workflow: Вызывает wf +Workflow -> History: Запрашивает актуальное\nсостояние заказа\nrpc GetLastState(GetLastStateRequest) +History --> Workflow: Возвращает Модель заказа\nс примененными корректировками\nreturn GetLastStateResponse +Workflow -> Workflow: Закрывает транзакцию,\nсохраняет актуальный\nзаказ в Order/shipment +Workflow -> WTIS: Отправляет модель заказа через топик kafka:\nВ ТЗ: Функциональные изменения - "На стороне Gateway" - п.2 +WTIS -> WTIS: Обновляет сущность заказа + +autonumber 22.1.1 +alt Изменения успешно проведены +WTIS --> Workflow: Возвращает ответ success +Workflow -> History: Отправляет GRPC сигнал о закрытии\nтранзакции\nrpc EndTransaction(EndTransactionRequest) +History --> Workflow: Подтверждает закрытие\nтранзакции\nreturn EndTransactionResponse +Workflow --> Gateway: answer +Gateway --> ARM: answer +ARM --> USER: Отображает модальное\nокно "Изменения\nуспешно сохранены" + +autonumber 22.2.1 +else Изменения не проведены +WTIS --> Workflow: Возвращает ответ failed +Workflow -> History: Отправляет GRPC сигнал\nоб удалении транзакции +History --> Workflow: Отправляет GRPC сигнал\nчто транзакция удалена +Workflow -> Workflow: Откатывает изменения,\nудаляет корректировки +Workflow --> Gateway: answer +Gateway --> ARM: answer +ARM --> USER: Отображает модальное\nокно "Не удалось\nприменить изменения" +end + + +@enduml \ No newline at end of file diff --git a/oms/process/correction.puml b/oms/process/correction.puml new file mode 100644 index 0000000..a6c83eb --- /dev/null +++ b/oms/process/correction.puml @@ -0,0 +1,79 @@ +@startuml +scale 2000x2000 +mainframe Внесение изменения в заказ в статусе "В работе" +Actor USER +participant ARM +participant Gateway +participant Workflow +participant History +participant WTIS + +'-------------------------------------------action------------------- +autonumber + +USER -> ARM: Открывает заказ +USER -> ARM: Нажимает кнопку\n"Редактировать заказ" +ARM -> Gateway: Запрос с номером заказа +Gateway -> Workflow: Инициирует запуск workflow +Workflow -> History: Открывает транзакцию\nrpc StartTransaction(StartTransactionRequest) +History --> Workflow: Подтверждает открытие транзакции\nreturn StartTransactionResponse +Workflow -> Workflow: Запускает workflow с бизнес-логикой:\nВ ТЗ: Функциональные изменения\n-На стороне Workflow\n-"Получение доступных типов корректировок" +Workflow -> WTIS: Запрашивает признак доступности корректировки для атрибутов +WTIS -> Workflow: Возвращает доступные для редактирования атрибуты +Workflow --> Gateway: Возвращает поля доступные\nдля редактирования +Gateway --> ARM: Возвращает атрибуты\nдоступные для редактирования +ARM --> USER: Дизейблит недоступные для\nредактирования элементы\nВ ТЗ: Функциональные изменения\n"На стороне ARM" + +loop Внесение корректировок пользоваелем и наполнение транзакции +USER -> ARM: Вносит корректировки +ARM -> Gateway: Использует стандартные\nendpoint заказа +Gateway -> Workflow: Передает запрос в workflow +Workflow -> Workflow: Проверяет что транзакция открыта:\nВ ТЗ: Проверка наличия открытой транзакции +autonumber 14.1.1 +alt Транзакция закрыта +Workflow -> Gateway: Возвращает ошибку +Gateway -> ARM: answer +ARM -> USER: Выводит сообщение:\n"Транзакция была закрыта,\nнеобходимо заново открыть\nзаказ на корректировку" + +autonumber 14.2.1 +else Транзакция открыта +Workflow -> History: Отправляет GRPC сигнал\nс корректировками в History\nrpc CreateEvent(CreateEventRequest) +History -> History: Сохраняет\nкорректировки +History --> Workflow: return CreateEventResponse +Workflow --> Gateway: answer +Gateway --> ARM: answer +end 'Это end alt +autonumber 15 + +end 'Это end loop + +USER -> ARM: Нажимает кнопку\n"Сохранить изменения"\nИЛИ "Отменить изменения" +ARM -> Gateway: Отправляет запрос на\n/orders/end-correction/orderID={orderGUID} +Gateway -> Workflow: Вызывает wf +Workflow -> History: Запрашивает актуальное\nсостояние заказа\nrpc GetLastState(GetLastStateRequest) +History --> Workflow: Возвращает Модель заказа\nс примененнеными корректировками\nreturn GetLastStateResponse +Workflow -> Workflow: Закрывает транзакцию,\nсохраняет актуальный\nзаказ в Order/shipment +Workflow -> WTIS: Отправляет модель заказа через топик kafka: oms.order.sync\nВ ТЗ: Функциональные изменения - "На стороне Gateway" - п.2 +WTIS -> WTIS: Пытается применить\nвсе изменения в заказе + +autonumber 22.1.1 +alt Изменения успешно проведены +WTIS --> Workflow: Возвращает сигнал в temporal success +Workflow -> History: Отправляет GRPC сигнал о закрытии\nтранзакции\nrpc EndTransaction(EndTransactionRequest) +History --> Workflow: Подтверждает закрытие\nтранзакции\nreturn EndTransactionResponse +Workflow --> Gateway: answer +Gateway --> ARM: answer +ARM --> USER: Отображает модальное\nокно "Изменения\nуспешно сохранены" + +autonumber 22.2.1 +else Изменения не проведены +WTIS --> Workflow: Возвращает сигнал в temporal failed +Workflow -> History: Отправляет GRPC сигнал\nоб удалении транзакции +History --> Workflow: Отправляет GRPC сигнал\nчто транзакция удалена +Workflow -> Workflow: Откатывает изменения,\nудаляет корректировки +Workflow --> Gateway: answer +Gateway --> ARM: answer +ARM --> USER: Отображает модальное\nокно "Не удалось\nприменить изменения" +end + +@enduml \ No newline at end of file diff --git a/oms/site-integration/AS IS.puml b/oms/site-integration/AS IS.puml new file mode 100644 index 0000000..7d7ae20 --- /dev/null +++ b/oms/site-integration/AS IS.puml @@ -0,0 +1,59 @@ +@startuml +scale 1300x1300 +mainframe AS IS обмен по созданию заказа на сайте +Actor USER +participant SITE +database SITE_database +queue kafka_1 +participant WTIS +database WTIS_database +queue kafka_2 +participant OMS +database OMS_database +'-------------------------------------------action------------------- +autonumber + +USER -> SITE: Нажимает кнопку оформить заказ +SITE -> SITE_database: Проводит внутренние проверки\nи сохраняет в БД +SITE_database -> SITE: Заказ успешно сохранен + +autonumber 4.1 +alt Тип доставки в заказе: Самовывоз +SITE -> kafka_1: Записывает заказ в топик kafka: site.order.pickup.created +else Тип доставки в заказе: Курьером +SITE -> kafka_1: Записывает заказ в топик kafka: site.order.courier.created +else Тип доставки в заказе: ТК +SITE -> kafka_1: Записывает заказ в топик kafka: site.order.transport_company.created +end + +autonumber 5 +WTIS -> kafka_1: Читает сообщения из топика +WTIS -> WTIS_database: Сохраняет заказ +WTIS_database -> WTIS: Заказ успешно сохранен +WTIS -> WTIS: Проверяет условия для MVP\nсогласно настроек в wtis_settings + +autonumber 9.1 +alt Заказ подходит под условия OMS +WTIS -> kafka_2: Записывает заказ в топик: wtis.order_oms.created +else Заказ не подходит под условия OMS +WTIS -> WTIS: Продолжает процедуру автооформления\nзаказа и обогащения данными +WTIS -> WTIS: Конец процесса +end + +autonumber 10 +OMS -> kafka_2: Читает событие из топика +OMS -> OMS_database: Сохраняет заказ в БД +OMS_database -> OMS: Заказ успешно сохранен + +OMS -> OMS: Проводит бизнес проверки +OMS -> WTIS: Резервирует товары + +autonumber 15.1 +alt Успешно зарезервировано +WTIS -> OMS: Товары в заказе успешно зарезервированы +else Не успешно зарезервировано +WTIS -> WTIS: Ставит задачу на менеджера, меняет мастер-систему +WTIS -> WTIS: Конец процесса +end + +@enduml \ No newline at end of file diff --git a/oms/site-integration/TO BE.puml b/oms/site-integration/TO BE.puml new file mode 100644 index 0000000..416e12a --- /dev/null +++ b/oms/site-integration/TO BE.puml @@ -0,0 +1,66 @@ +@startuml +scale 1300x1300 +mainframe TO BE обмен по созданию заказа на сайте +Actor USER +participant SITE +database SITE_database +participant WTIS +database WTIS_database +queue kafka_1 +queue kafka_2 +participant OMS +database OMS_database +'-------------------------------------------action------------------- +autonumber + +USER -> SITE: Нажимает кнопку оформить заказ +SITE -> SITE_database: Проводит внутренние проверки\nи сохраняет в БД +SITE_database -> SITE: Заказ успешно сохранен + +autonumber 4.1 +alt Тип доставки в заказе: Самовывоз +SITE -> kafka_1: Записывает заказ в топик kafka: site.order.pickup.created +else Тип доставки в заказе: Курьером +SITE -> kafka_1: Записывает заказ в топик kafka: site.order.courier.created +else Тип доставки в заказе: ТК +SITE -> kafka_1: Записывает заказ в топик kafka: site.order.transport_company.created +end + +autonumber 5 +OMS -> kafka_1: Читает сообщения из топиков +OMS -> OMS: Проверяет условия для MVP +WTIS -> kafka_1: Читает сообщения из топиков +WTIS -> WTIS: Проверяет условия для MVP + +autonumber 9.1 +alt Подходит под условия OMS +WTIS -> WTIS: Не обрабатывает такой заказ +OMS -> OMS_database: Сохраняет заказ +OMS -> kafka_2: Записывает заказ в топик: oms.orders.sync +OMS_database -> OMS: Заказ успешно сохранен +WTIS -> kafka_2: Читает топик +WTIS -> WTIS: Создает заказ +WTIS -> OMS: Возвращает модель заказа через workflow +OMS -> OMS: Проводит автооформление +OMS -> WTIS: Резервирует товары + +autonumber 9.9.1 +alt Успешно зарезервировано +WTIS -> OMS: Товары в заказе успешно зарезервированы +WTIS -> WTIS: Конец процесса + +else Не успешно зарезервировано +WTIS -> WTIS: Ставит задачу на менеджера, меняет мастер-систему +WTIS -> WTIS: Конец процесса +end + + +else Не подходит под условия OMS +autonumber 10.1 +OMS -> OMS: Не обрабатывает такой заказ +WTIS -> WTIS_database: Сохраняет заказ +WTIS_database -> WTIS: Заказ успешно сохранен +WTIS -> WTIS: Конец процесса +end + +@enduml \ No newline at end of file diff --git a/ordering.puml b/ordering.puml new file mode 100644 index 0000000..f1dfb28 --- /dev/null +++ b/ordering.puml @@ -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 \ No newline at end of file diff --git a/personal-cabinet.puml b/personal-cabinet.puml new file mode 100644 index 0000000..502337a --- /dev/null +++ b/personal-cabinet.puml @@ -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 \ No newline at end of file diff --git a/search/Architecture Scheme Search.drawio.xml b/search/Architecture Scheme Search.drawio.xml new file mode 100644 index 0000000..8a36ea8 --- /dev/null +++ b/search/Architecture Scheme Search.drawio.xml @@ -0,0 +1,2 @@ + +5Vxbd5s4EP41Pqf74BwQmMujL0mattnNWbfb9lEG2aYB5AX51l+/EghbgExITYCezYMjBgFi5vtGMxrZA20aHO4juFk/Yhf5A6C4h4E2GwCgqdaI/mOSYypRNVNNJavIc7nsLJh7PxEXKly69VwU5zoSjH3ibfJCB4chckhOBqMI7/PdltjPP3UDV6gkmDvQL0u/ei5Zp1ILmGf5e+St1tmTVcNOzwQw68zfJF5DF+8FkXY70KYRxiRtBYcp8pn2Mr2k191dOHsaWIRCUucCHCy/P0ynD9++/PAxcsPDhz0Zanxs5Ji9MHLp+/NDHJE1XuEQ+rdn6STC29BF7K4KPTr3+YTxhgpVKvyBCDlyY8ItwVS0JoHPz5ZHzl8mxtvIQRXDBRwBMFohUtFPT/uxdxEewPVyj3CASHSkHSLkQ+Lt8raGHDKrU7/TpU/Yo0MGCse3Cji8Obpty87fIh0ov+psm3EUwaPQbcM6xJefA+z8c0wOsru6/fVcf9pIR5AdCTo5ixL4yKG0N5fEfnTD+52ysu+nj2isu0P+yB30t1yfXzYuJGgA6P2UGfIRa0vQ9gkuqNfIIQT63iqkbYciBEVUsEMR8Sgrx/xE4LluCkYUez/hIrkfgyNXJb35aDIYzaRoq2IC9yP8jmf2sgGgQyWY+FnlRtcMkNM/B9aVaLNl98wux8tljEjByo3YFfz2LkL6Wlo7LkLTlZzZLLsdF2Epr3MRVhsuQi+5iDl1Cw7ph1uoQn8jbsGyzOscQaNkr2KPYKGvkMQ4LFnozHBmmP3aI2i+gQkz9zQUrMnm+uobalqeSOaIE2l/DstGGdnWQkhmKJf1m1Pfa9FsdOEYqQaj4zd2/c0oO/zOb5cczA65oyM/cmG8PpmLHTxBQjkUJhKgMGlMIvx8inLBVV5Y78oL17Vo1agF9D/CmHmaoqFpLL9hTRrf0A44Qq1wQLMKFFDLFDDeiAGKubO/P2l/B3/9+fAw+Qj+2a10ib46pgTIcUJ9gRO/Dm+jDO8qd9oTeBtlc1E92FP2ObGSz/GAao3CjLVvk7aatEeCHGT907P0k2pSefceBjTE/8YSdxbwz9cOJLzp0Cx3xROBv5ZLz0HRHz2YUdQ8nWylTCd11CaftF7w6ddpYTUNd3nsOjQKMbVaL6ZuKkiySmZ6mj12j2cV1MAzaBPPZi/wjA4eESImenQKmGj7PDewg1dNDfqH5ZO1+KzcW7v7x2cXjvcaHmbvKM4NUuUY7ZCFBso5VKhKkS3pKzXBFmmIp/YCBL/u1FSJQfs12UtxqPaDfFKdNGcI+auPuoyysmEKin+gOjxI0oj2pwjVvrGFP9PM+QZDb3HGkCuvnFLc+jTF8pw5gpGzZoGmx7RZjh+7yclAYVliBMoqtNrU4IlOrdI8pqQkY1ZvowKHWiz2nEx85/kNeOFRXS/cuBu+EISO9Coq6ZRpivAH8vd/4whVLRdjJtB5RqE791gVRnm3WW/oPyHDEzO/NBe8SyQgzfB6kK8V41tgteit5LGe3nuuNTPzStY75ArRugx5tHJilixw3GXLGeKyRQr5k5zDPGnbCTNow0w+FYEN+ZURINJlwtucVXr+FJVMBT4p2bqJBD6tFD5KvLtc4xARU0GDy8RVblSgajnuNlMRzTKZ7KZG/gZvVyZRy0tpX+KKdeJt4I8dGpMIlkus/IRjj3iYWXCBCcGBxLQEF3wp3hLfC9H0tOOlMmF9hYMtZIqSSEZr07tq/VgOa9/dypYQepjoZMMUy7lrFPnYee4+WCjG5ZotQfNblQul6z2SyakDNAvFErP5YknVQld/10+qRi2Y6yNcPsPOkV3cciZb5DXbxLUk14jjIUqzdqZGZThg2yHTQqoSYpcmIIZPhzVZUIGxYi3hCpNfwfL4Ov0tWf+CkahuSdGrs2L3FPtsUp6FOGTsWlJ3XhBlkZePlqQq7pIZPk/WBmyvFTKgkVazYqW/1R6I8hQ99+GubIB+FMytFgvm8glbRpV9ssNmGBzjf/0hWygwYMB0ES7izUkPjYL55TSiLpwlaUTJYhfNoyt58xh1E3rtzRL6l+2j/X/tY3Vun07WWy5tuaoXMb02I5CnQuUQ6nLQ0tnyS4k8DWwvEXaPXB94XcWGYnp8LqR2tv6olueTj94Cho1Eqdcpq7hdU1YXaVlZdhfOo0EnICuBVMCiKzeg92XZRpxzXbSE2ySHeNPlnOvspoMu7SbJ4wql1659SrEA1L1PyaBdnPM0YZFfy8oHp086GqXe3kqhPEEnwofPtyUjnBIr7GyDRJEvWWKRmu3TokHTqHbeMvXnRuvNTFOGczduqG13AyTBYkWRuCt3A8rTxF2Ead4Tuv3zNKdv9XbmabIVnN9yO5ccAFZNnIJOp0VQXrd/PNKUZMnqkO+Ycx6/nMMIdeSZ0J4I3UA+TWLtRvZcXEUEkO1wqKiitMsDrU/bSZvJ7ZXfggda2QG9x5tnL4wzHtgitMsRkClk/aZAhVvOHh4TAYFMap4Z4tLBiWQiq1L2jLrnzVAv7Hfonjh6P76s1X48pIO68dCFbSwtpc2SVKJoHxhv0h0fS+/AjCAqtrzRp7Sa7AXJj51MljTM4gZSwVk+84IVHbrvLegn/LmNEHulFQpRBOnw76bQWaObeLdqhiOWkWPIKPtJFbE2o0sIor/aAAMWWWY/s5JuATr/Wo12+x8=5VrbcuI4EP0aqnYfSFmWjeExgcylNqlNFTuT2UdhC+yJbTGyCJCv35YtXwWBLGBnZnhwpHbr1ud0q6W4h8fR5iMnS/+eeTTsmYa36eFJz4SfMYI/UrLNJEMDZ4IFD7xMhErBNHihSmgo6SrwaFJTFIyFIljWhS6LY+qKmoxwztZ1tTkL66MuyYJqgqlLQl36GHjCV6swnVL+iQYLPx8ZDdSCI5Irq5UkPvHYuiLCtz085oyJrBRtxjSUxsvtkrX7sOdtMTFOY3FMA3/2tHgcxkH48vW7EeEfxpf1uK96ScQ2XzD1YP2qyrjw2YLFJLwtpTecrWKPyl4NqJU6d4wtQYhA+J0KsVVgkpVgIPJFFKq32ZhyoL1LyefFVtylr8zfVpQgfEHFK3pOYXBgKmURFXwL7TgNiQie6/MgijKLQq9o+sACmKFpKHpbZtZCcdu2jXoP2bRUoxKaa87JtqK2lArJ/mFMVB8H4wbSh/RRTR8K2QzyWsUkpShlzxuYpIZ8JuFKmfPL0iOC9kzoz5jQkMryDrLdkRnEjBpBSBgsYii7wAfKQfBMuQjAKa/ViyjwvIyLNAleyCztT7JRmRI6t2969qQgmwoPSrN0Stkx3eyl4X6f0bmkejGuLDyo2191fCLZRrv6zJuz+TyhooHyWXDFv0mEQJcJEabt1HCzBi3FCOdtMcJqI0ZYWoyYQlxwxa8RF/ChuDAcOqdFgst7u60h9EhEwmINodLFJTBrPxB0uiSpJ64hE9zlzgds+npY7VsI1wmeQ7Uu0zLbUjK/kpI1Ha5q35r53mqrQReREczFt99k+ys7r/6ruksrk02ttlU1jyR+AZesPBABPhSnEtOQ0kRw9lRkueZ5w7DTVhg+CVJHo/89SWSoaSINyfxSFiHDAQXGaStOYI7qmwmcpjQfGLTpAkPNXh37hFlzCnTAKc7I79GR/La7pPdIhwvsMBrL580wfV73wGpAK1m+TcsoLdsVuZnrZ2/hCZY0/vhEIkjyv8lEQqb8U98lQhVdOOYu1FHg7/k8cCn/s/stBY/qW4rl6O6E7Db9Kb/16NihzugXaA8GJ6bVfWQ10oHhcXn1uRIlhDSkHib33XPaNI7gtNkqp/WbgU42iU0gKnkT1Iq0CcrlBiErF9gf8kUfToAGF3EYNGrcVTX9JVvB5fwFvwsWnDOyWT/Dlo/0M/dnMOFmR07bQawyr0aVn9PIblHnoUs/DncSusr81ukqv0WDn4LtAw2wv8j8iXTPdXt4eFt2WuW2ftadhuRZv6N/H0dd3PVRF+ln3STpr9PbsX60TX6EfQPeD0gkjRHPkmVhiIoxwSCibqvs1mXMQsZBErNY2ncehGFDdPzd5y5w6jHoDPhg1AjW9pHBGl8MIP10qwGEf1+ArM4BKv4R/i4uTFvcO4sPFy6e+5+Gj36kPcP1UOX2p+s9GDU2YXvHntJugpnnk02T49yc8MSpOT9UnjAb47iruQylVA44fP7ndv/uztxVlBryEBKzDLa72RmhQYbz/5BpnmKPQAaq5Uc32fG2/HQJ3/4H5VlNc5s6FP01zPQtnDECjFkax2mnH9O+8eK9LhWQQY1AjJBju7++VyBsYTmp06SmmXohi4MkpHvuudIFx5sX27cCV/knnhLmoHG6dbxrByHkRyH8KWTXIlHotkAmaNpCBrCk34kGxxpd05TUvYaScyZp1QcTXpYkkT0MC8E3/WYrzvpPrXBGLGCZYGaj/9FU5i06ReEBf0dolndPdidRe6fAXWO9kjrHKd8YkLdwvLngXLa1YjsnTBmvs0vb7+aBu/uJCVLKczpESbFYf8b//3s/oR9S9rV873sjPco9Zmu94AXDtaTJkmCR5HDrDS1Tsv1Hr0HuOsPAcipVTbGEDlxAPd7kVJJlhRN1YwMOAVguCwZXLlT1s4iQZPvgIty9acCnCC+IFDto0jmU57VdtDt5kbbuxiBHQ7nBy0RjWLtDth/5YDGoaKM9wYDIMgxJwYH0JRcy5xkvMVsc0FjwNdhUjTqGq0Obj5xX2lTfiJQ7rQa8lrxvyFpiIWfKuwFIgLCaJh18Q1nf3mo+j1sbps/XIiGPLFNbHR6QEflIu+A0e4IwLOl9fx6nuNBdv3AKM9yzPgrcq8j4hWHPCYDxq7HxQ/3x20nrIY/o3s/x1z3AsyQU4+SOlBDMJFECqvIK/hygZOo6QHk8a+rjpj5typsGQU0Z21o7OIx7EZWNXLdvYTewZeaiS+rMt6z8dwgvOFN47vg0o2cr71nsBBY7y5wIxpO74X0ZoaNoMbF92fMv6csTy1p1PSLtvqtujkfN+aGWREClhDOVgyYMZhXfAjDJVM3oEeoeaic+p/30VPsjlsDe8tj1Bb8jc864AKTkpRLUCnz+CMKMZiVcMrJSIyjuKBynZhouaJqyh84KfX2+APke6h8X/PGJOBac4N7/XdyHFvcf6C0u8fA68Y50cupoddmYPx0ixL9g7O5ymJ8G73DI2B39ITurGV5SssLrJoJdfsc9mzV3UNq6aT6cug0dUI4PkcMHFNdOd197iEFnOutzE7Pn2R1Zdv+0SwRfqRzvjcqAZm1mFBiZEeryoyZvQi3YltdGPTaaISOlmrX14ZOpc86fF5aBnbK+dhn4r0IGdhL7jld3tKw7GUSmZ3udGKD0GiRsykWDhIYSFlo8+i0DMrTk9oWxV9fC0JgpqlY8wfCyGfndDvfn6MZO3IY5Kl38SBSeeyQaVF52bmXRg+uq/UqwolvFgWnXSr0hbCYVxE5wbeSyCVgMcnEvpkXzuSBe8VJqfmBv2+PXtMhg6ozeQom/rwVRS8pISQSG6d/McZKTq/o+exmJTKP++Wo6tQQy8U/ow38yAXB5+FDRvjg9fO7xFj8A5VrbcqM4EP0aV+0+OAXiZj/GdjK7tZOqqXKlZnbfZCODZgVihXzL12/LCDAWjicVBzKTPCSoaV04p/uoFRg402T3SeAsfuAhYQNkhbuBMxsgZPuBBX+UZV9YxoFdGCJBQ+1UG+b0iWij7hetaUjyhqPknEmaNY1LnqZkKRs2LATfNt1WnDVnzXBEDMN8iZlp/UpDGRfWEQpq+x+ERnE5s+2PizsJLp31k+QxDvn2yOTcDZyp4FwWV8luSpgCr8Sl6Hd/5m61MEFS+SMdUGZ/enQ2438eH+ZPZDJNvWw21KPkcl8+MAnh+XWTCxnziKeY3dXWieDrNCRqVAtatc9nzjMw2mD8TqTcazLxWnIwxTJh+m4xp5ro7KOU6+JrsSTPrN/TIYFFROQzfkEFOEQq4QmRYg/9BGFY0k1zHViHTFT5VV2/cAorRJYOb+Tr+XVwBzZqDlGsS/equbkVAu+P3DLlkJ+fx3Wa87hj1KT6kn/Q8IeLYgVl6wiT2nQInxeEkn70DWZrjedjFmJJBgjGs2aEEXXdEm2f8QJEoxEhmNEoheslBAQRYNgQISlk5a2+kdAwLIKR5PQJLw7jqXDUUMLg3mTgzapo0/qgPeusVAOT3dk4PJ80ZjDpUawb1/FRA3898Cujbdw2Ztmdr1Y5kScsX4VX54NIhO28iUa4I6vBm4+60QjPeZlGeF1ohGtoxBx0YSl/DV04E0C1LoxGweuU4O2z3TMY+oplzlODoTrFFTHbmEoyz/AhE7dQCral8wVMn5fVqiIs97SRzqNtXZbZrvaJj0oy3zoPbwO9l0Ll9yGMgJbYf1P9b7yy+bce7tCY7RqtvW6FOI8rtlTjC5aQQunBgixlzaXg/1ZVLrquCgddqfCrKA2M6H/AuVKaU6ahmM/UJRQ44MAF6SQHPHSSA66ZA36XKTAy8PrJi4VSZC7GqddnmI4/LOz2uE/cy2UeAf8nYLhrEYjOt0eoL6yjH+Q0lMIJWnZL1KVU2LaB3R0D7aTLOcFiGcOt36gC8/f3IrZBU2xBfQ0IR50iaJ6w83xIChBVNWINB+r/TsWGZaU8hPO2z2BZkwUY/EhdHfUIdA8F64/4j9r8T6gCuGWTiaKqmHLGoV6fpTxV7K0oYyemsrRnZCWfK+zbiG9K2RW49/0T7v2W9PFayHffjHzHIH/O8MZk4H1UJl7flYltHjUhlLeHs8ww2ef/saEF932cKDDSRZ5VQFw1nC+fVDsJaM89qRztloBu2w+cNyPIPGkaBDkflyC/f4J8g6C/6AKnuPdax768MXdc2wQGJj9Z/a1PFJfrb7+dmY7q7/dx3mxKTEhWeH2omnKAT96ql45KV6BqyumyNN9T1idv5zKqI97MA+tJ7d//6emdSQoyj5r9hHrXIV295b8oRb2GNDKPswY/OM+KTxJWdKdIOAbWfB9hFCQ0OXybMFnxVGqCbFTbZzSJYOmMLuA3floLoh4pIikRGJZ/P8XLmNzkm+g6KeIi/yRFLCNFfLclQ9wXMwDN+rOI4sVG/XGJc/c/ \ No newline at end of file diff --git a/search/Mycroft.puml b/search/Mycroft.puml new file mode 100644 index 0000000..e97f81b --- /dev/null +++ b/search/Mycroft.puml @@ -0,0 +1,37 @@ +@startuml +'Параметры для интерфейсов +skinparam interface { + backgroundColor #1a2eff + borderColor black +} + +'Параметры для компонентов +skinparam component { + FontSize 13 + ArrowFontStyle Bold + FontName Times New Roman + BorderColor black + BackgroundColor #e6ffef + ArrowFontName Courier + ArrowColor #111111 + ArrowFontColor #111111 +} + +frame Mycroft_scheme #ededed { + +database MySql #turquoise { + [Sphinx] +} + +database ElasticSearch #turquoise { + [Sherlock] +} + +[request] --> [Sherlock] +[request] --> [Sphinx] +[Sherlock] --> [aggregate] +[Sphinx] --> [aggregate] +[aggregate] --> [csv_files]: save + +} +@enduml \ No newline at end of file diff --git a/search/Sherlock scheme.puml b/search/Sherlock scheme.puml new file mode 100644 index 0000000..c323fce --- /dev/null +++ b/search/Sherlock scheme.puml @@ -0,0 +1,38 @@ +@startuml +'Параметры для интерфейсов +skinparam interface { + backgroundColor #1a2eff + borderColor black +} + +'Параметры для компонентов +skinparam component { + FontSize 13 + ArrowFontStyle Bold + FontName Times New Roman + BorderColor black + BackgroundColor #e6ffef + ArrowFontName Courier + ArrowColor #111111 + ArrowFontColor #111111 +} + +frame Sherlock_scheme #ededed { + +database "Elasticsearch" #turquoise { + [database] +} + [user_request] -u-> http_request_autocomplete + [user_request] -u-> http_request_full_text + http_request_autocomplete -u-> [database] + http_request_full_text -u-> [database] + + note top of http_request_full_text: POST /api/v1/product + note top of http_request_autocomplete: POST /api/v1/autocomplete + + [database] -u-> [filtering, sorting] + [filtering, sorting] -u-> [response_for_user] + + [response_for_user] -u-> http_response +} +@enduml \ No newline at end of file diff --git a/search/Watson.drawio.svg b/search/Watson.drawio.svg new file mode 100644 index 0000000..253ec4b --- /dev/null +++ b/search/Watson.drawio.svg @@ -0,0 +1,4 @@ + + + +
ТХ товара, категории,
производители и товары
ТХ товара, категории,...
PDM
PDM
Теговые страницы, распродажи, rnames
заголовки страниц и категорий, акции и
скидки, отзывы, просмотры заказа, seo сортировка
Теговые страницы, распродажи, rnames...
SITE(через топики kafka)
SITE(через топики kafka)
ID магазинов и AregID
ID магазинов и AregID
Officer
Officer
Факт наличия остатков в регионе
Факт наличия остатков в регионе
Shcat
Shcat
Цены и типы цен
Цены и типы цен
PriceFormer
PriceFormer
Информация о наличии в магазинах
Информация о наличии в магазинах
HamletX10
HamletX10
Watson
Watson
Text is not SVG - cannot display
\ No newline at end of file diff --git a/search/Watson.drawio.xml b/search/Watson.drawio.xml new file mode 100644 index 0000000..8296fcd --- /dev/null +++ b/search/Watson.drawio.xml @@ -0,0 +1,2 @@ + +5ZpZb9s4EIB/jYHdhwYSdfrRZxug3Q3gBdo+MhZtqZFMg6Zju79+KZGUhqZiuLXjA82DQg7v4fCbIZOONyi2Hxlepl9oQvIOcpJtxxt2kPiJkfhVSnZS4iI/lJI5yxIlawST7CdRQkdJ11lCVkZFTmnOs6UpnNLFgky5IcOM0Y1ZbUZzc9QlnhNLMJni3JZ+zRKeSmmMokb+iWTzVI/shl1ZUmBdWa1kleKEboDIG3W8AaOUy1SxHZC81J7Wi2w3fqO0nhgjC35Mgx/0xf/nCTnjYjN6zdPnx0mSfHA9NTm+0ysmiVCAylLGUzqnC5yPGmmf0fUiIWW3jsg1dT5TuhRCVwh/EM53ajfxmlMhSnmRq1IxY7b7BjPfy84eAp0dblXnMrdTOXvJSgsrumZTcmidynQwmxN+oJ7a1lIHYACl0I+EFkTMR1RgJMc8ezWNBCtbm9f1mu0QCbUjv7I7vuz4FedrNVRHKKInv4Eo6QgVxlW2P6q+Mi3ljkqjQVVTpHugVNYMqq+ne6hbxeor26IwF1rrPzORmpepqnQM6o9AqwjMRMp9Xbo3bl+P4oDE4RWJb7/VZj/jZwEfw85wns0XIj0V9kKYELwSxjNxuHuqoMiSRJo0WWU/8XPVX2lpS5oteLWdQb8TDFtt7+CBUjxSXTYUKGdAtgdtS5V+cB6cMFK0VPjUdny0+anen8rlNF2bnXqO2Z7OZitxSPaNt57hCfZsmfPT8Iu1mSZeNmnGyWSJq+O9EV7G3OI3kXC8osPQMfSBIpXfNMB39f6lAPah87biTzv36BpU/n26ovuka3CArvtglCCq4CNLFalczSvA2/I7BMQLNbUGupUDmOa+wVIf9BZCGrMFLkRI1M7kCLSCk+9bRO2ZyD1uIQaof8OhdIEzqnuQKoJOpx7FXmOtsR5o4psrqocYgYlFYPuQuSO2/utRBmY/0Ac5lsJ7IK3l1RArQoGeoWbq6cWWASCjzxt2eeiMLi8Mwsh0ef5ZXJ5/KR+HLKhMHv8b/VXtbqRPSL3TgbKVlrhnDOy7OasvePaC/766z/SiW/OZ8Z9xkfHu09WG1ql4HGqCDiyXBQkaAy+kuQi8UI+R+ePwhukYnwuOzoMbd+PTYPj++POsjf53NsumQtnXRtZ+mB/F10aW61pKuSSzAKa+w7KzM8u/T2ZF7dcD3wz4Kq+NYKzsGE8bjd+X6bEZm7rA78MYoNcGPGTeH2CoHYP6Q31FuVkoass/BxVR4ARmxIjOEjHqbnSE410qgrQf/SbpFPOrA3Q/5rsBgLZfiy4G0EsFfcF9AjRuB2gI4DU0L9N7D8AxuJr3dZHZ/IYZ55yRcWHkGWfvxEvx+0PMflt7YiIMHFNW3EAs2L01knX/DJCF9wmybivIujFAmG89eA5ATBe2B4DHho3wUbQOBo+/Nss53HI82D0XKss/mvmeGQ+eGA6+Pyvtx5FPuMgJ/9YS31yZlNd/57NvZV8xX9HF1TW1Hx4H/vupSmSbfxyRZtj8/403+h8= \ No newline at end of file diff --git a/search/Watson.puml b/search/Watson.puml new file mode 100644 index 0000000..5fd95c2 --- /dev/null +++ b/search/Watson.puml @@ -0,0 +1,82 @@ +@startuml +scale 0.8 +'Параметры для интерфейсов +skinparam interface { + backgroundColor #1a2eff + borderColor black +} +'Прямые стрелки +skinparam linetype ortho +'Параметры для компонентов +skinparam component { + FontSize 13 + ArrowFontStyle Bold + FontName Times New Roman + BorderColor black + BackgroundColor #e6ffef + ArrowFontName Courier + ArrowColor #111111 + ArrowFontColor #111111 +} + + +frame Watson_scheme #ededed { + +package "Site" #lightblue { + [Акции и скидки] -l-> kafka + [rnames] --> kafka + [Распродажи] --> kafka + [Теговые страницы] --> kafka + [Скрытие категорий \nпроизводителей] -l-> kafka + [Заголовоки страниц\n категорий] -l-> kafka + [Отзывы, просмотры,\n заказы и seo сортировка] --> kafka +} + +package "PDM" #lightblue { + [Товары] --> http_pdm : Каждые 10 минут + [Производители] --> http_pdm: Каждые 10 минут + [Категории] --> http_pdm: Каждые 2 часа + [Технические характеристики] --> http_pdm: Каждую минуту +} + +package "PriceFormer" #lightblue { + [Цены] -up-> http_price_former + [Типы цен] -up-> http_price_former +} + +package "HamletX10" #lightblue { + [Информация о наличии в магазинах] -> http_hamlet +} + +package "Shcat" #lightblue { + [Факт наличия \nостатков в регионе] -up-> http_shcat +} + +package "Officer" #lightblue { + [ID магазинов] -up-> http_officer + [AregID] -up-> http_officer +} + +database "MySql" #turquoise { + [database] +} + +'Site +kafka --> [database]: Чтение топиков из kafka + +'PDM +http_pdm --> [database] + +'HamletX10 +http_hamlet -up--> [database]: Каждый день + +'Officer +http_officer -up--> [database]: Каждую неделю + +'Shcat +http_shcat -up--> [database]: Запускается вручную + +'PriceFormer +http_price_former -up--> [database]: Каждую минуту +} +@enduml \ No newline at end of file diff --git a/search/WatsonScheme.puml b/search/WatsonScheme.puml new file mode 100644 index 0000000..5506465 --- /dev/null +++ b/search/WatsonScheme.puml @@ -0,0 +1,404 @@ +@startuml +frame AS_IS_ALL_SCHEME { +skinparam linetype ortho +scale 2500*1700 + + entity "search_availability_flag_{guid_office}" as availability { + * id : int auto_increment "PK" + -- + *product : char(36) + *is_availability : tinyint(1) + *create_at : timestamp + *update_at : timestamp + -- + unique (product) + } + + entity "search_remaining_{guid_office}" as remaining { + * id: int auto_increment "PK" + -- + *product: char(36) + *remaining: int + *create_at: timestamp + *update_at: timestamp + -- + unique (product) + } + + entity "search_check" as search_check { + *id: int auto_increment "PK" + -- + *locality: char(36) + *product: char(36) + *update_at: timestamp + -- + unique(locality, product) + } + entity "search_localities_offices" as localities_offices { + *id: int auto_increment "PK" + -- + *locality_guid: char(36) + *office_guid: char(36) + *is_active: tinyint(1) + -- + unique (office_guid) + } + + + + + + entity "search_countries" as countries { + *id: int auto_increment "PK" + -- + *code varchar(3) + *name: varchar(256) + *full_name: varchar(256) + *alpha_2: varchar(2) + *alpha_3: varchar(3) + -- + unique (code) + } + entity "search_prices_types_localities" as prices_types_localities { + *id: int auto_increment "PK" + -- + *hash: char(40) + *locality_guid: char(36) + *price_type_guid: char(36) + *type: varchar(128) + -- + unique (hash) + } + + entity "search_prices_types_products" as prices_types_products { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *price_type_guid: char(36) + *price: decimal(10, 2) + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_products_relevancy_counts" as products_relevancy_counts { + *id: bigint: auto_increment "PK" + -- + *product_guid: char(36) + *orders: int(11) + *views: int(11) + *reviews: int(11) + *updated_at: timestamp + -- + unique (product_guid) + } + + entity "search_products_relevancy_data_items" as relevancy_data_items { + *id: bigint: auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *manufacter_guid: char(36) + *seo_position: int + *koef_sort: float + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_products_sort_rating" as products_sort_rating { + *id: bigint: auto_increment "PK" + -- + *product_guid: char(36) + *rating: float + *updated_at: timestamp + -- + unique (product_guid) + } + + entity "search_manufacturers_settings" as manufacturers_settings { + *id: int auto_increment "PK" + -- + *manufacturer_guid: char(36) + *locality_guid: char(36) + *is_hide: tinyint(1) + *updated_at: timestamp + *created_at: timestamp + -- + unique (manufacturer_guid, locality_guid) + } + + entity "search_manufacturers" as manufacturers { + *id: int auto_increment "PK" + -- + *guid: char(36) + *name: varchar(256) + *is_our: tinyint(1) + *description: varchar(256) + *updated_at: timestamp + -- + unique (guid) + } + + entity "search_products" as products { + *id: int auto_increment "PK" + -- + *is_consumable: tinyint(1) + *is_on_site: tinyint(1) + *is_visible: tinyint(1) + *status: smallint + *is_discountinued: tinyint(1) + *is_for_order: tinyint(1) + *sku: int + *height: float + *lenght: float + *width: float + *guid: char(36) + *manufacter_guid: char(36) + *name_site: varchar(256) + *category: char(36) + *name_pdm: varchar(256) + *name_wtis: varchar(256) + *name_contractor: varchar(256) + *keywords: varchar(256) + *lights: varchar(20) + *country_code: varchar(3) + *uri: text + *advantages: text + *description: text + *equipment: text + *features: text + *updated_at: timestamp + -- + unique (guid) + } + + entity "search_products_categories" as products_categories { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *category_guid: char(36) + *is_enabled: tinyint(1) + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_categories_settings" as categories_settings { + *id: int auto_increment "PK" + -- + *category_guid: char(36) + *locality_guid: char(36) + *is_hide: tinyint(1) + *updated_at: timestamp + *created_at: timestamp + -- + unique (category_guid, locality_guid) + } + + entity "search_categories_relationship" as categories_relationship { + *id: int auto_increment "PK" + -- + *parent: char(36) + *child: char(36) + *main: tinyint(1) + *level: int + *line: int + *created_at: timestamp + } + + entity "search_categories" as categories { + *id: int auto_increment "PK" + -- + *guid: char(36) + name: varchar(256) + type: varchar(256) + parent_guid: char(36) + is_active: tinyint(1) + is_enable: tinyint(1) + up_caption: varchar(256) + updated_at: timestamp + -- + unique (guid) + } + + entity "search_products_sale" as product_sale { + *id: bigint: auto_increment "PK" + -- + *hash: char(40) + *guid: char(36) + *product_guid: char(36) + *locality_guid: char(36) + remaining: int + price: float + updated_at: timestamp + -- + unique (hash) + } + + entity "search_promotions" as promotions { + *id: int: auto_increment "PK" + -- + *product_guid: char(36) + *locality_guid char(36) + *name: varchar(256) + *updated_at: timestamp + } + + entity "search_specifications_bool" as specifications_bool { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: tinyint(1) + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_collection" as specifications_collection { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: varchar(256) + *value_guid: char(36) + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_float" as specifications_float { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: float + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_int" as specifications_int { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: int + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_range" as specifications_range { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value_gte: float + *value_lte: float + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_text" as specifications_text { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: varchar(256) + *updated_at: timestamp + -- + unique (hash) + } + entity "search_locality" as locality { + *id: mediumint(9) auto_increment "PK" + -- + *name: char(50) + *english_name: varchar(255) + *areg_id: char(36) + *is_enabled: tinyint(1) + } + + entity "search_dates_sync" as dates_sync { + *id: int auto_increment "PK" + -- + *is_successful tinyint(1) + *'system': text + *message: text + *date: datetime + } + + 'Связи + products -d----> specifications_bool + specifications_bool -r-> specifications_range + specifications_bool -r-> specifications_text + specifications_bool -r-> specifications_collection + specifications_bool -r-> specifications_int + specifications_bool -r-> specifications_float + 'products -d---> specifications_range + 'products -d---> specifications_text + 'products -d---> specifications_collection + 'products -d---> specifications_int + 'products -d---> specifications_float + + note left of specifications_bool: Все таблицы с тх связаны с \nтаблицей товаров по product_guid + products -l--> manufacturers + manufacturers -l-> manufacturers_settings + + prices_types_localities -> localities_offices + prices_types_products -> prices_types_localities + + products -d--> promotions + products -d--> availability + products -d--> search_check + products --> remaining + + + products -r--> relevancy_data_items + product_sale -> localities_offices + promotions -> localities_offices + + products -l--> prices_types_products + + products -u-> categories + products -> products_relevancy_counts + products -> product_sale + products -> products_sort_rating + + + categories -> categories_relationship + categories -> categories_settings + + products_categories -> products + products_categories -> categories + +} +@enduml diff --git a/search/WatsonWithMicroservices.puml b/search/WatsonWithMicroservices.puml new file mode 100644 index 0000000..32909ab --- /dev/null +++ b/search/WatsonWithMicroservices.puml @@ -0,0 +1,142 @@ +@startuml +skinparam linetype ortho +'============================================================================================ +'===========================================Микросервисы===================================== +'============================================================================================ +package Microservices <> { + abstract "Shcat" as shcat { + +request: POST + +endpoint: http://shcat.vseinstrumenti.ru/rpc + -- + *Method: rests.get + *nomenclature - guid товара + *source - guid магазина + -- + +response + -- + *nomenclature - guid товара + *source - guid офиса + *quntity - количество остатков + *quality - качество, по умолчанию 1 + } + + abstract "HamletX10" as hamlet { + +request: POST + +enpoint: http://hamlet-v2.vseinstrumenti.ru/rpc + -- + *Method: availability.chain + *store - guid офиса + *nomenclature - guid товара + *filter_zero_chain - скрывать или нет ЛЦ по которым нет наличия + -- + +response + -- + *available - Признак наличия + *store - guid офиса + *free - количество остатков + } + + abstract "Officer" as officer { + +request: POST + +endpoint: https://officer2go.vseinstrumenti.ru/query + -- + *Method: availability.get_offices + *locality_areg_id - areg_id города + -- + +response + -- + *id - guid офиса + *created_at - Дата создания + } + + abstract "Scrooge_sync" as scrooge { + +request: GET + +endpoint: http://exporter.scrooge-v2.vseinstrumenti.ru/file/price?after-id= + -- + +response + -- + *price + *price_type + } + + abstract "Scrooge_graphQL" as Scrooge_graphQL { + +request: POST + +endpoint: http://exporter.scrooge-v2.vseinstrumenti.ru/query + -- + *method: priceTypeBinding + -- + +response + -- + *priceTypeId + *priceCategory + *localityID + } +} + + +package MySql <> { + entity "search_availability_flag_{guid_office}" as availability { + * id : int auto_increment "PK" + -- + *product : char(36) + *is_availability : tinyint(1) + *create_at : timestamp + *update_at : timestamp + -- + unique (product) + } + + + entity "search_remaining_{guid_office}" as remaining { + * id: int auto_increment "PK" + -- + *product: char(36) + *remaining: int + *create_at: timestamp + *update_at: timestamp + -- + unique (product) + } + + entity "search_localities_offices" as localities_offices { + *id: int auto_increment "PK" + -- + *locality_guid: char(36) + *office_guid: char(36) + *is_active: tinyint(1) + -- + unique (office_guid) + } + + entity "search_prices_types_localities_2" as prices_types_localities { + *id: int auto_increment "PK" + -- + *hash: char(40) + *locality_guid: char(36) + *price_type_guid: char(36) + *type: varchar(128) + -- + unique (hash) + } + + + entity "search_prices_types_products_2" as prices_types_products { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *price_type_guid: char(36) + *price: decimal(10, 2) + *updated_at: timestamp + -- + unique (hash) + } +} + + shcat -d-----> remaining + hamlet -d-----> availability + officer -d-----> localities_offices + scrooge -d-----> prices_types_products + Scrooge_graphQL -d--> prices_types_localities + +@enduml \ No newline at end of file diff --git a/search/WatsonWithPDM.puml b/search/WatsonWithPDM.puml new file mode 100644 index 0000000..8df3b3e --- /dev/null +++ b/search/WatsonWithPDM.puml @@ -0,0 +1,266 @@ +@startuml +skinparam linetype ortho +'=============================================================================== +'===================================PDM========================================= +'=============================================================================== +package PDM <> { + abstract ProductModuleName { + +request: GET + +endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/products/* + +headers: Accept:application/json + Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD + -- + *response: guid товара + -- + * - 2019-08-16 17:00:00 + } + + abstract CategoryModuleName { + +request: GET + +endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/rubrics/* + +headers: Accept:application/json + Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD + -- + *response: guid категории + -- + * - 2019-08-16 17:00:00 + } + + abstract ManufacturerModuleName { + +request: GET + +endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/manufacturers/* + +headers: Accept:application/json + Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD + -- + *response: guid производителя + -- + * - 2019-08-16 17:00:00 + } + + abstract SpecificationModuleName { + +request: GET + +endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/tech_param/* + +headers: Accept:application/json + Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD + -- + *response: guid изменившихся ТХ + -- + * - 2019-08-16 17:00:00 + } +} + +Package MySql <> { + package "Manufacter_MySql" <> { + entity "search_manufacturers_settings" as manufacturers_settings { + *id: int auto_increment "PK" + -- + *manufacturer_guid: char(36) + *locality_guid: char(36) + *is_hide: tinyint(1) + *updated_at: timestamp + *created_at: timestamp + -- + unique (manufacturer_guid, locality_guid) + } + + entity "search_manufacturers" as manufacturers { + *id: int auto_increment "PK" + -- + *guid: char(36) + *name: varchar(256) + *is_our: tinyint(1) + *description: varchar(256) + *updated_at: timestamp + -- + unique (guid) + } + } + + package "Products_MySql" <> { + entity "search_products" as products { + *id: int auto_increment "PK" + -- + *is_consumable: tinyint(1) + *is_on_site: tinyint(1) + *is_visible: tinyint(1) + *status: smallint + *is_discountinued: tinyint(1) + *is_for_order: tinyint(1) + *sku: int + *height: float + *lenght: float + *width: float + *guid: char(36) + *manufacter_guid: char(36) + *name_site: varchar(256) + *category: char(36) + *name_pdm: varchar(256) + *name_wtis: varchar(256) + *name_contractor: varchar(256) + *keywords: varchar(256) + *lights: varchar(20) + *country_code: varchar(3) + *uri: text + *advantages: text + *description: text + *equipment: text + *features: text + *updated_at: timestamp + -- + unique (guid) + } + + entity "search_products_categories" as products_categories { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *category_guid: char(36) + *is_enabled: tinyint(1) + *updated_at: timestamp + -- + unique (hash) + } + } + + package "Categories_MySql" <> { + entity "search_categories_settings" as categories_settings { + *id: int auto_increment "PK" + -- + *category_guid: char(36) + *locality_guid: char(36) + *is_hide: tinyint(1) + *updated_at: timestamp + *created_at: timestamp + -- + unique (category_guid, locality_guid) + } + + entity "search_categories_relationship" as categories_relationship { + *id: int auto_increment "PK" + -- + *parent: char(36) + *child: char(36) + *main: tinyint(1) + *level: int + *line: int + *created_at: timestamp + } + + entity "search_categories" as categories { + *id: int auto_increment "PK" + -- + *guid: char(36) + name: varchar(256) + type: varchar(256) + parent_guid: char(36) + is_active: tinyint(1) + is_enable: tinyint(1) + up_caption: varchar(256) + updated_at: timestamp + -- + unique (guid) + } + } + + package PDM_Specifications <> { + entity "search_specifications_bool" as specifications_bool { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: tinyint(1) + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_collection" as specifications_collection { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: varchar(256) + *value_guid: char(36) + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_float" as specifications_float { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: float + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_int" as specifications_int { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: int + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_range" as specifications_range { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value_gte: float + *value_lte: float + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_specifications_text" as specifications_text { + *id: int auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *guid: char(36) + *name: varchar(256) + *unit: varchar(256) + *description: text + *value: varchar(256) + *updated_at: timestamp + -- + unique (hash) + } + } +} + + SpecificationModuleName -up----> PDM_Specifications + ProductModuleName -up---> "Products_MySql" + CategoryModuleName -up----> "Categories_MySql" + ManufacturerModuleName -up---> "Manufacter_MySql" + +@enduml \ No newline at end of file diff --git a/search/WatsonWithSite.puml b/search/WatsonWithSite.puml new file mode 100644 index 0000000..7fe1a68 --- /dev/null +++ b/search/WatsonWithSite.puml @@ -0,0 +1,227 @@ +@startuml +skinparam linetype ortho + +'=============================================================================== +'=====================================Kafka===================================== +'=============================================================================== +package Site_kafka <> { + abstract promotions_kafka { + +Topics site.products.promotions + -- + *product_guid + *locality_guid + *promotions array[string] + } + abstract rnames_kafka { + + topics site.products.rname + -- + *url + *guid + } + abstract sale_kafka { + + site.products.sale + -- + *nomenclature_guid + *main_region_guid + *price + *clearance_sale_guid + *quantity_left + *status + } + abstract tagpage_delete_kafka { + + topics site.tagpage.delete + -- + *id + } + abstract tagpage_status_kafka { + + topics site.tagpage.status + -- + *id + *name + *is_active + *is_enable + } + + abstract makes_visibility_kafka { + + topics site.make.visibility + -- + *visibility + *makeGuid + *localities + } + abstract categories_visibility_kafka { + + topics site.categories.visibility + -- + *visibility + *values map[string] + *items array[string] + } + abstract up_caption_kafka { + + topics site.categories.up_caption + -- + *guid + *up_caption + } + abstract relevancy_kafka { + + topics site.products.relevancy + -- + *guid + *orders + *views + *rating + *reviews + *data [array] - массив данных + *[array].category + *[array].manufacturer + *[array].seo_position + *[array].koef_sort + } +} + + package "MySql" <> { + entity "search_products" as products { + *id: int auto_increment "PK" + -- + *is_consumable: tinyint(1) + *is_on_site: tinyint(1) + *is_visible: tinyint(1) + *status: smallint + *is_discountinued: tinyint(1) + *is_for_order: tinyint(1) + *sku: int + *height: float + *lenght: float + *width: float + *guid: char(36) + *manufacter_guid: char(36) + *name_site: varchar(256) + *category: char(36) + *name_pdm: varchar(256) + *name_wtis: varchar(256) + *name_contractor: varchar(256) + *keywords: varchar(256) + *lights: varchar(20) + *country_code: varchar(3) + *uri: text + *advantages: text + *description: text + *equipment: text + *features: text + *updated_at: timestamp + -- + unique (guid) + } + + entity "search_manufacturers_settings" as manufacturers_settings { + *id: int auto_increment "PK" + -- + *manufacturer_guid: char(36) + *locality_guid: char(36) + *is_hide: tinyint(1) + *updated_at: timestamp + *created_at: timestamp + -- + unique (manufacturer_guid, locality_guid) + } + + entity "search_categories_settings" as categories_settings { + *id: int auto_increment "PK" + -- + *category_guid: char(36) + *locality_guid: char(36) + *is_hide: tinyint(1) + *updated_at: timestamp + *created_at: timestamp + -- + unique (category_guid, locality_guid) + } + + entity "search_categories" as categories { + *id: int auto_increment "PK" + -- + *guid: char(36) + name: varchar(256) + type: varchar(256) + parent_guid: char(36) + is_active: tinyint(1) + is_enable: tinyint(1) + up_caption: varchar(256) + updated_at: timestamp + -- + unique (guid) + } + + entity "search_products_relevancy_counts" as products_relevancy_counts { + *id: bigint: auto_increment "PK" + -- + *product_guid: char(36) + *orders: int(11) + *views: int(11) + *reviews: int(11) + *updated_at: timestamp + -- + unique (product_guid) + } + + entity "search_products_relevancy_data_items" as relevancy_data_items { + *id: bigint: auto_increment "PK" + -- + *hash: char(40) + *product_guid: char(36) + *manufacter_guid: char(36) + *seo_position: int + *koef_sort: float + *updated_at: timestamp + -- + unique (hash) + } + + entity "search_products_sort_rating" as products_sort_rating { + *id: bigint: auto_increment "PK" + -- + *product_guid: char(36) + *rating: float + *updated_at: timestamp + -- + unique (product_guid) + } + + + entity "search_products_sale" as product_sale { + *id: bigint: auto_increment "PK" + -- + *hash: char(40) + *guid: char(36) + *product_guid: char(36) + *locality_guid: char(36) + remaining: int + price: float + updated_at: timestamp + -- + unique (hash) + } + + entity "search_promotions" as promotions { + *id: int: auto_increment "PK" + -- + *product_guid: char(36) + *locality_guid char(36) + *name: varchar(256) + *updated_at: timestamp + } + + } + + relevancy_kafka -d--> products_relevancy_counts + relevancy_kafka -d--> relevancy_data_items: data [array] + relevancy_kafka -d--> products_sort_rating: rating + rnames_kafka -d----> products + sale_kafka -d--> product_sale + promotions_kafka -d--> promotions + tagpage_status_kafka -d--> categories + tagpage_delete_kafka -d--> categories + makes_visibility_kafka -d--> manufacturers_settings + categories_visibility_kafka -d--> categories_settings + up_caption_kafka -d--> categories + +@enduml \ No newline at end of file diff --git a/search/Общий процесс autocomplete.puml b/search/Общий процесс autocomplete.puml new file mode 100644 index 0000000..b8dd9b0 --- /dev/null +++ b/search/Общий процесс autocomplete.puml @@ -0,0 +1,68 @@ +@startuml +mainframe api/v1/autocomplete Общая схема +Actor user +participant BackendSite +participant Sherlock +Database ElasticSearch + +user -> BackendSite: Вводит запрос в поисковую строку +BackendSite -> BackendSite: Обработка запроса на бэкенде\n сайта и формирование запроса\nдля Sherlock +BackendSite -> Sherlock: REST POST api/v1/autocomplete +Sherlock -> Sherlock: Перевод запроса\nна второй язык +Sherlock -> Sherlock: Преобразование запроса\n в структуру и формирование\nзапроса для ElasticSearch + + note over Sherlock + Отправка запроса в + ElasticSearch с доп + сортировкой по категориям + из Спектра + endnote + + +alt ElasticSearch ничего не вернул +Sherlock -> ElasticSearch: 8 запросов в 4 индекса: manufacturers,\ntagpage, categories, products на двух языках (RU, EN) +ElasticSearch --> Sherlock: Получен пустой ответ со всех 8-и запросов + + note over Sherlock + Отправляются доп.запрос + в ElasticSearch с меньшим + процентом вхождения + endnote + +Sherlock -> ElasticSearch: 8 запросов в 4 индекса: manufacturers,\ntagpage, categories, products на двух языках (RU, EN) +ElasticSearch --> Sherlock: Получен пустой ответ со всех 8-и запросов + +Sherlock --> BackendSite: Получен пустой ответ +Sherlock --> user: Пользователь получает страницу:\nРезультаты не найдены + +else Найдены товары + + +alt Есть товары спектр + note over ElasticSearch + ЕСЛИ хоть один из четырех индексов + отдал ответ, ТО он отдается на бэкенд + endnote + +Sherlock -> ElasticSearch: 8 запросов в 4 индекса: manufacturers,\ntagpage, categories, products на двух языках (RU, EN) + + note over ElasticSearch + Категории спектр поднимаются + наверх И товары внутри них + сортируются по скорингу + endnote + +else Товаров спектр не найдено +Sherlock -> ElasticSearch: 8 запросов в 4 индекса: manufacturers,\ntagpage, categories, products на двух языках (RU, EN) + note over ElasticSearch + Товары сортируются + по скорингу + endnote +end + +ElasticSearch --> Sherlock: Передает отсортированный\nсписок товаров +Sherlock --> BackendSite: Список товаров +BackendSite --> user: Пользователь получает страницу:\nРезультаты поиска + +end +@enduml \ No newline at end of file diff --git a/search/Общий процесс filters.puml b/search/Общий процесс filters.puml new file mode 100644 index 0000000..aebdd95 --- /dev/null +++ b/search/Общий процесс filters.puml @@ -0,0 +1,55 @@ +@startuml +mainframe api/v1/filters Общая схема +Actor user +participant BackendSite +participant Sherlock +Database ElasticSearch + +user -> BackendSite: Вводит запрос в поисковую строку +BackendSite -> BackendSite: Обработка запроса на бэкенде\n сайта и формирование запроса\nдля Sherlock + +BackendSite -> Sherlock: REST POST api/v1/filters +Sherlock -> Sherlock: Преобразование запроса\nв структуру и формирование\nзапроса для ElasticSearch + + note over Sherlock + Отправка запроса в + ElasticSearch с доп + сортировкой по категориям + из Спектра + endnote + + +alt ElasticSearch ничего не вернул +Sherlock -> ElasticSearch: REST GET products/_search +ElasticSearch --> Sherlock: Получен пустой ответ + + note over Sherlock + Отправляется доп.запрос + в ElasticSearch с меньшим + процентом вхождения + endnote + +Sherlock -> ElasticSearch: REST GET products/_search +ElasticSearch --> Sherlock: Получен пустой ответ +Sherlock --> BackendSite: Получен пустой ответ +Sherlock --> user: Пользователь получает страницу:\nРезультаты не найдены + +else Найдены товары +alt Есть товары спектр +Sherlock -> ElasticSearch: REST GET products/_search + note over ElasticSearch + Категории спектр + поднимаются наверх + endnote +else Товаров спектр не найдено +Sherlock -> ElasticSearch: REST GET products/_search +end + +ElasticSearch --> Sherlock: Передает список\nкатегорий и фильтров + +Sherlock --> BackendSite: Список категорий и фильтров + +BackendSite --> user: Пользователь получает фильтры\nна странице: Результаты поиска + +end +@enduml \ No newline at end of file diff --git a/search/Общий процесс products.puml b/search/Общий процесс products.puml new file mode 100644 index 0000000..0e2f04b --- /dev/null +++ b/search/Общий процесс products.puml @@ -0,0 +1,64 @@ +@startuml +mainframe api/v1/products Общая схема +Actor user +participant BackendSite +participant Sherlock +Database ElasticSearch + +user -> BackendSite: Вводит запрос в поисковую строку +BackendSite -> BackendSite: Обработка запроса на бэкенде\n сайта и формирование запроса\nдля Sherlock +BackendSite -> Sherlock: REST POST api/v1/products +Sherlock -> Sherlock: Перевод запроса\nна второй язык +Sherlock -> Sherlock: Преобразование запроса\n в структуру и формирование\nзапроса для ElasticSearch + + note over Sherlock + Отправка запроса в + ElasticSearch с доп + сортировкой по категориям + из Спектра + endnote + +alt ElasticSearch ничего не вернул +Sherlock -> ElasticSearch: REST GET products/_search RU +Sherlock -> ElasticSearch: REST GET products/_search EN +ElasticSearch --> Sherlock: Получен пустой ответ + + note over Sherlock + Отправляется доп.запрос + в ElasticSearch с меньшим + процентом вхождения + endnote + +Sherlock -> ElasticSearch: REST GET products/_search RU +Sherlock -> ElasticSearch: REST GET products/_search EN +ElasticSearch --> Sherlock: Получен пустой ответ +Sherlock --> BackendSite: Получен пустой ответ +Sherlock --> user: Пользователь получает страницу:\nРезультаты не найдены + +else Найдены товары + +alt Есть товары спектр +Sherlock -> ElasticSearch: REST GET products/_search RU +Sherlock -> ElasticSearch: REST GET products/_search EN + note over ElasticSearch + Категории спектр поднимаются + наверх И товары внутри них + сортируются по скорингу + endnote + +else Товаров спектр не найдено + +Sherlock -> ElasticSearch: REST GET products/_search RU +Sherlock -> ElasticSearch: REST GET products/_search EN + note over ElasticSearch + Товары сортируются + по скорингу + endnote +end + +ElasticSearch --> Sherlock: Передает отсортированный\nсписок товаров +Sherlock --> BackendSite: Список товаров +BackendSite --> user: Пользователь получает страницу:\nРезультаты поиска + +end +@enduml \ No newline at end of file diff --git a/search/Схема поиск.png b/search/Схема поиск.png new file mode 100644 index 0000000..3b90b78 Binary files /dev/null and b/search/Схема поиск.png differ diff --git a/shipment.puml b/shipment.puml new file mode 100644 index 0000000..b2edf9b --- /dev/null +++ b/shipment.puml @@ -0,0 +1,32 @@ +@startjson +{ + "ShipmentDoc":{ + "ShipmentMeta":{ + "id":"uuid || Идентификатор доставки", + "OrderID":"uuid || Идентификатор заказа", + "MethodId":"int(enum) || Способы доставки", + "DeliveryDate":"datetime || Дата доставки", + "Services":{ + "Settings":{ + "SpreadExtraCost":"bool || Размазать стоимость доставки по товарам связанным с доставкой" + } + }, + "CreatedAt":"datetime || Дата создания доставки", + "UpdatedAt":"datetime || Дата обновления доставки", + "Artifact": { + "DeliveryWith":"string || Начальный временной промежуток курьерской доставки", + "TrackingNumberId":"int || Удалить, бесполезное поле", + "PartnerDeliverTo":"string || ??? ", + "DestinationOfficeID":"int || Идентификатор офиса, откуда везем товар", + "DeliveryOn":"string || Верхняя граница часов доставки ", + "DeliveryType":"bool || - обычная доставка 1 - доставка строительных материалов", + "DeliveryZone":"int || id зоны доставки строительных материалов из таблицы wtis_ref_town_zone ", + "VeerouteExportDate":"datetime || Дата выгрузки в Veeroute ", + "AddressID":"int || Идентификатор адреса доставки (внутренний от WTIS) " + } + }, + "": { + } + } + } +@endjson \ No newline at end of file