流水单号的生产


一般的流水单号格式为YYYYMMDDXXXX,其中XXXX为0001开始自动生成,生成单号之前需要去数据库进行查询,如果存在则进行加一的操作,不存在则为初始值,具体的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 自动生成单号
*/
@PostMapping("/automatic")
@ResponseBody
public AjaxResult automatic(){
String newNumber = null;
//获得年月日时分秒
String numberDate=DateUtils.getnewDate();
//数据库进行查询获得最新的单号
String number=invoiceService.getMaxNumber(numberDate);

//判断是否存在
if(number!=null&&!number.equals("")){
// 对最后四位进行截取
String endnum = number.substring(8, number.length());
// 把String类型转化为int类型
int endNum = Integer.parseInt(endnum);
//工具类中进行转换
newNumber=numberDate+ DepotUtils.getFlowCode(endNum);

}else {
newNumber=numberDate+"0001";
}
AjaxResult ajax=AjaxResult.success();
ajax.put("num",newNumber);

return ajax;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 工具类
*/
public class DepotUtils {
public static final Logger log = LoggerFactory.getLogger(DepotUtils.class);
//静态变量存储最大值
private static final AtomicInteger atomicNum = new AtomicInteger();



/**
* 生成流水单号
*/
public static String getFlowCode(int num){
String format=null;
try{
atomicNum.set(num);
//线程安全的原子操作,所以此方法无需同步
int newNum = atomicNum.incrementAndGet();
//数字长度为4位,长度不够数字前面补0
format = String.format("%04d", newNum);


}catch(Exception e){
log.error("初始化获取分组编号异常",e);
}
return format;
}

}

此处使用了原子操作类AtomicInteger,防止多线程问题的出现。
AtomicInteger类的分析

-------------本文结束感谢您的阅读-------------