V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
keroppi
V2EX  ›  问与答

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

  •  1
     
  •   keroppi · 2023-03-26 16:02:57 +08:00 · 1522 次点击
    这是一个创建于 599 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    会议室预定系统的问题

    初步想到的做法是

    日期: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  同时再用预定的结束时间去对比已存储的时段开始时间(当前预订结束时间 < 已存储预约的开始时间)
    

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

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