我们按小时收钱。价格调过几次。
第一次调价之前,我们做对了一件事——不然那次调价会变成一场灾难。
那件事
每一单在提交的那一刻,把当时的费率抄一份,存进这一单自己的记录里。
之后所有的计算——预扣、结算、历史花费——只认这一单里的那个数,不去读「当前价」。
一个字段的事。
不这么做会发生什么
想象一下:价格表里存着一个「当前价」,每次算钱都去读它。
然后你调价了。
- 上个月已经付过款的单子,历史记录里的金额跟着变了
- 一个跑到一半的任务,前半段按旧价、后半段按新价
- 客户翻自己的账单,发现三个月前那一单的金额和当时收到的收据对不上
最后一条最要命。 它不是一个 bug,它是一件解释不清楚的事——你没法跟客户说「我们改了价,所以你三个月前那单的记录也变了」。
我们后来涨过、降过、还塌过档
这个字段在三种情况下都救了场:
- 从三档变两档
- 从两档变一档
- 单价本身调整
每一次,存量的单子都纹丝不动。 不用做数据迁移,不用挨个通知,不用解释。
这条规矩的一般形式
不只是价格。任何「会变、又被用来算钱」的数,都该在使用的那一刻固化下来:
- 汇率 —— 按交易当天的汇率折算,把汇率和日期一起存进那一行
- 费率、提成比例
- 折扣、优惠
判据是一句话:
这个数在事情发生之后还会变吗?会的话,把当时那个值抄一份存起来。
一个反面例子
我们还犯过反过来的错:做过一个「项目」功能,创建的时候把费率钉死,之后这个项目下的所有单都按那个价。
听起来和上面是同一件事,其实完全相反:
- 上面是「已经发生的事按当时的价」——对
- 那个是「将来要发生的事按过去的价」——错
后者等于发了一张收不回来的永久折扣券。第一次涨价那天,存量项目就成了不可逆的旧价通道。
这个功能后来也下架了。
区分在于时态。 固化的是过去,不是未来。