Изначально все лифты находятся в состоянии покоя. Система спроектирована так, что количество этажей и число лифтовых шахт можно поменять, при этом размер лифтов и этажей пересчитается.
Кнопки находятся в неактивном состоянии.
При нажатии на неактивную кнопку вызова программа ищет ближайший свободный лифт, расположенный к вызванному этажу. Поиск свободных лифтов происходит слева направа(как на картинке)
Данные лифтовой системы обновляются.
Вызов нескольких этажей также обрабатывается:
Лифт движется со скоростью 1 этаж за секунду.
При остановке на этаже лифт стоит 3 секунды и мигает:
Представляет собой массив объектов со свойствами уровня и состояния вызова:
При вызове обновляется состояние вызова.
Очередь реализована по принципу FIFO(First In First Out) - первый этаж в очереди будет обработан первым.
Очередь реализована через массив levelsQueue
:
Кнопки при добавлении этажа в очередь подсвечиваются активным цветом.
Повторное нажатие активной кнопки не добавляет ее в очередь и не изменяет её активного цвета.
По прибытии лифта на этаж кнопка "отпускается".
Логика функции поиска ближайшего лифта findFreeClosestShaft
вынесена в отдельный файл,т.к. довольно большая:
С помощью функции Array.prototype.reduce
выбирается наиболее близкий свободный лифт. Обязательные условия - лифт должен быть свободен и расстояние между этажом и лифтом должно быть минимальным.
Если на этаже уже есть лифт - вызов пропускается.
Если свободный лифт не найден, возвращается объект со свойствами gap
со значением макисмального этажа и allBusy
со значение true, если все лифты заняты. В таком случае вызов помещается в очередь levelsQueue
.
Реализовано частично
Система запоминает позицию лифта при beforeunload
событии страницы, если лифт приехал на этаж и находится либо в состоянии покоя, либо мигает:
При перезагрузке/закрытие и открытии страницы система лифтов не возобновляет движение:no_entry:
Также имеется костыль недочет при изменении параметров системы(если отключить localStorage, число лифтов и кнопок можно менять в файле state.js
):
Как уже упоминалось ранее, система расширяема: параметры shafts
и levels
меняются в файлах state.js и
App.vue`.
Покажу еще несколько примеров:
git init
git clone https://github.com/wouldRewind/TrueConfTest.git
npm install
npm run start
npm run build