Я использую JS-библиотеку Fullcalendar.io для визуализации бронирований в моей компании по прокату автомобилей. Я храню мотоциклы в виде массивов категорий (размеров двигателей) с дочерним массивом, содержащим все мотоциклы, принадлежащие каждой из них, как в примере ниже:
// The events array contains information about the motorbikes that are rented, including the start and end date of the rental.
events = [{
start: new Date(2025, 0, 6, 0, 0),
end: new Date(2025, 0, 9, 23, 59, 59),
resourceId: "bb101gh",
title: "Event 0"
},
{
start: new Date(2025, 0, 11, 0, 0),
end: new Date(2025, 0, 14, 23, 59, 59),
resourceId: "bb101gh",
title: "Event 1"
},
{
start: new Date(2025, 0, 7, 0, 0),
end: new Date(2025, 0, 11, 23, 59, 59),
resourceId: "bb123ab",
title: "Event 2"
},
{
start: new Date(2025, 0, 9, 0, 0),
end: new Date(2025, 0, 14, 23, 59, 59),
resourceId: "bb456cd",
title: "Event 3"
},
{
start: new Date(2025, 0, 7, 0, 0),
end: new Date(2025, 0, 10, 23, 59, 59),
resourceId: "bb789ef",
title: "Event 4"
},
{
start: new Date(2025, 0, 11, 0, 0),
end: new Date(2025, 0, 15, 23, 59, 59),
resourceId: "bb789ef",
title: "Event 5"
},
{
start: new Date(2025, 0, 6, 0, 0),
end: new Date(2025, 0, 15, 23, 59, 59),
resourceId: "cc101gh",
title: "Event 6"
},
{
start: new Date(2025, 0, 8, 0, 0),
end: new Date(2025, 0, 11, 23, 59, 59),
resourceId: "cc123ab",
title: "Event 7"
}
]
События можно визуализировать на этом снимке экрана моей временной шкалы fullcalendar.io.
Всякий раз, когда все мотоциклы в категории полностью забронированы на определенное время slot, я бы хотел иметь красный фон на уровне ресурса (пример здесь). Этого можно легко добиться с помощью фоновых событий (https://fullcalendar.io/docs/background-events). Моя проблема в том, что я не нашел способа надежно и эффективно хранить диапазоны дат, в которых бронирования перекрываются между «n» ресурсами (где «n» — это количество мотоциклов в категории объема двигателя).
На данный момент мне удалось найти полурабочее решение, взяв минимальные и максимальные даты для всех событий, перебрав их с использованием 30-минутных временных интервалов и сохранив фоновое событие для категории движка. когда все его ресурсы зарезервированы по определенному временной интервал. Вот код:
// Get the minimum and maximum date in the events array
minDate = events.map(event => event.start).reduce((a, b) => a < b ? a : b);
maxDate = events.map(event => event.end).reduce((a, b) => a > b ? a : b);
// Iterate between the dates using 30 minutes intervals.
unavailableDateRanges = [];
for (let i = minDate; i event.start = i).map(event => event.resourceId);
// If all resources from a certain category are used, store a 30 minutes unavailable range for that category.
let unavailableCategories = resources.filter(resource => resource.children.every(child => usedResources.includes(child.id))).map(resource => resource.id);
for (category of unavailableCategories) {
let start = new Date(i);
let end = new Date(i);
end.setMinutes(end.getMinutes() + 30);
unavailableDateRanges.push({
start: start,
end: end,
resourceId: category,
title: "Unavailable",
display: "background"
});
}
}
Это не дает надежного результата, поскольку проверяется только с 30-минутными интервалами, тогда как бронирование может начаться в другую минуту. Предположим, что бронирование начинается в 9:45, этот код не будет отмечать период с 9:45 до 10:00 как недоступный. Поскольку красный фон будет виден на разных уровнях детализации, это будет проблемой.
Поскольку даты представляют собой непрерывную переменную (UNIX), я думаю, можно было бы отфильтровать события по родительской категории размера двигателя, а затем проверьте, какие диапазоны дат перекрываются для «n» количества мотоциклов, предполагая, что заказы на определенный мотоцикл не перекрываются (в чем я уже убедился). Я пытался написать это решение, но безрезультатно.
Я знаю, что есть некоторые библиотеки для работы с диапазонами дат, например date-fns, но не похоже, что это поможет.< /p>
Может ли кто-нибудь более опытный мне помочь?
Я использую JS-библиотеку Fullcalendar.io для визуализации бронирований в моей компании по прокату автомобилей. Я храню мотоциклы в виде массивов категорий (размеров двигателей) с дочерним массивом, содержащим все мотоциклы, принадлежащие каждой из них, как в примере ниже: [code]// The resources array contains information about the motorbikes in a rental store. // The parent array contains the information about the motorbike engine, // while the children array contains the information about the unique motorbikes belonging to each engine category. resources = [{ id: "scooter50", title: "Scooter 50", children: [{ id: "aa123ab", title: "AA 123 AB" }, { id: "aa456cd", title: "AA 456 CD" }, { id: "aa789ef", title: "AA 789 EF" }, { id: "aa101gh", title: "AA 101 GH" } ] }, { id: "scooter125", title: "Scooter 125", children: [{ id: "bb123ab", title: "BB 123 AB" }, { id: "bb456cd", title: "BB 456 CD" }, { id: "bb789ef", title: "BB 789 EF" }, { id: "bb101gh", title: "BB 101 GH" } ] }, { id: "scooter250", title: "Scooter 250", children: [{ id: "cc123ab", title: "CC 123 AB" }, { id: "cc456cd", title: "CC 456 CD" }, { id: "cc789ef", title: "CC 789 EF" }, { id: "cc101gh", title: "CC 101 GH" } ] } ]; [/code] Затем у меня есть несколько событий (бронирований), принадлежащих каждому ресурсу: [code]// The events array contains information about the motorbikes that are rented, including the start and end date of the rental. events = [{ start: new Date(2025, 0, 6, 0, 0), end: new Date(2025, 0, 9, 23, 59, 59), resourceId: "bb101gh", title: "Event 0" }, { start: new Date(2025, 0, 11, 0, 0), end: new Date(2025, 0, 14, 23, 59, 59), resourceId: "bb101gh", title: "Event 1" }, { start: new Date(2025, 0, 7, 0, 0), end: new Date(2025, 0, 11, 23, 59, 59), resourceId: "bb123ab", title: "Event 2" }, { start: new Date(2025, 0, 9, 0, 0), end: new Date(2025, 0, 14, 23, 59, 59), resourceId: "bb456cd", title: "Event 3" }, { start: new Date(2025, 0, 7, 0, 0), end: new Date(2025, 0, 10, 23, 59, 59), resourceId: "bb789ef", title: "Event 4" }, { start: new Date(2025, 0, 11, 0, 0), end: new Date(2025, 0, 15, 23, 59, 59), resourceId: "bb789ef", title: "Event 5" }, { start: new Date(2025, 0, 6, 0, 0), end: new Date(2025, 0, 15, 23, 59, 59), resourceId: "cc101gh", title: "Event 6" }, { start: new Date(2025, 0, 8, 0, 0), end: new Date(2025, 0, 11, 23, 59, 59), resourceId: "cc123ab", title: "Event 7" } ] [/code] События можно визуализировать на этом снимке экрана моей временной шкалы fullcalendar.io. Всякий раз, когда все мотоциклы в категории полностью забронированы на определенное время slot, я бы хотел иметь красный фон на уровне ресурса (пример здесь). Этого можно легко добиться с помощью фоновых событий (https://fullcalendar.io/docs/background-events). Моя проблема в том, что я не нашел способа надежно и эффективно хранить диапазоны дат, в которых бронирования перекрываются между «n» ресурсами (где «n» — это количество мотоциклов в категории объема двигателя). На данный момент мне удалось найти полурабочее решение, взяв минимальные и максимальные даты для всех событий, перебрав их с использованием 30-минутных временных интервалов и сохранив фоновое событие для категории движка. когда все его ресурсы зарезервированы по определенному временной интервал. Вот код: [code]// Get the minimum and maximum date in the events array minDate = events.map(event => event.start).reduce((a, b) => a < b ? a : b); maxDate = events.map(event => event.end).reduce((a, b) => a > b ? a : b);
// Iterate between the dates using 30 minutes intervals. unavailableDateRanges = []; for (let i = minDate; i event.start = i).map(event => event.resourceId);
// If all resources from a certain category are used, store a 30 minutes unavailable range for that category. let unavailableCategories = resources.filter(resource => resource.children.every(child => usedResources.includes(child.id))).map(resource => resource.id); for (category of unavailableCategories) { let start = new Date(i); let end = new Date(i); end.setMinutes(end.getMinutes() + 30); unavailableDateRanges.push({ start: start, end: end, resourceId: category, title: "Unavailable", display: "background" }); } } [/code] Это не дает надежного результата, поскольку проверяется только с 30-минутными интервалами, тогда как бронирование может начаться в другую минуту. Предположим, что бронирование начинается в 9:45, этот код не будет отмечать период с 9:45 до 10:00 как недоступный. Поскольку красный фон будет виден на разных уровнях детализации, это будет проблемой. Поскольку даты представляют собой непрерывную переменную (UNIX), я думаю, можно было бы отфильтровать события по родительской категории размера двигателя, а затем проверьте, какие диапазоны дат перекрываются для «n» количества мотоциклов, предполагая, что заказы на определенный мотоцикл не перекрываются (в чем я уже убедился). Я пытался написать это решение, но безрезультатно. Я знаю, что есть некоторые библиотеки для работы с диапазонами дат, например date-fns, но не похоже, что это поможет.< /p> Может ли кто-нибудь более опытный мне помочь?
Я пытаюсь выяснить, есть ли какие-либо вспомогательные функции или какие-либо методы, которые могут быть полезны для получения списка дат в заданном диапазоне дат.
Допустим, пользователь вводит следующие параметры, которые представляют собой...
У меня есть модель представления, представляющая собой список, содержащий StartDate и EndDate. Я хочу изменить этот список диапазонов, чтобы, если разница в днях между следующей датой начала и предыдущей датой окончания равна 1, объединить два...