java根据日期生成单号
1.查询出创建时间等于当天的订单,按照时间倒序排序去一条数据。
select a.* from t_solid_waste_production a where deleted = 0 and to_days(create_time) = to_days(now()) order by create_time desc limit 1
2.编写编码生成规则
simpledateformat df = new simpledateformat("yyyymmdd");
string date = df.format(new date());
string recordnumber = "cf" + date + "001";3.判断最新一天是否有数据,如果没有则执行叠加
if (lastdata != null){
format f1=new decimalformat("000");
recordnumber = "cf" + date + f1.format((integer.parseint(lastdata.getrecordnumber().substring(lastdata.getrecordnumber().length() - 3)) + 1));
}java根据日期生成一定规则的单号
由于业务需求,需要根据一定的规则生成有规则的单号比如:yc-20231203-001
该规则单号前面部分 "yc-" 为异常的拼音缩写,中间部分 “20231203” 为时间,后面为递增的数字。
我的代码实现:
@apioperation("异常单号生成")
@getmapping("getcode")
public response<object> getcode(){
return new response<>().success().data(exceptionitemservice.getcode());
}
@override
public string getcode() {
//前缀
string prefix = "yc-";
//后缀
string lastindex;
//获取最大三位数
integer maxcode = exceptionitemmapper.selectmaxcode(prefix);
//查询出数据库中当前最大的单号,如果没有则说明今天还未添加一条数据,有的话则将最大的查出来 +1
if (maxcode != null && maxcode <= 8) {
maxcode += 1;
//integer转换为字符串
string i = string.valueof(maxcode);
lastindex = "00" + i;
} else if (maxcode != null && maxcode <= 98) {
maxcode += 1;
string i = string.valueof(maxcode);
lastindex = "0" + i;
} else if (maxcode != null) {
maxcode += 1;
lastindex = string.valueof(maxcode);
} else {
lastindex = "001";
}
// 中间部分 “20231211”
string middle = localdatetime.now().format(datetimeformatter.ofpattern("yyyymmdd"));
//设置新的异常单号 yc-20231203-001
return prefix + middle + "-" + lastindex;
}代码中
integer maxcode = exceptionitemmapper.selectmaxcode(prefix)
是通过查询数据库来得出单号后三位最大的数字,sql实现如下(本人用的postgres数据库):
<select id="selectmaxcode" resulttype="java.lang.integer">
select max(cast(substring(exception_code, length(exception_code) - 2) as integer))
from qc_exception_item
where exception_code like concat(#{prefix}, to_char(now(), 'yyyymmdd'),'-%','%');
</select>如果是mysql数据库的话,上面代码中的:
where exception_code like concat(#{prefix}, to_char(now(), 'yyyymmdd'),'-%','%') 中的
to_char(now(), 'yyyymmdd')
改为
date_format(now(), '%y%m%d')
即可。
本人现在代码未考虑多线程的情况,如果需要的话可以自己看情况修改。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论