java 实现流水号 日期加 序号

需求:需要实现生成编号流水号

按照日期 yyyyMMDD 加当天加入的序号

方法一: 与业务耦合 不使用redis 

1.取当天加入的人数 为空 从1开始

存在问题 导入时 有部分失败 但是流水号已作废导致导入10位成员  可能失败3条  最终第7位流水号为2024022100010

再次单独添加时为出现流水号重复

解决: 取当天加入的最大流水号 

private String getCurrentDataString(){
        // 获取当前日期
        Date currentDate = new Date();
        // 创建SimpleDateFormat对象,指定日期格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        // 格式化日期
        return dateFormat.format(currentDate);
    }

//如果获取当天的最大数流水号为空  设置初始值
String codeNumber  = getCurrentDataString+String.format("%05d", 0);

//如果已存在 及累加即可
Long Code = LongUtils.str2Long(codeNumber);

code+(目标数)

方法二.使用redis  与业务解耦合

根据key 去redis中查询  根据redis的自增 进行处理

public List<String> getSerialnumber(String key, Integer length) throws Exception{
        //key 20230306
        //在redis缓存中查找改key.
        //将该key自增1 返回
        String code = "CODENUMBER:";
        Boolean existKey = redisService.isExistKey(code+key);
        if(!existKey){
            //如果查询不到,将数据库的最大值读入缓存。//保证只有一个线程执行初始化键操作
            //加锁
            String redisKey = getClass().getSimpleName() + ":Code:" + key;
            String lockValue = null;
            try{
                lockValue = redisDistributedLock.lock(redisKey, 5000,1000);
                if (StringUtils.isEmpty(lockValue)) {
                    throw new BaseException("稍后重试");
                }
                //最大值
                // 从数据库获取做大值
                int max = 0;
                //todo               
                //再查一次缓存
                String redisValue = redisService.get(code + key);
                if(StringUtils.isEmpty(redisValue)){
                    if(StringUtils.isEmpty(redisValue) || (max >=redisValue))
                    //本地大于缓存 才更新
                    redisService.set(code + key,String.valueOf(max));
                }
            }catch (Exception e){
                e.printStackTrace();
                throw e;
            }finally {
                redisDistributedLock.unlock(redisKey, lockValue);
            }
        }
        List<String> nums = new ArrayList<>();
        Integer no = null;
        for(int i = 0; i < length; i++){
            //redis  自增
            no = IntegerUtils.valueOf(redisService.incrby(code + key, 1L));
            String sNO = key + String.format("%05d", no);
            nums.add(sNO);
        }
        return nums;
    }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
病历编号可以使用一个独特的标识符来识别每个病例。以下是一个示例规则,使用Java进行实现: 1. 首先,定义一个静态变量,表示当前年份。 ``` static int currentYear = Calendar.getInstance().get(Calendar.YEAR); ``` 2. 接下来,定义一个静态变量,表示自增序号。 ``` static int caseNumberCount = 1; ``` 3. 然后,定义一个静态方法,生成病历编号。 ``` public static String generateCaseNumber() { // 获取当前年份作为编号的一部分 String caseNumber = String.valueOf(currentYear); // 将自增序号作为编号的一部分 caseNumber += String.format("%05d", caseNumberCount); // 自增序号 caseNumberCount++; // 返回生成的编号 return caseNumber; } ``` 4. 在使用病历编号时,可以直接调用该静态方法生成一个独一无二的编号。 完整代码如下: ``` import java.util.Calendar; public class CaseNumberGenerator { static int currentYear = Calendar.getInstance().get(Calendar.YEAR); static int caseNumberCount = 1; public static void main(String[] args) { String caseNumber1 = generateCaseNumber(); String caseNumber2 = generateCaseNumber(); System.out.println(caseNumber1); System.out.println(caseNumber2); } public static String generateCaseNumber() { // 获取当前年份作为编号的一部分 String caseNumber = String.valueOf(currentYear); // 将自增序号作为编号的一部分 caseNumber += String.format("%05d", caseNumberCount); // 自增序号 caseNumberCount++; // 返回生成的编号 return caseNumber; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值