Uzałem że w ten sposób będę mógł pokazać najlepiej swoje umiejętności gdyż mam chyba największą wiedzę jeśli chodzi o budowanie tego typu aplikacji, mimo iż dla tego typu zadania wydaje mi się że nie jest to najlepsza opcja.
Algorytm wybiera najbliższe piętro w kierunku w którym porusza się winda(góra, dół), zatem najpierw wybierany jest kierunek windy w którym będzie się poruszać a dopiero potem wybierane jest najbliższe piętro. Nie można wybrać piętra na którym znajduje się aktualnie winda.
- jeśli winda porusza się w górę to wybrane zostanie najbliższe piętro w tym kierunku mimo iż bliżej może znajdować się piętro w kierunku przeciwnym
- jeśli winda oczekuje czyli nie porusza się ani w góre ani w dół to winda zacznie poruszać się w kierunku piętra które zostało wybrane jako pierwsze a następnie znajdzie najbliższe piętro na którym ma się zatrzymać
- gdy nie będzie już pięter na które ma sie udać winda w kierunku w którym porusza się winda to kierunek windy zostanie zmieniony i zostanie wybrane najbliższe piętro na które winda ma się udać
- winda przejdzie w stan oczekiwania gdy nie będzie musiała udać się na żadne piętro a będzie oczekiwała na piętrze na którym się zatrzymała.
Winda oczekuje na piętrze 3, wchodzi trzech ludzi, najpierw zostaje przyciśnięty przycisk 10 potem 0 a potem 5 -> winda zacznie poruszać się do góry bo jako pierwsze zostało wybrane piętro które znajduję się wyżej, winda najpierw zatrzyma się na piętrze 5 potem 10 a na końcu piętrze 0, jeśli na 5 piętrze ktoś wsiadł i wybrał piętro 11 to kolejność pięter będzie następująca 5 -> 10 -> 11 -> 0.
- przycisk "add elevator" dodaje winde
- przycisk "simulate" uruchamia wszystkie windy
- zielona obwódka przy numerze oznacza że winda oczekuje na tym piętrze
- czerwona obwódka przy numerze oznacza że piętro zostało wybrane
By uruchomić aplikacje należy mieć zainstalowanego dockera.
Uruchomienie za pomocą dockera -> należy przejść do folderu z aplikacją - ten folder w którym znajduje się plik docker-compose.yml
następnie wpisać komende docker-compose up i poczekać na uruchomienie, frontend troche długo się buduje.
Następnie otworzyć przeglądarke i udać się pod adres http://localhost:3000/
Frontend wysyła zapytanie do backendu by dostać informacje o aktualnym stanie wind co 0.5 sekundy.
By zmiany stanu windy były widoczne dla użytkownika symulowane jest opóźnienie pomiędzy zmianą pięter, otwarciem drzwi czy zamknięciem drzwi.
Czas opóźnienia jest konfigurowalny co można zobaczyć w klasie ElevatorConfig.
Po stronie frontendowej założono że winda ma maksymalnie 16 pięter przy czym maksymalne piętro i minimalne można skonfigurować jedynie dla backendu.
Ogólnie dla lepszej synchronizacji lepiej by opóźnienie nie było mniejsze niż jedna sekunda.
Przy aktualnie dobranych parametrach w miare dobrze wszystko działa.
Wydaje mi się, że lepszym pomysłym było by zdefiniowanie modelu piętra i przypisanie go do windy, taki model przechowywałby informacje czy oczekuje az winda pojawi się na tym piętrze, dzięki temu ograniczona byłaby liczba requestów jakie są tworzone ponieważ nie trzeba byłoby ich tworzyć a jedynie modyfikować status danego piętra ponadto takie rozwiązanie lepie współgrałoby z frontendem gdyż pozwoliłoby to na uniknięcie pewnych bugów, niestety wpadłem na to za późno.
