目录
前言
本篇主要内容为自动生成编码,如订单编码,产品编码等
实现思路
1.编码组成:头部+年月+编号;如产品询价(CPXJ)+ 202409 + 001
2.声明头部为固定的(CPXJ),声明当前最大编码为null
3.获取系统年月ym
4.判断当前内存中是否存在最大编码
5.查询最大编码
6.如果没有说明当前是当月第一个询价单(CPXJ202409001)
7.如果不为null,获取当前最大编码的年月tmpYm
8.比较最大编码的月份tmpYm和当前系统时间ym
9.如果ym与tmpYm不相同,则跨月归0
10.相同。获取递增序号seq 转换为数字类型 ++
11.重新拼接maxcode
实现
1.声明头部为固定的(CPXJ),声明当前最大编码为null
final String PREFIX = "CPXJ";
String maxCode = null;//当前最大编码
2.获取系统时间的年月工具类
/**
* 获取系统时间 并指定格式返回
*
* @return
*/
public static String getYm() {
LocalDate now = LocalDate.now();//获取系统时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");//获取指定时间格式的实例
return formatter.format(now);
}
2.查询当月最大编码(mapper层)
/**
* 查询指定月最大编码
* @param month
* @return
*/
String queryMaxCode(String month);
3.sql(mapper映射)
<select id="queryMaxCode" resultType="string">
select max(code) from s_product_enquiry where date_format(createTime,'%Y%m')=#{month}
</select>
<!--创建时间的年月与输入的年月为条件-->
4.生成编码方法generateCode
String generateCode() {
//获取系统年月
String ym = DateUtils.getYm();
//判断当前内存中是否存在最大编码
if (null == maxCode) {
//查询当月最大编码
maxCode = baseMapper.queryMaxCode(ym);
//如果没有
if (null == maxCode) {
//说明当前是当月第一个询价单 CPXJ202409001
maxCode = PREFIX + ym + "001";
return maxCode;
}
}
//不为空
//获取当前最大编码 的 年月
String tmpYm = maxCode.substring(4, 10);
//比较 最大编码 的月份与当前系统时间
if (!ym.equals(tmpYm)) {
//跨月 归零
maxCode = PREFIX + ym + "001";
return maxCode;
}
//如果相等
//获取递增序号
String seq=maxCode.substring(10);
Integer tmp= Integer.parseInt(seq);
tmp++;
maxCode=PREFIX+ym+String.format("%03d",tmp);
return maxCode;
}
总结
date_format(createTime,'%Y%m'):sql语法,将日期格式化为指定格式
maxCode.substring(4, 10); 截取字符串,包头包尾
Integer tmp= Integer.parseInt(seq); 字符串转换为包装类
String.format("%03d",tmp) 将数字类型转换为三位字符串,不够补0,
如tmp=1 则结果为001
tmp=12 结果:012
tmp=123 结果123