美文网首页
单据号生成工具

单据号生成工具

作者: 阿杰_96c5 | 来源:发表于2021-03-31 11:57 被阅读0次
    CREATE TABLE `t_order_no` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增长id',
      `order_type` varchar(20) DEFAULT NULL COMMENT '业务单号类型',
      `description` varchar(100) DEFAULT NULL COMMENT '业务单号类型描述',
      `prefix` varchar(20) DEFAULT NULL COMMENT '单据号前缀',
      `data_type` varchar(20) DEFAULT NULL COMMENT '日期格式',
      `length` int(11) DEFAULT NULL COMMENT '流水号长度',
      `init_val` int(11) DEFAULT NULL COMMENT '流水号初始值',
      `step_val` int(11) DEFAULT NULL COMMENT '流水号递增值',
      `last_date` date DEFAULT NULL COMMENT '最后生成单号的日期',
      `last_number` int(11) DEFAULT NULL COMMENT '最后生成单号的流水号',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='单号生成规则表(前缀+ 日期+ 流水号)'
    
    /**
     * @ClassName: OrderNo
     * @description: 单号生成规则类
     * @author: wangjie
     * @time: 2020-07-07 16:14
     */
    
    public class OrderNo {
    
        /**
         * 编码中没有日期
         */
        public  final  static String HAS_NO_DATATYPE = "EMPTY";
    
        public int id;          //ID
    
        public String orderType;        //业务单号类型
    
        public String description;      // 业务单号类型描述
    
        public String prefix;      //前缀字符
    
        /**
         * 日期格式
         * "yyyyMMdd"生成当前日期年月日 20200708
         * "empty"    前缀和流水号之间没有字符串
         */
        public String dataType;   //日期格式
    
        public int length;      //流水号长度
    
        public int initVal;     //流水号初始值
    
        public int stepVal;      //流水号递增值
    
        public Date lastDate;    //最后生成单号的日期
    
        public int lastNumber;  //最后生成单号的流水号
    
    }
    
     OrderNoMapper : 
    
     <select id="selectLockOneByOrderType" resultType="OrderNo ">
            select
                id as id,
                order_type as orderType,
                description as description,
                prefix as prefix,
                data_type as dataType,
                `length` as length,
                init_val as initVal,
                step_val as stepVal,
                last_date as lastDate,
                last_number as lastNumber
            from
                t_order_no
            where order_type = #{orderType}
    
        </select>
    
        <update id="updateOrderNo">
            UPDATE t_order_no
            SET  last_date=now() , last_number=#{lastNumber}
            WHERE id=#{id};
        </update>
    
    
    /**
     * @ClassName: OrderNoService 
     * @description:    单据号生成工具
     * @author: wangjie
     * @time: 2020-07-08 7:58
     */
    public class OrderNoUtil {
    
     @Service
    public class OrderNoService {
    
    
        @Autowired
        OrderNoMapper orderNoMapper;
    
        public  String getOrderNo(String orderType) {
    
            // 1.获取单号生成规则
            OrderNoPo orderNo = orderNoMapper.selectLockOneByOrderType(orderType);
            System.out.println(orderNo);
    
            //定义单号字符串
            StringBuffer orderNoStr = new StringBuffer();
    
            // 单号添加前缀
            orderNoStr.append(orderNo.getPrefix());
    
            // 2.获取日期格式
            if (!orderNo.getDataType().equals(OrderNoPo.HAS_NO_DATATYPE)) {
    
    
                // 单号中添加时间码
                orderNoStr.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern(orderNo.getDataType())));
    
                // 如果跨天,流水号重置为0
                DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyyMMdd");
                // Date 转 LocalDate
                LocalDate lastDate = orderNo.getLastDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
                // 上次生成单号的日期和当前日期不是同一天, 序列号归零
                if (ChronoUnit.DAYS.between(LocalDate.now(), lastDate) != 0l) {
                    orderNo.setLastNumber(0);
                }
            }
    
            // 3. 获取流水码
            orderNo.setLastNumber(orderNo.getLastNumber() + orderNo.getStepVal());
    
            // 按流水码长度获取 数字格式字符串 长度为2 格式为"00"
            String numberFormatStr = String.join("", Collections.nCopies(orderNo.getLength(), "0"));
            // 生成数字格式化对象
            DecimalFormat format = new DecimalFormat(numberFormatStr);
            // 单据号中添加流水码
            orderNoStr.append(format.format(orderNo.getLastNumber()));
    
            orderNoMapper.updateOrderNo(orderNo);
    
            return orderNoStr.toString();
        }
    }
    

    相关文章

      网友评论

          本文标题:单据号生成工具

          本文链接:https://www.haomeiwen.com/subject/ttvohltx.html