酒店预订/预订逻辑
本文关键字:酒店预订 | 更新日期: 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))