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

C#预约日期拦截问题求助:每周重复时段校验逻辑异常

修正HR预约系统每周重复拦截逻辑

问题分析

现有代码存在以下核心问题:

  1. 日期范围判断逻辑错误:错误地将预约起始日期与拦截规则的起始日期做单一比较,未覆盖规则的完整有效期(formatStartDate到stopLastDate)。
  2. 跨周时段判断缺失:当拦截时段跨周(如周日到周一)时,星期数的范围判断会失效。
  3. 循环内时间匹配逻辑错误:未根据循环的周数计算对应周的拦截结束时间,直接使用固定的formatEndDate,导致无法匹配后续周的拦截时段。
  4. 状态赋值逻辑颠倒:初始状态未合理设置,且只要一次不匹配就直接标记为可预约,忽略了只要存在一次重叠就应拦截的需求。

修正后的代码

if (repeatType == "Weekly")
{
    // 初始化默认状态为可预约
    orgTimeSlot.IsAvailable = true;
    orgTimeSlot.StartDate = null;
    orgTimeSlot.StopDate = null;

    // 1. 先判断预约时间是否在拦截规则的总有效期内
    if (formatAptStartDate.Date < formatStartDate.Date || formatAptStartDate.Date > stopLastDate.Date)
    {
        // 预约不在规则有效期内,直接保持可预约
        return;
    }

    // 2. 计算星期数(周一=0到周日=6,适配跨周场景)
    int GetWeekDayNumber(DateTime date) => (int)(date.DayOfWeek + 6) % 7;
    int aptStartWeekDay = GetWeekDayNumber(formatAptStartDate);
    int ruleStartWeekDay = GetWeekDayNumber(formatStartDate);
    int ruleEndWeekDay = GetWeekDayNumber(formatEndDate);

    // 3. 判断预约的星期是否在拦截时段的星期范围内(处理跨周情况)
    bool isWeekDayInRange;
    if (ruleStartWeekDay <= ruleEndWeekDay)
    {
        // 时段在同一周内(如周二到周三)
        isWeekDayInRange = aptStartWeekDay >= ruleStartWeekDay && aptStartWeekDay <= ruleEndWeekDay;
    }
    else
    {
        // 时段跨周(如周五到周一)
        isWeekDayInRange = aptStartWeekDay >= ruleStartWeekDay || aptStartWeekDay <= ruleEndWeekDay;
    }

    if (!isWeekDayInRange)
    {
        // 预约星期不在拦截范围内,保持可预约
        return;
    }

    // 4. 计算预约所在周的拦截时段起始和结束时间
    int weeksDiff = (int)((formatAptStartDate.Date - formatStartDate.Date).TotalDays / 7);
    DateTime currentWeekRuleStart = formatStartDate.AddDays(weeksDiff * 7);
    TimeSpan ruleDuration = formatEndDate - formatStartDate;
    DateTime currentWeekRuleEnd = currentWeekRuleStart.Add(ruleDuration);

    // 5. 判断预约时段与本周拦截时段是否重叠
    bool isOverlap = !(formatAptEndDate <= currentWeekRuleStart || formatAptStartDate >= currentWeekRuleEnd);
    if (isOverlap)
    {
        orgTimeSlot.IsAvailable = false;
        orgTimeSlot.StartDate = currentWeekRuleStart;
        orgTimeSlot.StopDate = currentWeekRuleEnd;
    }
}

关键修正点说明

  • 有效期前置判断:先快速排除不在规则总有效期内的预约,减少后续计算。
  • 跨周星期判断:分两种情况处理星期范围,覆盖同一周和跨周的拦截场景。
  • 动态计算周时段:根据预约所在周,动态生成对应周的拦截起止时间,避免固定日期的错误匹配。
  • 重叠判断逻辑:使用标准的时间重叠判断公式(!(A结束 <= B开始 || A开始 >= B结束)),准确检测时段重叠。
  • 状态初始化:默认设为可预约,仅在检测到重叠时标记为不可预约,符合需求逻辑。

内容的提问来源于stack exchange,提问作者Fatt Sky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:01:01