最近做的项目需要生成订单编号,查阅资料后进行了学习总结,并将最终项目中使用的订单号生成规则进行记录。

订单编号生成规则

  • 不重复。这是生成订单号最基本、最重要的原则。比如一个人在京东上买了一个手机,另外一个人在京东上买了一包卫生纸,生成了一样的订单编号,一个人给客服打电话,客服一查,到底是哪个商品呢?
  • 安全。订单编号不能暴露客户的id,或者让竞争对手很容易看出近期的订单量。
  • 不能大规模生成随机码。当订单量比较多的时候,大规模生成随机码容易发生碰撞。
  • 控制位数。客户向客服上报订单编号时,太长不仅容易出错,而且耽误时间。
  • 符合实际需求。订单的生成规则要根据自己的项目中实际的需求。比如一个小型网站使用淘宝的订单编号生成规则,显然有点大费周章了。
  • 订单号尽量保持整形。提高数据库的检索效率,也不至于凌乱,或是让一些英文发信不标准的朋友尴尬。

实例参考

  • 小米订单生成规则。1——111218—03234—5170,将订单分为四个部分。第一部分,1表示购买,2表示退货。第二部分,表示2011年12月18日下的单。第三部分,时间戳对应0:53:54。最后一部分,表示在同一秒内下的第5170单,也就是说,小米认为,在一秒内不会超过一万个订单。

  • 宅妈妈app订单生成规则。订单是一个四位数的自增数字,可能想让用户感觉到订单在不断的增加,或者业务初期不想让用户反馈问题时报上冗长的订单号。

所犯的错

开始的时候欲使用的订单生成规则为:年月日+时间戳(五为)+随机数(2位)+客户id后四位,如20170421—34324——32—32321。如果这样设置的话当客户超过十万人时,如果id为1和100001同一秒下单订单号就有可能重复,而且随机数的一般作用为混淆别人找出订单生成规则,而实际项目中没有必要,不是很符合实际需求。

项目中使用的订单生成规则

综合以上因素,项目中决定使用:年月日+时间戳(后五位)+同一秒内订单生成序列号(三位)。例:20170421—34234—001,前13位精确到秒,后三位表示同一秒内生成的第一单。如果同一秒内生成了多个订单,则这些订单钱13位一样,后三位依次递增,也就是系统认为一秒内不会同时生成1000个订单。

如有错误,欢迎指正!