请教会议室预定系统的设计

2023-03-26 16:02:57 +08:00
 keroppi

被公司安排设计开发一个会议室预定系统,主要是时间预定管理这方面,目前想到的感觉太笨了,想请教有没有更好点的设计和实现

会议室预定系统的问题

初步想到的做法是

日期:2023-03-26

时段开始:14:30

时段结束:15:30


日期:2023-03-26

时段开始:16:20

时段结束:17:00

然后查找匹配

会议编号 = 会议室编号
and 
预定日期 = 已存储的预约日期
and 
用预定开始时间去查找匹配已存储的预定时段结束时间(当前预订开始时间 > 已存储预约的结束时间)
and 
同时再用预定的结束时间去对比已存储的时段开始时间(当前预订结束时间 < 已存储预约的开始时间)

意识到上面可能有 BUG

解决办法,存储时多增加开始和结束小时的字段,如下

日期:2023-03-26

时段开始:14:30

时段开始小时:14

时段结束:15:30

时段结束小时:15

日期:2023-03-26

时段开始:16:20

时段开始小时:16

时段结束:17:00

时段结束小时:17

然后搜索逻辑

会议编号 = 会议室编号
and
预定日期 = 已存储的预约日期
and 
当前预约开始小时 = 已存储预约结束小时 and 用预定开始时间去查找匹配已存储的预定时段结束时间(当前预订开始时间 > 已存储预约的结束时间)
and 
当前预约结束小时 = 已存储预约开始小时 and  同时再用预定的结束时间去对比已存储的时段开始时间(当前预订结束时间 < 已存储预约的开始时间)

感觉这种实现太笨了,请教更好的设计。

1521 次点击
所在节点    问与答
10 条回复
illuz
2023-03-26 16:37:06 +08:00
把当天的预约情况查出来,代码比较有没有冲突。如果预约跨天了就查两天。
keroppi
2023-03-26 16:44:39 +08:00
@illuz 感谢,倒是提醒我了,还有跨天的可能(双 11 那晚)
illuz
2023-03-26 16:47:43 +08:00
我的思路就是代码处理,担心并发问题就上分布式锁,处理前后对会议室包上锁就行。
ilylx2008
2023-03-26 16:52:16 +08:00
时段半个小时一个,别整 10 分钟一个。
我刚写了一套。不过,建议还是直接用钉钉的吧
keroppi
2023-03-26 17:00:53 +08:00
@ilylx2008 额,用的是内部 OA 、IM 系统,因为还要控制门锁(扫码控制硬件开锁)就没去了解市面上,有点闭门造车了
keroppi
2023-03-26 17:01:55 +08:00
@illuz 没啥并发问题,就十几个会议室(普通人人都可以预定的)
yangzhezjgs
2023-03-26 17:13:40 +08:00
本质上是个资源管理问题,可以参考文件系统里管理空闲空间的一些思路。
首先,假设工作时间是早上八点到晚上八点,可以半小时为一个分配单位划分资源,用一个 24 位的 bitmap 来表示会议室的资源,初始化为全 0,已经分配的就置 1 。然后,写一个分配函数,逻辑就是先检查对应的位是否被置 1 (可以用异或),如果置 1 ,就提示错误,没有就把 0 变成 1 ,预定记录存入数据库。
metalvest
2023-03-26 17:31:45 +08:00
用时间戳保存
YonyBlackie
2023-03-26 20:48:34 +08:00
@keroppi 其实市面上有很多成熟的会议预定系统了,对接 OA 和智能控制的功能都很成熟。你查一查 evoko 这个品牌,可以调用 API 对接 OA 和智能控制。
lldld
2023-03-26 21:09:00 +08:00
@keroppi 我猜 3 楼 @illuz 的意思是不必局限于用 sql 去解决问题. 也就 10 几个会议室, 直接把预定信息读出来, 代码判断新的预定是否能满足就好了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/927274

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX