酒店预订/预订逻辑

本文关键字:酒店预订 | 更新日期: 2023-09-27 17:53:54

我正在使用Visual Studio 2013 Community为我的编码类编写一个非常简单的酒店预订项目,其中用户可以将客户预订到房间,如果房间已经在该日期预订或他们以某种方式与其他预订重叠,程序应该停止用户。

我面临的问题是,如果用户进行新的预订,其中Check In和Check Out日期与其他2个预订Check Out日期相同,则它可能与另一个预订重叠。

例子:
预订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作为Check In, 06.01.15作为Check Out,由于某种原因,程序没有捕捉到它,并允许在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();
    }

我本以为通过检查新的签入和签出是否与之前的签出相同(见下文),我就可以解决问题了,但这种逻辑一定有问题。

.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)) 

我是否应该做一些事情,比如检查新的Check In和Check Out是否与之前的Check Out ' s -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个日期之间(我不知道在你的情况下我是否正确)

> 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;
>             }
> 
>         }

这样可以避免重叠

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