Cuối cùng, tôi đã tìm kiếm một hệ thống tạo dấu thời gian cho ngày bắt đầu và ngày kết thúc trong cơ sở dữ liệu. Trong khi kiểm tra, tôi đã thêm một giây vào đầu và trừ một giây cho cuối để tránh trùng lặp thời gian cho các cuộc hẹn.
Cuối cùng tôi đã làm gì
Rõ ràng là tôi không chắc đây là cách thực hành tốt nhất, nhưng nó đã mang lại hiệu quả cho tôi. Người dùng bắt đầu bằng cách chọn giới tính của họ và sở thích trong ngày. Điều này sẽ gửi một yêu cầu AJAX để có được nhân viên có sẵn và các loại cuộc hẹn khác nhau (ví dụ như nhuộm tóc, cắt tóc, v.v.).
Khi tất cả các cài đặt đã được chọn (giới tính, ngày tháng, người và loại), tôi bắt đầu bằng một số xác nhận đơn giản:kiểm tra ngày, kiểm tra xem ngày ("N") có phải là ngày 7 (chủ nhật) hay không. Nếu mọi thứ đều ổn, những thứ quan trọng hơn sẽ được bắt đầu:
1) Loại cuộc hẹn được tìm nạp từ cơ sở dữ liệu bao gồm tổng thời gian mà loại cuộc hẹn này mất (30 phút, 45 phút, v.v.) 2) Cá nhân có sẵn được tìm nạp (danh sách đầy đủ những người vào ngày đó hoặc chỉ một người nếu một người được chọn) bao gồm cả thời gian có sẵn của họ
Nhân viên (hoặc một người) sau đó được lặp lại, bắt đầu với thời gian bắt đầu của chính họ. Tại thời điểm này, tôi có một tập dữ liệu chứa:
$duration (of the appointment type)
$startTime (starting time of the person selected in the loop)
$endTime (= $startTime + $duration)
$personStart (= starting time of the person)
$personEnd (= end time of the person)
Hãy lấy dữ liệu demo này:
$duration = 30 min
$startTime = 9.00h
$endTime = 9.30h
$personStart = 9.00h
$personEnd = 12.00h
Những gì tôi đang làm ở đây là:
while( $endTime < $personEnd )
{
// Check the spot for availability
$startTime = $endTime;
$endTime = $startTime + $duration;
}
Rõ ràng, nó đã được đơn giản hóa trong trường hợp này. Bởi vì khi tôi kiểm tra tình trạng sẵn có, và vị trí không còn miễn phí. Tôi đặt $ startTime bằng với cuộc hẹn gần nhất được tìm thấy và bắt đầu từ đó trong vòng lặp.
Ví dụ:
I check for a free spot at 9.00 but the spot is not free because there's an appointment from 9.00 till 10.00, then 10.00 is returned and $startTime is set to 10.00h instead of 9.30h. This is done to keep the number of queries to a minimum since there can be quiet a lot.
Kiểm tra chức năng còn hàng
// Check Availability
public static function checkAvailability($start, $end, $ape_id)
{
// add one second to the start to avoid results showing up on the full hour
$start += 1;
// remove one second from the end to avoid results showing up on the full hour
$end -= 1;
// $start and $end are timestamps
$getAppointments = PRegistry::getObject('db')->query("SELECT * FROM appointments WHERE
((
app_start BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
OR
app_end BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
)
OR
(
app_start < '".date("Y-m-d H:i:s", $start)."' AND app_end > '".date("Y-m-d H:i:s", $end)."'
))
AND
ape_id = ".PRegistry::getObject('db')->escape($ape_id));
if(PRegistry::getObject('db')->num_rows($getAppointments) == 0) {
return true;
} else {
$end = 0;
foreach(PRegistry::getObject('db')->fetch_array(MYSQLI_ASSOC, $getAppointments, false) as $app) {
if($app['app_end'] > $end) {
$end = $app['app_end'];
}
}
return $end;
}
}
Vì tôi đang lưu trữ các cuộc hẹn là "Từ:10.00 đến:11.00" nên tôi phải đảm bảo kiểm tra các điểm từ 11:00:01 đến 11:59:59, vì nếu không, cuộc hẹn lúc 11:00 sẽ hiển thị trong kết quả.
Ở cuối hàm, trong trường hợp tìm thấy cuộc hẹn, tôi lặp lại kết quả và trả về kết thúc mới nhất. Đây là bước bắt đầu tiếp theo trong vòng lặp mà tôi đã đề cập ở trên.
Hy vọng rằng điều này có thể giúp ích cho bất kỳ ai. Cũng giống như thông tin:ape_id
là ID của "Người được bổ nhiệm" mà nó được liên kết.