1. 程式人生 > >java生成訂單號的一種思路(生成友好的訂單號)

java生成訂單號的一種思路(生成友好的訂單號)

比如訂單號碼要求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;

然後業務層呼叫工具類去格式化數字作為最後的訂單號。