package cn.iocoder.yudao.framework.common.util.number;
|
|
/**
|
* 业务编码(单据号 / 主数据编码)生成的公共约定。
|
*
|
* <p>需求:系统中所有自动生成的业务编码统一为「16 位纯数字」,且全系统唯一(任意两条编码都不重复)。
|
*
|
* <p>实现约定:全系统共用同一个 Redis 自增 KEY({@link #GLOBAL_SEQ_KEY}),
|
* 每次生成时对其执行 INCR 得到单调递增的序列号,再左补 '0' 到 {@link #CODE_LENGTH} 位。
|
* 由于所有编码都来自同一条递增序列,故天然保证「全系统唯一」。
|
*
|
* <p>注意:
|
* <ul>
|
* <li>该 KEY 不设置过期时间,避免过期归零导致重号;</li>
|
* <li>Redis 若发生数据丢失 / 清空,需要从数据库现有编码的最大值恢复计数器,否则可能重号。</li>
|
* </ul>
|
*/
|
public class BizNoUtils {
|
|
/**
|
* 全系统业务编码统一使用的 Redis 自增 KEY。
|
*
|
* <p>所有模块(erp / crm / trade / aftersales / hrm / bpm / mes)共用此 KEY,
|
* 以保证「全系统唯一」。
|
*/
|
public static final String GLOBAL_SEQ_KEY = "biz:seq_no:global";
|
|
/**
|
* 业务编码的总长度:16 位
|
*/
|
public static final int CODE_LENGTH = 16;
|
|
/**
|
* 将自增序列号格式化为 16 位纯数字编码(左侧补 '0')
|
*
|
* @param seq 自增序列号
|
* @return 16 位纯数字编码
|
*/
|
public static String format(Long seq) {
|
return String.format("%0" + CODE_LENGTH + "d", seq);
|
}
|
|
}
|