Создание массива временных меток, удаляющих часы между началом и концом периода - PullRequest
1 голос
/ 01 ноября 2019

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

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

Что я делаю в настоящее время после выбора профессионала и услуги (я опубликую соответствующий код ниже):

  • Я получаю рабочее время специалиста, с воскресенья по субботу, в какие дни он работает и в какое время он начинает и заканчивает работать.
  • Я получаю его повестку дня, то, что он уже запланировал, услуги запускаются иконечные часы.
  • Я создаю массив, в котором первая запись является профессиональным начальным часом, в котором я суммирую продолжительность службы и продолжаю делать это, пока она не достигнет конечного часа.
  • Затем ясоздайте цикл для удаления любого доступного часа, на который может быть запланировано обслуживание.

Вот пример переменных, которые у меня работаютрк с:

weekDay = {
  startHour: '08:00AM', endHour: '05:00PM'
};
serviceDuration = 30;
agenda = [
  {"from": 1572683400000, "to": 1572685200000}, 
  {"from": 1572685200000, "to": 1572687000000},
  {"from": 1572688800000, "to": 1572690600000}, 
  {"from": 1572694200000, "to": 1572696000000},
  {"from": 1572696000000, "to": 1572699600000}, 
  {"from": 1572705000000, "to": 1572706800000},
  {"from": 1572711300000, "to": 1572713100000}
];
baseArray = ['08:00AM', '08:30AM', '09:00AM', '09:30AM', ..., '04:30PM'];
// The baseArray is also converted to timestamp, this is just to demonstrate
// Agenda is called removeArray in the code

Для того, что я делаю, это работает отлично, но что-то новое только что появилось, и нам нужно сгенерировать доступное время, основываясь на том, когда служба в повестке дня закончилась.

Допустим, у меня есть услуга продолжительностью 45 минут, я начинаю работать в 08:00, и уже есть кое-что забронированное с 8:30 до 9:00. Добавляя длительность, как я делаю сейчас, я получу это: ['08:00', '08:45', '09:30']. Но мне нужно следующее доступное время, когда уже забронированная услуга заканчивается, поэтому должно быть что-то вроде: ['08:00', '09:00'];

Я придумал код, в котором я проверяю текущий часДобавленный beeing находится в середине текущего забронированного сервиса, если это я возвращаю конец сервиса, чтобы быть следующим значением, которое будет сравниваться. Вот код, который у меня сейчас есть:

  let startHour = new Date(`${currentDay}T${weekDay.startHour}:00.000Z`).getTime();
  const endHourTime = new Date(`${currentDay}T${weekDay.endHour}:00.000Z`).getTime();

  if (startHour <= endHourTime) {
    while (startHour < endHourTime && endHourTime - startHour >= duration) {
      baseArray.push(startHour);
      startHour = getNextAvailableTime(startHour, duration, removeArray);
    }
  }

function getNextAvailableTime(startHour, duration, removeArray) {
  const filterArray = [];
    for (let i = 0, max = removeArray.length; i < max; i++) {
      if ((startHour >= removeArray[i].from && startHour < removeArray[i].to)) {
        filterArray.push(removeArray[i].to);
        break;
      }
    }

    if (filterArray.length > 0) {
      return filterArray[0];
    } else {
      return startHour + duration;
    }
  }
}

Это ставит меня в бесконечный цикл, всегда получая конец первого значения в removeArray. Есть идеи, что я делаю не так? Если вам нужно лучше объяснить, я буду рад сделать это

...