package com.ltkj.common.utils; import cn.hutool.core.util.StrUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; /** * @Company: 西安路泰科技有限公司 * @Author: zhaowenxuan * @Date: 2024/10/10 14:55 */ @Component public class IdUtils { private static final String LIS_LAST_ID_KEY = "id:generate:lis:id"; private static final String LIS_LAST_ID_INCR_KEY = "id:generate:lis:id:incr"; private static final String LIS_CURRENT_DATE_KEY = "id:generate:lis:currentDate"; // private static final UidGenerator uidGenerator = new DefaultUidGenerator(); // 使用默认的Snowflake生成器 @Autowired private StringRedisTemplate stringRedisTemplate; public synchronized String generateLisID(String prefix) { String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_KEY); int lastId; if (storedDate == null || !storedDate.equals(currentDate)) { lastId = 1; stringRedisTemplate.opsForValue().set(LIS_LAST_ID_KEY, String.valueOf(lastId)); stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate); } else { lastId = Integer.parseInt(lastIdStr) + 1; stringRedisTemplate.opsForValue().set(LIS_LAST_ID_KEY, String.valueOf(lastId)); } String yyMMdd = currentDate.substring(2); return String.format(prefix+"%s%05d", yyMMdd, lastId); } /** * 生成无限递增条码号 * @param prefix * @return */ public synchronized String generateLisNextId(String prefix){ String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_INCR_KEY); int current; if (StrUtil.isBlank(lastIdStr)) { current = 1; }else { current = Integer.parseInt(lastIdStr); } int numberLength = String.valueOf(99999).length(); String result = prefix + String.format("%0" + numberLength + "d", current); current++; stringRedisTemplate.opsForValue().set(LIS_LAST_ID_INCR_KEY,String.valueOf(current)); return result; } //生成体检号用 private static long lastTimestamp = -1; private static final Random random = new Random(); public static synchronized String getTjNumber() { long timestamp = System.currentTimeMillis(); // 获取当前时间戳(毫秒) // 如果时间戳和上次生成的时间戳相同,生成一个新的随机数 if (timestamp == lastTimestamp) { return String.format("%09d", (timestamp % 1000000000) + random.nextInt(900) + 100); } else { lastTimestamp = timestamp; // 更新最后生成时间戳 return String.format("%09d", (timestamp % 1000000000) + random.nextInt(900) + 100); } } // 使用分布式ID生成器(如Snowflake) public static String generateExamNumber() { // long id = uidGenerator.getUID(); // 获取生成的唯一ID // return String.format("%09d", Math.abs(id) % 1000000000); // 格式化为9位 return null; } }