2014年3月26日 星期三

{C#} 預約系統 -時間判斷某一天預約時間區間是否衝突

下列判斷方式需為同一天的時間區間
//目前起始時間是否大於目前終止時間
if (!(start >= end))
                {
                    var tempDate = start.ToShortDateString();
                    //目前的起始時間到終止期間有連續多天欲預約
                   //ex:2014/03/26 10:00~2014/03/27 10:00
                    if(start.ToShortDateString()!=end.ToShortDateString())
                    {
                        var tempStart = start;
                        // 一天一天的比對
                        while (tempStart <= end)
                        {
                            var tempSource = call funcion(tempStart.ToShortDateString());//資料庫已預約完成某一天的資料
                            if (tempSource.Count() > 0)
                            {
                                //時分秒是否衝突
                                var queryCount = tempSource.Any(s => s.StartDate < end && s.EndDate > tempStart);
                                if (queryCount && !result) { result = true; msg = "預約時段衝突"; break; }
                                //完全相同---為安全確保而多寫的
                                queryCount = tempSource.Any(s => s.StartDate == start && s.EndDate == tempStart);
                                if (queryCount && !result) { result = true; msg = "預約時段衝突"; break; }
                            }
                            tempStart = tempStart.AddDays(1);
                        }
                    }
                    //目前起始時間小於當下
                    else if (start < now)
                    {
                        result = true;//起始日小於現在
                        msg = "預約時間已過期, 請更改預約時間";
                    }
                    //目前結束時間小於當下
                    else if(end <now)
                    {
                        result = true;//結束時間小於當下
                        msg = "預約時間已過期, 請更改預約時間";
                    }
                    else
                    {
                        //目前的起始時間到終止期間有同一日時間區間預約
                        //ex:2014/03/26 10:00~2014/03/26 18:00
                        var source =call funcion();//資料庫已預約完成的全部資料
                        if (source.Count() > 0)
                        {
                            var queryCount = source.Any(s => s.StartDate < end && s.EndDate > start);
                            if (queryCount && !result) { result = true; msg = "預約時段衝突"; }
                            //完全相同
                            queryCount = source.Any(s => s.StartDate == start && s.EndDate == start);
                            if (queryCount && !result) { result = true; msg = "預約時段衝突"; }
                        }
                    }
                }
                else{
                    result = true;//起始大於終止
                    msg = "開始時間不可大於結束時間";
                }
            }
            else
            {
                result = true;
                msg = "預約資訊異常-起始日為空、終止日為空、無此設備";
            }



參考資料:
http://bibby.be/2008/07/blog-post_10.html