规则: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); }
数据库设计