从一张票拆成多个可履约票项
联票对游客是一张凭证,对系统却应是多个票项。举例来说,“古城+博物馆+夜游”包含三个核销权益,可能拥有不同开放日期、入园次数和退款条件。如果只保存一个“已使用/未使用”字段,第一站核销后其余景点就无法正确判断。
| 层级 | 关键字段 | 作用 |
|---|---|---|
| 订单 | 渠道、游客、金额、支付与退款 | 交易与财务主记录 |
| 联票 | 产品、总有效期、实名规则 | 游客持有的统一凭证 |
| 票项 | 景点、日期、次数、状态、分摊金额 | 独立履约与退款单位 |
| 核销记录 | 票项、门店、设备、时间、结果、业务键 | 防重、审计与对账 |
一次核销请求要校验什么
- 凭证是否真实、是否属于当前游客或适用人群。
- 当前景点和门店是否在该票项允许范围内。
- 预约日期、入园时段和总有效期是否同时有效。
- 剩余次数是否大于零,是否存在正在处理的并发请求。
- 渠道是否要求回传具体门店 POI 或票项信息。
抖音景区核销文档提示,日历票多门店场景核销时需要回传核销门店 POI;政府采购需求也出现多景点打包预订并在各景点分别验证的能力。这些公开需求共同指向票项级履约,而不是整单“一刀切”。
防止同一票项在两处同时核销
检票口并发时,两个设备可能几乎同时读取同一票码。系统应在数据库或一致性服务中对票项做原子条件更新:只有“可用且剩余次数足够”的记录才能成功扣减。设备端重复点击、网络重发和恢复同步都必须使用同一幂等键返回原结果。
联票库存不能只看总量
联票可售数量通常受最紧张票项约束。若博物馆某时段只剩 20 个名额,即使古城仍有大量容量,包含该票项的联票也不能继续超额销售。系统应区分联票产品库存、各票项配额和渠道配额,并定义取消或退款后何时释放。
部分使用后的退款与结算
每个票项需要有可解释的金额分摊与履约状态,才能判断未使用部分是否可退、各景点如何结算。优惠不能在退款时临时随意分配;商品创建时就应固定分摊规则,渠道账、票务账和景点结算账使用同一版本。
