java生成訂單號的一種思路(生成友好的訂單號)
阿新 • • 發佈:2019-01-22
比如訂單號碼要求20位字串,除了8位的yyyymmdd外,還有12位可以自己去做。
提供一個工具類,根據一個數字生成訂單號 result str = yyyymmdd + 這個int的 格式化結果,格式化就是補0,比如今天是16年12.30第一個訂單號是1那麼完整訂單號為20161230000000000001
假設今天是第一次要訂單號,我需要100個。
然後提供一個服務類來記錄和獲取今天生成的最大訂單號。
// needNum代表 業務要佔用多少個訂單號
public int getMaxOrderNum(int needNum)
{
int maxNum = 獲取今天最大的 ordrNum 去資料庫裡(資料庫有日期和maxNum2個欄位) ,如果今天沒有記錄返回0;
if(maxNum ==0)
{
給資料庫insert 一條 maxNum為0 今天 的記錄。
}
int updateDBMaxNum = maxNum + needNum;
update 資料庫 今天, updateDBMaxNum 。
return maxNum 回去。
}
以下是我們公司的實現,我們通過 getmaxordernumberformDate方法獲取到一個int值,然後formart一下即可當做訂單號。
public class OrderNumberDubbboServiceImpl implements OrderNumberDubbboService { /** * redis鎖操作service */ @Resource(name = "redisLockServiceImpl") private RedisLockService redisLockService; @Autowired private OrderNumberDAO dao; @Override public int getMaxOrderNumberFromDate(Map<String, Object> paramMap) { // 鎖表(用於判斷現在是否可以建立訂單)一小時的超時時間 if (!redisLockService.addRedisLock(ConstantKey.REDIS_LOCK_MAX_ORDER_NUMBER, 2000, 2)) { return 0; } int number = ConverterUtils.toInt(paramMap.get("number")); int nowDate = ConverterUtils.toInt(paramMap.get("date")); // 從庫中獲取此型別的最新訂單資訊 OrderNumber orderNumber = dao.getOrderNumber(paramMap); OrderNumber newOrderNumber = new OrderNumber(); newOrderNumber.setType(ConverterUtils.toInt(paramMap.get("type"))); newOrderNumber.setDate(nowDate); int startNum = 1; if (!CheckUtils.isNullOrEmpty(orderNumber) && nowDate == orderNumber.getDate()) {// 庫裡有並且是今天的話,獲取庫裡的資料 startNum = orderNumber.getNumber() + 1; newOrderNumber.setNumber(orderNumber.getNumber() + number); dao.updateOrderNumber(newOrderNumber); redisLockService.delRedisLock(ConstantKey.REDIS_LOCK_MAX_ORDER_NUMBER); return startNum; } newOrderNumber.setNumber(number); dao.addOrderNumber(newOrderNumber); // 解鎖 redisLockService.delRedisLock(ConstantKey.REDIS_LOCK_MAX_ORDER_NUMBER); return startNum; } }
如果覺得這篇文章幫助到你,給作者打賞點咖啡錢吧。
業務層拿到最大num 是0,然後他就可以佔用1-100.
當下個業務在需要100個,拿到的是100,他就佔用101-200;
然後業務層呼叫工具類去格式化數字作為最後的訂單號。