Skip to content

Repository files navigation

Разработка приложения (консольного) для отслеживания заявок сотрудников.

Система управления заявками — это консольное приложение на языке Python, предназначенное для отслеживания и обработки рабочих заявок сотрудников в рамках структурированного жизненного цикла. Система предоставляет полный набор функций СУБД, обеспечивает соблюдение строгих бизнес-правил и включает широкие возможности для тестирования производительности с использованием PostgreSQL.
Бизнес-процесс Заявка проходит следующие этапы: Новая → В работе → Выполнена

Установка зависимостей

  • PostgreSQL
  • Python 3.6+

Инструкции по запуску

bash
python -m venv venv
.\venv\Scripts\Activate.ps1 // source venv/bin/activate (ubuntu)
pip install --upgrade pip
pip install -r requirements.txt
python app.py

database PostgreSQL

bash
psql
CREATE DATABASE applicationdb;
CREATE USER postgres WITH PASSWORD 'postgres';  
GRANT ALL PRIVILEGES ON DATABASE applicationdb TO postgres;

подготовка параметра среды

.env

bash
DB_HOST=localhost
DB_NAME=applicationdb
DB_USER=postgres
DB_PASSWORD=postgres

описание реализованного бизнес-процесса:

Все операции с базой данных инкапсулированы в классе Database.

  1. Добавить сотрудника: Вставить нового сотрудника и вернуть ID, чтобы получить сгенерированный ключ.
  2. Список сотрудников : Извлекать записи в виде объектов.
  3. Добавить заявка": Вставить новые записи и вернуть ID, чтобы получить сгенерированный ключ.
  4. Список заявок (с фильтрами): создать динамическое условие WHERE на основе фильтров (статус, исполнитель, отдел, просрочка).
  5. Статус заявка на изменение: Проверить, входит ли данный переход состояний в список «Допустимые переходы», и, если да «true», внести изменение. В противном случае вернуть «false».
  6. Изменить исполнителя заявки: Изменить исполнителя можно только в том случае, если заявка является новым или находится в процессе выполнения.
  7. Отчеты
  • подсчитать количество запросов в каждой категории статусов.
  • подсчитать все запросы, срок выполнения которых истек, но которые еще не завершены.
  • перечислить количество выполненных заявок для каждого исполнителя,
  1. Сгенерировать тестовые данные (1 млн заявок, 1 тыс. сотрудников): заполнить базу данных тестовыми данными
  2. Тест производительности (до оптимизации): Выполнить запрос: вывести все просроченные заявки конкретного исполнителя, находящиеся в статусе «В работе», отсортированные по сроку выполнения. В этой функции измеряется время выполнения (в секундах) с помощью метода time.time() в Python. Возвращается кортеж (elapsed_time, number_of_rows_returned). Он используется как до, так и после создания индекса для демонстрации оптимизации.
  3. Создание индексов (оптимизация): Создать три индекса для таблицы application с целью повышения производительности запросов:
  • idx_applications_executor — по столбцу executor_id.
  • idx_applications_status — по столбцу status.
  • idx_applications_executor_status_deadline — составной индекс по полям (executor_id, status, deadline), специально предназначенный для ускорения выполнения запросов.
  1. Тест производительности (после оптимизации): выполнить функциональное нагрузочное тестирование после внесения оптимизаций

Результаты измерения производительности

  • Сначала был запущен запрос для извлечения просроченных запросов (с крайним сроком до сегодняшнего дня), которые в данный момент находятся в процессе обработки и назначены конкретному исполнителю, отсортированных по крайнему сроку. Он вернул 303 записи за 0,1078 секунды. После применения оптимизирующего индекса время обработки 322 записей сократилось до 0,0164.
  • Индекс охватывает все столбцы условия WHERE и включает столбец ORDER BY. Теперь база данных может использовать высокоселективный просмотр индекса для извлечения только строк, соответствующих фильтру, и возвращать строки, уже отсортированные по сроку выполнения, непосредственно из индекса, что позволяет исключить отдельный этап сортировки.
  • Ускорение = (Время до) / (Время после)= 0.1078 / 0.0164 ≈ 6.57×
  • Сокращение времени = (0.1078 − 0.0164) / 0.1078 × 100% ≈ 84.8%

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages