我目前正在开发一个应用程序,人们可以在该应用程序上安排注册专业人员的服务。这个想法很简单,用户将打开应用程序,选择专业人员,并显示所有可用时间的议程。
该专业人员的上班时间和下班时间为一天,并且该服务有一定的持续时间,因此他一天可能会有很多服务。
选择专业人员和服务后我目前正在做什么(我将在下面发布相关代码):
这是我使用的变量的示例:
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']
;
我想出了一个代码,其中我检查当前添加的小时蜂鸣是否在当前预订的服务中间,如果是,则返回服务端作为下一个要比较的值。这是我现在拥有的代码:
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中第一个值的结尾。知道我在做什么错吗?如果您需要更好的解释,我会很乐意