अंत में मैं एक ऐसी प्रणाली के लिए गया जिसने डेटाबेस में प्रारंभ और समाप्ति तिथियों के लिए टाइमस्टैम्प उत्पन्न किया। जाँच करते समय मैंने शुरुआत में एक सेकंड जोड़ा और नियुक्तियों के लिए किसी भी अतिव्यापी समय से बचने के लिए अंत से एक सेकंड घटाया।
मैंने आखिर क्या किया
जाहिर है मुझे यकीन नहीं है कि यह सबसे अच्छा अभ्यास है, लेकिन इसने मेरे लिए काम किया। उपयोगकर्ता अपने लिंग और दिन के लिए वरीयता का चयन करके शुरू करता है। यह उपलब्ध कार्मिक और विभिन्न प्रकार के अपॉइंटमेंट प्रकारों (जैसे बालों को रंगना, बाल काटना, आदि) प्राप्त करने के लिए एक AJAX अनुरोध भेजता है।
जब सभी सेटिंग्स का चयन किया गया है (लिंग, तिथि, व्यक्तिगत और प्रकार) मैं कुछ सरल सत्यापनों से शुरू करता हूं:तिथि की जांच करना, यह जांचना कि क्या तिथि ("एन") 7 (रविवार) नहीं है। अगर सब कुछ ठीक रहा, तो ज़्यादा ज़रूरी चीज़ें शुरू हो गई हैं:
1) अपॉइंटमेंट प्रकार डेटाबेस से प्राप्त किया जाता है जिसमें इस प्रकार के कुल समय (30 मिनट, 45 मिनट, आदि) शामिल हैं) 2) उपलब्ध व्यक्तिगत प्राप्त किया जाता है (उस दिन लोगों की एक पूरी सूची या सिर्फ एक व्यक्ति यदि एक चुना जाता है) उनके उपलब्ध समय सहित
व्यक्ति (या एक व्यक्ति) को तब लूप किया जाता है, जो अपने शुरुआती समय से शुरू होता है। इस समय मेरे पास डेटा का एक सेट है जिसमें शामिल हैं:
$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)
आइए इस डेमो डेटा को लें:
$duration = 30 min
$startTime = 9.00h
$endTime = 9.30h
$personStart = 9.00h
$personEnd = 12.00h
मैं यहाँ क्या कर रहा हूँ:
while( $endTime < $personEnd )
{
// Check the spot for availability
$startTime = $endTime;
$endTime = $startTime + $duration;
}
जाहिर है, इस मामले में यह सरल है। क्योंकि जब मैं उपलब्धता की जांच करता हूं, और स्पॉट फ्री नहीं होता है। मैंने $स्टार्टटाइम को नवीनतम अपॉइंटमेंट के बराबर होने के लिए सेट किया है और लूप में वहां से शुरू होता है।
उदाहरण:
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.
उपलब्धता फ़ंक्शन जांचें
// 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;
}
}
चूंकि मैं नियुक्तियों को "प्रेषक:10.00 से:11.00" के रूप में संग्रहीत कर रहा हूं, इसलिए मुझे 11:00:01 से 11:59:59 तक स्पॉट की जांच करना सुनिश्चित करना होगा, क्योंकि अन्यथा 11:00 बजे की नियुक्ति परिणामों में दिखाई देगी।
फ़ंक्शन के अंत में, यदि कोई अपॉइंटमेंट मिलता है, तो मैं परिणामों को लूप करता हूं और नवीनतम अंत लौटाता हूं। ऊपर बताए गए लूप में यह अगली शुरुआत है।
उम्मीद है कि यह किसी के लिए भी मददगार हो सकता है। जैसे ही जानकारी:ape_id
"नियुक्ति व्यक्ति" की आईडी है जिससे यह जुड़ा हुआ है।