Функция React, генерирующая доступные временные интервалы, не генерирует правильные временные интервалы

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

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

const GenerateAvailableTimeSlots = (start, serviceObject, allAppointments) => {

  const moment = extendMoment(Moment);

  var x = {
    nextSlot: 15,
    appointmentsOfThatDay: [],
    startTime: '8:00',
    endTime: '20:00'
  };
  // function to filter only the appointment that occur on specified day --> ( start )
  let filterAppointments = (allAppointments, start) => {
    let results = [];
    let filterAppoinments = allAppointments.filter(appoinment => appoinment.date === start.format('MMMM Do YYYY'));
    filterAppoinments.map(appoinment => results.push([appoinment.start.format('HH:mm'), appoinment.end.format('HH:mm')]))
    console.log("results", results);
    return results;
  };

  x.appointmentsOfThatDay = filterAppointments(allAppointments, start)
  console.log("appointmentsOfThatDay", x.appointmentsOfThatDay)

  var slotTime = moment(x.startTime, "HH:mm");
  var endTime = moment(x.endTime, "HH:mm");

  // function to check time slot overlaps with already made appointments 
  function OverlapsScheduledAppointment(slotTime, appointments) {

    //added duration to timeslot so I could check if a suggested timeslot + the duration also doesn't overlap with already made appointment
    var slotTimeWithDuration = slotTime.clone().add(serviceObject.hours, 'hours').add(serviceObject.minutes, 'minutes');

    // I don't know where I also could check for slotTimeWithDuration overlap
    return appointments.some((br) => {
      console.log(slotTime >= moment(br[0], "HH:mm") && slotTime < moment(br[1], "HH:mm"));
      return (slotTime >= moment(br[0], "HH:mm") && slotTime < moment(br[1], "HH:mm"));
    });
  }

  let times = [];
  while (slotTime < endTime) {
    if (!OverlapsScheduledAppointment(slotTime, x.appointmentsOfThatDay)) {
      times.push(slotTime.format("HH:mm"));
    }
    slotTime = slotTime.add(x.nextSlot, 'minutes');
  }

  return times;
};


person imkeVr    schedule 30.07.2020    source источник


Ответы (1)


Я нашел ответ на свой вопрос. Я шел в правильном направлении с приведенным выше кодом, но для создания доступных временных интервалов с учетом продолжительности услуги, которую вы хотите запланировать, и встречи, которая уже запланирована.

Мне пришлось изменить эту строку кода:

// эта строка просто подталкивает отфильтрованную встречу на определенный день

filterAppoinments.map(appoinment => results.push([appoinment.start.format('HH:mm'), appoinment.end.format('HH:mm')]))

К этому

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

filterAppoinments.map(appoinment => results.push([appoinment.start.clone().subtract(serviceObject.hours, 'hours').subtract(serviceObject.minutes, 'minutes').format('HH:mm'), appoinment.end.format('HH:mm')]))

person imkeVr    schedule 31.07.2020