shiyunteng
8 天以前 fb9fca375c78c5b79acf6db990357816f86100fb
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
package com.by4cloud.platformx.business.utils;
 
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
 
public class ContractNumberGenerator {
 
    // 用于存储每天的序列号计数器,Key为日期字符串,Value为原子整数
    private static final ConcurrentHashMap<String, AtomicInteger> counterMap = new ConcurrentHashMap<>();
 
    // 日期格式化器,格式为 yyyyMMdd
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
 
    /**
     * 生成合同编号
     * 格式: yyyyMMdd-XXXX (XXXX为当日自增序列,不足4位补0)
     *
     * @return 合同编号字符串
     */
    public static String generateContractNumber() {
        // 1. 获取当前日期字符串
        String dateStr = LocalDate.now().format(DATE_FORMATTER);
 
        // 2. 获取或创建当天的计数器
        // computeIfAbsent 保证原子性,如果key不存在则创建新的AtomicInteger(0)
        AtomicInteger counter = counterMap.computeIfAbsent(dateStr, k -> new AtomicInteger(0));
 
        // 3. 递增并获取当前序列号
        int sequence = counter.incrementAndGet();
 
        // 4. 格式化序列号,例如 1 -> "0001"
        String formattedSequence = String.format("%04d", sequence);
 
        // 5. 组合返回
        return dateStr + "-" + formattedSequence;
    }
 
}