我正在制作预订系统。
例如,我可以随时提供要约:
Offer: 8AM - 8PM (in one day, for example in 1/12/2018)
OR
Offer: 7/12/2019 8AM - 10/12-2019 8PM
有人暂时保留一部分时间,例如:
First reservation: 12AM - 2PM (same day as offer)
OR
First reservation: 7/12/2019 8AM - 8/12/2019 8AM
如您所见,我们还有可用时间:8AM - 12 AM
和2PM - 8PM
。
现在,有人想保留时间:
Second reservation: 8AM - 10AM (same day as offer)
OR
Second reservation: 10/12/2019 0AM - 10/12/2019 8PM
然后,有人要再次预订:
Third reservation: 2PM - 8PM (same day as offer)
OR
Third reservation: 8/12/2019 0AM - 9/12/2019 8AM
从上面的场景中,可以提供的时间:
Available time in offer (after 3 reservations): 10AM - 12AM (same day as offer)
//i didnt write example with couple of days because it is too hard to calculate it in mind
现在,我的问题。我正在寻找在一段时间内通过DateTimes
验证请求的解决方案。
我开始编写一些代码:
//there is no Offer offer in this method, because i check request times
//with offer step before
private bool TimeOfReservationIsValid(Command request)
{
bool result = true;
var reservations = _context.Reservations.Where(r => r.OfferId == request.OfferId);
if (reservations.Count() > 0)
{
foreach (var reservation in reservations)
{
if (request.StartOfRent <= reservation.StartOfRent
&& request.StartOfRent < reservation.EndOfRent
&& request.EndOfRent <= reservation.EndOfRent
&& request.EndOfRent > reservation.StartOfRent)
{
break;
}
else if (request.StartOfRent >= reservation.StartOfRent
&& request.StartOfRent < reservation.EndOfRent
&& request....)
{
//i think in this code it can be too much if statemantes?
}
}
}
return result;
}
但是案例太多了。在上面的代码中,我正在检查request
是否与reservation
中的任何一个发生冲突。如果它与其中之一发生冲突,result = false
就会删除request
。
我知道我可以在ClientSide
中进行验证(例如在前端,仅发送良好的请求),但我想在后端进行逻辑验证request times
。
我的问题有图书馆或解决方案吗?
如您所见,当我们在要约租用时间中间进行预订时,首先我需要检查请求是否与第一个空闲要约时间匹配,然后我需要检查第二个空闲时间(如果request
匹配offer
时间免费)。也许您遇到类似的问题要解决?
编辑:
我在报价示例中添加了完整日期。我的Reservations
系统可以在完整的DateTime
上使用年,月,日等
答案 0 :(得分:2)
检查范围是否重叠。
var overlaps =
_context.Reservations
.Where(r => r.OfferId == request.OfferId)
.Any(r => request.EndOfRent >= reservation.StartOfRent &&
reservation.EndOfRent >= request.StartOfRent)