Микросервис promo
Микросервис promo предоставляет функциональность по заведению и применению скидок.
Доступ к сервису предоставляется по запросу.
Логика работы
В работе микросервиса участвуют следующие сущности:
- Скидка (Promo) - содержит информацию о скидке (id, название, метод применения, клиенты, на которых распространяется скидка, статус, дата начала и окончания действия и др.)
- Настройка (Setting) - содержит данные о настройке скидки (ключ, значение, описание)
- Промо продукт (PromoProduct) - содержит информацию о продукте/варианте продукта и его скидке (артикул продукта/варианта продукта, количество товара в штуках, цена за единицу товара, цена со скидкой за единицу товара, стоимость общего количества товара с учетом скидки, величина скидки на весь товар и др.)
Аутентификация
При обращении к микросервису через API в запросах на создание, редактирование или удаление скидок и настроек аутентификация не требуется.
Service context path
/api/promo/
Настройки и параметры конфигурации
Параметры конфигурации указываются в Vault.
Vault используется на нашей платформе в качестве хранилища всех конфигураций развертывания. Инструмент может быть выбран другой.
{
"env": {
"JAVA_XMS": "XXm",
"JAVA_XMX": "YYYm",
"SPRING_DATA_MONGODB_DATABASE": "название_бд",
"SPRING_DATA_MONGODB_PORT": "порт_бд",
"SPRING_DATA_MONGODB_USERNAME": "юзернейм_для_бд"
}
}
// пример взят с тестового стенда
{
"env": {
"AUTH_ENABLED": "флаг_активации_аутентификации",
"OAUTH_ECOM_CLIENT_ID": "токен_приложения_ECOM_OAuth",
"OAUTH_ZITADEL_CLIENT_ID": "токен_приложения_Zitadel",
"OAUTH_ZITADEL_ISSUER_URI": "url_Zitadel",
"SPRING_DATA_MONGODB_HOST": "хост_бд",
"SPRING_DATA_MONGODB_PASSWORD": "пароль_для_бд"
}
}
{
"key": "LIMIT",
"value": "70.0",
"description": "Limit of the maximum
promotion percentage"
}
{
"key": "LIMIT",
"value": "70.0",
"description": "Limit of the maximum
promotion percentage"
}
- 201 - операция прошла успешно, настройка создана
- 409 - ошибка, настройка уже существует
- 400 - ошибка, не удалось создать настройку
- 404 - ошибка, не удалось найти
настройку
- Получение настройки по ее ключу - GET запрос, /v1/settings/{key}
key - path-параметр, обязательный: уникальный идентификатор
настройки
{
"key": "LIMIT",
"value": "90",
"description": null
}
200 - операция выполнена успешно, получены данные настройки
- Редактирование настройки по ее ключу - PATCH запрос, /v1/settings/{key}
key - path-параметр, обязательный: уникальный идентификатор
настройки
{
"key": "LIMIT",
"value": "70.0",
"description": "Limit
of the maximum promotion percentage"
}
{
"key": "LIMIT",
"value": "70.0",
"description": "Limit
of the maximum promotion percentage"
}
- 200 - операция прошла успешно, настройка отредактирована
- 404 - ошибка, не удалось найти настройку
- Удаление настройки по ее ключу - DELETE запрос, /v1/settings/{key}
key - path-параметр, обязательный: уникальный идентификатор
настройки
Отсутствует. В ответе приходит только код операции, например, 204.
- 204 - операция выполнена успешно, настройка удалена
- 404 - ошибка, настройка не найдена
Работа со скидками
- Получение списка всех скидок - GET запрос, /v1/promos
page - query-параметр: номер страницы
size -
query-параметр: размер страницы
sort - query-параметр: сортировка
скидок
status - query-параметр: статус скидок
{
"content": [
{
"id":
"93929a1e-033c-4716-8cda-496e027a1a6c",
"name": "filter test",
"applying": "AUTO",
"entity":
"PRODUCT",
"userIds": [],
"combination": "SUMMARIZE",
"startDate": "03-12-2023
21:00:00",
"endDate": null,
"status": "ACTIVE",
"articleIds": [
"1001523DC",
"1001627DC"
],
"discountType":
"PERCENT",
"discount": 71
},
{
"id":
"911fb1c8-c4fe-4a28-b305-f38f7117502f",
"name": null,
"applying": "AUTO",
"entity":
"PRODUCT",
"userIds": [],
"combination": "SUMMARIZE",
"startDate": "10-03-2024
21:00:00",
"endDate": null,
"status": "ACTIVE",
"articleIds": [
"1001429DC",
"1001457DC",
"1001458DC"
],
"discountType": "PERCENT",
"discount": 55
},
{
"id": "e6aefb70-a231-41b7-966c-7d48d3c5cf79",
"name": null,
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [],
"combination":
"EXCLUDE",
"startDate":
null,
"endDate": null,
"status": "ACTIVE",
"articleIds": [
"1009029DC"
],
"discountType":
"PERCENT",
"discount": 44
}
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"pageSize": 3,
"pageNumber":
0,
"offset": 0,
"paged": true,
"unpaged":
false
},
"last": false,
"totalPages": 6,
"totalElements":
16,
"first": true,
"numberOfElements": 3,
"sort": {
"sorted": false,
"unsorted":
true,
"empty": true
},
"size": 3,
"number": 0,
"empty": false
}
200 - операция выполнена успешно, получен список скидок
- Получение скидки по ее ID - GET запрос, /v1/promos/{id}
id - path-параметр, обязательный: уникальный идентификатор
скидки
{
"id":
"911fb1c8-c4fe-4a28-b305-f38f7117502f",
"name":
null,
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [],
"combination": "SUMMARIZE",
"startDate":
"10-03-2024 21:00:00",
"endDate": null,
"status": "ACTIVE",
"articleIds":
[
"1001429DC",
"1001457DC",
"1001458DC"
],
"discountType": "PERCENT",
"discount": 55
}
- 200 - операция выполнена успешно, получены данные скидки
- 404 - ошибка, скидка не
найдена
- Получение страницы скидок с возможностью фильтрации - GET запрос, /v1/promos/page
page - query-параметр: номер страницы
size -
query-параметр: размер страницы
sort - query-параметр: сортировка
скидок
searchTerm - query-параметр: поисковый запрос
пользователя
name - query-параметр: обозначение скидки
applyingSet - query-параметр: метод скидки
combinationSet -
query-параметр: комбинации скидки
statusSet - query-параметр:
статус скидки
discountFirstValue - query-параметр: первый числовой
параметр фильтра "Скидка"
discountFirstOperator - query-параметр:
первый числовой оператор фильтра "Скидка" (например, "меньше")
discountFilterConnectiveType - query-параметр: тип соединения числовых
параметров фильтра "Скидка" (например, "AND" или "OR")
discountSecondValue - query-параметр: второй числовой параметр фильтра
"Скидка"
discountSecondOperator - query-параметр: второй числовой
оператор фильтра "Скидка" (например, "больше")
productArticleId -
query-параметр: артикул продукта
variantsArticleId -
query-параметр: артикул варианта продукта
userId - query-параметр:
идентификатор клиента
productName - query-параметр: название
продукта
variantsName - query-параметр: название варианта
продукта
startDate - query-параметр: дата начала действия
скидки
endDate - query-параметр: дата окончания действия
скидки
{
"content": [
{
"id":
"e6aefb70-a231-41b7-966c-7d48d3c5cf79",
"name": null,
"applying": "AUTO",
"entity":
"PRODUCT",
"userIds": [],
"combination": "EXCLUDE",
"startDate": null,
"endDate": null,
"status": "ACTIVE",
"articleIds": [
"1009029DC"
],
"discountType": "PERCENT",
"discount": 44
},
{
"id": "cea19eb6-58d0-4014-912c-0ac1ade70ddc",
"name": null,
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [],
"combination":
"EXCLUDE",
"startDate":
null,
"endDate": null,
"status": "ACTIVE",
"articleIds": [],
"discountType": "PERCENT",
"discount": 43
}
],
"pageable": {
"sort": {
"sorted":
true,
"unsorted": false,
"empty": false
},
"pageSize": 2,
"pageNumber": 0,
"offset": 0,
"paged": true,
"unpaged": false
},
"last": true,
"totalPages": 1,
"totalElements": 2,
"first": true,
"numberOfElements": 2,
"sort": {
"sorted": true,
"unsorted": false,
"empty": false
},
"size": 2,
"number": 0,
"empty": false
}
200 - операция выполнена успешно, получена отфильтрованная страница со скидками
- Получение отфильтрованного списка скидок - GET запрос, /v1/promos/list
page - query-параметр: номер страницы
size -
query-параметр: размер страницы
sort - query-параметр: сортировка
скидок
searchTerm - query-параметр: поисковый запрос
пользователя
name - query-параметр: обозначение скидки
applyingSet - query-параметр: метод скидки
combinationSet -
query-параметр: комбинации скидки
statusSet - query-параметр:
статус скидки
discountFirstValue - query-параметр: первый числовой
параметр фильтра "Скидка"
discountFirstOperator - query-параметр:
первый числовой оператор фильтра "Скидка" (например, "меньше")
discountFilterConnectiveType - query-параметр: тип соединения числовых
параметров фильтра "Скидка" (например, "AND" или "OR")
discountSecondValue - query-параметр: второй числовой параметр фильтра
"Скидка"
discountSecondOperator - query-параметр: второй числовой
оператор фильтра "Скидка" (например, "больше")
productArticleId -
query-параметр: артикул продукта
variantsArticleId -
query-параметр: артикул варианта продукта
userId - query-параметр:
идентификатор клиента
productName - query-параметр: название
продукта
variantsName - query-параметр: название варианта
продукта
startDate - query-параметр: дата начала действия
скидки
endDate - query-параметр: дата окончания действия
скидки
[
{
"id":
"e6aefb70-a231-41b7-966c-7d48d3c5cf79",
"name": null,
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [],
"combination":
"EXCLUDE",
"startDate": null,
"endDate": null,
"status": "ACTIVE",
"articleIds": [
"1009029DC"
],
"discountType":
"PERCENT",
"discount": 44
},
{
"id": "cea19eb6-58d0-4014-912c-0ac1ade70ddc",
"name": null,
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [],
"combination":
"EXCLUDE",
"startDate": null,
"endDate": null,
"status": "ACTIVE",
"articleIds": [],
"discountType": "PERCENT",
"discount": 43
}
]
200 - операция выполнена успешно, получен отфильтрованный список скидок
- Создание скидки - POST запрос, /v1/promos
{
"name": "Bestsellers 7%",
"applying": "AUTO",
"entity":
"PRODUCT",
"userIds": [
"201539523727877663",
"202010411006977567"
],
"combination": "SUMMARIZE",
"startDate": "17-08-2023
00:00:00",
"endDate": "31-12-2023 23:59:59",
"articleIds": [
"1000009",
"1000238DC"
],
"discountType": "PERCENT",
"discount": 4.99
}
{
"id":
"4b7e6hjA-107b-476b-816a-51hh256a30d1",
"name":
"Bestsellers 7%",
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [
"201539523727877663",
"202010411006977567"
],
"combination": "SUMMARIZE",
"startDate": "17-08-2023
00:00:00",
"endDate": "31-12-2023 23:59:59",
"articleIds": [
"1000009",
"1000238DC"
],
"discountType": "PERCENT",
"discount": 4.99
}
201 - операция выполнена успешно, скидка создана
- Перезагрузка скидок из БД - POST запрос, /v1/promos/reload
Отсутствует.
Отсутствует. В ответе приходит только код операции, например, 201.
201 - операция выполнена успешно
- Редактирование скидки - PATCH запрос, /v1/promos/{id}
id - path-параметр, обязательный: уникальный идентификатор
скидки
{
"id":
"4b7e6hjA-107b-476b-816a-51hh256a30d1",
"name":
"Bestsellers 7%",
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [
"201539523727877663",
"202010411006977567"
],
"combination": "SUMMARIZE",
"startDate": "17-08-2023
00:00:00",
"endDate": "31-12-2023 23:59:59",
"articleIds": [
"1000009",
"1000238DC"
],
"discountType": "PERCENT",
"discount": 4.99
}
{
"id":
"4b7e6hjA-107b-476b-816a-51hh256a30d1",
"name":
"Bestsellers 7%",
"applying": "AUTO",
"entity": "PRODUCT",
"userIds": [
"201539523727877663",
"202010411006977567"
],
"combination": "SUMMARIZE",
"startDate": "17-08-2023
00:00:00",
"endDate": "31-12-2023 23:59:59",
"articleIds": [
"1000009",
"1000238DC"
],
"discountType": "PERCENT",
"discount": 4.99
}
200 - операция выполнена успешно, скидка обновлена
- Удаление скидки - DELETE запрос, /v1/promos/{id}
id - path-параметр, обязательный: уникальный идентификатор
скидки
Отсутствует. В ответе приходит только код операции, например, 204.
- 204 - операция выполнена успешно, скидка удалена
- 404 - ошибка, скидка не найдена
Работа с калькулятором скидок
- Расчет стоимости товаров с учетом скидки - POST запрос, /v1/promo-calculate/products
{
"articleId": "1009029DC", // id товара
"quantity": 10, // количество товара
"unitPrice": 10, // цена на одну единицу товара
"price": 100, // стоимость всего количества товара
"currencyId": "b7843131-85ae-454b-a116-794b64435eca" // id валюты, в которой исчисляется цена
}
{
"articleId": "1009029DC",
"quantity": 10,
"unitPrice": 10,
"discountUnitPrice": 8, // цена со скидкой на единицу товара
"price": 100,
"discountPrice": 80, // стоимость всего количества товара с учетом скидки
"discountSum": 20, // величина скидки на весь товар
"currencyId": "b7843131-85ae-454b-a116-794b64435eca"
}
200 - операция выполнена успешно, скидка для продукта/варианта продукта рассчитана