预约排队系统开发实战:多时段预约、排队叫号和微信通知的完整方案
预约排队系统的应用场景
预约排队系统在日常生活中无处不在:医院挂号、政务服务大厅办事、银行柜台业务、餐厅等位、美容美发预约、驾校练车预约、展馆参观预约……几乎所有需要按序服务的线下场景都能用到。
传统的现场取号排队方式存在明显的体验问题:顾客不知道还要等多久、高峰期现场拥挤混乱、工作人员需要手动管理排队秩序。而一套设计良好的预约排队系统可以让顾客提前预约时段、远程查看排队进度、到号前收到提醒通知,大幅提升服务体验和运营效率。
本文将从系统开发的角度,详细拆解预约排队系统的核心功能模块和技术实现方案。
系统架构设计
模块划分
预约排队系统的核心模块包括:
预约管理:时段配置、预约下单、预约变更和取消。
排队管理:取号、排队队列、叫号、过号处理。
通知服务:微信模板消息、短信通知、现场叫号屏。
后台管理:服务窗口管理、业务类型配置、排队规则设置。
数据统计:等候时间分析、业务量统计、高峰时段分析。
技术架构
后端使用轻量级的微服务架构或单体应用(根据项目规模决定),核心组件包括:
Web服务:处理预约下单、排队管理等业务逻辑。
消息队列:用于解耦通知服务,预约成功、即将到号等事件发布到队列,通知服务消费并发送消息。
定时任务:定期检查过号、清理过期预约、生成统计报表。
缓存层:Redis缓存当前排队队列和窗口状态,保证叫号操作的实时性。
前端分为三个端:
- 用户端:微信小程序或H5页面,用于在线预约和查看排队进度
- 工作人员端:PC端或平板端,用于叫号操作和服务记录
- 大屏端:现场排队显示屏,展示当前叫号信息和等候队列
预约管理模块
时段配置
预约的核心是时段管理。系统需要支持灵活的时段配置:
基本时段设置:管理员配置每天的营业时间段,如 09:00-12:00 和 14:00-17:00,以及每个时段的可预约名额。时段的粒度可配置(15分钟、30分钟、1小时等),不同业务类型可以有不同的时段粒度。
特殊日期处理:节假日可以关闭预约,或者调整营业时间和名额。工作日和周末可以设置不同的时段模板。
动态名额调整:根据服务窗口数量和业务类型的平均服务时长自动计算每个时段的可预约名额。当临时增加或减少窗口时,自动调整后续时段的名额。
预约规则:
- 提前预约天数限制(如最多提前7天预约)
- 预约截止时间(如时段开始前30分钟停止预约)
- 每人每天预约次数限制(防止恶意占位)
- 黑名单机制(对频繁爽约的用户限制预约)
时段数据模型设计
时段数据的设计需要平衡灵活性和查询效率:
时段模板表:
- 模板ID、业务类型、适用日期类型(工作日/周末/节假日)
- 开始时间、结束时间、时段间隔、每时段名额
时段实例表:
- 日期、时段开始时间、时段结束时间
- 总名额、已预约数、剩余名额
- 状态(开放/已满/已关闭)
预约记录表:
- 预约ID、用户ID、业务类型
- 预约日期、预约时段
- 状态(已预约/已签到/已完成/已取消/已爽约)
- 排队号码
每天凌晨由定时任务根据模板自动生成未来N天的时段实例。管理员可以手动调整特定日期的时段配置。
预约下单流程
用户端的预约流程如下:
- 选择业务类型:展示可预约的服务项目列表,每个项目显示预估服务时长
- 选择日期和时段:日历视图展示可预约日期,时段列表展示每个时段的剩余名额,已满的时段灰色不可选
- 填写个人信息:姓名、手机号、备注(根据业务需求可扩展其他字段)
- 确认预约:提交预约,系统扣减时段名额,生成预约记录
- 预约成功通知:通过微信模板消息或短信发送预约确认信息,包含预约时间、地点、注意事项和取消链接
在高并发场景下(如热门医院的专家号),多人同时抢同一个时段可能导致超卖。解决方案:
- 乐观锁:更新时段名额时使用版本号或CAS(Compare And Swap)操作,更新失败则提示用户名额已被抢完
- Redis预扣减:在Redis中维护每个时段的剩余名额计数器,使用DECR原子操作进行扣减,扣减成功后再异步写入数据库。这种方式性能更好,但需要处理Redis和数据库之间的数据一致性
预约变更和取消
- 用户可以在预约时段开始前一定时间内取消预约(如提前2小时),取消后名额自动释放
- 变更预约等价于取消旧预约+创建新预约
- 对于频繁取消的用户,系统记录违约次数,达到阈值后限制预约权限
- 管理员可以批量取消某个时段的所有预约(如因突发情况关闭服务),系统自动通知所有受影响的用户
排队管理模块
取号机制
预约用户到达现场后,需要签到取号进入排队队列。取号方式包括:
二维码签到:用户到达后扫描现场二维码,系统确认签到并分配排队号码。
自助终端取号:现场放置自助取号机,用户输入预约手机号或扫描预约二维码取号。
前台取号:工作人员在后台系统中为到场用户手动签到取号。
现场直接取号:对于未预约的walk-in用户,直接在现场取号排队,排在预约用户之后。
号码生成规则:通常使用业务类型前缀+序号的格式(如 A001、B002),每天从001重新开始。预约用户和现场用户可以使用不同的号段,方便区分。
排队队列设计
排队队列是整个系统的核心数据结构。使用Redis的Sorted Set实现优先级排队:
默认排序:按取号时间排序,先到先服务(FIFO)。
优先级机制:预约用户优先于现场取号用户,VIP客户优先于普通客户。通过调整Sorted Set中的score值来实现优先级排序。
多队列管理:不同业务类型维护独立的排队队列,不同窗口服务不同类型的业务。支持一个窗口服务多种业务类型,按优先级从不同队列中取号。
队列的状态需要实时更新,包括:当前等候人数、预计等候时间、当前服务号码等。
叫号流程
工作人员端的叫号操作流程:
- 叫下一位:工作人员点击"叫号"按钮,系统从队列中取出下一个等候者
- 广播通知:大屏显示"请X号到Y窗口",同时通过语音播报、微信通知等方式通知用户
- 等待到场:给用户一定的响应时间(如5分钟)
- 开始服务:用户到达窗口,工作人员点击"开始服务"
- 服务结束:服务完成后点击"完成",记录服务时长,自动叫下一位
过号处理
用户被叫号后未在规定时间内到达窗口的情况需要妥善处理:
- 第一次过号:重新插入队列,排在当前等候者之后(给一次机会)
- 第二次过号:标记为弃号,不再排队
- 过号通知:过号时发送微信通知,告知用户已过号以及是否还在队列中
过号的超时时间可以配置,不同业务类型可以设置不同的超时时间。
通知服务模块
微信模板消息
微信模板消息是预约排队系统最常用的通知渠道。需要在微信公众号或小程序中申请以下类型的消息模板:
预约确认通知:包含预约时间、地点、业务类型、取消链接。
预约提醒通知:在预约时段前一定时间(如前1小时)发送提醒。
排队进度通知:当前面只剩N人时(可配置)发送提醒,告知用户"前面还有3人,预计等待15分钟,请尽快到场"。
叫号通知:通知用户"已到您的号码X号,请到Y窗口办理"。
过号通知:通知用户已过号及后续处理方式。
服务完成通知:服务结束后发送满意度评价链接。
技术实现上,小程序的订阅消息需要用户主动授权订阅,且每次授权只能发送一条。可以在预约下单时引导用户一次性订阅多个消息类型。公众号的模板消息没有这个限制,但需要用户关注公众号。
短信通知
作为微信通知的补充渠道,对于未关注公众号或未使用小程序的用户,通过短信发送关键通知(叫号通知和过号通知)。
现场叫号屏
排队大屏是现场最重要的信息展示渠道。大屏的设计要点:
- 字体足够大,在10米外也能看清
- 信息层次清晰:当前正在服务的号码和窗口(醒目突出)、等候队列(滚动展示)、当前等候人数和预计等待时间
- 叫号时有醒目的动画效果和语音播报
- 配合TTS语音合成(如百度语音或腾讯云语音合成API)实现自动语音叫号
技术上,大屏端可以使用Web页面全屏展示,通过WebSocket实时接收叫号事件并更新画面。
后台管理模块
窗口管理
管理员可以配置服务窗口:
- 窗口编号和名称
- 窗口服务的业务类型(一个窗口可以服务多种业务)
- 窗口状态(开放/暂停/关闭)
- 绑定的工作人员
当某个窗口暂停(如工作人员休息)时,该窗口停止叫号,其他窗口继续服务。暂停期间队列不受影响。
业务类型配置
- 业务类型名称和编号
- 预估服务时长(用于计算等候时间)
- 优先级权重
- 是否支持在线预约
- 所需材料清单(在预约确认通知中告知用户需要携带的材料)
实时监控看板
管理后台提供实时运营看板:
- 各窗口当前服务状态和服务进度
- 各队列的等候人数和预计等候时间
- 今日预约总数、已签到数、已完成数、爽约数
- 平均等候时间和平均服务时长的实时数据
数据统计分析
运营效率分析
等候时间分析:统计平均等候时间、最长等候时间的趋势变化。按时段统计等候时间分布,找出高峰时段。
服务时长分析:统计各业务类型的平均服务时长,对比不同窗口和工作人员的服务效率。
业务量分析:按日/周/月统计各类型业务的办理量,识别业务量的周期性变化规律。
预约数据分析
预约转化率:预约→签到→完成的转化漏斗,找出流失环节。
爽约率分析:统计爽约率的变化趋势,分析爽约的主要原因(忘记、临时有事、等候时间太长放弃等)。
时段热度图:以热力图的形式展示各时段的预约热度,帮助管理者合理调配资源。
容量规划
基于历史数据,系统可以为管理者提供容量规划建议:
- 根据业务量趋势预测未来的窗口需求
- 识别现有窗口配置的瓶颈(某个业务类型经常排长队)
- 建议调整各时段的预约名额上限
开发过程中的关键技术点
等候时间预估
准确的等候时间预估是提升用户体验的关键。计算公式:
预估等候时间 = 前面等候人数 × 该业务类型平均服务时长 ÷ 当前开放的服务窗口数
但这个公式过于简单,实际场景中还需要考虑:
- 不同用户的服务时长差异较大(有的业务3分钟搞定,有的要30分钟)
- 窗口可能中途暂停
- 排在前面的人可能弃号
更精确的做法是使用加权移动平均:基于最近N次相同业务类型的实际服务时长计算平均值,给予近期数据更高的权重。
高可用保障
排队系统的可用性直接影响现场秩序。系统需要考虑以下容灾措施:
- Redis使用主从模式或集群模式,主节点故障自动切换
- 关键数据(排队队列)既在Redis中维护也持久化到数据库,Redis故障时可以从数据库恢复
- 大屏端做本地缓存,网络中断时仍能显示最近的叫号信息
- 工作人员端支持离线叫号模式(本地缓存队列数据),网络恢复后自动同步
多门店支持
连锁企业需要一套系统管理多个门店的排队预约。设计上需要:
- 数据按门店隔离,每个门店独立的排队队列和配置
- 总部可以查看所有门店的汇总数据
- 支持跨门店预约(用户可以选择就近的门店)
- 统一的消息模板管理,各门店共用
总结
预约排队系统看似功能简单,但要做好用户体验和运营效率,涉及的技术细节相当多。万户科技在开发此类系统时,通常建议客户从最核心的预约+排队+通知三个模块开始,快速上线使用,再根据实际运营中收集的数据和反馈,逐步完善数据分析、容量规划等高级功能。
对于计划开发预约排队系统的企业,有几个关键决策需要提前明确:是只做线上预约还是同时支持现场取号?通知渠道是微信为主还是短信为主(取决于用户群体)?是否需要对接现有的叫号硬件设备?这些决策将影响系统的技术方案和开发周期,建议在需求阶段就充分讨论清楚。
需要网站建设、软件开发或爬虫定制?
模板建站1280元起,价格公开不加价。电话/微信 13535321113
