tuqin
14 小时以前 7580d02bd3f9399143a6a388732658bea2610bc4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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);
    }
 
}