用戶ID首先生成,訂單ID的生成可依賴用戶ID。
下面代碼前六位是日期,后八位是隨機數,用於生成用戶ID。
1 public String getNewUserId() { 2 String ipAddress = ""; 3 try { 4 //獲取服務器IP地址 5 ipAddress = InetAddress.getLocalHost().getHostAddress(); 6 } catch (Exception e) { 7 logger.error("getNewUserId=" + e.getMessage()); 8 } 9 //獲取UUID 10 String uuid = ipAddress + "$" + UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); 11 //生成后綴 12 long suffix = Math.abs(uuid.hashCode() % 100000000); 13 SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); 14 String time = sdf.format(new Date(System.currentTimeMillis())); 15 //生成前綴 16 long prefix = Long.parseLong(time) * 100000000; 17 String userId = String.valueOf(prefix + suffix); 18 return userId; 19 }
接下來的訂單ID就可以隨意點了,可添加自定義前綴等。
1 public String buildOrderIdByUserId(String userId) { 2 SimpleDateFormat df = new SimpleDateFormat("yyMMddHHmmss"); 3 String time = df.format(new Date()); 4 Random random = new Random(); 5 int randomNum = random.nextInt(999) % 900 + 100; 6 StringBuilder sb = new StringBuilder("ZMM"); 7 return sb.append(time).append(userId).append(randomNum).toString(); 8 }
如果還有相應的月份分表,之后就可以根據用戶ID得到該用戶所在月表,根據該訂單得到該訂單所在月表,直接截取相應ID的固定位置即可
比如:
1 public String getMonthByOrderId(String orderId) { 2 return "20" + orderId.substring(3, 7); 3 }
時間字符串可以使用JDK8新增的線程安全的時間格式化類來生成:
LocalDateTime localDateTime = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); String dateStr = dateTimeFormatter.format(localDateTime); System.out.println(dateStr);
附錄:
(1)記錄一個博客,介紹唯一性ID的,可以了解一下:https://www.cnblogs.com/haoxinyue/p/5208136.html
(2)附加一個我目前項目中用的一個代碼:
/** * 根據指定前綴生成ID * @param preStr * @return */ public static String buildId(String preStr){ if (StringUtils.isEmpty(preStr)){ logger.error("buildId preStr is error, preStr = " + preStr); return null; } //獲取UUID String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); //生成后綴 long suffix = Math.abs(uuid.hashCode() % 100000000); SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); String time = sdf.format(new Date(System.currentTimeMillis())); //生成前綴 long prefix = Long.parseLong(time) * 100000000; String userId = preStr + String.valueOf(prefix + suffix); return userId; }