Initial commit

This commit is contained in:
Andrey
2024-04-08 19:15:50 +03:00
commit 072ced2815
51 changed files with 2926 additions and 0 deletions

8
.idea/.gitignore generated vendored Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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
View File

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

View 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
View 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

View 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

View 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

View 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
View File

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

85
personal-cabinet.puml Normal file
View File

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

File diff suppressed because one or more lines are too long

37
search/Mycroft.puml Normal file
View 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

View 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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

2
search/Watson.drawio.xml Normal file
View 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
View 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
View 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

View 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
View 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
View 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

View 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

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

32
shipment.puml Normal file
View 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