流水号原则:流水号后四位同月自增,从0001开始,跨月重置自增;
思路分享:
1.写一个流水号工具类:
package cn.itcast;
/*
* 获取流水号
*/
public class SerialNumberUtil {
public static void main(String[] args) {
String a = getId("HT202303",1);
System.out.println("流水号:"+a);
}
private static final Integer ONE = 1;
private static final Integer TWO = 2;
private static final Integer THREE = 3;
// par为自定义前缀,想要几位数可以自行修改0的数量
// id获取方式为从数据库表中查询现在最大id+1(SELECT id+1 from table ORDER BY id DESC LIMIT 1)
public static String getId(String par, Integer id){
//判断位数
String s = id + "";
int count = s.length();
String strNum = par;
if (ONE == count){
strNum += "000"+ String.valueOf(id);
}else if (TWO == count){
strNum += "00"+ String.valueOf(id);
}else if (THREE == count){
strNum += "0" + String.valueOf(id);
}else {
strNum += String.valueOf(id);
}
return strNum;
}
}
2.在serviceImpl进行数据入库前产生流水号;
则需在调用数据保存接口之前产生流水号,那么:
首先:写一个接口去数据库查询:原则:根据输入的月份降序查询id最大的那一条数据记录返回,比如当前按照一个List<Map<String,String>>返回数据;
举例:
SQL语句:
SELECT * FROM data_list_question WHERE 1 = 1 AND MONTH = '2023-03' ORDER BY id DESC LIMIT 1
MyBatis语句:
<!-- 根据月份升序查询id最大的那一条数据记录返回 -->
<select id="getMaxIdInfo" parameterType="map" resultType="map">
SELECT * FROM data_list_question where 1 = 1
<if test = "null != month and '' != month">
and month = #{month}
</if>
ORDER BY id DESC LIMIT 1
</select>
返回结果:
返回一条数据记录:
然后在service实现层写一个方法,生成问题单编号;
@Autowired
private CustomerMapper customerMapper;
//生成问题单编号方法;
private String getAutoQuestionNo(Map<String, Object> paramMap){
String result = "";
//前台输入的月份
String month = String.valueOf(paramMap.get("month")).replace("-","").substring(2,6); // 月度
//获取数据库查询的数据
List<Map<String, Object>> queMap = questionNoMapper.getQuestionNo(paramMap);
String queNo = "";
String sqMonth = "";
String questionNo = "";
if(queMap.size() < 1){
//表中第一次插入数据的时候,从0001递增;
questionNo = "0001";
}else{
//获取数据库当前查询的问题单编号
queNo = String.valueOf(queMap.get(0).get("questionNo"));
//获取查询的月份
sqMonth = String.valueOf(queMap.get(0).get("month"));
//如果输入的月份与数据库查询的月份相等,则为同月;递增;否则重置清零递增;
if(paramMap.get("month").equals(sqMonth)){
//获取问题单编号后4位递增;
questionNo = Integer.toString(Integer.parseInt(queNo.substring(queNo.length() - 4)) + 1);
}else{
questionNo = "0001";
}
}
// 调用SerialNumberUtil类中的getId方法,进行数据处理:
result = SerialNumberUtil.getId(month,Integer.parseInt(questionNo));
return result;
}
最后在实现层调用保存数据入库接口之前,先调用该方法,将问题单编号put到map集合里面;
举例:
service实现层:
@Override
public Result addData(Map<String, Object> paramMap) {
String type = String.valueOf(paramMap.get("type"));
String msg = "";
//添加流水号
paramMap.put("questionNo",getAutoQuestionNo(paramMap));
questionNoMapper.addData(paramMap);
msg = "数据添加成功";
return Result.success().result(msg);
}