-
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Приоритет: Высокий
Срок выполнения: До конца текущей итерации разработки.
Описание:
Как банк "Стар", мы хотим расширить нашу рекомендательную систему, добавив возможность взаимодействия с пользователями через телеграм-бота. Бот будет выдавать персонализированные рекомендации по имени пользователя. Также мы хотим вести статистику срабатывания динамических правил рекомендаций.
Как пользователь системы, я хочу:
-
Получать рекомендации через телеграм-бота:
- При первом обращении бот должен приветствовать меня и выдавать справку.
- Команда
/recommend usernameдолжна возвращать рекомендации для указанного пользователя. - Если пользователь не найден или найдено несколько пользователей, бот должен выдавать сообщение «Пользователь не найден».
-
Вести статистику срабатывания правил:
- Система должна отслеживать, сколько раз каждое динамическое правило рекомендаций было выполнено.
- При удалении правила его статистика также должна быть удалена.
- Возможность получать статистику срабатываний по всем правилам через REST API.
-
Управлять кешем рекомендаций:
- Возможность сбрасывать кеш всех запросов в системе через POST-запрос
/management/clear-caches.
- Возможность сбрасывать кеш всех запросов в системе через POST-запрос
-
Получать информацию о сервисе:
- Возможность получать название и версию сервиса через запрос
/management/info.
- Возможность получать название и версию сервиса через запрос
Функциональные требования:
-
Телеграм-бот:
- При первом обращении бот должен приветствовать пользователя и выдавать справку.
- Команда
/recommend usernameдолжна возвращать рекомендации для указанного пользователя в формате:Здравствуйте <Имя и фамилия пользователя> Новые продукты для вас: список продуктов с рекомендациями, удобно отформатированный. - Если пользователь не найден или найдено несколько пользователей, бот должен выдавать сообщение «Пользователь не найден».
-
Статистика срабатывания правил:
- Система должна вести статистику срабатываний динамических правил рекомендаций.
- При удалении правила его статистика также должна быть удалена.
- Возможность получать статистику срабатываний по всем правилам через запрос:
GET /rule/stats - Если по правилу еще не было ни одного срабатывания, оно должно присутствовать в списке со значением 0.
-
Сброс кеша:
- Возможность сбрасывать кеш всех запросов в системе через запрос:
POST /management/clear-caches - Этот запрос не принимает тело и не возвращает данные.
- Возможность сбрасывать кеш всех запросов в системе через запрос:
-
Информация о сервисе:
- Возможность получать название и версию сервиса через запрос:
GET /management/info - Ответ должен содержать:
{ "name": "<название сервиса>", "version": "<версия сервиса из файла pom.xml>" }
- Возможность получать название и версию сервиса через запрос:
Нефункциональные требования:
-
Производительность:
- Обеспечить быструю обработку запросов от телеграм-бота и REST API.
- Оптимизировать SQL-запросы для быстрого получения данных.
-
Масштабируемость:
- Система должна быть готова к расширению и поддерживать большое количество пользователей и правил.
-
Безопасность:
- Обеспечить безопасный доступ к API для управления кешем и получения информации о сервисе.
- Защитить базу данных от несанкционированного доступа.
Пример использования:
Телеграм-бот:
При первом обращении:
Бот: Привет! Я бот банка "Стар". Введите /recommend username, чтобы получить рекомендации.
Команда /recommend username:
Бот: Здравствуйте Иван Иванов
Новые продукты для вас:
1. Простой кредит
Откройте мир выгодных кредитов с нами!
2. Invest 500
Откройте свой путь к успеху с индивидуальным инвестиционным счетом (ИИС) от нашего банка!
Если пользователь не найден:
Бот: Пользователь не найден
Статистика срабатывания правил:
Request:
GET /rule/stats
Response:
200 OK
{
"stats": [
{
"rule_id": "<id правила>",
"count": "<число срабатываний этого правила>"
},
{
"rule_id": "<id правила>",
"count": "<число срабатываний этого правила>"
}
]
}Сброс кеша:
Request:
POST /management/clear-caches
Response:
204 No Content
Информация о сервисе:
Request:
GET /management/info
Response:
200 OK
{
"name": "Рекомендательная система банка 'Стар'",
"version": "1.0.0"
}Приоритет: Высокий
Срок выполнения: До конца текущей итерации разработки.