Initial commit
This commit is contained in:
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@@ -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
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/plantUML.iml" filepath="$PROJECT_DIR$/.idea/plantUML.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
19
.idea/php.xml
generated
Normal file
19
.idea/php.xml
generated
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="MessDetectorOptionsConfiguration">
|
||||
<option name="transferred" value="true" />
|
||||
</component>
|
||||
<component name="PHPCSFixerOptionsConfiguration">
|
||||
<option name="transferred" value="true" />
|
||||
</component>
|
||||
<component name="PHPCodeSnifferOptionsConfiguration">
|
||||
<option name="highlightLevel" value="WARNING" />
|
||||
<option name="transferred" value="true" />
|
||||
</component>
|
||||
<component name="PhpStanOptionsConfiguration">
|
||||
<option name="transferred" value="true" />
|
||||
</component>
|
||||
<component name="PsalmOptionsConfiguration">
|
||||
<option name="transferred" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
8
.idea/plantUML.iml
generated
Normal file
8
.idea/plantUML.iml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
255
example.proto
Normal file
255
example.proto
Normal file
@@ -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;
|
||||
}
|
||||
46
oms/autoorder/FRQ-1.puml
Normal file
46
oms/autoorder/FRQ-1.puml
Normal file
@@ -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
|
||||
55
oms/autoorder/FRQ-2.puml
Normal file
55
oms/autoorder/FRQ-2.puml
Normal file
@@ -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
|
||||
39
oms/autoorder/change-ao.puml
Normal file
39
oms/autoorder/change-ao.puml
Normal file
@@ -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
|
||||
30
oms/free-rest-and-reserve-journal/free-rest.puml
Normal file
30
oms/free-rest-and-reserve-journal/free-rest.puml
Normal file
@@ -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
|
||||
24
oms/free-rest-and-reserve-journal/reserve-rest.puml
Normal file
24
oms/free-rest-and-reserve-journal/reserve-rest.puml
Normal file
@@ -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
|
||||
15
oms/interface-arm/contragent/add-contact.puml
Normal file
15
oms/interface-arm/contragent/add-contact.puml
Normal file
@@ -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
|
||||
15
oms/interface-arm/contragent/add-contragent-to-order.puml
Normal file
15
oms/interface-arm/contragent/add-contragent-to-order.puml
Normal file
@@ -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
|
||||
30
oms/interface-arm/contragent/change-contractor.puml
Normal file
30
oms/interface-arm/contragent/change-contractor.puml
Normal file
@@ -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
|
||||
19
oms/interface-arm/contragent/create-contractor.puml
Normal file
19
oms/interface-arm/contragent/create-contractor.puml
Normal file
@@ -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
|
||||
19
oms/interface-arm/contragent/get-contractor-info.puml
Normal file
19
oms/interface-arm/contragent/get-contractor-info.puml
Normal file
@@ -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
|
||||
21
oms/interface-arm/contragent/get-contragent-info.puml
Normal file
21
oms/interface-arm/contragent/get-contragent-info.puml
Normal file
@@ -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
|
||||
38
oms/interface-arm/contragent/search-contractor.puml
Normal file
38
oms/interface-arm/contragent/search-contractor.puml
Normal file
@@ -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
|
||||
20
oms/interface-arm/docs/get realizations MVP.puml
Normal file
20
oms/interface-arm/docs/get realizations MVP.puml
Normal file
@@ -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
|
||||
19
oms/interface-arm/docs/payment-with-kafka.puml
Normal file
19
oms/interface-arm/docs/payment-with-kafka.puml
Normal file
@@ -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
|
||||
46
oms/interface-arm/docs/payment.puml
Normal file
46
oms/interface-arm/docs/payment.puml
Normal file
@@ -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
|
||||
36
oms/interface-arm/docs/realizations-or-payment.puml
Normal file
36
oms/interface-arm/docs/realizations-or-payment.puml
Normal file
@@ -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
|
||||
38
oms/interface-arm/docs/realizations.puml
Normal file
38
oms/interface-arm/docs/realizations.puml
Normal file
@@ -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
|
||||
41
oms/interface-arm/order/get-region.puml
Normal file
41
oms/interface-arm/order/get-region.puml
Normal file
@@ -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
|
||||
|
||||
|
||||
23
oms/personal-cabinet/change note.puml
Normal file
23
oms/personal-cabinet/change note.puml
Normal file
@@ -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
|
||||
23
oms/personal-cabinet/favorites.puml
Normal file
23
oms/personal-cabinet/favorites.puml
Normal file
@@ -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
|
||||
17
oms/personal-cabinet/get-info-order.puml
Normal file
17
oms/personal-cabinet/get-info-order.puml
Normal file
@@ -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
|
||||
16
oms/personal-cabinet/get-note.puml
Normal file
16
oms/personal-cabinet/get-note.puml
Normal file
@@ -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
|
||||
58
oms/process/action.puml
Normal file
58
oms/process/action.puml
Normal file
@@ -0,0 +1,58 @@
|
||||
@startuml
|
||||
mainframe TO BE применение акций и скидок в заказе B2C
|
||||
scale 1500x1500
|
||||
actor user as user
|
||||
participant ARM
|
||||
participant Sherlock
|
||||
participant Gateway
|
||||
participant Order
|
||||
participant PDM
|
||||
participant Druz
|
||||
participant SCROOGE
|
||||
participant Promo
|
||||
|
||||
autonumber
|
||||
user -> ARM: Нажимает кнопку "Применить скидки"
|
||||
ARM -> ARM: Рендерит модальное окно
|
||||
ARM -> ARM: Акции сайта - чекбокс активен
|
||||
ARM -> ARM: Скидки, выбрано: Без скидки
|
||||
autonumber 5.1
|
||||
alt Выбирает только скидки уровня ОПТ
|
||||
user -> ARM: Выбирает тип ОПТа для клиента
|
||||
user -> ARM: Снимает чекбокс "Акции сайта"
|
||||
user -> ARM: Нажимает кнопку "Применить"
|
||||
ARM -> Gateway: Передает запрос
|
||||
Gateway -> Gateway: Получает название региона из кэша
|
||||
Gateway -> SCROOGE: Запрашивает цены из SCROOGE согласно уровню ОПТа
|
||||
SCROOGE --> Gateway: answer
|
||||
autonumber 6.1
|
||||
else Выбирает только акции сайта
|
||||
user -> ARM: Оставляет чекбокс "Акции сайта"
|
||||
user -> ARM: Оставляет скидку с типом "Без скидки"
|
||||
user -> ARM: Нажимает кнопку "Применить"
|
||||
ARM -> Gateway: Передает запрос
|
||||
Gateway -> Gateway: Получает название региона из кэша
|
||||
Gateway -> Gateway: Готовит запрос в promo
|
||||
Gateway -> Promo: Запрашивает акции и цены по товарам из Promo
|
||||
Promo --> Gateway: answer
|
||||
autonumber 7.1
|
||||
else Выбирает акции и скидки ОПТ
|
||||
user -> ARM: Выбирает тип ОПТа для клиента
|
||||
user -> ARM: Оставляет чекбокс "Акции сайта"
|
||||
user -> ARM: Нажимает кнопку "Применить"
|
||||
ARM -> Gateway: Передает запрос
|
||||
Gateway -> Gateway: Получает название региона из кэша
|
||||
Gateway -> Gateway: Готовит запрос в promo
|
||||
Gateway -> Promo: Запрашивает акции и цены по товарам из Promo
|
||||
Promo --> Gateway: answer
|
||||
Gateway -> SCROOGE: Запрашивает цены из SCROOGE согласно уровню ОПТа
|
||||
SCROOGE --> Gateway: answer
|
||||
Gateway -> Gateway: Применяет наименьшие цены\nк каждому из товаров
|
||||
end
|
||||
autonumber 8
|
||||
Gateway -> Order: Записывает изменения в модель
|
||||
Order --> Gateway: Изменения успешно применены
|
||||
Gateway -> Gateway: Собирает ответ для frontend
|
||||
Gateway --> ARM: Answer
|
||||
ARM -> user: Отображает примененные акции
|
||||
@enduml
|
||||
26
oms/process/basket-import.puml
Normal file
26
oms/process/basket-import.puml
Normal file
@@ -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
|
||||
77
oms/process/booking.puml
Normal file
77
oms/process/booking.puml
Normal file
@@ -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<b>В ТЗ: Проверка наличия открытой транзакции
|
||||
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<b>В ТЗ: Функциональные изменения - "На стороне 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
|
||||
79
oms/process/correction.puml
Normal file
79
oms/process/correction.puml
Normal file
@@ -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<b>В ТЗ: Функциональные изменения\n<b>-На стороне Workflow\n<b>-"Получение доступных типов корректировок"
|
||||
Workflow -> WTIS: Запрашивает признак доступности корректировки для атрибутов
|
||||
WTIS -> Workflow: Возвращает доступные для редактирования атрибуты
|
||||
Workflow --> Gateway: Возвращает поля доступные\nдля редактирования
|
||||
Gateway --> ARM: Возвращает атрибуты\nдоступные для редактирования
|
||||
ARM --> USER: Дизейблит недоступные для\nредактирования элементы\n<b>В ТЗ: Функциональные изменения\n<b>"На стороне ARM"
|
||||
|
||||
loop Внесение корректировок пользоваелем и наполнение транзакции
|
||||
USER -> ARM: Вносит корректировки
|
||||
ARM -> Gateway: Использует стандартные\nendpoint заказа
|
||||
Gateway -> Workflow: Передает запрос в workflow
|
||||
Workflow -> Workflow: Проверяет что транзакция открыта:\n<b>В ТЗ: Проверка наличия открытой транзакции
|
||||
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: <b>oms.order.sync</b>\n<b>В ТЗ: Функциональные изменения - "На стороне 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
|
||||
59
oms/site-integration/AS IS.puml
Normal file
59
oms/site-integration/AS IS.puml
Normal file
@@ -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
|
||||
66
oms/site-integration/TO BE.puml
Normal file
66
oms/site-integration/TO BE.puml
Normal file
@@ -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
|
||||
119
ordering.puml
Normal file
119
ordering.puml
Normal file
@@ -0,0 +1,119 @@
|
||||
@startuml
|
||||
title Проверка лимитов заказа
|
||||
autonumber
|
||||
actor User
|
||||
participant ARM as ARM
|
||||
participant Gateway as Gateway
|
||||
participant Workflow as Workflow
|
||||
participant Temporal as Temporal
|
||||
|
||||
User -> ARM: Нажатие кнопки "Оформить заказ"
|
||||
ARM -> Gateway: Отправляет запрос на /orders/{orderID}/validate
|
||||
Gateway -> Temporal: Отправка данных на\nоформление заказа и его проверку
|
||||
Temporal --> Workflow: Получение сообщения
|
||||
Workflow -> Workflow: Проверка лимитов ПВЗ и размеров товаров
|
||||
Workflow -> Workflow: Завершает выполнение workflow
|
||||
Workflow -> Temporal: Отдает результат проверки в Temporal.
|
||||
Gateway --> Temporal: Слушает temporal и получает результат проверки
|
||||
Gateway --> ARM: Ответ в виде кодов ответа с /orders/{orderID}/validate
|
||||
|
||||
alt Проверки пройдены
|
||||
ARM -> ARM: Проверки пройдены успешно
|
||||
ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway
|
||||
else Проверки не пройдены
|
||||
ARM -> User: Показывает Пользователю модальное\nокно с лимитами ПВЗ и выбором\nдальнейших действий - продолжить\nоформление или отменить.
|
||||
alt Отмена оформления
|
||||
User -> ARM: Нажимает кнопку "Отменить оформление"
|
||||
ARM -> ARM: Закрывает модальное окно и ждет следующего действия от менеджера (Конец процесса)
|
||||
else Продолжение оформления
|
||||
User -> ARM: Нажимает кнопку "Продолжить оформление"
|
||||
ARM -> Gateway: Вызывает метод bf orders/{orderID}/ordering оформления заказа\nи отправляет идентификатор orderId для оформления заказа в Gateway
|
||||
end
|
||||
end
|
||||
note across: Продолжение описания алгоритма начинается с Workflow оформления заказа
|
||||
@enduml
|
||||
|
||||
|
||||
@startuml
|
||||
title Оформление заказа
|
||||
autonumber
|
||||
participant User
|
||||
participant ARM
|
||||
participant Gateway
|
||||
participant Temporal
|
||||
participant Workflow
|
||||
queue Kafka
|
||||
participant Wtis
|
||||
participant Order
|
||||
|
||||
ARM -> Gateway: Вызов метода bf orders/{orderID}/ordering
|
||||
ARM -> User: Блокирует заказ на изменение\nи выводит оповещения: "Оформление заказа",
|
||||
Gateway -> Temporal: Отправляет данные\nна оформление заказа
|
||||
Workflow --> Temporal: Получает сообщения о заказе
|
||||
Workflow -> Workflow: Создает WorkflowOrdering
|
||||
Workflow -> Temporal: Отправляет workflowID и runID
|
||||
Temporal -> Gateway: Получает workflowID и runID
|
||||
Gateway -> ARM: Отправка workflowID и runID\nв ответ на метод bf orders/{orderID}/ordering
|
||||
ARM -> ARM: Сохранение workflowID и runID в куки на 5 минут
|
||||
loop Раз в 5 секунд
|
||||
ARM -> Gateway: Периодическая проверка состояния workflow\nзапросом на orders/{orderID}/workflow/{workflowID}
|
||||
Gateway -> Temporal: Отправляет запрос на\nпроверку состояния workflow
|
||||
Workflow -> Temporal: Слушает и получает запрос\nна состояние workflow
|
||||
Workflow -> Temporal: Уточнение состояния workflow\n(в работе или завершен успешно\nили завершен с ошибкой)\n WorkflowOrdering
|
||||
Gateway -> Temporal: Слушает и получает состояния\nworkflow
|
||||
Gateway -> ARM: Получает ответ
|
||||
end
|
||||
alt До тех пор пока workflow не завершен
|
||||
ARM -> User: ARM блокирует интерфейс пользователю
|
||||
else workflow завершен успешно
|
||||
ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ оформлен". И обновляет все данные\nсодержащие статусы, подробнее описано ниже.
|
||||
else workflow завершен с ошибкой "Втис не доступен"
|
||||
ARM -> User: АРМ снимает блокировку и показывает оповещение\n"Заказ не оформлен"
|
||||
else workflow завершен с ошибкой "Не удалось взять в резерв товары"
|
||||
ARM -> User: АРМ снимает блокировку и показывает\nоповещение "Не удалось товары взять в резерв".\nИ обновляет все данных содержащие статусы,\nподробнее описано ниже.
|
||||
end
|
||||
|
||||
Workflow -> Order: Забирает структуру заказа
|
||||
Workflow -> Workflow: Конвертирует структуру заказа\nв нужную для Wtis
|
||||
Workflow -> Workflow: Создает таймер ответа\nна запрос и ждет ответ от Wtis\nTBD: Сколько таймер?
|
||||
Workflow -> Kafka: Записывает данные в топик\nKafka oms.orders.sync
|
||||
alt Успешный сценарий
|
||||
Wtis -> Kafka: Читает данные по заказу
|
||||
Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД
|
||||
Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв"
|
||||
Wtis -> Temporal: Отправляет сигнал что закончил свои флоу
|
||||
|
||||
else WTIS не доступен
|
||||
Wtis -> Kafka: Не забрал данные по заказу
|
||||
Temporal -> Temporal: по таймауту понимает что\nвтис не ответил\nTBD: Где таймер?\nНа воркфлоу или на темпорал?
|
||||
Workflow -> Temporal: Слушает Temporal и\nполучает информацию об ошибке
|
||||
Workflow -> Order: Ничего не обновляет в БД Order
|
||||
else WTIS частично взял товары в резерв
|
||||
Wtis -> Kafka: Читает данные по заказу
|
||||
Wtis -> Wtis: Создает заказ или сопоставляет\nс тем что уже есть и апдейтит\nего в БД
|
||||
Wtis -> Wtis: При необходимости резервирует\nтовары через "Умный резерв"\n(частичный резерв)
|
||||
Wtis -> Temporal: Отправляет сигнал что закончил\nсвои флоу частично
|
||||
Workflow -> Temporal: Слушает Temporal и получает\nинформацию о проведенном резерв
|
||||
Workflow -> Order: Обновляет ту часть товаров что была зарезервирована
|
||||
Workflow -> Workflow: Меняет мастер систему\nв заказе на WTIS
|
||||
Workflow -> Gateway: Возвращает ответ
|
||||
Gateway -> ARM: Возвращает ответ
|
||||
ARM -> User: Пишет сообщение пользователю:\n"Заказ не оформлен товары не зарезервировались"
|
||||
end
|
||||
Wtis -> Kafka: Записывает обновленные\nданные заказа
|
||||
Temporal -> Kafka: Слушает топик wtis.orders.sync и получает структуру даных
|
||||
Workflow -> Order: Маппит структуру и сохранет ее в Order, обновляя статусы заказов и товаров
|
||||
Workflow -> Workflow: Запускает дочерний\nworkflow SendSMSMessage
|
||||
Workflow -> Workflow: Завершает wf WorkflowOrdering
|
||||
Workflow -> Temporal: Сообщает о завершении workflow
|
||||
Gateway -> Temporal: Слушает Temporal и\nполучает сигнал что wf завершен
|
||||
Gateway --> ARM: Возвращает ответ на bf orders/{orderID}/ordering
|
||||
ARM -> User: Разблокирует интерфейс, меняет управляющие кнопки заказа
|
||||
ARM -> Gateway: Вызывает метод bf /orders/{orderID}/products\nтоварного блока обновляет статусы товаров.
|
||||
Gateway -> ARM: answer
|
||||
ARM -> Gateway: Вызывает метод bf /orders/{orderID}\nзаказа обновляет статус заказа.
|
||||
Gateway -> ARM: answer
|
||||
ARM -> Gateway: Вызывает метод bf /orders/{orderID}/deliveries\nобновляет статус доставки.
|
||||
Gateway -> ARM: answer
|
||||
|
||||
@enduml
|
||||
85
personal-cabinet.puml
Normal file
85
personal-cabinet.puml
Normal file
@@ -0,0 +1,85 @@
|
||||
@startuml
|
||||
mainframe Получение данных о заказах для ЛК пользователя
|
||||
scale 1500x1500
|
||||
actor user as user
|
||||
participant ARM
|
||||
participant Gateway
|
||||
participant Order
|
||||
|
||||
autonumber
|
||||
user -> ARM: Нажимает кнопку "Главная"
|
||||
user -> ARM: Нажимает кнопку "Статистика по заказам"
|
||||
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/stats
|
||||
Gateway -> Order: Вызывает методы для получения всех необходимых срезов по заказам
|
||||
Order --> Gateway: answer
|
||||
Gateway --> ARM: answer
|
||||
ARM --> user: Рендерит информационные блоки
|
||||
@enduml
|
||||
|
||||
|
||||
@startuml
|
||||
mainframe Получение заметки пользователя для ЛК
|
||||
scale 1500x1500
|
||||
actor user as user
|
||||
participant ARM
|
||||
participant Gateway
|
||||
participant personalCabinet
|
||||
|
||||
autonumber
|
||||
user -> ARM: Нажимает кнопку "Главная"
|
||||
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
|
||||
Gateway -> personalCabinet: Вызывает методы для получения заметок по пользователю
|
||||
personalCabinet --> Gateway: answer
|
||||
Gateway --> ARM: answer
|
||||
ARM --> user: Рендерит текст в блоке заметок
|
||||
@enduml
|
||||
|
||||
|
||||
@startuml
|
||||
mainframe Взаимодействие с избранным
|
||||
scale 1500x1500
|
||||
actor user as user
|
||||
participant ARM
|
||||
participant Gateway
|
||||
participant Order
|
||||
|
||||
autonumber
|
||||
user -> ARM: Нажимает иконку\nсердечка в любом заказе
|
||||
|
||||
alt Поле было предварительно выделено (активное состояние)
|
||||
ARM -> Gateway: Отправляет запрос на\nDELETE orders/v1/{orderID}/favorite
|
||||
else Поле было предварительно не выделено (не активное состояние)
|
||||
ARM -> Gateway: Отправляет запрос на\nPOST orders/v1/{orderID}/favorite
|
||||
end
|
||||
|
||||
Gateway -> Order: Вызывает метод\nвзаимодействия с заказом
|
||||
Order -> Order: Обновляет модель order\n(Либо добавляет uuid юзера\nлибо удаляет)
|
||||
Order --> Gateway: answer
|
||||
Gateway --> ARM: answer
|
||||
ARM --> user: answer
|
||||
@enduml
|
||||
|
||||
|
||||
@startuml
|
||||
mainframe Добавление/удаление заметки пользователя в ЛК
|
||||
scale 1500x1500
|
||||
actor user as user
|
||||
participant ARM
|
||||
participant Gateway
|
||||
participant personalCabinet
|
||||
|
||||
autonumber
|
||||
user -> ARM: Нажимает кнопку "Главная"
|
||||
alt Пользователь ввел текст и снял фокус с поля
|
||||
ARM -> Gateway: Отправляет запрос на\nPUT personal-cabinet/v1/note
|
||||
else Пользователь нажал кнопку "Очистить"
|
||||
ARM -> Gateway: Отправляет запрос на\nDELETE personal-cabinet/v1/note
|
||||
end
|
||||
|
||||
|
||||
ARM -> Gateway: Отправляет запрос на GET personal-cabinet/v1/note
|
||||
Gateway -> personalCabinet: Вызывает методы для\nизменения заметок по пользователю
|
||||
personalCabinet --> Gateway: answer
|
||||
Gateway --> ARM: answer
|
||||
ARM --> user: answer
|
||||
@enduml
|
||||
2
search/Architecture Scheme Search.drawio.xml
Normal file
2
search/Architecture Scheme Search.drawio.xml
Normal file
File diff suppressed because one or more lines are too long
37
search/Mycroft.puml
Normal file
37
search/Mycroft.puml
Normal file
@@ -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
|
||||
38
search/Sherlock scheme.puml
Normal file
38
search/Sherlock scheme.puml
Normal file
@@ -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
|
||||
4
search/Watson.drawio.svg
Normal file
4
search/Watson.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 17 KiB |
2
search/Watson.drawio.xml
Normal file
2
search/Watson.drawio.xml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mxfile host="app.diagrams.net" modified="2022-05-23T07:54:23.579Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36" etag="67KJ1o47IpnP2dD_l4sc" version="18.1.1" type="google"><diagram id="Akut9kj0bVuIZsBiPKg9" name="Dataflow">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=</diagram></mxfile>
|
||||
82
search/Watson.puml
Normal file
82
search/Watson.puml
Normal file
@@ -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
|
||||
404
search/WatsonScheme.puml
Normal file
404
search/WatsonScheme.puml
Normal file
@@ -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
|
||||
142
search/WatsonWithMicroservices.puml
Normal file
142
search/WatsonWithMicroservices.puml
Normal file
@@ -0,0 +1,142 @@
|
||||
@startuml
|
||||
skinparam linetype ortho
|
||||
'============================================================================================
|
||||
'===========================================Микросервисы=====================================
|
||||
'============================================================================================
|
||||
package Microservices <<cloud>> {
|
||||
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 <<database>> {
|
||||
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
|
||||
266
search/WatsonWithPDM.puml
Normal file
266
search/WatsonWithPDM.puml
Normal file
@@ -0,0 +1,266 @@
|
||||
@startuml
|
||||
skinparam linetype ortho
|
||||
'===============================================================================
|
||||
'===================================PDM=========================================
|
||||
'===============================================================================
|
||||
package PDM <<Cloud>> {
|
||||
abstract ProductModuleName {
|
||||
+request: GET
|
||||
+endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/products/<date>*
|
||||
+headers: Accept:application/json
|
||||
Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD
|
||||
--
|
||||
*response: guid товара
|
||||
--
|
||||
*<date> - 2019-08-16 17:00:00
|
||||
}
|
||||
|
||||
abstract CategoryModuleName {
|
||||
+request: GET
|
||||
+endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/rubrics/<date>*
|
||||
+headers: Accept:application/json
|
||||
Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD
|
||||
--
|
||||
*response: guid категории
|
||||
--
|
||||
*<date> - 2019-08-16 17:00:00
|
||||
}
|
||||
|
||||
abstract ManufacturerModuleName {
|
||||
+request: GET
|
||||
+endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/manufacturers/<date>*
|
||||
+headers: Accept:application/json
|
||||
Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD
|
||||
--
|
||||
*response: guid производителя
|
||||
--
|
||||
*<date> - 2019-08-16 17:00:00
|
||||
}
|
||||
|
||||
abstract SpecificationModuleName {
|
||||
+request: GET
|
||||
+endpoint: http://api.pdm.vseinstrumenti.ru/api/v1/tech_param/<date>*
|
||||
+headers: Accept:application/json
|
||||
Authorization:Bearer m1iXCmdwRlbqTU7gBCIe4Xpk8fIjVBGD
|
||||
--
|
||||
*response: guid изменившихся ТХ
|
||||
--
|
||||
*<date> - 2019-08-16 17:00:00
|
||||
}
|
||||
}
|
||||
|
||||
Package MySql <<database>> {
|
||||
package "Manufacter_MySql" <<Folder>> {
|
||||
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" <<Folder>> {
|
||||
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" <<Folder>> {
|
||||
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 <<Folder>> {
|
||||
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
|
||||
227
search/WatsonWithSite.puml
Normal file
227
search/WatsonWithSite.puml
Normal file
@@ -0,0 +1,227 @@
|
||||
@startuml
|
||||
skinparam linetype ortho
|
||||
|
||||
'===============================================================================
|
||||
'=====================================Kafka=====================================
|
||||
'===============================================================================
|
||||
package Site_kafka <<Cloud>> {
|
||||
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" <<database>> {
|
||||
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
|
||||
68
search/Общий процесс autocomplete.puml
Normal file
68
search/Общий процесс autocomplete.puml
Normal file
@@ -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
|
||||
55
search/Общий процесс filters.puml
Normal file
55
search/Общий процесс filters.puml
Normal file
@@ -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
|
||||
64
search/Общий процесс products.puml
Normal file
64
search/Общий процесс products.puml
Normal file
@@ -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
|
||||
BIN
search/Схема поиск.png
Normal file
BIN
search/Схема поиск.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
32
shipment.puml
Normal file
32
shipment.puml
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user