You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现资产预订的日期范围不重叠校验方法?

修正资产预订区间重叠校验逻辑

问题分析

原方法仅校验单个日期是否处于已激活预订区间,无法检测区间重叠的场景。比如已存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:10:30