ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

生成16位卡号和激活码

2021-10-27 15:33:57  阅读:557  来源: 互联网

标签:code return String 16 prefix 激活码 卡号 cardId


生成16位不重复数字,每四位"-"隔开

16位卡号

工具类(规则可自己修改生成)

package com.meditrusthealth.mth.equity.service.util;

import org.apache.commons.lang3.StringUtils;

import java.util.Random;

/**
 * @description: 卡号生成工具
 * @author: Jay
 * @create: 2021-10-22 16:39
 **/
public class CodeNumberUtil {
    private static int i = 0;
    public static final String NUMBERCHAR = "0123456789";
    public static final String ENGILSHCHAR = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890";

    /**
     * Description: 生成条码(卡号)
     */
    public static String getCodeNumber(String prefix) {
        if (!StringUtils.isEmpty(prefix)) {
            //可以修改生成随机数的长度,生成想要的长度的条码
            String num = generateNumString(6);
            String st = prefix + num + getUnixTime();
            return st + getCardCheckCode(st);
        }
        return "prefix不能为空";
    }

    /**
     * 传入一个前缀和一个码。 【根据自己的业务定义】
     *  卡号
     */
    public static String getCodeNumber(String prefix, String code) {
        if (!StringUtils.isEmpty(prefix) && !StringUtils.isEmpty(code)) {
            String st = prefix + code + getUnixTime();
            return st + getCardCheckCode(st);
        }
        return "prefix和code不能为空";
    }

    /**
     * 校验条码是否正确
     */
    public static boolean checkCode(String code) {
        char bit = getCardCheckCode(code.substring(0, code.length() - 1));
        if (bit == 'N') {
            return false;
        }
        return code.charAt(code.length() - 1) == bit;
    }

    /**
     * 从不含校验位的卡号采用 Luhm 校验算法获得校验位
     */
    private static char getCardCheckCode(String nonCheckCodeCardNo) {
        if (nonCheckCodeCardNo == null
                || nonCheckCodeCardNo.trim().length() == 0
                || !nonCheckCodeCardNo.matches("\\d+")) {
            // 如果传的不是数据返回N
            return 'N';
        }
        char[] chs = nonCheckCodeCardNo.trim().toCharArray();
        int luhmSum = 0;
        for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if (j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;
        }
        return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');
    }

    /***
     * 获取当前系统时间戳 并截取后8位
     */
    private static String getUnixTime() {
        try {
            Thread.sleep(10);// 快速执行时,休眠10毫秒 防止号码重复
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i++;
        i = i > 100 ? i % 10 : i;
        return ((System.currentTimeMillis() / 100) + "").substring(5)
                + (i % 10);
    }

    /**
     * 生成一个定长的纯数字符串
     */
    private static String generateNumString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(NUMBERCHAR.charAt(random.nextInt(NUMBERCHAR.length())));
        }
        return sb.toString();
    }

    /*========================================================================================================*/
    /*===============================================激活码====================================================*/
    /*========================================================================================================*/


    /**
     * Description: 生成激活码(密码)
     */
    public static String getCodeEnglish(String prefix) {
        if (!StringUtils.isEmpty(prefix)) {
            //可以修改生成随机数的长度,生成想要的长度的条码
            String num = generateEngString(2);
            String st = prefix + num + getUnixTime();
            return st + getCardCheckCode(st);
        }
        return "prefix不能为空";
    }
    /**
     * 传入一个前缀和一个码。 【根据自己的业务定义】
     *  激活码
     */
    public static String getCodeEnglish(String prefix, String code) {
        if (!StringUtils.isEmpty(prefix) && !StringUtils.isEmpty(code)) {
            String st = prefix + code + getUnixTime();
            return st + getCardCheckCode(st);
        }
        return "prefix和code不能为空";
    }

    /**
     * 生成一个定长混搭
     */
    private static String generateEngString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(ENGILSHCHAR.charAt(random.nextInt(ENGILSHCHAR.length())));
        }
        return sb.toString();
    }


    //测试卡号
//    public static void main(String[] args) {
//
//        try {
//
//            for (int i = 0; i < 1; i++) {
//                // 生成条码
//                String code = getCodeNumber("99");
//                System.out.println(code);
//                // 检验条码
//                System.out.println(checkCode(code));
//            }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    //测试激活码
//    public static void main(String[] args) {
//        try {
//            for (int i = 0; i < 1; i++) {
//                // 生成条码
//                String code = getCodeEnglish("MX","33");
//                System.out.println(code);
//                // 检验条码
//                System.out.println(checkCode(code));
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
}

用例

 /**
     * 制作卡
     */
    @Transactional
    @Async
    public EquityCardBatchnoResp makeCardAndActivation(EquityCardBatchnoReq equityCardBatchnoReq) throws CommonException {
        /*创建人和创建时间*/
        Date date = new Date();
        //13位的时间戳
        long time = date.getTime();
        EquityCardBatchno equityCardBatchno = new EquityCardBatchno();
        BeanUtils.copyProperties(equityCardBatchnoReq,equityCardBatchno);
        equityCardBatchnoReq.setCreateTime(date);
        EquityCardBatchnoDetail equityCardBatchnoDetail = new EquityCardBatchnoDetail();
        equityCardBatchnoDetail.setBatchNo(String.valueOf(time));
        //卡数
        equityCardBatchno.setBacthCount(2000);
        /*批量制卡*/
        for (int i = 0; i < equityCardBatchno.getBacthCount(); i++) {
            String cardId = CodeNumberUtil.getCodeNumber("99");
            String activationCode = CodeNumberUtil.getCodeEnglish("MD");
            /*卡片校验*/
            boolean checkCode = CodeNumberUtil.checkCode(cardId);
            if (checkCode) {
                /*卡号和激活码*/
                cardId=cardId.replaceAll("(.{4})","$1-");
                cardId = cardId.substring(0, cardId.length() - 1);
                equityCardBatchnoDetail.setCardNo(cardId);
                equityCardBatchnoDetail.setActivationCode(activationCode);
                int saveId = equityCardBatchnoDetailMapper.insert(equityCardBatchnoDetail);
                if (saveId == 1) {
                    log.warn(
                            "{卡号:" + "  " + cardId + "}" + "  " + "保存成功" + "}" +
                                    "{激活码:" + "  " + activationCode + "}" + "  " + "保存成功" + "}"
                    );
                } else {
                    log.warn(
                            "{卡号:" + "  " + cardId + "}" + "  " + "保存失败" +
                                    "{激活码:" + "  " + activationCode + "}" + "  " + "保存失败" + "}"
                    );
                }
            } else {
                log.error(
                        "{卡号:" + "  " + cardId + "}" + "  " + "制卡失败,不符合编卡规则" + "}"
                );
            }
        }
        EquityCardBatchno cardBatchno = equityCardBatchnoMapper.selectById(equityCardBatchno.getId());
        LambdaQueryWrapper<EquityCardBatchnoDetail> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EquityCardBatchnoDetail::getBatchNo,cardBatchno.getBatchNo());
        List<EquityCardBatchnoDetail> list = equityCardBatchnoDetailMapper.selectList(wrapper);
        EquityCardBatchnoResp resp = new EquityCardBatchnoResp();
        BeanUtils.copyProperties(cardBatchno,resp);
        resp.setEquityCardBatchnoDetailList(list);
        log.warn(
                "{本次制卡数量:" + "  " + equityCardBatchnoReq.getBacthCount() + "}" + "  "+"已完成}"
        );
        return resp;
    }

卡号(16位数字,每4位之间用-隔开)

			String cardId = CodeNumberUtil.getCodeNumber("99");
            String activationCode = CodeNumberUtil.getCodeEnglish("MD");
            /*卡号校验*/
            boolean checkCode = CodeNumberUtil.checkCode(cardId);
            /*卡号和激活码*/
            //正则表达式,每四位加"-"
			cardId=cardId.replaceAll("(.{4})","$1-");
			//去除最后一个"-"
            cardId = cardId.substring(0, cardId.length() - 1);
			System.out.println(cardId);

激活码(12位数字+随机字母)

String activationCode = CodeNumberUtil.getCodeEnglish("MD");

标签:code,return,String,16,prefix,激活码,卡号,cardId
来源: https://blog.csdn.net/weixin_45883611/article/details/120993522

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有