Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику.
Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого технологического стека и общих подходов к разработке.
На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В качестве такой задачи была выбрана разработка отчета о периодах наибольших трат со стороны пользователей.
Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о покупках пользователей, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию:
- Идентификатор пользователя;
- Дата и время оформления заказа;
- Статус заказа;
- Сумма заказа.
В пояснительной записке к массиву данных была уточняющая информация относительно статусов заказов:
- COMPLETED (Завершенный заказ);
- CANCELED (Отмененный заказ);
- CREATED (Созданный заказ, еще не оплаченный);
- DELIVERY (Созданный и оплаченный заказ, который доставляется).
Необходимо разработать отчет, вычисляющий по полученному массиву данных месяц, когда пользователи тратили больше всего. Если максимальная сумма пользовательских трат была в более, чем одном месяце, отчет должен показывать все такие месяцы. В отчете должны учитываться только завершенные заказы.
Требования к реализации:
- Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом;
- В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания;
- Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата:
- {«months»: [«march»]}
- {«months»: [«march», «december»]}
- Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года.
Насевич Владислав Викторович.
Основной класс программы - Formatter
.
В нём по ходу обработки файла и преобразования данных вызываются методы из вспомогательных
классов, о которых далее:
FileUtils
- отвечает непосредственно за чтение данных из JSON-файла. Используется в классеOrderService
для получения JSON-строки из файла (в связке сJsonUtils
).JsonUtils
- отвечает за все операции, связанные непосредственно с представлением данных в формате JSON, а именно их сериализацию и десериализацию. Также имеет методы форматирования.OrderService
- объединяет в себе все операции, связанные непосредственно с заказами и более узко направленные комбинации методов классовFileUtils
иJsonUtils
(так как классыFileUtils
иJsonUtils
предоставляют лишь максимально обобщённые методы для работы с относящимися к ним сущностям). Включает в себя методы, необходимые для вычисления конечного результата и вызывающиеся напрямую изmain
метода классаFormatter
.
Как уже было упомянуто ранее, метод main
класса Formatter
собирает решение воедино,
напрямую взаимодействуя только с OrderService
и, в исключительном случае,
для форматирования результата вычислений, с JsonUtils
.
Также в проекте реализован механизм логирования с помощью Logback
. При возникновении ошибки
stacktrace записывается в файл, а в консоль выводиться лаконичное сообщение,
описывающее суть возникшей проблемы.
Проект собирается и запускается с помощью Maven
(maven-jar-plugin
и maven-exec-plugin
соответственно),
однако также имеется возможность компиляции в jar-with-dependencies для дальнейшего запуска без Maven
.
Для тестирования работы приложения необходимо выполнить следующие шаги:
- Установить Java версии >= 21, если необходимо.
- Клонировать репозиторий:
git clone [email protected]:watisluv1910/school2024-test-task1.git
- Перейти в root-директорию проекта и выполнить следующие команды:
Для Unix-подобных систем:Для Windows:./mvnw clean package
mvnw.cmd clean package
- Для запуска приложения с тестовым файлом выполнить
(стандартным расположением файла является корневая директория проекта):
Для Unix-подобных систем:Для Windows:./mvnw -q exec:java
Для запуска с переопределением стандартного пути к файлу с данными (необходимо заменитьmvnw.cmd -q exec:java
/path/to/file
на фактический путь к файлу):
Для Unix-подобных систем:Для Windows:./mvnw -q exec:java -Dexec.args="/path/to/file"
mvnw.cmd -q exec:java -Dexec.args="/path/to/file"