Задание «Продажа песчано-гравийной смеси»

Задание «Продажа песчано-гравийной смеси» #

Задание № 1 #

Разработать приложение, решающее задачу по управлению списком с данными.

Данные #

Элемент списка: акт отгрузки ПГС.

Название поля Описание поля Тип поля
Id Уникальный идентификатор отгрузки UUID
Title Наименование ПГС Текст
SWG Тип ПГС Тип ПГС из списка
Measure Единица измерения Из списка: м3, т
Count Отгруженное количество Положительное вещественное число
Price Цена за ед. измерения (руб.) Положительное вещественное число
Cost Стоимость (тыс. руб.) Положительное целое число.
Не может быть больше $\frac{Price*Count}{1000}$
ShipmentDateTime Дата и время отгрузки Дата и время в формате ISO
Model Модель транспортного средства Текст
Registration Регистрационный номер ТС Текст
Washing Была ли оказана услуга мытья ТС? Логическое значение true/false

Пример описания акта отгрузки в формате JSON:

{
  "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
}

Приложение должно считывать список актов отгрузки из CSV-файла (разделитель – запятая).
Пример данных:

Id,Title,SWG,Measure,Count,Price,Cost,ShipmentDateTime,Model,Registration,Washing
de42a00f-7f43-4d10-808d-bee47fdeef49,Песчано-гравийная смесь (ПГС),Песок речной,м3,36,640,22.3488,"2024-01-01T00:00:00  ",KAMAZ-65951-СА,Д903ЧН,True
2b52fcb1-34ec-48d2-95f2-b79f2d9c3c70,Песчано-гравийная смесь (ПГС),Щебень гранитный,м3,14,2660,36.1228,"2024-01-01T00:00:00",МАЗ 5516А8-336,Э723ВЛ,True
92a8c420-dd0d-43c6-a7a7-8ab5618b6cc5,Песчано-гравийная смесь (ПГС),Щебень гравийный,м3,16,1520,23.3472,"2024-01-01T00:00:00",МАЗ 5516А8-336,О295ЩЮ,True
fb0532cb-29c3-4be2-83ed-a8924a7901cb,Песчано-гравийная смесь (ПГС),Щебень шлаковый,м3,13,1400,17.108,"2024-01-01T00:00:00",МАЗ 5516А8-336,Ф760ЛЭ,True
202f3382-4572-435f-a66f-d6f981a97b5c,Песчано-гравийная смесь (ПГС),Песок карьерный,т,20,400,7.6,"2024-01-01T00:00:00"," УРАЛ 6х4 С35510",Й330ЖЭ,True
e7f9375b-ecab-4270-bafa-1263b5a6a4dc,Песчано-гравийная смесь (ПГС),Щебень гранитный,т,20,1860,33.48,"2024-01-01T00:00:00"," УРАЛ 6х4 С35510",Р188БС,False
4469cef4-4c11-4114-9efc-4bdee93def2c,Песчано-гравийная смесь (ПГС),Щебень гравийный,т,40,1060,39.008,"2024-01-01T00:00:00",KAMAZ-65951-СА,В866МЗ,False
2009d170-5d57-435b-8f42-d08d10b02b8c,Песчано-гравийная смесь (ПГС),Песчано-гравийная смесь,т,45,380,16.245,"2024-01-01T00:00:00",KAMAZ-65951-СА,Ф754ФБ,False

Имя файла с исходными данными должно передаваться приложению с ключом --swg-file

... --swg-file="../data/file.csv"
... --swg-file="C:\Users\AM\data\app-3968942893870838401.csv"

Список типов ПГС #

Тип ПГС Насыпная плотность (т/м3)
Песок речной 1.5
Песок карьерный 1.5
Щебень гранитный 1.4
Щебень гравийный 1.43
Щебень шлаковый 1.17
Песчано-гравийная смесь 1.6

Задание #

В зависимости от аргументов вызова приложение должно выполнять следующие команды:

1. list – получить список актов отгрузки. #

Выходные данные: список всех актов отгрузки в формате JSON, упорядоченный по возрастанию даты и времени отгрузки и id. Список может быть пустым.

Информация об акте отгрузки должна содержать только идентификатор, наименование и стоимость.

{
  "report": [
    {
      "Id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
      "Title": "Песчано-гравийная смесь (ПГС)",
      "Cost": 22.3488
    },
    {
      "Id": "2b52fcb1-34ec-48d2-95f2-b79f2d9c3c70",
      "Title": "Песчано-гравийная смесь (ПГС)",
      "Cost": 36.1228
    }
  ]
}
{
  "report": []
}

2. show-shipment – получить один элемент списка по идентификатору. #

--shipment-id=ID – обязательный параметр. Корректное значение: идентификатор существующего в списке акта отгрузки.

Выходные данные: полная информация об акте отгрузки в формате JSON.

show-shipment --shipment-id=de42a00f-7f43-4d10-808d-bee47fdeef49
{
  "shipment-id": "de42a00f-7f43-4d10-808d-bee47fdeef49",
  "shipment": {
    "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
  }
}

3. list-by-swg – получить список актов отгрузки по типу ПГС. #

--type=TYPE – обязательный параметр типа ПГС, корректное значение – из списка ПГС.

Выходные данные: список актов отгрузки в формате JSON соответствующего типа ПГС, упорядоченный по убыванию даты и времени отгрузки и возрастанию id. Список может быть пустым.

Информация об акте отгрузки должна содержать только идентификатор, наименование и стоимость.

list-by-swg --type="Щебень шлаковый"
{
  "type": "Щебень шлаковый",
  "report": [
    {
      "Id": "fb0532cb-29c3-4be2-83ed-a8924a7901cb",
      "Title": "Песчано-гравийная смесь (ПГС)",
      "Cost": 17.108
    }
  ]
}

4. list-by-period – получить список отгрузок за период. #

--from – обязательный параметр даты в формате ISO.
--to – обязательный параметр даты в формате ISO.

Выходные данные: список актов отгрузки, для которых дата отгрузки находится в промежутке между --from и --to включительно. Список упорядочен по возрастанию даты и времени отгрузки и id. Список может быть пустым.

Информация об акте отгрузки должна содержать только идентификатор, наименование, дату отгрузки (поле ShipmentDate) и стоимость.

list-by-period --from="2024-01-01" --to="2024-01-02"
{
  "from": "2024-01-01",
  "to": "2024-01-02",
  "report": [
    {
      "Id": "fb0532cb-29c3-4be2-83ed-a8924a7901cb",
      "Title": "Песчано-гравийная смесь (ПГС)",
      "ShipmentDate": " 2024-01-01",
      "Cost": 17.108
    },
    {
      "Id": "202f3382-4572-435f-a66f-d6f981a97b5c",
      "Title": "Песчано-гравийная смесь (ПГС)",
      "ShipmentDate": " 2024-01-02",
      "Cost": 7.6
    }
  ]
}

5. report – получить отчётную информацию по объёму загрузки. #

--year – обязательный положительный числовой параметр года отчёта.

Выходные данные: отчётность по месяцам для отгрузок переданного года. Список упорядочен по месяцу, каждый отчёт содержит поля:

  • month – код месяца,
  • monthTitle – название месяца,
  • count – количество отгрузок,
  • cost – общая стоимость отгрузок,
  • weight – суммарный вес отгрузок Measure=т
  • volume – суммарный объём груза для отгрузок Measure=м3

В выдаче должны присутствовать только те месяцы года, для которых есть данные.

report --year=2024
{
  "report": [
    {
      "month": 1,
      "monthTitle": "Январь",
      "count": 8,
      "cost": 202.4868,
      "weight": 125,
      "volume": 79
    }
  ]
}

Выходные данные #

При корректных входных данных приложение должно завершать работу с кодом возврата 0 и возвращать данные в формате JSON.

При некорректных входных данных приложение должно завершать работу с ненулевым кодом возврата и возвращать сообщение об ошибке. Некорректными данными считаются:

  • отсутствие аргумента команды или некорректная команда.
  • отсутствие обязательного параметра команды, его некорректное значение или несоответствие значения указанному типу данных.
  • отсутствие аргумента --swg-file или его некорректное значение.

Приложение всегда должно завершать работу корректно. Падение приложения или отображение стека вызовов недопустимо.

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su