java生成订单号的一种思路(生成友好的订单号)

比如订单号码要求20位字符串,除了8位的yyyymmdd外,还有12位可以自己去做。

提供一个工具类,根据一个数字生成订单号 result str = yyyymmdd + 这个int的 格式化结果,格式化就是补0,比如今天是16年12.30第一个订单号是1那么完整订单号为20161230000000000001


假设今天是第一次要订单号,我需要100个。



然后提供一个服务类来记录和获取今天生成的最大订单号。

//  need Num代表 业务要占用多少个订单号

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;


然后业务层调用工具类去格式化数字作为最后的订单号。


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值