-
Notifications
You must be signed in to change notification settings - Fork 2
User story
Описание:
Как банк "Стар", мы хотим внедрить рекомендательную систему, которая будет анализировать поведение клиентов и предлагать им персонализированные банковские продукты.
Как пользователь системы, я хочу:
-
Анализировать транзакции:
- Учитывать типы продуктов (DEBIT, SAVING, INVEST, CREDIT).
- Определять суммы пополнений и трат.
-
Определять подходящие продукты:
- Использовать заранее заданные правила для каждого продукта.
- Учитывать, что для рекомендации должны выполняться все правила.
-
Предоставлять список рекомендаций:
- Через REST API с методом
GET /recommendation/<user_id>. - Возвращать JSON с идентификатором пользователя и списком рекомендуемых продуктов.
- Через REST API с методом
Функциональные требования:
-
Анализ транзакций:
- Получать данные из базы данных H2.
- Анализировать транзакции для определения типов продуктов и сумм.
-
Применение правил:
- Использовать заранее заданные правила для каждого продукта.
- Объединять правила логическими "И", "ИЛИ".
-
Генерация рекомендаций:
- Генерировать список рекомендуемых продуктов на основе выполненных правил.
- Возвращать пустой список, если рекомендаций нет.
-
REST API:
- Предоставлять метод
GET /recommendation/<user_id>. - Возвращать JSON с идентификатором пользователя и списком продуктов.
- Предоставлять метод
Нефункциональные требования:
-
Производительность:
- Обрабатывать запросы в реальном времени.
- Оптимизировать SQL-запросы.
-
Масштабируемость:
- Разрабатывать с учетом возможности расширения.
- Компоненты должны быть легко тестируемы и поддерживаемы.
-
Безопасность:
- Обеспечивать безопасный доступ к базе данных и API.
Пример использования:
Входные данные:
- Идентификатор пользователя:
cd515076-5d8a-44be-930e-8d4fcb79f42d
Выходные данные:
{
"user_id": "cd515076-5d8a-44be-930e-8d4fcb79f42d",
"recommendations": [
{
"name": "Invest 500",
"id": "147f6a0f-3b91-413b-ab99-87f081d60d5a",
"text": "Откройте свой путь к успеху с индивидуальным инвестиционным счетом (ИИС) от нашего банка! Воспользуйтесь налоговыми льготами и начните инвестировать с умом. Пополните счет до конца года и получите выгоду в виде вычета на взнос в следующем налоговом периоде. Не упустите возможность разнообразить свой портфель, снизить риски и следить за актуальными рыночными тенденциями. Откройте ИИС сегодня и станьте ближе к финансовой независимости!"
}
]
}Дополнительные требования:
- Реализовать как Spring Boot приложение.
- Использовать JdbcTemplate для работы с базой данных.
- Код должен быть структурирован и легко тестируем с использованием Mockito и JUnit.
Приоритет: Высокий
Срок выполнения: До конца текущей итерации разработки.
Описание:
Как банк "Стар", мы хотим расширить функциональность нашей рекомендательной системы, добавив возможность динамического создания, удаления и получения правил рекомендаций. Это позволит нам гибко адаптировать систему под изменяющиеся потребности и стратегии маркетинга.
Как пользователь системы, я хочу:
-
Добавлять новые правила рекомендаций:
- Создавать динамические правила, которые будут определять, какие продукты рекомендовать пользователям.
- Каждое правило должно состоять из одного или нескольких запросов, объединенных логическим "И".
-
Удалять существующие правила:
- Удалять динамические правила, которые больше не актуальны или не нужны.
-
Получать список всех правил:
- Просматривать все созданные динамические правила для контроля и анализа.
-
Использовать динамические правила в рекомендациях:
- Система должна проверять выполнение динамических правил при формировании рекомендаций для пользователей.
- Если правила выполняются, продукт, связанный с этими правилами, должен быть добавлен в список рекомендаций.
Функциональные требования:
-
API для управления правилами:
- Создать три метода REST API:
-
POST /ruleдля добавления нового правила. -
DELETE /rule/{rule_id}для удаления правила. -
GET /ruleдля получения списка всех правил.
-
- Создать три метода REST API:
-
Типы запросов:
- Поддержка четырех типов запросов:
-
USER_OF— проверка, является ли пользователь пользователем продукта. -
ACTIVE_USER_OF— проверка, является ли пользователь активным пользователем продукта. -
TRANSACTION_SUM_COMPARE— сравнение суммы транзакций с константой. -
TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW— сравнение суммы пополнений с тратами по продукту.
-
- Поддержка четырех типов запросов:
-
Использование динамических правил:
- При запросе рекомендаций (
GET /recommendation/{user_id}) система должна проверять выполнение всех динамических правил и добавлять соответствующие продукты в список рекомендаций.
- При запросе рекомендаций (
-
Кеширование результатов:
- Кешировать результаты SQL-запросов к базе данных для повышения производительности.
- Использовать библиотеку Caffeine или Spring Cache для реализации кеширования.
-
Подключение второй базы данных:
- Использовать PostgreSQL для хранения динамических правил.
- Настроить подключение к PostgreSQL через Spring Data JPA.
- Использовать Liquibase для управления миграциями базы данных.
Нефункциональные требования:
-
Производительность:
- Обеспечить быструю обработку запросов на добавление, удаление и получение правил.
- Оптимизировать SQL-запросы для быстрого получения данных.
-
Масштабируемость:
- Система должна быть готова к расширению и поддерживать большое количество динамических правил.
-
Безопасность:
- Обеспечить безопасный доступ к API для управления правилами.
- Защитить базу данных от несанкционированного доступа.
Пример использования:
Добавление нового правила:
Request:
POST /rule
{
"product_name": "Простой кредит",
"product_id": "ab138afb-f3ba-4a93-b74f-0fcee86d447f",
"product_text": "<текст рекомендации>",
"rule": [
{
"query": "USER_OF",
"arguments": ["CREDIT"],
"negate": true
},
{
"query": "TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW",
"arguments": ["DEBIT", ">"],
"negate": false
},
{
"query": "TRANSACTION_SUM_COMPARE",
"arguments": ["DEBIT", "DEPOSIT", ">", "100000"],
"negate": false
}
]
}Response:
200 OK
{
"id": "<некий сгенерированный id>",
"product_name": "Простой кредит",
"product_id": "ab138afb-f3ba-4a93-b74f-0fcee86d447f",
"product_text": "<текст рекомендации>",
"rule": [
{
"query": "USER_OF",
"arguments": ["CREDIT"],
"negate": true
},
{
"query": "TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW",
"arguments": ["DEBIT", ">"],
"negate": false
},
{
"query": "TRANSACTION_SUM_COMPARE",
"arguments": ["DEBIT", "DEPOSIT", ">", "100000"],
"negate": false
}
]
}Получение списка всех правил:
Request:
GET /ruleResponse:
200 OK
{
"data": [
{
"id": "<некий сгенерированный id>",
"product_name": "Простой кредит",
"product_id": "ab138afb-f3ba-4a93-b74f-0fcee86d447f",
"product_text": "<текст рекомендации>",
"rule": [
{
"query": "USER_OF",
"arguments": ["CREDIT"],
"negate": true
},
{
"query": "TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW",
"arguments": ["DEBIT", ">"],
"negate": false
},
{
"query": "TRANSACTION_SUM_COMPARE",
"arguments": ["DEBIT", "DEPOSIT", ">", "100000"],
"negate": false
}
]
},
...
]
}Удаление правила:
Request:
DELETE /rule/<rule_id>Response:
204 No ContentПриоритет: Высокий
Срок выполнения: До конца текущей итерации разработки.