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

新增Appointment日程时如何校验是否与已有日程重叠及修复校验误判问题

修复方案

问题根因

你现有代码的核心问题是时间段重叠的判断逻辑完全错误,同时存在查询过滤逻辑冗余的问题:

  • 原有判断条件命中了大量完全不重叠的场景:比如已有日程结束时间早于新日程开始时间的非重叠场景,也会被你的判断条件命中,所以才会出现无重叠也报错的问题
  • 你把Weekday的过滤放在了Any的内部逻辑中,没有提前在数据库查询阶段过滤,会拉取大量无效数据降低查询效率
  • 末尾的? true : false属于冗余写法,Any()方法本身返回的就是布尔值,不需要额外转换

正确的时间段重叠判断逻辑

两个时间段[x_start, x_end]和[new_start, new_end]发生重叠的核心条件是:x的开始时间 < 新日程的结束时间 且 新日程的开始时间 < x的结束时间

注:如果你的业务允许日程首尾相接(比如前一个日程14:00结束,新日程14:00开始不算重叠),则直接用上述条件即可;如果首尾相接也算重叠,将<替换为<=即可。

修复后的代码

public async Task<IEnumerable<Notification>> ValidateAdd(AppointmentViewModel model)
{
    // 提前在查询层过滤同活动、同周次的日程,减少拉取的数据量
    var relatedAppointments = await _appointmentRepo
        .FindBy(x => x.ActivityId == model.ActivityId && x.Weekday == model.Weekday)
        .ToListAsync();
    
    // 正确的重叠判断
    bool hasOverlap = relatedAppointments.Any(x => 
        x.StartAppointment < model.EndAppointment 
        && model.StartAppointment < x.EndAppointment
    );
    
    // 后续你自己的报错逻辑,比如hasOverlap为true时添加重叠提示的Notification
    // ...
}

内容的提问来源于stack exchange,提问作者Victor Lima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:54:06