Разработать приложение, решающее задачу по управлению списком актов отгрузки песчано-гравийной смеси (ПГС).
Приложение считывает все данные из соответствующих CSV-файлов (разделитель – запятая) при старте приложения.
Имя файла с исходными данными передаётся приложению с ключом --swg-file
Id,Title,SWG,Measure,Count,Price,Cost,ShipmentDateTime,DumpTruck,Washing,Manager
de42a00f-7f43-4d10-808d-bee47fdeef49,Песчано-гравийная смесь (ПГС),Песок речной,т,36,640,22.3488,"2024-01-01T00:00:00",accfe76f-9a9e-4cb4-8876-d36daa22f924,True,de42a00f-7f43-4d10-808d-bee47fdeef49
2b52fcb1-34ec-48d2-95f2-b79f2d9c3c70,Песчано-гравийная смесь (ПГС),Щебень гранитный,м3,14,2660,36.1228,"2024-01-01T00:00:00",accfe76f-9a9e-4cb4-8876-d36daa22f924,True,de42a00f-7f43-4d10-808d-bee47fdeef49
Имя файла с исходными данными передаётся приложению с ключом --dump-trucks-file
Id,Model,Registration,Capacity,Volume
accfe76f-9a9e-4cb4-8876-d36daa22f924,KAMAZ-65951-СА,Д903ЧН,36.0,25
f8741785-4986-41ab-85d3-8b2fe522f9ed,МАЗ 5516А8-336,Э723ВЛ,37.0,26
Имя файла с исходными данными передаётся приложению с ключом --employees-file
Id,Name,Position,RegistrationDateTime,Email
de42a00f-7f43-4d10-808d-bee47fdeef49,Иванов Иван Иванович,Начальник смены,2024-01-01T00:00:00,IvanovII@crafted.su
Приложение запускается с помощью системы сборки Gradle, обязательные параметры:
--swg-file – имя файла с данными приложения--dump-trucks-file – имя файла с данными приложения--employees-file – имя файла с пользователями приложения--port – порт, по которому доступен веб-сервер ./gradlew run --args="--swg-file ../sample-data/swg.csv --dump-trucks-file ../sample-data/trucks.csv --employees-file ../sample-data/employees.csv --port 9000"
Веб-сервер запускается и работает только при получении корректных значений всех параметров. При некорректном значении хотя бы одного параметра приложение выводит соответствующее сообщение об ошибке и завершает работу с ненулевым кодом возврата.
Error: missing option --employees-file
Error: file not found «abc.csv»
Список должен быть упорядочен по возрастанию даты и времени отгрузки и id.
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы. Если номер превышает максимально возможный, приложение возвращает пустой список. Если номер передан и не является натуральным числом, приложение возвращает сообщение об ошибке. |
| records-per-page | integer Default: 10 Enum: 5 10 20 50 Example: records-per-page=10 Количество записей на странице. Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке. |
[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Title": "Песчано-гравийная смесь (ПГС)",
- "Cost": 22.3488
}
]Идентификатор отгрузки генерируется автоматически.
| Title required | string Наименование ПГС | ||||||||||||||
| SWG required | string Enum: "Песок речной" "Песок карьерный" "Щебень гранитный" "Щебень гравийный" "Щебень шлаковый" "Песчано-гравийная смесь"
| ||||||||||||||
| Measure required | string Enum: "м3" "т" Единица измерения | ||||||||||||||
| Count required | number <double> > 0 Отгруженное количество | ||||||||||||||
| Price required | number <double> > 0 Цена за ед. измерения (руб.) | ||||||||||||||
| Cost required | number <double> > 0 Стоимость (тыс. руб.) | ||||||||||||||
| ShipmentDateTime | string <date-time> Default: "текущая дата и время" Дата и время отгрузки | ||||||||||||||
| Washing | boolean Default: false Была ли оказана услуга мытья ТС? | ||||||||||||||
| DumpTruck required | string <UUID> Уникальный идентификатор самосвала | ||||||||||||||
| Manager required | string <UUID> Уникальный идентификатор работника |
{- "Title": "Песчано-гравийная смесь (ПГС)",
- "SWG": "Песок речной",
- "Measure": "м3",
- "Count": 36,
- "Price": 640,
- "Cost": 22.3488,
- "ShipmentDateTime": "2024-01-01T00:00:00",
- "Washing": true,
- "DumpTruck": "accfe76f-9a9e-4cb4-8876-d36daa22f924",
- "Manager": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}| shipment-id required | string <UUID> Example: de42a00f-7f43-4d10-808d-bee47fdeef49 идентификатор акта отгрузки ПГС |
{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Title": "Песчано-гравийная смесь (ПГС)",
- "SWG": "Песок речной",
- "Measure": "м3",
- "Count": 36,
- "Price": 640,
- "Cost": 22.3488,
- "ShipmentDateTime": "2024-01-01T00:00:00",
- "Model": "KAMAZ-65951-СА",
- "Registration": "Д903ЧН",
- "Washing": true,
- "ManagerEmail": "IvanovII@crafted.su"
}| Title required | string Наименование ПГС | ||||||||||||||
| SWG required | string Enum: "Песок речной" "Песок карьерный" "Щебень гранитный" "Щебень гравийный" "Щебень шлаковый" "Песчано-гравийная смесь"
| ||||||||||||||
| Measure required | string Enum: "м3" "т" Единица измерения | ||||||||||||||
| Count required | number <double> > 0 Отгруженное количество | ||||||||||||||
| Price required | number <double> > 0 Цена за ед. измерения (руб.) | ||||||||||||||
| Cost required | number <double> > 0 Стоимость (тыс. руб.) | ||||||||||||||
| ShipmentDateTime | string <date-time> Дата и время отгрузки. Если отсутствует, то поле не изменяется. | ||||||||||||||
| Washing | boolean Была ли оказана услуга мытья ТС. Если отсутствует, то поле не изменяется. | ||||||||||||||
| DumpTruck required | string <UUID> Уникальный идентификатор самосвала | ||||||||||||||
| Manager required | string <UUID> Уникальный идентификатор работника. |
{- "Title": "Песчано-гравийная смесь (ПГС)",
- "SWG": "Песок речной",
- "Measure": "м3",
- "Count": 36,
- "Price": 640,
- "Cost": 22.3488,
- "ShipmentDateTime": "2024-01-01T00:00:00",
- "Washing": true,
- "DumpTruck": "accfe76f-9a9e-4cb4-8876-d36daa22f924",
- "Manager": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}{- "Value": "{",
- "Error": "Missing a name for object member."
}Список должен быть упорядочен по убыванию даты и времени отгрузки и возрастанию идентификатора
| by-swg-type required | string (Swg-type) Enum: "Песок речной" "Песок карьерный" "Щебень гранитный" "Щебень гравийный" "Щебень шлаковый" "Песчано-гравийная смесь" Example: by-swg-type=Щебень гравийный тип ПГС |
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы. Если номер превышает максимально возможный, приложение возвращает пустой список. Если номер передан и не является натуральным числом, приложение возвращает сообщение об ошибке. |
| records-per-page | integer Default: 10 Enum: 5 10 20 50 Example: records-per-page=10 Количество записей на странице. Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке. |
[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Title": "Песчано-гравийная смесь (ПГС)",
- "Cost": 22.3488
}
]Список должен быть упорядочен по возрастанию даты и времени отгрузки и id.
| from required | string <date> Example: from=2024-01-01 Начало периода (дата отгрузки ≥ начало периода) |
| to required | string <date> Example: to=2024-02-01 Окончание периода (дата отгрузки ≤ окончание периода) |
| page | integer >= 1 Default: 1 Example: page=1 Номер страницы. Если номер превышает максимально возможный, приложение возвращает пустой список. Если номер передан и не является натуральным числом, приложение возвращает сообщение об ошибке. |
| records-per-page | integer Default: 10 Enum: 5 10 20 50 Example: records-per-page=10 Количество записей на странице. Если количество передано и не входит в указанный набор значений, приложение возвращает сообщение об ошибке. |
[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Title": "Песчано-гравийная смесь (ПГС)",
- "ShipmentDate": "2024-01-01",
- "Cost": 22.3488
}
]Список должен содержать только те месяцы, для которых есть данные, и быть упорядочен по номеру месяца.
| year required | integer >= 2000 Example: year=2024 отчётный год |
[- {
- "Month": 1,
- "MonthTitle": "Январь",
- "Count": 1,
- "Cost": 100,
- "Weight": 36,
- "Volume": 0
}
]Приложение разбирает накладную и создаёт:
Самосвал.
Если в списке самосвалов отсутствует объект с соответствующими полями Model и Registration,
приложение создаёт новый объект.
Id генерируется уникальным,Capacity соответствует весу отгрузки,Volume соответствует весу отгрузки, поделённому на насыпную плотность.Акт отгрузки.
Id генерируется уникальным,Measure=т,ShipmentDateTime соответствует текущей дате и времени,DumpTruck соответствует самосвалу, найденному по полям DumpTruckModel и DumpTruckRegistration,Washing=false.| InvoiceTitle required | string Наименование ПГС | ||||||||||||||
| InvoiceType required | string Enum: "Песок речной" "Песок карьерный" "Щебень гранитный" "Щебень гравийный" "Щебень шлаковый" "Песчано-гравийная смесь"
| ||||||||||||||
| InvoiceWeight required | number <double> > 0 Отгруженный вес | ||||||||||||||
| InvoicePrice required | number <double> > 0 Цена за ед. измерения (руб.) | ||||||||||||||
| InvoiceCost | number <double> > 0 Default: "InvoicePrice * InvoiceWeight" Стоимость (тыс. руб.) | ||||||||||||||
| DumpTruckModel required | string Модель транспортного средства | ||||||||||||||
| DumpTruckRegistration required | string Регистрационный номер ТС | ||||||||||||||
| Manager required | string <UUID> Уникальный идентификатор работника. |
InvoiceTitle=%D0%9F%D0%B5%D1%81%D1%87%D0%B0%D0%BD%D0%BE-%D0%B3%D1%80%D0%B0%D0%B2%D0%B8%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BC%D0%B5%D1%81%D1%8C%20%28%D0%9F%D0%93%D0%A1%29&InvoiceType=%D0%9F%D0%B5%D1%81%D0%BE%D0%BA%20%D1%80%D0%B5%D1%87%D0%BD%D0%BE%D0%B9&InvoiceWeight=36&InvoicePrice=640&InvoiceCost=22.3488&DumpTruckModel=KAMAZ-65951-%D0%A1%D0%90&DumpTruckRegistration=%D0%94903%D0%A7%D0%9D&Manager=de42a00f-7f43-4d10-808d-bee47fdeef49
{- "ShipmentId": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "DumpTruckId": "accfe76f-9a9e-4cb4-8876-d36daa22f924"
}| dump-truck-id required | string <UUID> Example: accfe76f-9a9e-4cb4-8876-d36daa22f924 идентификатор самосвала |
{- "Id": "accfe76f-9a9e-4cb4-8876-d36daa22f924",
- "Model": "KAMAZ-65951-СА",
- "Registration": "Д903ЧН",
- "Capacity": 32.5,
- "Volume": 25,
- "Shipments": [
- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Title": "Песчано-гравийная смесь (ПГС)",
- "ShipmentDateTime": "2024-01-01T00:00:00"
}
]
}| dump-truck-id required | string <UUID> Example: accfe76f-9a9e-4cb4-8876-d36daa22f924 идентификатор самосвала |
{- "Error": "Некорректное значение переданного параметра X. Ожидается UUID, но получено текстовое значение"
}Приложение разбирает накладную и создаёт:
Самосвал.
Если в списке самосвалов отсутствует объект с соответствующими полями Model и Registration,
приложение создаёт новый объект.
Id генерируется уникальным,Capacity соответствует весу отгрузки,Volume соответствует весу отгрузки, поделённому на насыпную плотность.Акт отгрузки.
Id генерируется уникальным,Measure=т,ShipmentDateTime соответствует текущей дате и времени,DumpTruck соответствует самосвалу, найденному по полям DumpTruckModel и DumpTruckRegistration,Washing=false.| InvoiceTitle required | string Наименование ПГС | ||||||||||||||
| InvoiceType required | string Enum: "Песок речной" "Песок карьерный" "Щебень гранитный" "Щебень гравийный" "Щебень шлаковый" "Песчано-гравийная смесь"
| ||||||||||||||
| InvoiceWeight required | number <double> > 0 Отгруженный вес | ||||||||||||||
| InvoicePrice required | number <double> > 0 Цена за ед. измерения (руб.) | ||||||||||||||
| InvoiceCost | number <double> > 0 Default: "InvoicePrice * InvoiceWeight" Стоимость (тыс. руб.) | ||||||||||||||
| DumpTruckModel required | string Модель транспортного средства | ||||||||||||||
| DumpTruckRegistration required | string Регистрационный номер ТС | ||||||||||||||
| Manager required | string <UUID> Уникальный идентификатор работника. |
InvoiceTitle=%D0%9F%D0%B5%D1%81%D1%87%D0%B0%D0%BD%D0%BE-%D0%B3%D1%80%D0%B0%D0%B2%D0%B8%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BC%D0%B5%D1%81%D1%8C%20%28%D0%9F%D0%93%D0%A1%29&InvoiceType=%D0%9F%D0%B5%D1%81%D0%BE%D0%BA%20%D1%80%D0%B5%D1%87%D0%BD%D0%BE%D0%B9&InvoiceWeight=36&InvoicePrice=640&InvoiceCost=22.3488&DumpTruckModel=KAMAZ-65951-%D0%A1%D0%90&DumpTruckRegistration=%D0%94903%D0%A7%D0%9D&Manager=de42a00f-7f43-4d10-808d-bee47fdeef49
{- "ShipmentId": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "DumpTruckId": "accfe76f-9a9e-4cb4-8876-d36daa22f924"
}[- {
- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Name": "Иванов Иван Иванович",
- "Position": "Начальник смены",
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "Email": "IvanovII@crafted.su"
}
]| Id | string <UUID> идентификатор акта отгрузки ПГС | ||||||||||||||
| Title | string Наименование ПГС | ||||||||||||||
| SWG | string (Swg-type) Enum: "Песок речной" "Песок карьерный" "Щебень гранитный" "Щебень гравийный" "Щебень шлаковый" "Песчано-гравийная смесь"
| ||||||||||||||
| Measure | string (Swg-measure) Enum: "м3" "т" Единица измерения | ||||||||||||||
| Count | number <double> > 0 Отгруженное количество | ||||||||||||||
| Price | number <double> > 0 Цена за ед. измерения (руб.) | ||||||||||||||
| Cost | number <double> > 0 Стоимость (тыс. руб.) | ||||||||||||||
| ShipmentDateTime | string <date-time> Дата и время отгрузки | ||||||||||||||
| DumpTruck | string <UUID> Транспортное средство, на которое осуществлялась отгрузка (соответствует | ||||||||||||||
| Washing | boolean Была ли оказана услуга мытья ТС? | ||||||||||||||
| Manager | string <UUID> Работник, зарегистрировавший отгрузку ( |
{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Title": "Песчано-гравийная смесь (ПГС)",
- "SWG": "Песок речной",
- "Measure": "м3",
- "Count": 36,
- "Price": 640,
- "Cost": 22.3488,
- "ShipmentDateTime": "2024-01-01T00:00:00",
- "DumpTruck": "accfe76f-9a9e-4cb4-8876-d36daa22f924",
- "Washing": true,
- "Manager": "de42a00f-7f43-4d10-808d-bee47fdeef49"
}| Id | string <UUID> Уникальный идентификатор самосвала |
| Model | string Модель транспортного средства |
| Registration | string Регистрационный номер ТС |
| Capacity | number <double> > 0 Грузоподъёмность |
| Volume | number <double> > 0 Объём кузова |
{- "Id": "accfe76f-9a9e-4cb4-8876-d36daa22f924",
- "Model": "KAMAZ-65951-СА",
- "Registration": "Д903ЧН",
- "Capacity": 32.5,
- "Volume": 25
}| Id | string <UUID> Уникальный идентификатор работника |
| Name | string ФИО работника |
| Position | string Должность работника |
| RegistrationDateTime | string <date-time> Дата и время регистрации в системе |
string Электронная почта работника |
{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Name": "Иванов Иван Иванович",
- "Position": "Начальник смены",
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "Email": "IvanovII@crafted.su"
}