预约冲突检测怎么写:一个老师听得懂的真难点

发布于 2026-09-10 · 作者 babachen · 可套订房 / 会议室 / 设备借用
预约冲突检测

管理系统被说「太普通」,往往不是缺微服务,而是主流程没有一条硬规则。冲突检测就是最稳的那条:同一实验室(房间/设备)在重叠时段不能被两个「已通过」预约占住。整套预约骨架见 实验室预约落地文;本页只把冲突写死。

一句话规则:同一 resource_id,新预约时段与已占用时段相交,则拒绝。相交判定:newStart < oldEnd AND oldStart < newEnd。

一、先定「什么叫占用」

状态默认是否占用说明
待审核否可允许多单待审,审核时再查一次
已通过 / 进行中是必须参与冲突
已驳回 / 已取消 / 已完成否释放时段

规则写进开题和论文「业务约束」一节。不要答辩现场才改。

二、判定式(背下来)

半开区间 [start, end) 更不容易边界重复:

冲突 ⇔ newStart < oldEnd 且 oldStart < newEnd
不冲突 ⇔ newEnd <= oldStart 或 oldEnd <= newStart

三、SQL 思路(MySQL)

SELECT id FROM booking
WHERE resource_id = ?
  AND status IN ('APPROVED','ONGOING')
  AND start_time < ?
  AND end_time   > ?
  AND id <> ?          -- 改约时排除自己
LIMIT 1;

查到一行就返回业务错误,例如:CONFLICT: 该时段已被预约。不要只打日志还返回 200。

四、接口放哪

  1. 学生提交预约:insert 前查冲突
  2. 管理员点通过:改状态前再查一次(防待审期间被别人先通过)
  3. 改时段:带上 id <> self

两处都查,比「只在前端 disable 按钮」靠谱。前端灰掉只是体验,不是约束。

五、最少测例(答辩可演示)

已有新预约期望
10:00–12:0012:00–13:00通过(点接壤)
10:00–12:0011:00–11:30拒绝(被包含)
10:00–12:0009:00–11:00拒绝(左重叠)
10:00–12:00 已取消10:30–11:00通过

六、答辩怎么讲 30 秒

「同一实验室同一时间只允许一个已通过预约。用时间段相交公式在提交和审核两处校验,测了包含、左重叠、点接壤和取消后重约。这是业务约束,不是调参模型。」

别说「我用了算法」。老师要的是规则清楚、测例在、代码找得到。

常见问题

时间段冲突怎么判断?

两段 [aStart,aEnd) 与 [bStart,bEnd) 相交,当且仅当 aStart < bEnd 且 bStart < aEnd。

待审核要不要互斥?

默认不互斥;通过时再查。若学院要求「提交即占坑」,开题写死并全站统一。

订房、会议室能套吗?

能。把 resource 换成房间/车位/设备即可,公式不变。

规则写了但代码对不上?

发表结构和提交接口,帮你看冲突查在哪一层。微信 cqlhsa123。

立即免费咨询