Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,28 @@

## Автор решения

#### Армишев Кирилл Константинович

## Описание реализации


#### Реализация была написана на языке Java с использованием библиотеки Gson для работы с JSON.


- Класс Order: Класс представляет собой модель данных заказа. Он содержит поля для идентификатора пользователя, даты и времени заказа, статуса заказа и суммы заказа.
Метод getOrdered_at() преобразует строку с датой и временем заказа в объект LocalDateTime.
- Метод generateReport: Этот метод принимает список заказов и генерирует отчет в формате JSON. Сначала создается мапа monthSumMap, где ключ - это месяц, а значение - сумма заказов за этот месяц. Затем происходит обход списка заказов, фильтрация заказов со статусом "COMPLETED" и обновление значения в monthSumMap. После этого находится месяц с макстмальной суммой заказов и создается список месяцев с этой суммой. Метод возвращает строку в формате JSON.
- Класс Main: Класс содержит основную логику программы. В методе main происходит чтение данных из файла input.json и преобразование этих данных в список объектов Order с помощью библиотеки Gson. Затем генерируется отчет с помощью метода generateReport.
- Формат отчета: Отчет представляет собой строку в формате JSON, которая содержит список месяцев с максимальной суммой заказов. Месяцы выводятся на английском языке в нижнем регистре в порядке их следования в течение года. Примеры формата отчета: {«months»: [«march»]} или {«months»: [«march», «december»]}.
- Таким образом, реализация решения задачи обеспечивает формирование отчета о месяцах с максимальной суммой заказов статуса "COMPLETED" на основе данных из файла input.json.

#### В коде для каждого метода содержатся комментарии с описанием его назначения и логики работы.

## Инструкция по сборке и запуску решения


#### Сборка проекта:
- Выполнить команду: mvn clean install
#### Запуск:
- Выполнить команду: mvn exec:java

32 changes: 32 additions & 0 deletions input.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[
{
"user_id": "25b003b9-ab22-4a24-a616-dd0303f983d8",
"ordered_at": "2023-03-05T08:34:21.123",
"status": "COMPLETED",
"total": "13990.00"
},
{
"user_id": "e1470ada-fcbb-4424-8c46-065b6409ca4b",
"ordered_at": "2016-03-16T13:56:39.492",
"status": "COMPLETED",
"total": "215.50"
},
{
"user_id": "081a47a5-b7bf-462c-a11a-68002a179152",
"ordered_at": "2023-12-08T21:36:59.281",
"status": "COMPLETED",
"total": "49499.00"
},
{
"user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69",
"ordered_at": "2023-12-14T11:10:29.408",
"status": "CANCELED",
"total": "13650.00"
},
{
"user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69",
"ordered_at": "2023-12-14T11:15:31.108",
"status": "COMPLETED",
"total": "14760.00"
}
]
52 changes: 52 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>croc-test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>croc-test</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>org.example.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>







</project>

82 changes: 82 additions & 0 deletions src/main/java/org/example/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package org.example;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.Map.Entry;

public class Main {
public static void main(String[] args) {

/* Считываем данные из файла */
Gson gson = new Gson();
try (FileReader reader = new FileReader("input.json")) {
/* Преобразуем JSON в список заказов */
Type orderListType = new TypeToken<List<Order>>(){}.getType();
List<Order> orders = gson.fromJson(reader, orderListType);


if (orders != null) {
/* Генерируем отчет */
String report = generateReport(orders);
System.out.println(report);


} else {
System.out.println("Не удалось прочитать данные из файла.");
}
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* Генерация отчета
* @param orders список заказов
* @return отчет в формате JSON
*/
private static String generateReport(List<Order> orders) {
/* Создаем мапу, где ключ - месяц, значение - сумма заказов за данный месяц */
Map<String, Double> monthSumMap = new HashMap<>();
orders.stream()
/* Фильтруем заказы со статусом "COMPLETED" */
.filter(order -> "COMPLETED".equals(order.getStatus()))
/* Сортируем заказы по месяцу */
.sorted(Comparator.comparing(order -> order.getOrdered_at().getMonth()))
.forEach(x -> {
/* Получаем месяц из даты заказа */
String month = x.getOrdered_at().getMonth().toString().toLowerCase();
/* Получаем текущую сумму для данного месяца или 0, если месяц еще не встречался */
double currentSum = monthSumMap.getOrDefault(month, 0.0);
/* Обновляем сумму для данного месяца, добавляя стоимость текущего заказа */
currentSum += x.getTotal();
/* Сохраняем обновленную сумму в мапу */
monthSumMap.put(month, currentSum);
});
/* Находим максимальную сумму заказов */
double maxSum = monthSumMap.values().stream().max(Double::compareTo).orElse(0.0);

/* Получаем список месяцев с максимальной суммой заказов */
List<String> monthsWithMaxSum = monthSumMap.entrySet().stream()
/* Фильтруем месяцы с максимальной суммой */
.filter(entry -> entry.getValue().equals(maxSum))
/* Получаем список месяцев */
.map(Entry::getKey)
/* Преобразуем в список */
.collect(Collectors.toList());

/* Создаем мапу для отчета */
Map<String, List<String>> reportMap = new HashMap<>();
reportMap.put("months", monthsWithMaxSum);
Gson gson = new Gson();
return gson.toJson(reportMap);
}
}
30 changes: 30 additions & 0 deletions src/main/java/org/example/Order.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.example;

import java.time.LocalDateTime;

public class Order {
private String user_id; // Идентификатор пользователя
private String ordered_at; // Дата заказа
private String status; // Статус заказа
private double total; // Сумма заказа

public Order() {
}

public String getUser_id() {
return user_id;
}

public LocalDateTime getOrdered_at() {
// Парсим дату в формате строки в LocalDateTime
return LocalDateTime.parse(ordered_at);
}
public String getStatus() {
return status;
}

public double getTotal() {
return total;
}

}