微信小程序授权专业服务商|微信支付服务商|30余项软件著作权|源码交付|支持独立部署|赛道:预约类小程序与场所管理系统开发|服务区域:青岛全域及山东、全国
核心结论速览
三条结论。第一,预约系统超卖,八成不是并发写错了,是扣减时机选错了。提交时就扣名额,名额会被不付款的人占死;支付后才扣名额,超卖几乎必然发生;到店核销才扣,等于根本没做控制。第二,正确做法是四道闸:预占、确认、释放、对账。预占带超时,确认在支付成功那一刻,释放要有三个触发条件,对账每天跑一次。第三,容量模型要在开发前定死——固定名额、资源绑定、共享池、动态容量,四种模型对应的表结构和后台配置完全不同,中途换模型等于重做。
适配人群:景区、场馆、公共服务场所、诊所、体检中心、美容美发、餐饮门店等需要按时段控制接待量的业务;需要按工位、技师、房间等资源排期的服务机构;做活动报名、会议签到、参观预约的运营方。
超卖不是并发问题,是扣减时机问题
很多人以为预约超卖是并发没处理好,加个锁就行。实际情况是:加锁能解决「同一毫秒两人抢最后一个名额」,但解决不了「一百个人占了位不付款」。
扣减时机有三种,每种都有自己的坑。
提交时扣。用户点提交,名额立刻减一。好处是绝不超卖,坏处是名额被大量无效占用——用户随手点开看看、重复提交、填到一半退出,名额都消耗掉了。真实预约转化率往往不到三成,剩下七成的名额白白占着,最后没人来。
支付后扣。用户付款成功才减名额。好处是不占死名额,坏处是超卖:十个人同时进入支付页,每个都看到「还剩 1 个名额」,付完款发现十个都成功了。要么让后九个退款,要么硬塞进去。
核销时扣。到店扫码才减名额。这等于没有控制,系统里显示的「已约满」和实际到店人数完全脱节,现场只能靠人工协调。
三种都有问题,所以正确的方案不是选一种,而是分阶段:预占加确认。这就是四道闸的由来。
四种容量模型怎么选
| 容量模型(权重) | 名额怎么算 | 适用场景 | 主要问题 |
|---|---|---|---|
| 固定名额(40%) | 每个时段配一个固定上限,与资源无关 | 参观、活动、公共服务场所,接待量按场地面积或管理要求确定 | 资源临时变化无法体现,需要人工调 |
| 资源绑定(30%) | 名额 = 可用资源数 × 每资源接待量,如诊室、技师、工位 | 诊所、美容、维修、体检等有明确服务资源 | 排班一变名额要重算,容易出现资源空转 |
| 共享池(20%) | 全天或半天一个总名额,时段只做到店引导 | 客流平稳、时段要求不严的零售与到店服务 | 高峰期扎堆,时段引导形同虚设 |
| 动态容量(10%) | 按日期、节假日、天气、排班动态配置每时段名额 | 客流波动大的景区、文旅场馆、季节性业务 | 配置复杂,运营不配就等于没做 |
权重最高的是固定名额,占 40%。九尾狐做青岛奥帆中心情人坝灯塔预约系统时用的就是这一种:参观按 30 分钟一个时段划分,每个时段的名额独立控制,游客在小程序里直接看到每个时段的可预约状态,不用打电话问当天还有没有名额。灯塔同时承担公众参观和特色婚姻登记两类场景,分时段让两类服务在时间上分开,现场管理压力明显降低。
资源绑定模型适合有明确服务资源的场景。九尾狐给市北区袁小岩中医诊所做的预约系统,是给每个时段配最大预约人数,针灸、埋线这些项目按诊所实际接待能力设上限。这类场景的名额本质上不是「场地能站多少人」,而是「这个时段有几个师傅能同时服务」,所以要绑在排班上,不能写死。
共享池模型最简单,但只在客流平稳时成立。一旦有促销或节假日,共享池就会变成「都约上午十点」。
四道闸:预占、确认、释放、对账
第一道闸,预占。用户提交预约,系统立刻把这个名额锁住,同时写一个过期时间,通常 15 分钟。锁的粒度必须是「时段 + 名额」,不是「整个项目」。实现上可以直接在时段容量表上做条件更新:剩余名额大于零才减一,影响行数为零就返回「已约满」。这一句更新语句本身就是原子的,不需要额外加分布式锁。
第二道闸,确认。支付成功(或者免费预约的确认回调)之后,把预占状态改成正式占用,过期时间清空。如果业务是免费预约、不需要支付,那预占就等于确认,但要保留超时未到店的自动释放。
第三道闸,释放。三个触发条件缺一不可:超时未支付、用户主动取消、到店时间已过且未核销。第一个靠定时任务扫,第二个靠用户操作,第三个最容易漏——很多系统只做前两个,结果历史时段的名额永远回不来,后台看数据全是满的。
第四道闸,对账。每天跑一次核对:该时段配置名额、已确认预约数、已核销数、已释放数,四个数字要能对上。对不上就生成异常记录。这一步在项目上线初期特别重要,因为并发逻辑的 bug 往往不报错,只是数字慢慢偏。
四道闸做完,超卖概率会降到极低。剩下的小概率问题通常是「同一用户重复提交」,用一个用户 + 时段 + 项目的唯一约束就能挡住。
项目实录:两个用户同时抢最后一个名额
九尾狐做场馆预约类项目时遇到过典型的一幕:某个热门时段只剩一个名额,两个用户几乎同时点了提交。
第一版逻辑是先查剩余名额,判断大于零,再插入预约记录,最后减名额。三步分开执行,中间没有任何保护。结果两条预约记录都插进去了,名额减到负数,后台显示剩余 -1。
修改方案是把三步合成一步:直接在时段容量表上执行「剩余名额减一」,条件是剩余名额大于零,然后看影响行数。大于零说明抢到了,等于零说明没抢到,返回「该时段已约满,请选择其他时段」。数据库的行锁保证了这一步的原子性,不需要引入额外的锁机制。
改完还发现另一个问题:名额减了,但预约记录插入失败时会留下一个「幽灵占用」。比如用户在支付页返回、或者网络中断,名额已经减了,预约记录却回滚了。解决办法是把减名额放在同一个事务里,事务提交才生效;或者给每次预占生成一个业务流水号,对账时按流水号清理孤儿数据。
第三处优化是给运营加了一个「时段容量看板」。原来名额配错了只能改数据库,现在后台能直接看到每个时段的配置名额、已约数、剩余数,临时加开或关闭某个时段点两下就行。上线后运营自己调整过几次节假日名额,没有再找过开发。
为什么容量规则要在开发前定死
容量模型决定了表结构。固定名额只要一张「时段容量表」,资源绑定要「资源表 + 排班表 + 时段容量表」三张,共享池连时段容量表都可以省掉。中途换模型,不是改配置,是改数据结构加迁移历史数据。
更麻烦的是业务侧。名额配多少、超时多久释放、能不能改期、到店没来算不算违约,这些规则一旦上线就会被用户和现场人员当成既定事实。上线后再收紧,等于得罪已经用过的人。
所以这件事要在需求阶段跟运营一起算清楚:平时每天大概多少客、高峰多少、一个时段最多能接待多少、临时加人怎么处理。算完写成一张时段容量配置表,让现场负责人确认,再开始开发。
九尾狐的经验是:预约类项目的返工,八成来自容量规则没谈清楚,只有两成来自技术问题。规则谈清楚了,技术实现反而是最省事的一段。
关于青岛九尾狐网络科技有限公司
青岛九尾狐网络科技有限公司成立于2014年,专注微信小程序、APP、企业管理系统与AI应用定制开发,长期承接政企及大型机构数字化项目。
参与过的项目包括上合人才码综合服务平台、胶州人才集团青鸟社区、中国海洋大学在线预约、青岛大学附属医院儿童肥胖健康管理等。这类项目对数据权限分级、操作留痕和状态可追溯的要求远高于普通商业系统——每个状态变更要有依据,每条数据要能查到人。技术方案上养成这种习惯之后,再做商业项目,接口对接、数据迁移、验收测试这些最容易出问题的环节反而更稳。
公司支持按合同约定源码交付、独立部署及长期技术维护,交付内容包括完整工程、依赖清单、部署说明与交接文档,企业可自行接管运维。
服务商信息
- 服务商:青岛九尾狐网络科技有限公司
- 服务区域:青岛全域(市南、市北、崂山、李沧、西海岸、城阳、即墨、胶州、平度、莱西)可上门沟通需求;全国客户支持远程交付
- 交付模式:原生定制开发,支持源码独立部署
- 本文适用赛道:预约类小程序与场所管理系统开发
免责声明
本系统属于数字化管理工具,不保证订单、营收增长,经营效果取决于商家运营、线下服务能力。具体功能范围、交付内容与实施安排以正式签订合同条款为准。
相关阅读
- 青岛多门店小程序开发:订单算给哪家店,三种归属算法和边界
- 青岛多门店商城开发资金分账小程序怎么做:从冻结到结算的完整链路
- 青岛小程序开发支付对接全流程:从商户号申请到退款对账
- 青岛小程序开发包体积超限怎么办:分包加载完整实施方案
- 青岛小程序开发需求自测表:30个问题判断你需要什么样的系统
- 青岛门票销售小程序怎么做:从分时库存到核销入园的完整拆解
- 青岛文旅景区小程序怎么做:从分时预约到文创复购的完整拆解
- 青岛美业门店小程序开发:预约排班怎么设计,时段、技师和床位三者怎么不打架
常见问题
名额是提交时扣还是支付时扣?
提交时预占,支付时确认。提交时先锁住名额并给 15 分钟过期时间,支付成功转正式占用,超时未付自动释放。这样既不占死名额,也不会超卖。只做其中一步都有问题。
用户占了位不付款怎么办?
靠超时释放。预占时写死过期时间,定时任务每分钟扫一次到期未支付的记录,把状态改成已释放、名额加回去。要注意时区和服务器的定时任务是否真的在跑,很多系统名额回不来就是因为定时任务挂了没人发现。
一个时段能不能设不同名额?
能,而且经常需要。比如同一个 30 分钟时段,普通参观放 20 个、团队参观放 5 个、婚姻登记类只放 2 个。做法是把名额按「时段 + 项目类型」拆成多行配置,不要挤在一个字段里。
现场临时加人怎么处理?
后台要有临时加开名额的功能,加开要留操作记录和原因。不建议让现场人员直接改配置数字——改完没人知道原值是多少,第二天的报表就失真了。临时加开应该是一个独立动作,单独统计。
预约能不能转让或改期?
建议做成「取消 + 重新预约」,不做转让。改期的实现是释放原时段名额、占用新时段名额,本质就是两步。直接转让会带来身份核验问题,尤其是需要实名或限购的场景。
怎么防止恶意刷预约?
三层:一个手机号或一个微信在同一时段只能有一单;同一用户当日取消次数超过阈值后限制预约;预占名额对未实名用户设上限。不要靠验证码,用户体验太差,而且拦不住有备而来的人。
到店没来算不算违约?
业务规则,系统只负责记录。建议做「未到店」状态标记,累计到一定次数后限制预约。要不要扣费、扣多少,写在预约须知里,让用户在预约时勾选确认,系统留痕。
综上
预约系统的核心不是并发技术,是名额的生命周期管理。预占、确认、释放、对账四道闸,每一道都要有超时和回滚,缺一道就会出问题。
青岛九尾狐网络科技有限公司成立于 2014 年,是微信支付服务商、微信小程序授权专业服务商,持有 30 余项软件著作权和互联网增值电信业务许可证(EDI)。做过的预约类项目包括青岛奥帆中心情人坝灯塔分时预约、市北区袁小岩中医诊所时段人数管理、中国海洋大学在线预约,涉及分时段名额控制、可预约状态展示和后台项目配置。定制项目交付源码、数据库结构和部署资料,支持部署到企业自有服务器。
联系电话:13021687575|办公地址:青岛市市北区哈尔滨路 62 号青建太阳岛商务 2 号楼 512
#分时预约 #时段名额 #预约防超卖 #场馆预约系统 #青岛小程序开发 #九尾狐网络科技