JavaWeb 自动编号器Utils,用于各种自增长的编号,单号等

使用以下技术栈

  • springboot
  • mybatisplus
  • mysql

一、首先设计一张表

表名假设为auto_numbering

名称数据类型备注描述
idbigint主键
namevarchar(64)编号名称
prefixvarchar(8)前缀
inti_valuebigint初始值
current_valuebigint当前值
lengthint编号长度(不包含前缀)

假设有两条数据

idnameprefixinti_valuecurrent_valuelength
1stock_inputSI028
2product_codePC058

第一条表示入库单编号,编号的规则是,前缀为SI,当前编号数为2,长度为8,那么下一次使用入库单号时,对应的current_value加1变为3,得到的单号应该是字符串"SI00000003" 。第二条表示产品编号,同理,对应的current_value加1变为6,应该得到字符串"PC00000006"

那么如何设计这样一个自动编号工具类呢?这个工具类的方法最好是static,这样可以直接得到自动编号器的返回值,同时又要去让数据表对应的current_value自增。

二、创建对应的Domain类、Mapper接口、编号名称枚举类

domain

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("auto_numbering")
public class AutoNumbering{

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 编号名称
     */
    private String name;

    /**
     * 前缀
     */
    private String prefix;

    /**
     * 初始值
     */
    private Long intiValue;

    /**
     * 当前值
     */
    private Long currentValue;

    /**
     * 编号长度(不包含前缀)
     */
    private Integer length;

}

mapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface AutoNumberingMapper extends BaseMapper<AutoNumbering> {

}

enum

public enum AutoNumberingEnum {

    STOCK_INPUT("stock_input", "入库编号"),
    PRODUCT_CODE("product_code", "产品编号");
    
    private final String name;
    private final String remark;

    AutoNumberingEnum(String name, String remark) {
        this.name = name;
        this.remark = remark;
    }
    
    /**
     * 获取枚举名称
     *
     * @return name
     */
    public String getName() {
        return this.name;
    }

    /**
     * 获取枚举描述
     *
     * @return remark
     */
    public String getRemark() {
        return this.remark;
    }
}

三、写一个Service接口和实现类

service接口类

public interface AutoNumberingService {

	/**
	 * 获取下一个编号
	 * @param  param 自动编号枚举值
	 * @return 自动编号字符串
	 */
	String getNextNo(AutoNumberingEnum param);
}

serviceimpl

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class AutoNumberingServiceImpl  implements AutoNumberingService {

	@Autowired
	private AutoNumberingMapper autoNumberingMapper ;

	/**
	 * 自动编号方法
	 *
	 * @param  param 自动编号枚举值
	 * @return 编号
	 */
	@Transactional
	public String getNextNo(AutoNumberingEnum param) {

		// 查找当前的采番配置信息
		LambdaQueryWrapper<AutoNumbering> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AutoNumbering::getName, param.getName());
		List<AutoNumbering> AutoNumberings = AutoNumberingMapper.selectList(wrapper);
		// 未获取到配置信息
		if (AutoNumberings.isEmpty()) {
			return null;
		} else {
			// 规则获取
			AutoNumbering autoNumbering = AutoNumberings.get(0);
			// 前缀
			String prefix = autoNumbering.getPrefix();
			// 长度
			Integer length = autoNumbering.getLength();
			// 顺番
			Long currentNo = autoNumbering.getCurrentValue();
			// 更新原数据
			currentNo++;
		}
			autoNumbering.setCurrentValue(currentNo);
			AutoNumberingMapper.updateById(autoNumbering);

			// 生成编号
			String formatNo = StringUtils.leftPad(String.valueOf(currentNo), length, "0");
			return String.format("%s%s", prefix, formatNo);
		}
	}

四、写一个Utils类静态获取编号

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class NoGeneratorUtil {

    private static AutoNumberingService autoNumberingService;

    @Autowired
    public void setAutoNumberingService(AutoNumberingService autoNumberingService) {
        NoGeneratorUtil.autoNumberingService = autoNumberingService;
    }

    /**
     * 获取最新的入库单编号
     * @return 最新的入库单编号
     */
    public static String getNextStockInputNo() {
        return autoNumberingService.getNextNo(AutoNumberingEnum.STOCK_INPUT);
    }

    /**
     * 获取最新的产品编号
     * @return 最新的c'p 编号
     */
    public static String getNextProductNo() {
        return autoNumberingService.getNextNo(AutoNumberingEnum.PRODUCT_CODE);
    }

这段代码是SpringBoot框架中的一种常见用法,用于将SpringBoot管理的bean注入到静态变量中。那么,autoNumberingService是如何被注入的呢?实际上,当SpringBoot启动时,它会扫描所有的类,并为带有@Component(或者@Service等)注解的类创建实例。在创建NoGeneratorUtil实例的过程中,SpringBoot会调用所有带有@Autowired注解的setter方法,包括setAutoNumberingService方法,从而将AutoNumberingService的实现类注入到autoNumberingService静态变量中。

五、使用

之后如下使用即可一行代码获取最新编号

String string1 = NoGeneratorUtil.getNextStockInputNo();
String string2 = NoGeneratorUtil.getNextProductNo();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值