自动生成批次号,要求:P+四位台数+年月+3位当月驻地增加序列号

规则:P+四位台数+年月+3位当月驻地增加序列号

基本原理:

P+四位台数 需要把实际台数与0拼接成四位;

年月+3位递增序列号数据库新建一个表,字段包含主键,模块常量,流水日期,流水长度,流水值(默认0,即序列号);

每次新增时先更新数据库流水值,直接加1;

然后判断当前日期与数据库流水日期是否一致,不一致更新流水日期为当前日期;

年月 日期获取可直接调用日期工具类对系统日期进行改造即可;

然后获取最新的数据库流水值,调用工具类与0拼接成四位序列号

       String batchId = "P";
            String number = getBatchIdNumber("5");//默认台数为5台,可依据实际业务传参
            batchId = batchId + number;
            //批次号生成规则:
            orderNo = serialNoUtils.getGroupPurchaseBatchId(SerialType.group_purchase_no,batchId);//生成批次号
//获取四位台数,实际业务台数 与 0 拼接
public
String getBatchIdNumber(Integer number) { String numberString = SerialNoUtils.getPreZeroNumber(4,StringTools.stringOf(number)); return numberString; }
    /**
     * 数字补0
     * 
     * @param num
     *            需要补充到num位
     * @param str
     *            待补充0的字符串(数字转化而来)
     * @return
     */
    public static String getPreZeroNumber(int num, String str) {
        int strLen = str.length();
        if (strLen < num) {
            for (int i = strLen; i < num; i++) {
                StringBuffer sb = new StringBuffer();
                sb.append("0").append(str);
                str = sb.toString();
            }
        }
        return str;
    }
/**
     * 获取批次号
     * @param codeConfigId 主键
     * @param pre
     * @return
     */
    @Override
    public String getGroupPurchaseBatchId(String codeConfigId, String pre) {
        //1.先更新数据库,流水值 即 序列号递增加1
        baseMapper.updateSerialValue(codeConfigId);
        //2.查询
        CodeConfigEntity cce = baseMapper.selectById(codeConfigId);
        if (cce == null || cce.getSerialDate() == null) {
            throw new RRException("请维护" + codeConfigId + "的生成规则信息");
        }
        //若编号日期与数据库日期不符合,更新编号日期
        if (!cce.getSerialDate().equals(DateUtils.getYMDate())) {
            baseMapper.resetSerialValue(DateUtils.getYMDate(), codeConfigId);
            cce = baseMapper.selectById(codeConfigId);
        }
        // 获取 流水值 即 序列号
        String suf = cce.getSerialValue() + "";
     // 将序列号 与 0 拼接成3位 序列号,然后与其他数据 拼接 即可 String serialNO
= SerialNoUtils.getBatchId(pre, cce.getSerialLength(), suf); logger.info(codeConfigId+"编号获取成功 :" + serialNO ); return serialNO; }
/**
     * 获取批次号
     * @param pre 常量
     * @param length 变量长度
     * @param suf 变量
     * @return
     */
    public static String getBatchId(String pre,int length, String suf) {
    //调用日期工具类,获取年月
        String date = getPrefixYM();
        return pre + date + getPreZeroNumber(length, suf);
    }

数据库设计

原文地址:https://www.cnblogs.com/sanhao/p/12470474.html