Техническое задание
Презентация
Хакатон
Эта документация описывает развертывание системы, состоящей из нескольких контейнеров Docker, которые обеспечивают работу баз данных, ETL-процесса, бекенда и фронтенда. Все компоненты взаимодействуют друг с другом для предоставления полноценного решения.
Система состоит из следующих основных компонентов:
- Фронтенд: Веб-интерфейс для взаимодействия с пользователем
- Бекенд: Сервис, предоставляющий API и логику приложения.
- ETL-процесс: Обработка данных и их перемещение из JSON в хранилище.
- База данных: Используется PostgreSQL для хранения данных.
Аппаратные требования
- Процессор: Минимум двухъядерный процессор
- Оперативная память: 4 ГБ и выше
- Место на диске: 20 ГБ и выше
- Поддержка виртуализации на уровне процессора
Программные требования
- Docker версии 19.03 и выше
- Docker Compose версии 1.25.0 и выше
- Поддержка виртуализации на уровне ОС
Для Windows и MacOS скачайте и установите Docker Desktop с официального сайта Docker.
Для Linux выполните следующие команды:
sudo apt-get update
sudo apt-get install docker
Выполните следующую команду для установки Docker Compose:
sudo apt-get install docker-compose
компоненты и их взаимодействие
Веб-сервис построен на основе Kotlin с использованием Spring Boot, что обеспечивает быструю разработку и управление приложениями. Основные используемые технологии включают:
- Spring Boot: Фреймворк для создания автономных, готовых к продакшену приложений на основе Spring.
- Spring Security: Инфраструктура для обеспечения аутентификации и авторизации в приложениях.
- Spring Data JPA: Упрощает взаимодействие с базами данных через JPA (Java Persistence API) и Hibernate.
- Spring Actuator: Предоставляет возможности мониторинга и управления приложением в реальном времени.
- Liquibase: Читает .XML файлы с оописанием миграции баз данных.
Фронтенд приложения разработан на базе Svelte с использованием Vite для быстрой сборки и разработки. Важные компоненты включают:
- Svelte: Прогрессивный фреймворк JavaScript для построения пользовательских интерфейсов.
- Vite: Быстрый инструмент сборки для современных веб-приложений с поддержкой быстрого развертывания и горячей перезагрузки.
- Tailwind CSS: Библиотека CSS, которая упрощает стилизацию компонентов и создание адаптивного дизайна.
- Фронтенд и бекенд: Фронтенд обращается к бекенду через API, предоставляемые Spring Boot. Это включает запросы на получение данных, отправку данных и аутентификацию пользователя (JWT).
- База данных: Бекенд взаимодействует с PostgreSQL для хранения и извлечения данных. Используется Spring Data JPA для выполнения операций CRUD (Create, Read, Update, Delete).
- Безопасность и аутентификация: Spring Security обеспечивает защиту API и управление доступом к различным ресурсам в зависимости от роли пользователя.
- Проект поддерживается и собирается при помощи инструментов сборки Gradle и npm (Node Package Manager).
Пользователь получает SSR страницу с сервиса Vercel, затем браузер пользователя с загруженной страницей обращается к API хоста бэкенда, в запросах с данными идет вызов запросов к базе данных.
Перейдите в директорию, где вы хотите разместить проект, и выполните команду:
git clone https://github.com/funcid/metro-in-tandem.git
cd metro-in-tandem
docker-compose up --build
База данных (PostgreSQL): будет доступна на порту, указанном в переменной POSTGRES_PORT
в файле .env
. По умолчанию это порт 5432
Бэкенд: будет доступен на порту 8080
Фронтенд: будет доступен на порту 3000
ETL: перенесет данные из JSON файлов и загрузит их в базу
Динамическое описание API методов доступно в Swagger по ссылке:
https://api.метровтандеме.рф/swagger-ui/index.html
-
Посетите сайт https://метровтандеме.рф
-
Нажмите “Войти” или любую кнопку из меню навигации
-
Введите логин и пароль, по умолчанию, доступны следующие учетные записи с ролями:
-
Администратор
admin_user admin_pass
-
Специалист
specialist_user specialist_pass
-
Оператор
operator_user operator_pass
-
Работник
admin_user admin_pass
-
-
Справа сверху исчезнет кнопка “Войти” и появится активная учетная запись
-
Для выхода из учетной записи нажмите на кнопку справа сверху, далее: Выйти
Алгоритм в классе AllocationService
выполняет распределение заявок (Application
) между сотрудниками (Employee
). Основные шаги алгоритма следующие:
-
Инициализация и подготовка:
- Очистка текущих распределений (
allocation.clear()
). - Извлечение списка сотрудников и заявок в заданном диапазоне времени (
from
иto
). - Если требуется перераспределение (
reallocate == true
), то:- Удаление всех существующих распределений из базы данных.
- Распределение заявок среди подходящих сотрудников.
- Обеспечение обеденного перерыва для всех сотрудников.
- Логирование неудачных распределений.
- Сохранение новых распределений в базе данных.
- В противном случае загрузка текущих распределений из базы данных и группировка их по сотрудникам.
- Очистка текущих распределений (
-
Поиск валидных заявок:
- Метод
findValidApplications
извлекает заявки из базы данных, которые попадают в заданный временной интервал и не отменены.
- Метод
-
Распределение заявок:
- Метод
allocateToSuitableEmployees
распределяет заявки среди сотрудников, разделяя их на группы по рангу ("ЦИ" и "ЦСИ"). - Для каждой заявки находит подходящих сотрудников и определяет лучшего сотрудника для выполнения заявки на основе времени путешествия.
- Метод
-
Проверка доступности сотрудников:
- Метод
isEmployeeAvailable
проверяет, доступен ли сотрудник для выполнения новой заявки, основываясь на текущих распределениях и рабочем времени.
- Метод
-
Обеспечение обеденного перерыва:
- Метод
ensureLunchBreakForAllEmployees
добавляет обеденный перерыв для каждого сотрудника, если это необходимо.
- Метод
-
Оценка времени путешествия:
- Метод
estimateTravelTime
оценивает время, необходимое для перемещения сотрудника от последней заявки к новой.
- Метод
Теперь рассмотрим сложность различных частей алгоритма.
-
Метод
allocateApplications
:- Очистка текущих распределений:
O(1)
. - Извлечение списка сотрудников:
O(E)
, гдеE
- количество сотрудников. - Извлечение списка заявок:
O(A)
, гдеA
- количество заявок. - Удаление всех распределений из базы данных:
O(N)
, гдеN
- количество текущих распределений. - Основной цикл распределения заявок:
- Поиск подходящих сотрудников для каждой заявки:
O(A * E)
. - Обеспечение обеденного перерыва для всех сотрудников:
O(E * A)
. - Логирование неудачных распределений:
O(E)
.
- Поиск подходящих сотрудников для каждой заявки:
- Очистка текущих распределений:
-
Метод
findValidApplications
:- Извлечение заявок из базы данных:
O(A)
. - Фильтрация заявок:
O(A)
.
- Извлечение заявок из базы данных:
-
Метод
allocateToSuitableEmployees
:- Фильтрация сотрудников по рангу:
O(E)
. - Основной цикл распределения заявок:
- Поиск подходящих сотрудников для каждой заявки:
O(A * E)
. - Поиск лучшего сотрудника для каждой заявки:
O(A * E)
.
- Поиск подходящих сотрудников для каждой заявки:
- Фильтрация сотрудников по рангу:
-
Метод
isEmployeeAvailable
:- Проверка наличия пересечений в распределениях сотрудника:
O(A)
(в худшем случае). - Проверка соответствия рабочему времени:
O(1)
.
- Проверка наличия пересечений в распределениях сотрудника:
- В худшем случае основная сложность алгоритма определяется этапом распределения заявок среди сотрудников:
O(A * E)
, гдеA
- количество заявок,E
- количество сотрудников.
Таким образом, общая сложность алгоритма allocateApplications
равна O(A * E)
.