先说编号规则:
前缀+yyyyMMdd+5位序号(00001,00002.......)
首先说说思路:
首先是查询数据库中编号的最大值是多少----->没有数据直接生成一个新的从00001开始----->存在编号就直接截取编号的后5位----->序号+1
为了可以实现多种编号规则和涉及到多个表的数据直接使用动态SQL的方式实现
第一步:是创建动态SQL查询的方法
在Service中定义接口
/**
* 执行本数据库查询的动态SQL
* @param sql
* @return
*/
List<Map<String,Object>> executeSql(String sql);
在service的实现类中实现接口
@Override
public List<Map<String, Object>> executeSql(String sql) {
return dataSourceMapper.executeSql(sql);
}
在Mapper接口中定义接口
List<Map<String, Object>> executeSql(@Param("sql") String sql);
在Mapper的xml写sql配置
<!--自定义sql -->
<select id="executeSql" resultType="map">
${sql}
</select>
第二步:创建配置类及实现的方法
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* YNK 20241127修改
* 配置生成唯一编号
* 生成规则:前缀+yyyyMMdd+5位序号
*/
public class CodeConfig {
public static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 指定日期格式
public static String INIT_CODE = "00001";
/**
* 表名3编号前缀和查询最大的SQL静态变量
*/
public static String CODE_DB = "DBAPI";
public static String CODE_DB_SQL = "select 编号字段 as code from 表名3 where DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(SYSDATE(),'%Y-%m-%d') order by id desc limit 1";
/**
* 表名2编号前缀和查询最大的SQL静态变量
*/
public static String CODE_DATASET = "DATA";
public static String CODE_DATASET_SQL = "select 编号字段 as code from 表名2 where DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(SYSDATE(),'%Y-%m-%d') order by id desc limit 1";
/**
* 表名1编号前缀和查询最大的SQL静态变量
*/
public static String CODE_REPORT = "REPORT";
public static String CODE_REPORT_SQL = "select 编号字段 as code from 表名1 where DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(SYSDATE(),'%Y-%m-%d') order by id desc limit 1";
/**
* 返回最大编码方法
* @param q 编码前缀
* @param sql 查询最大编码SQL语句
* @return 返回编号
*/
public static String RETURN_CODE(String q,String sql){
//查询数据 静态方法参考上一篇文章
List<Map<String,Object>> list = StaticService.staticDataSourceService.executeSql(sql);
if(CollectionUtils.isNotEmpty(list)){
//获取第一条数据
Map<String,Object> map = list.get(0);
String code = map.get("code").toString();
//截取最后5位 + 1
int i = Integer.parseInt(StringUtils.substring(code, -5) ) + 1;
return q + sdf.format(new Date()) + String.format("%05d",i);
}else{
return q + sdf.format(new Date()) + INIT_CODE; // 格式化日期
}
}
}
第三步:调用
//生成唯一编码
String code = CodeConfig.RETURN_CODE(CodeConfig.CODE_DB,CodeConfig.CODE_DB_SQL);