业务背景
美甲、按摩这类服务业的预约痛点不是"能不能约",而是"约到的时段是不是真的有人能做":员工技能不同(美甲师不会做蜜蜡)、排班不同(有人周日休)、项目时长不同(凝胶 manicure 40 分钟、spa pedicure 15-25 分钟)。系统必须把这三者叠在一起算可约时段,而不是简单按营业时间切格子。
客户端:选日子、选时段

Yo2 Nail Bar 预约页:日期横滑条(Today Sep 9 起一周)+ 15 分钟粒度时段网格;提示"This appointment takes about 40 min. Times shown already leave room for it."——展示的每个时段都已按项目时长和员工排班校验过。
下单与改期接口

POST /booking/hold:带 menuItemId / providerId / startAtIso / 顾客信息 / payLater 与 items 下单,返回 appointmentId、orderId、短码 A7X2、depositCents 与 status confirmed——持位成功即锁时段。

POST /booking/requests:kind=reschedule 提交改期申请(requestedStartAtIso + 顾客备注"临时有事"),返回 requestId 与 status pending、"已提交,等门店确认"——改期走审批,不直接改单。
商家后台:技能与周排班

商家后台预约页"员工与排班":添加员工时勾选能做的项目(42 项技能芯片:Standard/French/Gel Manicure、Dip Powder、各类 Pedicure、蜜蜡系列等),再按周设置班次(周一到周六 10:00-19:00、周日休息,美东 24 小时制);下方 Store Staff 卡片汇总技能与每日班次,支持改排班/删除。
后台日视图接口

GET /admin/booking/day?slug=yo2-nail-bar&date=2026-09-11&includeCancelled=1:返回当日 appointments(含 providerName、serviceName、status confirmed、depositCents / depositPaidCents / refundedCents 押金三态)与 nextAppointmentDate,后台日历与取消单同接口出。
核心业务成果
- 可约时段 = 员工排班 ∩ 技能匹配 ∩ 项目时长留白,顾客看到的每个时段都真实可履约;
- 下单持位返回短码(A7X2),门店前台口头核销不用翻系统;
- 改期走申请-审批流,门店对日历有最终控制权;
- 押金三态(应付/实付/已退)在日视图接口直接给出,对账不用二次查询。
技术难点总结
- 时段计算:按项目时长在员工班次内滑动开窗,再扣除已持位区间与缓冲时间,复杂度控制在门店规模可实时响应;
- 持位并发:同一时段多人下单用持位记录互斥,未付款超时自动释放,不超卖;
- 改期审批:改期不直接移动订单,而是生成 pending 申请,门店确认后原子换时段,避免审批期间时段被抢;
- 时区:排班按门店当地时区存储与展示(美东 24 小时制),接口一律 ISO 带时区,杜绝夏令时错位。













































