订单生成规则探讨 - 附 Java 实现
系统设计 Java About 1,257 words例子
长度共24
位
240110114442845000000000
含义
前 0~15 位
240110114442845
按年月日时分秒生成,精确到毫秒级。其中年份取后两位。
后 x 位
取决于唯一表示,如:自增用户ID
,从1
到100000
到更多。
后 x-2 位
支付渠道号,如:自增的渠道ID
,从01
到99
位。
后 x-2-15 位
取随机数,如:
x
取1
位,则随机数取6
位x
取3
位,则随机数取4
位x
取7
位,则随机数不占位
好处
当运营人员看到订单号时,大致就能知道订单发生的时间,用户是谁,支付渠道。
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: 546 · Posted: 2024-01-19
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...