如何正确实现资产预订的日期范围不重叠校验方法?
修正资产预订区间重叠校验逻辑
问题分析
原方法仅校验单个日期是否处于已激活预订区间,无法检测区间重叠的场景。比如已存在2022-10-27的预订时,新的2022-10-26至2022-10-28区间会因为没有单个日期命中而被允许,这显然违反预订规则。
区间重叠的核心判断逻辑是:两个日期区间只要存在交集即视为冲突,对应条件为:新预订开始日期 <= 已存在预订结束日期 且 新预订结束日期 >= 已存在预订开始日期
修正后的代码实现
修改方法参数为待预订的日期区间,同时调整JPQL查询条件以覆盖所有重叠场景:
public boolean isAssetReservationOverlapping(Set<Asset> assets, Date newDateFrom, Date newDateTo) { // 截断日期到天,确保按日粒度校验 Date truncatedNewFrom = DateUtils.truncate(newDateFrom, Calendar.DAY_OF_MONTH); Date truncatedNewTo = DateUtils.truncate(newDateTo, Calendar.DAY_OF_MONTH); // JPQL查询:判断新区间与已激活预订区间是否存在重叠 String query = "select e from am_AssetReservation e " + "where e.refAsset IN :assets " + "and e.isActive = true " + "and :newDateFrom <= e.dateTo " + "and :newDateTo >= e.dateFrom"; List<AssetReservation> overlappingReservations = dataManager.load(AssetReservation.class) .query(query) .parameter("assets", assets) .parameter("newDateFrom", truncatedNewFrom) .parameter("newDateTo", truncatedNewTo) .list(); return !overlappingReservations.isEmpty(); }
关键说明
- 参数调整:将单个校验日期改为待预订的起始和结束日期,符合实际预订场景
- 区间重叠判断:通过
newDateFrom <= e.dateTo和newDateTo >= e.dateFrom两个条件组合,覆盖所有可能的区间重叠情况(包含、部分重叠、被包含) - 日期截断:保持按日粒度处理,避免因时分秒导致的误判
内容的提问来源于stack exchange,提问作者SanyaKirilloff
相关产品推荐
相关产品推荐

