酒店预订/预订逻辑

时间:2015-06-07 14:36:27

标签: c#

我正在使用Visual Studio 2013社区为我的编码课程开展一个非常简单的酒店预订项目,用户可以将客户预订到一个房间,如果该房间已在该日期预订,则该程序应该停止用户或它们与其他预订在某种程度上重叠。

我面临的问题是,如果用户进行了新的预订,其中登记入住和退房日期与其他2个预订退房日期相同,则可能与其他预订重叠。

例:
预订A - 01.01.15至02.01.15
预订B - 03.01.15至04.01.15
预订C - 05.01.15至06.01.15
预订D - 02.01.15至06.01.15

在预订D中,用户将02.01.15作为“登记入住”,将06.01.15作为“结账”,由于某种原因,程序无法捕获并允许通过B和C进行预订。

public override void Add(Booking booking)
    {
        // Don't allow a new booking if the room is already out.

        var currentBooking = _ctx.Bookings
            .Where(b => b.RoomId == booking.RoomId)               
            .Select(b => (booking.CheckOut > b.CheckIn && booking.CheckIn < b.CheckOut)
                      || (booking.CheckIn < b.CheckIn && booking.CheckOut > b.CheckIn)) 

            .FirstOrDefault();

        if (currentBooking)
        {
              throw new BookingException("The Room is already out on that date.");
        }

        _ctx.Set<Booking>().Add(booking);
        _ctx.SaveChanges();
    }

我原本以为通过检查新的Check In和Check Out是否与之前的Check Out(见下文)相同,我会解决问题但是这个逻辑肯定有问题。

.Select(b => (booking.CheckOut > b.CheckIn && booking.CheckIn < b.CheckOut)
          || (booking.CheckIn < b.CheckIn && booking.CheckOut > b.CheckIn)
          || (booking.CheckIn == b.CheckOut && booking.CheckOut == b.CheckOut)) 

我是否应该做一些事情,比如检查新的登记和退房是否与之前退房的1天相同?

3 个答案:

答案 0 :(得分:1)

我认为您需要一些代码来检查特定日期是否介于2个日期之间(我不知道您的情况是否正确)

> public int CheckDateBetween2Dates(DateTime Date)
>         {
>             try
>             {
>                 if (Date.Ticks >StartingDate.Ticks && Date.Ticks < EndDate.Ticks)
>                 {
>                     //..The Date is between the 2 dates return 1;
>                 }
>                 else
>                 {
>                     //..The Date is not between them return 0;
>                 }
>             }
>             catch
>             {
>                 return -1;
>             }
> 
>         }

答案 1 :(得分:1)

如果第一个句点的开始位于第二个句点的开始和结束之间,或者如果第二个句点的开始位于第一个句点的开始和结束之间,那么两个句点重叠,那么您可以写:

public override void Add(Booking booking)
        {
            // Don't allow a new booking if the room is already out.

            var currentBooking = _ctx.Bookings
                .Where(b => b.RoomId == booking.RoomId && 
        (booking.CheckIn <= b.CheckOut && booking.CheckIn >= b.CheckIn ||
         b.CheckIn <= booking.CheckOut && b.CheckIn >= booking.CheckIn))               
                .FirstOrDefault();

            if (currentBooking != null)
            {
                  throw new BookingException("The Room is already out on that date.");
            }

            _ctx.Set<Booking>().Add(booking);
            _ctx.SaveChanges();
        }

但是,如果某个预订在检查

之后的另一个线程中保存到db,则此方法可能无法正常工作
if(currentBooking)

执行。

您可以在表上创建触发器来检查数据库中的约束以避免这种情况。

答案 2 :(得分:0)

这样可以避免重叠

(!(booking.start < b.CheckOut && b.CheckIn < booking.CheckOut))