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

单据号生成工具

作者: 阿杰_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