C#预约日期拦截问题求助:每周重复时段校验逻辑异常
修正HR预约系统每周重复拦截逻辑
问题分析
现有代码存在以下核心问题:
- 日期范围判断逻辑错误:错误地将预约起始日期与拦截规则的起始日期做单一比较,未覆盖规则的完整有效期(
formatStartDate到stopLastDate)。 - 跨周时段判断缺失:当拦截时段跨周(如周日到周一)时,星期数的范围判断会失效。
- 循环内时间匹配逻辑错误:未根据循环的周数计算对应周的拦截结束时间,直接使用固定的
formatEndDate,导致无法匹配后续周的拦截时段。 - 状态赋值逻辑颠倒:初始状态未合理设置,且只要一次不匹配就直接标记为可预约,忽略了只要存在一次重叠就应拦截的需求。
修正后的代码
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
相关产品推荐
相关产品推荐

