文章目录
- 问题描述:
- 实现思路
- 代码案例
问题描述:
Java项目实现流水号自动增长,项目需求中有时需要生成一定规则递增编号:
eg用户编码自动生成,规则:user+7位数字,每次新增自增长,例:user0000001
角色编码自动生成,规则:role+7位数字,每次新增自增长,例:role0000001
实现思路
实现的基本思路就是项目启动时,从数据库获取当前最大值,作为静态变量存储;
业务获取新的编码,考虑并发问题,获取编码方法(编码自增部分)为synchronized同步方法,如果自增为原子操作,则无需同步;
编码前置0,使用String.format(“%07d”, num);格式化获取。
传入了数据库中最新设备编号,将首先使用Integer的parseInt()方法返回十进制整数,这样就可以对其自增1。
最简单的可以用Redis的incr来实现这种效果。
代码案例
1、生成保险产品的险种编码
2、规则:保险公司简称首字母+险种大类+主附险标记+8位流水自增长,例:中德安联个险主险,ZDAL 1 0 00000001
/**
* 业务实现类
* @param productCode
* @param numLength
* @return
*/
@Service
@Slf4j
public class InsuranceProductServiceImpl{
@Override
@Transactional
public String addProduct(ProductInVo product) {
//xxxx校验 业务处理
String prex = PinyinUtils.getAlphaDefaultCode(product.getCompanyShortName()) + product.getProductClassify() + product.getMainProductFlag();
String productCode = generateProductCode(prex, 8);
return productCode;
}
/**
*生成编码
*/
private String generateProductCode(String productCode, int numLength) {
Long code = redisService.incr(ProductKeys.PRODUCT_CODE, productCode);
return productCode + String.format("%0" + numLength + "d", code);
}
}
/**
* 公司编码前缀
*/
public static ProductKeys PRODUCT_CODE = new ProductKeys(10, "product_code:");
关于获取首字母的工具类,可查看:汉语拼音pinyin4j处理工具类具体说明适用。