Задание «Инвентаризационный список техники»

Задание «Инвентаризационный список техники» #

Задание № 1 #

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

Данные #

Элемент списка: элемент техники.

Название поля Описание поля Тип поля
Id Инвентарный номер UUID
Equipment Наименование оборудования Текст
Category Тип техники Из списка: монитор, ПК, телефон, принтер, другое
GuaranteeDate Гарантийный срок Дата в формате ISO
IsUsed Используется или свободно Логическое значение:
true (используется)
false (свободно)
Price Балансная стоимость Вещественное число
Location Место хранения Текст
ResponsiblePerson ФИО материально ответственного лица Текст
User ФИО пользователя оборудования Текст
null, если IsUsed=false

Пример описания элемента техники в формате JSON:

{
  "Id": "67bfcd12-6c8f-45fc-bc6b-265c23d7d881",
  "Equipment": "Системный блок Acer",
  "Category": "ПК",
  "GuaranteeDate": "2028-01-01",
  "IsUsed": true,
  "Price": 15300,
  "Location": "дома",
  "ResponsiblePerson": "Смирнова Ксения Дмитриевна",
  "User": "Смирнова Ксения Дмитриевна"
}

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

Id,Equipment,Category,GuaranteeDate,IsUsed,Price,Location,ResponsiblePerson,User
1d0f861e-9d0c-4340-acad-69ade7b83085,"Монитор 19.5"" LG 20M47D",монитор,2028-01-01,false,2800,склад,Иванов Иван Иванович,
4cc3098f-fa98-4312-b351-fce99fde825f,"Монитор 19.5"" Acer K202HQL",монитор,2028-01-01,false,5700,склад,Иванов Иван Иванович,
bf7c82ce-334a-470b-89be-f7ae283ce564,"Системный блок Acer Intel Core i5-6500, RAM 16 ГБ, SSD 480 ГБ, Intel HD Graphics 530",ПК,2028-01-01,false,15300,склад,Иванов Иван Иванович,
f463afc0-3088-4ba4-92ae-5859faedc585,"Принтер Canon PIXMA G540 ",принтер,2030-01-01,true,21550,"офис, кабинет № 26",Иванов Иван Иванович,Воронкова Элина Матвеевна
d7494a0f-6929-4d71-9bbc-fb067356bfeb,IP-телефон Cisco CP-7940G,телефон,2030-01-01,true,6100,"офис, кабинет № 26",Иванов Иван Иванович,Овсянникова Анастасия Елисеевна
fe385d95-f916-47c0-b042-557435b2e160,Проектор Epson EB-E20,другое,2030-01-01,true,60600,"офис, кабинет № 15",Быкова Ника Робертовна,Быкова Ника Робертовна
f920444e-3741-497c-a6b2-b9fa1bc5b741,"Принтер Canon PIXMA G540 ",принтер,2030-01-01,true,21550,"офис, кабинет № 15",Иванов Иван Иванович,Волкова Александра Артемьевна
505324a0-dc5f-4e55-adb2-08cea636909f,"Монитор 19.5"" Acer K202HQL",монитор,2028-01-01,true,5700,"офис, кабинет № 15",Горбунов Тимофей Дмитриевич,Горбунов Тимофей Дмитриевич
ddf299df-f992-40f0-98f2-52e087b19f2b,IP-телефон Cisco CP-7940G,телефон,2030-01-01,true,6100,"офис, кабинет № 15",Новикова Виктория Романовна,Новикова Виктория Романовна
dfae5f87-9f0d-4972-9fb7-ec4b1cd49ad2,IP-телефон Cisco CP-7940G,телефон,2030-01-01,true,6100,"офис, кабинет № 12",Иванов Иван Иванович,Федорова Ника Кирилловна
14fb9f3b-0540-407c-b93b-2d57a574240f,"Монитор 19.5"" LG 20M47D",монитор,2028-01-01,true,2800,дома,Иванов Иван Иванович,Козлов Тихон Ильич
61ee40c7-c174-431f-9c2b-8c821b11075b,"Системный блок Acer Intel Core i5-6500, RAM 16 ГБ, SSD 480 ГБ, Intel HD Graphics 530",ПК,2028-01-01,true,15300,дома,Лазарева Марьяна Михайловна,Лазарева Марьяна Михайловна
53fd0e1e-d06e-46b0-8d64-298166453829,"Монитор 19.5"" LG 20M47D",монитор,2028-01-01,true,2800,дома,Михайлова Альбина Александровна,Михайлова Альбина Александровна
99e66f63-6303-45f5-9cc3-4214de370633,"Системный блок Acer Intel Core i5-6500, RAM 16 ГБ, SSD 480 ГБ, Intel HD Graphics 530",ПК,2028-01-01,true,15300,дома,Морозова Арина Львовна,Морозова Арина Львовна
1fee9e0c-3323-468e-b8cb-36d294347b49,"Монитор 19.5"" LG 20M47D",монитор,2028-01-01,true,2800,дома,Руднев Никита Александрович,Руднев Никита Александрович
67bfcd12-6c8f-45fc-bc6b-265c23d7d881,"Системный блок Acer Intel Core i5-6500, RAM 16 ГБ, SSD 480 ГБ, Intel HD Graphics 530",ПК,2028-01-01,true,15300,дома,Смирнова Ксения Дмитриевна,Смирнова Ксения Дмитриевна

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

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

Задание #

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

1. list – получить список техники. #

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

Информация о технике должна содержать только инвентарный номер, наименование и поле IsUsed.

{
  "equipment": [
    {
      "Id": "fe385d95-f916-47c0-b042-557435b2e160",
      "Equipment": "Проектор Epson EB-E20",
      "IsUsed": true
    },
    {
      "Id": "14fb9f3b-0540-407c-b93b-2d57a574240f",
      "Equipment": "Монитор 19.5\" LG 20M47D",
      "IsUsed": true
    }
  ]
}
{
  "equipment": []
}

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

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

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

show-equipment --equipment-id=fe385d95-f916-47c0-b042-557435b2e160
{
  "equipment-id": "fe385d95-f916-47c0-b042-557435b2e160",
  "equipment": {
    "Id": "fe385d95-f916-47c0-b042-557435b2e160",
    "Equipment": "Проектор Epson EB-E20",
    "Category": "другое",
    "GuaranteeDate": "2030-01-01",
    "IsUsed": true,
    "Price": 60600,
    "Location": "офис, кабинет № 15",
    "ResponsiblePerson": "Быкова Ника Робертовна",
    "User": "Быкова Ника Робертовна"
  }
}
{
  "equipment-id": "1d0f861e-9d0c-4340-acad-69ade7b83085",
  "equipment": {
    "Id": "1d0f861e-9d0c-4340-acad-69ade7b83085",
    "Equipment": "Монитор 19.5\" LG 20M47D",
    "Category": "монитор",
    "GuaranteeDate": "2028-01-01",
    "IsUsed": false,
    "Price": 2800,
    "Location": "склад",
    "ResponsiblePerson": "Иванов Иван Иванович",
    "User": null
  }
}

3. list-unused-equipment – получить список не использующейся техники. #

--category=TEXT – необязательный параметр типа техники. Может содержать несколько типов техники через запятую. Регистр может отличаться, могут присутствовать лишние пробельные символы. Если хотя бы одно из полученных значений отсутствует в списке типов техники, значение параметра считается некорректным и приложение должно возвращать ненулевой код и сообщение об ошибке.

Выходные данные: список свободной техники в формате JSON соответствующих типов или всех типов при отсутствии параметра или при пустом параметре. Список может быть пустым.

Информация о технике должна содержать только инвентарный номер и наименование. Список упорядочен по возрастанию типа техники лексикографически и id.

Поле «category» должно содержать переданную строку или пустую строку, если параметр отсутствует.

list-unused-equipment
list-unused-equipment --category=монитор 
list-unused-equipment --category=Монитор,Пк
{
  "category": "Монитор,Пк",
  "equipment": [
    {
      "Id": "1d0f861e-9d0c-4340-acad-69ade7b83085",
      "Equipment": "Монитор 19.5\" LG 20M47D"
    },
    {
      "Id": "4cc3098f-fa98-4312-b351-fce99fde825f",
      "Equipment": "Монитор 19.5\" Acer K202HQL"
    },
    {
      "Id": "bf7c82ce-334a-470b-89be-f7ae283ce564",
      "Equipment": "Системный блок Acer Intel Core i5-6500, RAM 16 ГБ, SSD 480 ГБ, Intel HD Graphics 530"
    }
  ]
}
{
  "category": "другое",
  "equipment": []
}

4. list-time – получить список техники, которую нужно заменить к моменту времени. #

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

Выходные данные: список техники, для которой в переданный момент времени истечёт гарантийный срок.

Список может быть пустым.

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

list-time --time=2028-01-01T00:00:00.0
{
  "time": "2028-01-01T00:00:00.0",
  "equipment": [
    {
      "Id": "1fee9e0c-3323-468e-b8cb-36d294347b49",
      "Equipment": "Монитор 19.5\" LG 20M47D",
      "GuaranteeDate": "2028-01-01"
    },
    {
      "Id": "99e66f63-6303-45f5-9cc3-4214de370633",
      "Equipment": "Системный блок Acer Intel Core i5-6500, RAM 16 ГБ, SSD 480 ГБ, Intel HD Graphics 530",
      "GuaranteeDate": "2028-01-01"
    }
  ]
}

5. statistic – получить статистическую информацию об имеющейся технике. #

--by-type=[category/person] – обязательный параметр типа отображаемой статистики.

Возможные значения:

  • category – статистика по типу техники
  • person – статистика по материально ответственному лицу

Статистика должна содержать поля:

  • category/person – тип техники или МОЛ,
  • count – количество элементов техники,
  • price – общая стоимость элементов техники,
  • countUsers – количество различных пользователей, пользующихся данной техникой (null не учитывается).

Статистика должны быть упорядочена по полю category/person. Может быть пустой.

statistic --by-type=category
statistic --by-type=person
{
  "statisticByCategory": [
    {"category": "другое", "count": 1, "price": 60600, "countUsers": 1},
    {"category": "монитор", "count": 6, "price": 22600, "countUsers": 4},
    {"category": "ПК", "count": 4, "price": 61200, "countUsers": 3},
    {"category": "принтер", "count": 2, "price": 43100, "countUsers": 2},
    {"category": "телефон", "count": 3, "price": 18300, "countUsers": 2}
  ]
}
{
  "statisticByPerson": [
    {"person": "Быкова Ника Робертовна", "count": 1, "price": 60600, "countUsers": 1},
    {"person": "Горбунов Тимофей Дмитриевич", "count": 1, "price": 5700, "countUsers": 1},
    {"person": "Иванов Иван Иванович", "count": 8, "price": 81900, "countUsers": 5},
    {"person": "Лазарева Марьяна Михайловна", "count": 1, "price": 15300, "countUsers": 1}
  ]
}

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

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

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

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

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

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