Skip to content

User story

Aleksandr Gorohov edited this page Nov 25, 2024 · 10 revisions

User Story US001: Рекомендательная система для банка "Стар"

Описание:

Как банк "Стар", мы хотим внедрить рекомендательную систему, которая будет анализировать поведение клиентов и предлагать им персонализированные банковские продукты.

Как пользователь системы, я хочу:

  1. Анализировать транзакции:

    • Учитывать типы продуктов (DEBIT, SAVING, INVEST, CREDIT).
    • Определять суммы пополнений и трат.
  2. Определять подходящие продукты:

    • Использовать заранее заданные правила для каждого продукта.
    • Учитывать, что для рекомендации должны выполняться все правила.
  3. Предоставлять список рекомендаций:

    • Через REST API с методом GET /recommendation/<user_id>.
    • Возвращать JSON с идентификатором пользователя и списком рекомендуемых продуктов.

Функциональные требования:

  1. Анализ транзакций:

    • Получать данные из базы данных H2.
    • Анализировать транзакции для определения типов продуктов и сумм.
  2. Применение правил:

    • Использовать заранее заданные правила для каждого продукта.
    • Объединять правила логическими "И", "ИЛИ".
  3. Генерация рекомендаций:

    • Генерировать список рекомендуемых продуктов на основе выполненных правил.
    • Возвращать пустой список, если рекомендаций нет.
  4. REST API:

    • Предоставлять метод GET /recommendation/<user_id>.
    • Возвращать JSON с идентификатором пользователя и списком продуктов.

Нефункциональные требования:

  1. Производительность:

    • Обрабатывать запросы в реальном времени.
    • Оптимизировать SQL-запросы.
  2. Масштабируемость:

    • Разрабатывать с учетом возможности расширения.
    • Компоненты должны быть легко тестируемы и поддерживаемы.
  3. Безопасность:

    • Обеспечивать безопасный доступ к базе данных и 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.

Приоритет: Высокий

Срок выполнения: До конца текущей итерации разработки.

User Story US002: Динамические правила рекомендаций для банка "Стар"

Описание:

Как банк "Стар", мы хотим расширить функциональность нашей рекомендательной системы, добавив возможность динамического создания, удаления и получения правил рекомендаций. Это позволит нам гибко адаптировать систему под изменяющиеся потребности и стратегии маркетинга.

Как пользователь системы, я хочу:

  1. Добавлять новые правила рекомендаций:

    • Создавать динамические правила, которые будут определять, какие продукты рекомендовать пользователям.
    • Каждое правило должно состоять из одного или нескольких запросов, объединенных логическим "И".
  2. Удалять существующие правила:

    • Удалять динамические правила, которые больше не актуальны или не нужны.
  3. Получать список всех правил:

    • Просматривать все созданные динамические правила для контроля и анализа.
  4. Использовать динамические правила в рекомендациях:

    • Система должна проверять выполнение динамических правил при формировании рекомендаций для пользователей.
    • Если правила выполняются, продукт, связанный с этими правилами, должен быть добавлен в список рекомендаций.

Функциональные требования:

  1. API для управления правилами:

    • Создать три метода REST API:
      • POST /rule для добавления нового правила.
      • DELETE /rule/{rule_id} для удаления правила.
      • GET /rule для получения списка всех правил.
  2. Типы запросов:

    • Поддержка четырех типов запросов:
      • USER_OF — проверка, является ли пользователь пользователем продукта.
      • ACTIVE_USER_OF — проверка, является ли пользователь активным пользователем продукта.
      • TRANSACTION_SUM_COMPARE — сравнение суммы транзакций с константой.
      • TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW — сравнение суммы пополнений с тратами по продукту.
  3. Использование динамических правил:

    • При запросе рекомендаций (GET /recommendation/{user_id}) система должна проверять выполнение всех динамических правил и добавлять соответствующие продукты в список рекомендаций.
  4. Кеширование результатов:

    • Кешировать результаты SQL-запросов к базе данных для повышения производительности.
    • Использовать библиотеку Caffeine или Spring Cache для реализации кеширования.
  5. Подключение второй базы данных:

    • Использовать PostgreSQL для хранения динамических правил.
    • Настроить подключение к PostgreSQL через Spring Data JPA.
    • Использовать Liquibase для управления миграциями базы данных.

Нефункциональные требования:

  1. Производительность:

    • Обеспечить быструю обработку запросов на добавление, удаление и получение правил.
    • Оптимизировать SQL-запросы для быстрого получения данных.
  2. Масштабируемость:

    • Система должна быть готова к расширению и поддерживать большое количество динамических правил.
  3. Безопасность:

    • Обеспечить безопасный доступ к 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 /rule

Response:

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

Приоритет: Высокий

Срок выполнения: До конца текущей итерации разработки.

User Story US003: Рекомендации через телеграм-бота и статистика срабатывания правил

Описание:

Как банк "Стар", мы хотим расширить нашу рекомендательную систему, добавив возможность взаимодействия с пользователями через телеграм-бота. Бот будет выдавать персонализированные рекомендации по имени пользователя. Также мы хотим вести статистику срабатывания динамических правил рекомендаций.

Как пользователь системы, я хочу:

  1. Получать рекомендации через телеграм-бота:

    • При первом обращении бот должен приветствовать меня и выдавать справку.
    • Команда /recommend username должна возвращать рекомендации для указанного пользователя.
    • Если пользователь не найден или найдено несколько пользователей, бот должен выдавать сообщение «Пользователь не найден».
  2. Вести статистику срабатывания правил:

    • Система должна отслеживать, сколько раз каждое динамическое правило рекомендаций было выполнено.
    • При удалении правила его статистика также должна быть удалена.
    • Возможность получать статистику срабатываний по всем правилам через REST API.
  3. Управлять кешем рекомендаций:

    • Возможность сбрасывать кеш всех запросов в системе через POST-запрос /management/clear-caches.
  4. Получать информацию о сервисе:

    • Возможность получать название и версию сервиса через запрос /management/info.

Функциональные требования:

  1. Телеграм-бот:

    • При первом обращении бот должен приветствовать пользователя и выдавать справку.
    • Команда /recommend username должна возвращать рекомендации для указанного пользователя в формате:
      Здравствуйте <Имя и фамилия пользователя>
      Новые продукты для вас:
      список продуктов с рекомендациями, удобно отформатированный.
      
    • Если пользователь не найден или найдено несколько пользователей, бот должен выдавать сообщение «Пользователь не найден».
  2. Статистика срабатывания правил:

    • Система должна вести статистику срабатываний динамических правил рекомендаций.
    • При удалении правила его статистика также должна быть удалена.
    • Возможность получать статистику срабатываний по всем правилам через запрос:
      GET /rule/stats
      
    • Если по правилу еще не было ни одного срабатывания, оно должно присутствовать в списке со значением 0.
  3. Сброс кеша:

    • Возможность сбрасывать кеш всех запросов в системе через запрос:
      POST /management/clear-caches
      
    • Этот запрос не принимает тело и не возвращает данные.
  4. Информация о сервисе:

    • Возможность получать название и версию сервиса через запрос:
      GET /management/info
      
    • Ответ должен содержать:
      {
        "name": "<название сервиса>",
        "version": "<версия сервиса из файла pom.xml>"
      }

Нефункциональные требования:

  1. Производительность:

    • Обеспечить быструю обработку запросов от телеграм-бота и REST API.
    • Оптимизировать SQL-запросы для быстрого получения данных.
  2. Масштабируемость:

    • Система должна быть готова к расширению и поддерживать большое количество пользователей и правил.
  3. Безопасность:

    • Обеспечить безопасный доступ к 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"
}

Приоритет: Высокий

Срок выполнения: До конца текущей итерации разработки.

Clone this wiki locally