防止孤立空座
夹在两个已占用座位之间的单个空座通常很难售出。自 1.72.0 起,平台可以拒绝造成这种情况的选座操作。若买家的选择会使相邻座位孤立、旁边再无空座,座位图会自动将该邻座加入选择,或拒绝本次选择。规则逐排判断,只响应本次更改新造成的孤立空座。
启用功能
需要组织管理员角色,无需全局管理员权限。
打开 Settings > Organization(设置 > 组织)。Orphan seat prevention(防止孤立空座) 字段的提示为“Blocks selections that would leave a single empty seat in a row.”,即阻止会在一排中留下单个空座的选择,并提供三个值。Enabled(启用) 对组织内所有活动应用规则;Disabled(禁用) 对全部活动关闭规则;Inherit (currently enabled) 或 Inherit (currently disabled) 将决定权交给上级,并显示上级当前是否启用。选择后立即保存。
该值依次从五个层级继承:平台默认值、租户、组织、座位图、活动。某层显式设置的值会覆盖上方所有层;设为 Inherit 则继续继承。各层初始均为关闭,所以在有人启用之前,买家体验不会变化。
为单个活动覆盖设置
从活动中心打开已有活动。相同字段位于活动对话框的 External ID 下方,与表单其他内容一同保存。新建活动时暂不显示此字段;先创建,再重新打开即可。
更改何时生效
Booking 服务缓存最终配置 30 秒,因此约半分钟内买家即可看到变化。座位图和结算调用同时生效,无需重新发布座位图或重启服务。
如何判断一排座位
规则依据排的几何布局,按坐标排序。编号从 23 递减到 12 的排,与前方从 1 递增到 11 的排按相同方式处理,座位名称不参与计算。
过道会截断连续座位。当两个相邻座位间距大于本排座位间距中位数的 1.5 倍,或大于整个场地测得间距的 3 倍时,规则将其视为过道,并停止跨越计数。因此,过道旁的座位不会受过道另一侧座位约束。
只有本次更改新产生的孤立空座才会被拒绝。操作前就已只剩一个空座的排仍可预订,该座位可正常出售。隐藏座位不参与检查。
释放座位永远不会被阻止。解除保留和撤销销售无论留下何种布局都会执行,因为拒绝释放会使座位无法再次出售。
买家看到的效果
若某座位只能与邻座一起选择,渲染器会在这对座位外围绘制虚线轮廓。轮廓仅作提示,不影响点击,买家可点击其中任一座位。
默认情况下,会造成孤立空座的点击会自动补选,而不是被拒绝。渲染器加入规则要求的座位,购物车最终包含两个座位。若从购物车移除座位会触发此问题,则拒绝操作,因为调整会移除买家已选座位。groupSize 大于 1 时的点击也会因此被拒绝。
缩小到场地总览时,轮廓会消失,因为此尺度下两个座位外围的虚线难以辨认。
集成说明
实现 onOrphanSeatsBlocked 回调,可自行决定结果而不使用默认行为。回调接收买家尝试选择的座位、将变为孤立的座位,以及避免问题所需的调整。返回 true 接受调整,返回 false 拒绝更改。
主动调用购物车方法时,返回值也提供相同信息。initCart、addSeatsToCart、removeSeatsFromCartByIds 和 removeSeatsFromCartByKeys 现在返回 ICartChangeResult。applied 表示购物车是否更改,orphaned 表示更改是否留下孤立空座。移除操作会返回 applied: true,并可能带有非空 orphaned,因为移除仍会执行,即使留下孤立空座。
如果结算逐个锁定座位,请在 v2 请求的 cartSeatIds 中传入买家已持有座位的 ID。服务器会将这些座位与本次请求合并判断,避免合理的购物车在逐步构建时被拒绝。该字段最多接受 1000 个 ID,lock 和 sale 会读取它。
完整回调签名与示例请参阅渲染器文档中的编程式购物车更改与孤立空座防护。
结算响应
服务器也执行此规则,因此未经检查构建的购物车会在结算时再次校验。响应取决于调用路由,自托管集成方尤其需要注意两者差异。
v2 预订路由会使整个请求失败。lock 和 sale 返回 HTTP 422、错误代码 ORPHAN_SEATS_REFUSED,并指出被拒绝的座位。不会锁定或出售任何座位。
v1 销售路径返回 HTTP 200,违规座位列入失败选择列表,其余选择仍被出售。必须读取失败列表,HTTP 200 不代表所有座位都成功。
服务器仅检查转为 LOCKED 或 SOLD 的座位,释放操作不受影响。自 1.74.0 起,直接销售也跳过检查:directsale 记录在您的系统中已最终完成的销售,拒绝只会造成双方库存不一致。在 1.72 和 1.73 中,directsale 与 sale 一样接受检查,读取 cartSeatIds,并返回 HTTP 422 和 ORPHAN_SEATS_REFUSED。
检查本身失败时
检查失败时采用放行策略。如果无法读取配置、加载座位排,或规则抛出异常,更改仍被允许,销售继续。买家不会因检查内部故障而失去座位。