java动态实现生成订单yyyymmdd+三位数(如001)
思路:
首先向数据库中查询,看有没有传进来的这个日期的数据,按降序只查一条
(日期:记录创建时间)
如果查询的结果为空,说明数据表里没有这个日期的数据,也就是说当前这个日期的订单是第一单,订单号是:日期+001
要是有查询到这个日期的数据,说明这个日期的订单不是第一单,那么查询出来这个日期最大的那条记录,把那条记录的订单号取出来,取出后三位,再加一。再把日期与加一后的订单号后三位进行拼接
数据库中的订单表结构如下
在Service层写个方法,方法里的参数是数据表里面的created_at(创建时间)
/**
* 生成一条新的bidNumber 例如: '20201112002' : 2020年+11月份+12日+今天的第二单
* @param bidDate 批次年月日
* @return 新的 bidNumber
*/
String createNewBidNumber(String bidDate);
在Service的实现类里实现这个方法
根据created_at查询的语句如下
desc:降序
<select id="selectCreatedAt" parameterType="java.lang.String" resultMap="bid">
SELECT *
FROM epsi_bid WHERE created_at < = #{date,jdbcType=VARCHAR} ORDER BY created_at DESC limit 1
</select>
/**
*
* 投标编号 年月日+三位数,例如 '20201112001':2020年11月12日第一单
*
* @param bidDate 传的值是2020-11-11这样的
* @return 新的 bidNumber
*/
@Override
public String createNewBidNumber(String bidDate) { //传的是2020-11-11
String newBidDate = bidDate.replace("-", "");//把2020-11-11中-去掉
Bid bid = bidDao.select(bidDate);//根据传进来的日期向数据表中查询数据
if (bid != null){// 在数据表中查到了,说明现在这个订单不是今天的第一单
String id = bid.getId(); //取出ID,也就是数据表的第一列的数据 20201111123
id = id.substring(8,11); // 取出后三位数,也就是自动生成的三位数 123
int num = Integer.valueOf(id);
num ++; // 123+1
if(num<10){
String idNum = String.format("%03d", num); //num<10,说明是个位数,前面要补两个0
String date = newBidDate + idNum;
return date;
}
else if(num<100){
String idNum = String.format("%02d", num);//num<100,说明是两位数,前面要补一个0
String date = newBidDate + idNum;
return date;
}
else {
String idNum = String.valueOf(num);
String date = newBidDate + idNum; //date = 20201111+124
return date;
}
}else {
int number = 1;
String idNum = "00" + number;
String date = newBidDate + idNum;
return date;
}
}