2017-02-17 4 views
4

Ich arbeite an einem Warteschlangensystem für eine Klinik. Die Person an der Rezeption hat zwei Optionen, um Patienten zur Warteschlange hinzuzufügen.Finde den nächsten freien Platz in einem Zeitfeld

  1. Patienten mit festen Terminen
  2. Walk-in Patienten

So zum Beispiel gibt es vier Patienten, die bereits in der Warteschlange, mein vorhandenen Termine Array sieht aus wie

existing_appointments = ["09:30", "10:00", "12:15", "13:45"]; 

Und Durchschnitt Check-up-Zeit für einen Patienten beträgt 15 Minuten.

avg_wait_per_patient = 15; 

Sobald ein Patient zu Fuß ist, finde ich das beste verfügbare Zeitfenster für ihn.

Sagen Sie jetzt die Zeit 09.00

ist
current_time = "09:00"; 

Die unten Funktion find_free_slot() funktioniert nicht, weil es 9.15 kehrt statt 09.00 Uhr, da es auf diesem Slot kein Termin ist.

Was ich erreichen möchte, ist, wenn es niemanden in der Nähe von current_time + avg_wait_per_patient gibt, sollte die Person current_time Schlitz gegeben werden. Wenn dieser Slot nicht verfügbar ist, sollte er das Array durchlaufen, es sei denn, es wird ein freies gefunden. Und wenn es scheitert, sollte die Person zu der Zeit auf last_index_of_array + avg_wait hinzugefügt werden.

function toMinutes(t) { 
    return 60 * Number(t.split(":")[0]) + Number(t.split(":")[1]); 
} 
function reverse_toMinutes(t) { 
    return ("0" + Math.floor(t/60)).slice(-2) + ":" + ("0" + t % 60).slice(-2); 
} 
function find_free_slot(ct,appointments,avg_wait) { 
    ct = toMinutes(ct); 
    free_slot = ''; 
    if(appointments.length==0) { 
     free_slot = ct; 
    } else { 
     for(i=0; i<appointments.length; i++) { 
      appointment = toMinutes(appointments[i]); 
      if(free_slot <= appointment - avg_wait) { 
       i == 0 ? 
        free_slot = ct + avg_wait : 
        free_slot = toMinutes(appointments[i - 1]) + avg_wait; 
       break; 
      } 
     } 
    } 
    return reverse_toMinutes(free_slot); 
} 

jsfiddle

+0

ich verschiedene Werte für CURRENT_TIME und existing_appointments Eingabe versucht haben. Zum Beispiel habe ich die aktuelle Zeit auf 9:50 'current_time =" 09:50 ";' geändert, die resultierende Ausgabe war 10:05. Zusätzlich habe ich den ersten Wert in existing_appointments auf 9:10 geändert, die resultierende Ausgabe war 9:15. – Inkdot

Antwort

4

Das Problem ist in:

i == 0 ? 
    free_slot = ct + avg_wait : 
    free_slot = toMinutes(appointments[i - 1]) + avg_wait; 

Wenn Sie den ersten Termin Überprüfung sind (9,30) und den freien Steckplatz <= (9:30 - 15), dann sind Sie ct + avg_wait zurückkehren, die ist 9:00 + 15.

Ich habe die Logik ein bisschen wieder gearbeitet, damit es funktioniert:

function toMinutes(t) { 
 
    return 60 * Number(t.split(":")[0]) + Number(t.split(":")[1]); 
 
} 
 

 
function reverse_toMinutes(t) { 
 
    return ("0" + Math.floor(t/60)).slice(-2) + ":" + ("0" + t % 60).slice(-2); 
 
} 
 

 
function find_free_slot(ct, appointments, avg_wait) { 
 
    ct = toMinutes(ct); 
 
    free_slot = ct; // The first slot you want to check is "right now" 
 

 
    if (appointments.length == 0) 
 
    return reverse_toMinutes(ct); 
 

 
    for (i = 0; i < appointments.length; i++) { 
 
    appointment = toMinutes(appointments[i]); 
 
    if (ct <= appointment + avg_wait) {  // The appointment must be later than the current appointment's end time. 
 
     if (free_slot <= appointment - avg_wait) // Free slot is enough time before the current appointment 
 
     return reverse_toMinutes(free_slot); // Return the free slot 
 

 
     free_slot = toMinutes(appointments[i]) + avg_wait; // Otherwise, set the free slot to `avg` after the current appointment, to check the next iteration of the loop. 
 
    } 
 
    } 
 
    return reverse_toMinutes(free_slot); // No free slot has been found, `free_slot` is `last appointment + avg` 
 
} 
 

 
var appointments = ["09:30", "10:00", "12:15", "13:45"]; 
 

 
console.log(" time - appointment"); 
 
console.log(" 9:00 -", find_free_slot("9:00", appointments, 15)); 
 
console.log(" 9:15 -", find_free_slot("9:15", appointments, 15)); 
 
console.log(" 9:16 -", find_free_slot("9:16", appointments, 15)); 
 
console.log(" 9:31 -", find_free_slot("9:31", appointments, 15)); 
 
console.log("10:09 -", find_free_slot("10:09", appointments, 15)); 
 
console.log("11:59 -", find_free_slot("11:59", appointments, 15)); 
 
console.log("12:00 -", find_free_slot("12:00", appointments, 15)); 
 
console.log("12:01 -", find_free_slot("12:01", appointments, 15));

+0

Vielen Dank für Ihre Antwort. Sieht so aus, als gäbe es immer noch einen Fehler in der Logik. Haben Sie versucht, 'current_time =" 09:31 "' Es sollte "09:46" zurückgeben – AZee

+0

@AZee: Warum sollte es '09: 46' zurückgeben? Das ist 16 Minuten nach dem nächsten Termin. Da ein Termin im Durchschnitt 15 Minuten beträgt, ist der nächste verfügbare Platz 15 Minuten nach dem 09:30 Uhr Termin. (Der Termin um 9:30 Uhr endet im Durchschnitt um 9:45 Uhr. Warum eine Minute warten, um den nächsten Patienten zu planen?) – Cerbrus

+0

Da ist bereits ein Termin bei '9: 30' im Array, was den freien Platz für das Kommen bedeutet Person ist 9:45, weil die erste Person 15 Minuten braucht, dann kommt die zweite Person um 9:45 Uhr. – AZee

0

Sie überprüfen können, wenn der nächste Slot plus die durchschnittliche Zeit ist kleiner als dann Termin.

Wenn true, zurückgeben, andernfalls prüfen, ob die Zeit plus durchschnittliche Zeit größer oder gleich dem nächsten offenen Slot ist, dann den Slot plus durchschnittliche Zeit nehmen.

function getMinutes(t) { 
 
    var p = t.split(':'); 
 
    return 60 * p[0] + +p[1]; 
 
} 
 

 
function find_free_slot(current_time) { 
 
    var next_time = getMinutes(current_time); 
 

 
    existing_appointments.some(function (a) { 
 
     var minutes = getMinutes(a); 
 
     if (next_time + avg_wait_per_patient <= minutes) { 
 
      return true; 
 
     } 
 
     next_time = minutes + avg_wait_per_patient >= next_time ? minutes + avg_wait_per_patient : next_time; 
 
    }); 
 
    return ('0' + Math.floor(next_time/60)).slice(-2) + ':' + ('0' + next_time % 60).slice(-2); 
 
} 
 

 
var existing_appointments = ["09:30", "10:00", "12:15", "13:45"], 
 
    avg_wait_per_patient = 15; 
 

 
console.log(find_free_slot('09:00')); // 09:00 
 
console.log(find_free_slot('09:15')); // 09:15 
 
console.log(find_free_slot('09:16')); // 09:45 
 
console.log(find_free_slot('09:45')); // 09:45 
 
console.log(find_free_slot('09:46')); // 10:15 
 
console.log(find_free_slot('10:00')); // 10:15 
 
console.log(find_free_slot('10:09')); // 10:15 
 
console.log(find_free_slot('11:59')); // 11:59 
 
console.log(find_free_slot('12:00')); // 12:00 
 
console.log(find_free_slot('12:01')); // 12:30

-1

machte ich etwas bearbeiten, jetzt ist es ok, vielleicht benötigen Sie einen close_time und START_TIME auch zu überprüfen.

function toMinutes(t) { 
 
\t return 60 * Number(t.split(":")[0]) + Number(t.split(":")[1]); 
 
} 
 
function reverse_toMinutes(t) { 
 
\t return ("0" + Math.floor(t/60)).slice(-2) + ":" + ("0" + t % 60).slice(-2); 
 
} 
 

 
var existing_appointments = ["09:30", "10:00", "12:55", "13:45"]; 
 
var avg_wait_per_patient = 15; // in minutes 
 
var current_time = "10:00"; 
 

 
function find_free_slot(ct,appointments,avg_wait) { 
 
\t ct = toMinutes(ct); 
 
\t var free_slot = ''; 
 
    
 
\t if(appointments.length==0) { 
 
\t \t free_slot = ct; 
 
\t } 
 
    else if (appointments.length==1) { 
 
    \t free_slot = toMinutes(appointments[0])+avg_wait; 
 
\t } 
 
    else { 
 
    var i=0; 
 
    \t for (i=1;i<appointments.length;i++){ 
 
    \t if (toMinutes(appointments[i])-toMinutes(appointments[i-1])>=2*avg_wait){ 
 
     \t free_slot=toMinutes(appointments[i-1])+avg_wait; 
 
      break; 
 
     }  
 
     } 
 
\t } 
 
    
 
    if (free_slot=='') free_slot=toMinutes(appointments[appointments.length-1])+avg_wait; 
 

 
\t return reverse_toMinutes(free_slot); 
 
} 
 

 
document.write(find_free_slot(current_time,existing_appointments,avg_wait_per_patient));

-1

Ich schlage vor, Sie momentjs Bibliothek zu verwenden, um diese Art von Berechnungen & Formatierung zu tun. Hier ist ein Beispiel, wie Sie mit dem Moment erreichen können, was Sie wollen.

function find_free_slot(ct,appointments,avg_wait) { 
 
    existing_appointments.sort((a,b) => a-b); 
 
    let possibleSlot = ct; 
 
    for(let i=0; i<appointments.length; i++) { 
 
    const a = appointments[i]; 
 
    if(a >= +possibleSlot + (avg_wait * 60000)) { 
 
     appointments.splice(i, 0, possibleSlot); 
 
     return possibleSlot; 
 
    } 
 
    const endOfCurrentSlot = a.clone().add(avg_wait,'minute'); 
 
    if(endOfCurrentSlot > possibleSlot) { 
 
     possibleSlot = endOfCurrentSlot; 
 
    } 
 
    } 
 
    appointments.push(possibleSlot); 
 
    return possibleSlot; 
 
    
 
} 
 

 
const existing_appointments = [ 
 
    moment('09:30','HH:mm'), 
 
    moment('10:00','HH:mm'), 
 
    moment('13:45','HH:mm') 
 
]; 
 
const avg_wait_per_patient = 15; // in minutes 
 

 
function getSlotStr(time) { 
 
    var slot = find_free_slot(time, existing_appointments, avg_wait_per_patient); 
 
    return time.format('HH:mm') + ' --> ' + slot.format('HH:mm'); 
 
} 
 

 
document.write(getSlotStr(moment('09:00','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('09:10','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('09:20','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('09:30','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('09:40','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('10:10','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('13:00','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('13:40','HH:mm')) + '<br />'); 
 
document.write(getSlotStr(moment('13:50','HH:mm')) + '<br />');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

Verwandte Themen