DEV Challenge XVIII backend nomination solution
Installation
$ yarn install
Run the app
# production mode
$ yarn start
# development mode
$ yarn start:dev
Run docker image
$ docker-compose up prod
Test
# unit tests
$ yarn test
# test coverage
$ yarn test:cov
Методология
При планировании реализации проекта, я изначально понял что структура крестообразной развёртки коробки является не эффективной, из-за выпирающих углов, что даёт дополнительную площадь отходов. Наиболее эффективной, по моему мнению, является форма прямоугольника, благодаря 100% прилеганиям к краям листа и к другим коробкам.
Изначально планировалось сделать полностью автономную фабричную систему коробок, в которой можно валидировать, рассчитывать и давать команды для отдельного типа коробки, но из-за нехватки времени было решено сделать поддержку только одного вида коробок.
В первую очередь необходима была валидация входящих данных. Это было реализовано с помощью проверки на типы. Сначала проверял, являются ли объекты объектами, после этого пошла валидация чисел.
Дальше создал класс коробки, как было сказано выше, с единичным функционалом. В нём сделал проверку на размер листа, функционал которой перенял сервис валидатора, а также получение высоты и ширины обертки, и команд для выреза начиная с левого нижнего угла, координаты которого нужно указать.
Для заполнения области листа по максимуму, в некоторых случаях развёртку нужно переворачивать на 90 градусов. Для этого было сделано отдельный метод создания команд.
После создания коробки необходим класс для обработки размеров листа, для этого было создано класс резака. Его функционал представлял собой поиск количества, а в последствии начальных координат каждой коробки, значения которых передавались к классу коробки, который уже генерировал команды.
Работа по поиску коробок заключается в:
- Поиску количества нормальных коробок по горизонтали, по формуле: ширинаЛиста/ширинаКоробки
- Поиска количества нормальных коробок по вертикали
- Если хоть одно округлённое значение является нулём, то все значения нормальной коробки - 0
- Если округлённое до меньшего значения количество коробок по горизонтали не сходится с не округлённым, то можно искать перевёрнутые коробки
- Повторяется схема с нормальными коробками, но от остатка листа
В итоге к контроллеру запросов поступало всего два сервиса, валидатор и резак.
Замечания и улучшения
- Необходимо обязательно внедрить фабричный метод для инициализации коробок
- Стоит добавить стандартные размеры листов картона
- Функционал по поиску оптимального размера стандартных листов картона для конкретного количества коробок заданного размера
- Возможность получения команд в стандарте gcode, как наиболее популярного в сфере ЧПУ
- Сохранение в базу данных часто используемых шаблонов