Разработать приложение, решающее задачу по управлению списком актов отгрузки песчано-гравийной смеси (ПГС).
Приложение считывает все данные из соответствующих CSV-файлов (разделитель – запятая) при старте приложения.
Имя файла с исходными данными передаётся приложению с ключом --swg-file
Id,Title,SWG,Measure,Count,Price,Cost,ShipmentDateTime,DumpTruck,Washing
de42a00f-7f43-4d10-808d-bee47fdeef49,Песчано-гравийная смесь (ПГС),Песок речной,т,36,640,22.3488,"2024-01-01T00:00:00",accfe76f-9a9e-4cb4-8876-d36daa22f924,True
2b52fcb1-34ec-48d2-95f2-b79f2d9c3c70,Песчано-гравийная смесь (ПГС),Щебень гранитный,м3,14,2660,36.1228,"2024-01-01T00:00:00",accfe76f-9a9e-4cb4-8876-d36daa22f924,True
Имя файла с исходными данными передаётся приложению с ключом --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
Приложение запускается с помощью системы сборки Gradle, обязательные параметры:
--swg-file
– имя файла с данными приложения--dump-trucks-file
– имя файла с данными приложения--port
– порт, по которому доступен веб-сервер ./gradlew run --args="--swg-file ../sample-data/swg.csv --dump-trucks-file ../sample-data/trucks.csv --port 9000"
Веб-сервер запускается и работает только при получении корректных значений всех параметров. При некорректном значении хотя бы одного параметра приложение выводит соответствующее сообщение об ошибке и завершает работу с ненулевым кодом возврата.
Error: missing option --swg-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> Уникальный идентификатор самосвала |
{- "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"
}
{- "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
}
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> Уникальный идентификатор самосвала |
{- "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"
}
{- "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 Регистрационный номер ТС |
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
{- "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 Регистрационный номер ТС |
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
{- "ShipmentId": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "DumpTruckId": "accfe76f-9a9e-4cb4-8876-d36daa22f924"
}
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 Была ли оказана услуга мытья ТС? |
{- "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
}
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
}