时段定价
HandyCafe 使用分段式定价引擎计算网吧或电竞馆的时段费用。引擎不是对整个时段使用单一固定费率,而是将每个时段分为多个分段,每个分段有自己的定价上下文。这确保了即使时段跨越多个时间档位、价格变更、暂停或断线时也能准确计费。
核心概念
| 术语 | 定义 |
|---|---|
| 基础小时费率 | 应用倍率前的每小时价格。在"设置 > 定价"中设置。 |
| 定价档位 | 具有特定倍率的命名时间段。共 8 个档位,每个带颜色编码。 |
| 倍率 | 应用于基础费率的系数。1.0 = 标准价,0.5 = 半价,2.0 = 双倍价。 |
| 分段 | 时段中定价上下文(档位、倍率、基础价格)保持不变的连续时间段。 |
| 结算 | 时段结束时确定顾客应付金额的最终计算。 |
基础小时费率
基础小时费率是所有定价计算的基础。在设置 > 定价中设置,代表 PC 使用的标准每小时价格。
所有内部计算使用货币最小单位(例如美元使用分,人民币使用分)。如果基础费率是每小时 3.00 元,内部值为 300。这消除了浮点舍入问题。
双货币支持
HandyCafe 支持基础货币和本地货币及汇率(FX rate)。如果您所在的国家国际定价与本地定价不同:
- 基础货币。 内部定价计算使用的货币。
- 本地货币。 向顾客显示并用于支付的货币。
- 汇率。 基础货币与本地货币之间的转换系数。
如果两种货币相同,汇率视为 1.0,无影响。
定价档位
共有 8 个颜色编码的定价档位,每个代表不同的定价层级:
| 档位 | 颜色 | 典型用途 |
|---|---|---|
| Blue | 蓝色 | 标准费率 |
| Orange | 橙色 | 晚间或周末加价 |
| Red | 红色 | 高峰时段溢价 |
| Green | 绿色 | 低谷折扣 |
| Teal | 青色 | 学生或会员费率 |
| Gray | 灰色 | 节假日或特殊定价 |
| Cyan | 蓝绿色 | 夜间费率 |
| Emerald | 翡翠色 | 促销费率 |
每个档位有三个属性:
- 名称。 描述性标签(如"高峰时段"或"夜间折扣")。
- 倍率。 修改基础费率的小数值。常见值包括 1.0(标准)、0.5(半价)、1.5(加价 50%)、2.0(双倍)。
- 排期数据。 定义档位适用于哪些日期的哪些小时的内部表示。通过排期网格自动管理。
排期网格
定价排期是一个 7 天 x 24 小时的矩阵(共 168 个一小时块)。每个块分配给一个定价档位。排期决定了任何给定时刻适用哪个倍率。
在设置 > 定价排期中配置。日期从周一到周日,小时从 00:00 到 23:00。
定价分段
分段是时段中定价上下文不变的连续时间段。当以下边界事件发生时,定价引擎创建新分段:
| 边界 | 触发 |
|---|---|
| session_start | 新时段开始 |
| session_stop | 时段结束 |
| pause | 收银员暂停时段 |
| resume | 收银员恢复时段 |
| tick | 时钟跨越小时边界进入不同的定价档位 |
| disconnect | 客户端 PC 丢失网络连接 |
每个分段记录会话 ID、开始时间、结束时间、定价档位 ID、倍率、基础价格快照和计算金额。
费用公式
单个分段的费用计算为:
amount = ceil( (base_price_snapshot * multiplier * duration_seconds) / 3600 )
引擎使用 128 位整数的定点算术,天花板除法确保结果始终向上取整到下一个最小单位。
时段总额计算
步骤 1:累加所有分段
raw_total = 所有已关闭分段金额之和 + 当前分段的部分金额
步骤 2:应用取整
rounded_total = round_up(raw_total, rounding_step)
取整始终向上(天花板)以保护收入。
步骤 3:应用起步费最低限额
final_total = max(rounded_total, startup_fee)
起步费是任何时段的最低收费,无论时长。
结算
结算是确定时段最终计费的过程。
开始结算(仅预付费)
预付费时段开始时,创建"开始"结算记录,捕获计算费用和实际收费金额。
结束结算
任何时段(预付费或后付费)结束时,创建"结束"结算记录,包含计算费用、实际收费金额、手动调整金额、手续费率、手续费金额、固定手续费和完整的定价时间线快照。
增值税
增值税在"设置 > 定价"中配置为百分比(0-100%)。应用于计算的时段金额之上:
增值税 = 收费金额 x (增值税率 / 100)
实际示例
示例 1:简单的后付费时段
- 基础费率:3.00 元/小时(300 最小单位)
- 排期:全天标准档位(倍率 1.0)
- 时段:10:00 至 11:30(90 分钟)
- 起步费:0.50 元
计算:
分段 1:(300 * 1.0 * 5400) / 3600 = 450 最小单位(4.50 元)
总计:max(4.50, 0.50) = 4.50 元
示例 2:跨越两个档位的时段
- 基础费率:4.00 元/小时(400 最小单位)
- 排期:标准(1.0)10:00-12:00,半价时段(0.5)12:00-14:00
- 时段:11:00 至 13:00(120 分钟)
计算:
分段 1(11:00-12:00,标准):(400 * 1.0 * 3600) / 3600 = 400(4.00 元)
分段 2(12:00-13:00,半价):(400 * 0.5 * 3600) / 3600 = 200(2.00 元)
总计:4.00 + 2.00 = 6.00 元
示例 3:含暂停的时段
- 基础费率:2.00 元/小时(200 最小单位)
- 时段:10:00 开始,10:30 暂停,11:00 恢复,11:45 结束
计算:
分段 1(10:00-10:30,活跃):(200 * 1.0 * 1800) / 3600 = 100(1.00 元)
暂停期间(10:30-11:00):不收费
分段 2(11:00-11:45,活跃):(200 * 1.0 * 2700) / 3600 = 150(1.50 元)
总计:1.00 + 1.50 = 2.50 元