Разработать приложение, решающее задачу по управлению списком актов отгрузки песчано-гравийной смеси (ПГС).
Приложение считывает все данные из соответствующих 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,Role
de42a00f-7f43-4d10-808d-bee47fdeef49,Иванов Иван Иванович,Начальник смены,2024-01-01T00:00:00,IvanovII@crafted.su,Manager
Приложение запускается с помощью системы сборки Gradle, обязательные параметры:
--swg-file – имя файла с данными приложения--dump-trucks-file – имя файла с данными приложения--employees-file – имя файла с пользователями приложения--port – порт, по которому доступен веб-сервер--secret - секретный ключ для HMAC512, который используется для подписи JWT-токенов. ./gradlew run --args="--swg-file ../sample-data/swg.csv --dump-trucks-file ../sample-data/trucks.csv --employees-file ../sample-data/employees.csv --port 9000 --secret SECRET"
Веб-сервер запускается и работает только при получении корректных значений всех параметров. При некорректном значении хотя бы одного параметра приложение выводит соответствующее сообщение об ошибке и завершает работу с ненулевым кодом возврата.
Error: missing option --employees-file
Error: file not found «abc.csv»
Во время выполнения запроса пользователь может передать JWT-токен в HTTP-заголовке Authorization в формате Bearier. Отправка Bearier-токена через HTTP-форму или параметры URI не будет выполняться.
Для указанного пользователя определяется роль Employee→Role.
В каждом запросе приведён список ролей, для которых допустимо выполнения запроса. Также присутствуют роли:
Owner – выполнение запроса разрешено владельцу объекта.Все дополнительные роли и правила доступа приведены в описании маршрута.
Если в описании маршрута отсутствует блок Authorizations, маршрут доступен всем пользователям.
Если блок Authorizations присутствует, но список ролей пуст или all, маршрут доступен всем зарегистрированным пользователям вне зависимости от роли.
Список должен быть упорядочен по возрастанию даты и времени отгрузки и 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 | string <UUID> Default: "работник, выполнивший запрос" Уникальный идентификатор работника. Только пользователь с ролью Пользователь с ролью |
{- "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 | 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,Manager соответствует пользователю, выполнившему запрос.| 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,Manager соответствует пользователю, выполнившему запрос.| 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": "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 Электронная почта работника | |||||||||
| Role | string (Роль пользователя) Enum: "Employee" "Manager" "UserManager" Роль, в зависимости от которой определяются возможности пользователя.
|
{- "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
- "Name": "Иванов Иван Иванович",
- "Position": "Начальник смены",
- "RegistrationDateTime": "2024-01-01T00:00:00",
- "Email": "IvanovII@crafted.su",
- "Role": "Employee"
}