package com.app.framework.core.support.service;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * ID生成接口
 */
public interface SequenceService {

    /**
     * 锁对象，可以为任意对象
     */
    Object lockObj = "lockerOrder";

    /**
     * 订单号生成计数器
     * <prefix, 计数器>
     */
    Map<String, Long> IdCountMap = new HashMap<>();

    /**
     * 每毫秒生成订单号数量最大值
     */
    int maxPerMSECSize = 100000;

    /**
     * 根据yyMMdd生成非重复ID
     * @param prefix ID前缀
     * @return
     */
    default String genIdByDate(String prefix) {
        String p = ObjectUtil.defaultIfNull(prefix, "id");
        // 最终生成的订单号
        String finOrderNum = "";
        synchronized (lockObj) {
            Long idCount = ObjectUtil.defaultIfNull(IdCountMap.get(p), 0L);

            // 计数器到最大值归零，可扩展更大
            if (idCount > maxPerMSECSize) {
                idCount = 0L;
            }
            idCount++;
            // 组装订单号
            finOrderNum = ObjectUtil.defaultIfNull(prefix, "") + DateUtil.format(new Date(), "yyMMdd") + (maxPerMSECSize + idCount);

            IdCountMap.put(p, idCount);
        }
        return finOrderNum;
    }

}
