Будучи сотрудником департамента внутренней автоматизации одной IT компании, вы занимаетесь разработкой и интеграцией различных решений с целью автоматизации различных внутренних бизнес процессов компании. Так, например, в свое время в вашем департаменте была разработана система учета проектных трудозатрат.
Идеологически такая система содержит функциональность по вводу и работе со сведениями о проектах и, самое главное, управление фактическими трудозатратами – списаниями времени. Это значит, что при выполнении той или иной проектной задачи сотрудник фиксирует затраченное на решение задачи время в данной системе. В результате менеджмент проектов может оценивать потраченное время и, как следствие, деньги на реализацию проекта: по задачам, этапам и любому другому уровню детализации.
Что еще важно знать о списаниях времени. У каждого сотрудника компании есть норма списания - количество времени, которое необходимо списывать за рабочий день. В общем случае (и в рамках задачи делаем допущение, что во всех случаях) такая норма составляет 8 часов в день. Однако сотрудники по тем или иным причинам могут списывать как больше 8 часов, так и меньше, в результате чего образуется дизбаланс.
В первом случае можно говорить о том, что сотрудник перегружен или тратит на задачи больше времени, чем планируется, но, желая успеть в срок, задерживается на работе. Во втором случае причиной может быть как простой (отсутствие задач), так и недоработки со стороны самого сотрудника.
Дизбаланс списаний стал серьезно волновать руководителей производственных департаментов, поэтому было принято решение на регулярной основе мониторить дизбаланс и принимать соответствующие меры. Однако за неимением такого отчета в системе, руководство департамента обратилось к вам с просьбой реализовать MVP подобного отчета.
На текущий момент система управления содержит функцию выгрузки списаний “TSR-3” (присвоенный отчету код) за указанный период в следующем формате:
"<id сотрудника в формате UUID> <Фамилия> <Имя> <Отчество> <Дата списания в формате dd.MM.YYYY> <количество часов>"
При этом стоит учесть, что количество списаний сотрудником не ограничивается. Так, например, файл может выглядеть следующим образом:
a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.05.2024 4
0f0ccd5e-cd46-462a-b92d-69a6ff147465 Петров Алексей Сергеевич 16.05.2024 6
a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.05.2024 2.5
0f0ccd5e-cd46-462a-b92d-69a6ff147465 Петров Алексей Сергеевич 16.05.2024 2
a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.05.2024 1.5
По данному примеру видно, что оба сотрудника (Петров А.С. и Иванов И.И.) списали за 16 мая каждый по 8 часов, но, скорее всего, в разные задачи.
Вам же необходимо разработать программу для анализа дизбаланса, технические требования к разработке которой содержат следующее:
- На вход программа для анализа получает файл со списаниями report.txt за конкретную рабочую неделю. О формате файла известно следующее:
- в первой строке файла указывается недельная норма списания на одного сотрудника (из расчета дневной нормы списания, равной 8 часам; например, 40 для пятидневной рабочей недели);
- во всех последующих строках файла указывается перечень списаний сотрудников в формате отчета “TSR-3”.
- Программа определяет сотрудников, у которых дизбаланс списаний времени за неделю составляет более 10% в обе стороны;
- Найденные сотрудники с дизбалансом по итогам работы программы записываются в текстовый файл result.txt в следующем виде:
"<Фамилия И.О.> <количество часов, составляющих дизбаланс, с указанием знака>".
Количество часов дизбаланса сопровождается знаками “+” и “–” в соответствии со следующими условиями:
- для часов, которые идут сверх нормы, ставится знак “+”;
- для часов, недостающих до нормы, ставится знак “–”.
- В выходном файле сначала перечисляются сотрудники с отрицательным дизбалансом в алфавитном порядке, затем - сотрудники с положительным дизбалансом в алфавитном порядке.
- Ручной ввод пути к файлу через интерактивный режим (посредством клавиатурного ввода) недопустим. Также эксплуатация программы не должна подразумевать какие-либо изменения программного кода с целью указания пути к файлам.
Примеры входного и выходного файлов приложены к настоящему техническому заданию.
Предоставленное решение состоит из программы на Java, предназначенной для анализа дизбаланса времени, списанного сотрудниками за неделю. Программа читает входной файл report.txt
, обрабатывает данные для вычисления дизбаланса часов, списанных каждым сотрудником, и записывает результаты в выходной файл result.txt
.
Основные компоненты решения:
-
Класс Disbalance:
- Представляет дизбаланс списанных часов для сотрудника.
- Содержит два поля:
fullName
(полное имя сотрудника) иdisbalance
(вычисленный дизбаланс). - Предоставляет методы-геттеры для этих полей.
-
Класс TimeEntry:
- Представляет запись о списании времени сотрудником.
- Содержит поля, такие как
uuid
,lastName
,firstName
,middleName
,date
иhours
. - Включает статический метод
parse
для создания объектаTimeEntry
из строки. - Предоставляет метод для получения полного имени сотрудника в формате "Фамилия И.О." и метод для получения списанных часов.
-
Класс Main:
- Точка входа в программу.
- Читает входной файл для извлечения недельной нормы и списка записей о времени.
- Вычисляет общее количество списанных часов для каждого сотрудника.
- Вычисляет дизбаланс для каждого сотрудника и фильтрует тех, у кого значительный дизбаланс (больше 10% от недельной нормы).
- Разделяет дизбалансы на отрицательные и положительные списки, сортирует их по именам сотрудников и записывает результаты в выходной файл.
Для сборки и запуска предоставленной программы на Java с использованием IntelliJ IDEA, выполните следующие шаги:
-
Клонируйте репозиторий:
- Клонируйте репозиторий средствами Intellij IDEA
- or
- Откройте терминал и выполните команду:
git clone <URL_вашего_репозитория>
- Перейдите в директорию проекта:
cd <имя_репозитория>
-
Импортируйте проект в IntelliJ IDEA:
- Откройте IntelliJ IDEA.
- Выберите "File > Open".
- Выберите папку с вашим клонированным репозиторием и нажмите "ОК".
-
Настройте главный класс:
- Перейдите в
Run > Edit Configurations
. - Нажмите на значок
+
для добавления новой конфигурации и выберите "Application". - Назовите конфигурацию (например, "RunMain").
- Установите "Main class" как
src.Solution.Main
. - Убедитесь, что рабочая директория установлена на корень проекта.
- Перейдите в
-
Сборка и запуск:
- Нажмите на значок сборки (молоток) или перейдите в
Build > Build Project
. - Запустите программу, нажав на значок запуска (зеленая стрелка) или перейдите в
Run > Run 'RunMain'
.
- Нажмите на значок сборки (молоток) или перейдите в
Программа прочитает файл report.txt
, выполнит анализ дизбаланса и запишет результаты в файл result.txt
в корневой директории проекта.
В соответствии с ТЗ нужно было собрать проект поэтому так же предоставляю альтернативный вариант запуска решение
- Откройте папку
result
в Finder (или Explorer на Windows). - Запустите .jar файл двойным щелчком мыши.
- Откройте result.txt
Так же можете собрать .jar самостоятельно. Снизу представлена инструкция
-
Сборка через IntelliJ IDEA:
- Перейдите в
File > Project Structure
. - В разделе "Artifacts" нажмите
+
и выберите "Jar > From modules with dependencies". - Выберите модуль и основной класс (например,
src.Solution.Main
). - Установите путь вывода для .jar файла (например,
out/artifacts
). - Нажмите "OK" и примените изменения.
- Перейдите в
Build > Build Artifacts
и выберите ваш артефакт, затем нажмите "Build".
- Перейдите в
-
Запуск .jar файла через командную строку:
- Откройте терминал.
- Перейдите в директорию, где находится .jar файл:
cd <путь_к_jar_файлу>
- Запустите .jar файл с помощью команды:
java -jar имя_файла.jar