订单生成规则探讨 - 附 Java 实现

系统设计 Java About 1,257 words

例子

长度共24

240110114442845000000000

含义

前 0~15 位

240110114442845按年月日时分秒生成,精确到毫秒级。其中年份取后两位

后 x 位

取决于唯一表示,如:自增用户ID,从1100000到更多。

后 x-2 位

支付渠道号,如:自增的渠道ID,从0199位。

后 x-2-15 位

取随机数,如:

  • x1位,则随机数取6
  • x3位,则随机数取4
  • x7位,则随机数不占位

好处

当运营人员看到订单号时,大致就能知道订单发生的时间,用户是谁,支付渠道。

Java 代码

private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");

public static String genOrderId(String channelId, String userId) {
    // 240110114442845
    String prefix = formatter.format(LocalDateTime.now());
    String suffix = channelId + userId;
    int randomLen = 24 - prefix.length() - suffix.length();
    String random = "";
    if (randomLen > 0) {
        int bound = Integer.parseInt("9".repeat(randomLen)) + 1;
        int value = ThreadLocalRandom.current().nextInt(0, bound);
        random = String.format("%0" + randomLen + "d", value);
    }
    return prefix + random + suffix;
}

测试

public class OrderIdGenerator {

    public static void main(String[] args) throws InterruptedException {
        System.out.println(genOrderId("1", "1"));
        System.out.println(genOrderId("12", "12"));
        System.out.println(genOrderId("123", "123"));
    }

}
240110181122863775733511
240110181122879765811212
240110181122879242123123
Views: 337 · Posted: 2024-01-19

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓
Today On History
Browsing Refresh