比如订单号码要求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;
然后业务层调用工具类去格式化数字作为最后的订单号。