java生成流水编码信息

1,先创建工具类CodeUtils

package com.example.ashun;

public class CodeUtils {

    /**
     * 利用给定流水位,生成第一个流水号
     * 例如: 流水位 3 第一个流水号 001
     *       流水位 4 第一个流水号 0001
     * @param glideBit
     * @return
     */
    public static String geneFirstGlideNumber(Integer glideBit) {

        if (glideBit == null || glideBit < 3) {
            glideBit = 3;
        }

        String glideNumber = "";
        for (int i = 0; i < glideBit - 1; i++) {
            glideNumber = glideNumber + "0";
        }

        glideNumber = glideNumber + "1";

        return glideNumber;

    }


    /**
     * 根据当前的流水号,生成下一个流水号
     * 例如:当前流水号 001 下一个 002
     *      当前0005 下一个 ---6
     * @param curGlideNumber 当前流水号
     * @return
     */
    public static String geneNextGlideNumber(String curGlideNumber) {

        if (curGlideNumber.isEmpty()) {
            throw new RuntimeException("不能计算下一个流水号");
        }

        curGlideNumber = "1" + curGlideNumber;
        Integer icurGlideNumber = Integer.parseInt(curGlideNumber);
        icurGlideNumber++;
        curGlideNumber = icurGlideNumber + "";

        curGlideNumber = curGlideNumber.substring(1);

        return curGlideNumber;
    }

}

2,创建实体类SysCodeRule

package com.example.ashun.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;

/**
 * 
 * @TableName sys_code_rule
 */
@TableName(value ="sys_code_rule")
@Data
public class SysCodeRule implements Serializable {
    /**
     * 编号
     */
    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 模块名称(固定)
     */
    private String module;

    /**
     * 编码前缀(可变)
     */
    private String areaprefix;

    /**
     * 日期位(可变)
     */
    private String areatime;

    /**
     * 流水位(可变)
     */
    private Integer glidebit;

    /**
     * 预览(显示的提供看的)
     */
    private String currentcode;

    /**
     * 表明(固定)
     */
    private String tabname;

    /**
     * 是否有效(Y和N两个指,如果是保存是Y,如果“#编码前缀,#日期位”,#流水位中有一个发生变化就 
       变成N)
     */
    private String available;

    /**
     * 下次产生的序号
     */
    private String nextseq;

    /**
     * 序号对应的日期(yyyyMMdd)
     */
    private String curdate;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

3,创建SysCodeRuleMapper

package com.example.ashun.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.ashun.entity.SysCodeRule;

/**
* @author ZX_2021_1
* @description 针对表【sys_code_rule】的数据库操作Mapper
* @createDate 2022-06-29 16:28:35
* @Entity com.example.entity.SysCodeRule
*/
public interface SysCodeRuleMapper extends BaseMapper<SysCodeRule> {
    
}




4,创建SysCodeRuleService

package com.example.ashun.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.ashun.entity.SysCodeRule;

/**
* @author ZX_2021_1
* @description 针对表【sys_code_rule】的数据库操作Service
* @createDate 2022-06-29 16:28:35
*/
public interface SysCodeRuleService extends IService<SysCodeRule> {

    String getCompanyCodeByTabName(String tabName);

}

5,创建SysCodeRuleServiceImpl(主要的业务层)

package com.example.ashun.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.ashun.CodeUtils;
import com.example.ashun.entity.SysCodeRule;
import com.example.ashun.mapper.SysCodeRuleMapper;
import com.example.ashun.service.SysCodeRuleService;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* @author ZX_2021_1
* @description 针对表【sys_code_rule】的数据库操作Service实现
* @createDate 2022-06-29 16:28:35
*/
@Service
public class SysCodeRuleServiceImpl extends ServiceImpl<SysCodeRuleMapper, SysCodeRule> implements SysCodeRuleService {

    /**
     * 生成客户编码
     * @param tabName 表名
     * @return
     */
    @Override
    public String getCompanyCodeByTabName(String tabName){
        //获取代码规则,查询sys_code_rule
        List<SysCodeRule> list = this.lambdaQuery().eq(SysCodeRule::getTabname,tabName).list();

        if(list.isEmpty()){
            throw new RuntimeException("不能生成客户编码");
        }
        //其实只能查到一个
        SysCodeRule sysCodeRule = list.get(0);
        //客户编码
        String code;
        //获取是否被修改字段值
        //如果被修改过或刚添加,被修改字段值为Y
        if (sysCodeRule.getAvailable().equals("Y")){ //默认为Y,表示刚开始昨天和今天都没改过,进来发生了修改,此条件结束改为N
            //获取流水位 = 3
            Integer glideBit=sysCodeRule.getGlidebit();
            //生成第一个流水号 001
            String firstGlideNumber = CodeUtils.geneFirstGlideNumber(glideBit);
            //计算下一个流水号
            String nextGlideNumber = CodeUtils.geneNextGlideNumber(firstGlideNumber);
            //获取系统当前日期,用于存放数据库以作代码查询判断(注: 此当前日期只做判断,并非要求日期格式)
            String curDate=new DateTime().toString("yyyyMMdd");
            //生成客户编码
            code = sysCodeRule.getAreaprefix() + "-" +new DateTime().toString(sysCodeRule.getAreatime()) + "-" + firstGlideNumber;
            //修改代码规则表
            //下一个序列号 = “003”
            sysCodeRule.setNextseq(nextGlideNumber);
            sysCodeRule.setCurdate(curDate);
            //是否被修改过 = “N”
            sysCodeRule.setAvailable("N");
            baseMapper.updateById(sysCodeRule);
            return code;
        }
        //获取数据库保存的今天或昨天的日期
        String curDate = sysCodeRule.getCurdate();
        //获取系统当前日期
        String sysCurDate = new DateTime().toString("yyyyMMdd");
        //通过时间判断,属于昨天还是今天修改,此处逻辑为今天修改,修改后不需要给数据库设置新的日期
        if(curDate.equals(sysCurDate)){
            //获取数据库表中的下一个流水号
            String nextseq = sysCodeRule.getNextseq();
            //计算新的流水号
            String nextGliderNumber = CodeUtils.geneNextGlideNumber(nextseq);
            //生成客户编码
            code = sysCodeRule.getAreaprefix() + "-" + new DateTime().toString(sysCodeRule.getAreatime()) + "-" + nextseq;
            //修改代码规则表
            sysCodeRule.setNextseq(nextGliderNumber);
            //更新规则表
            baseMapper.updateById(sysCodeRule);
            return code;
        }
        //能走到这,说明是昨天修改的,此处罗晋为昨天被修改,说明已经到了新的一天,需重新生成一次编码,需要给数据库设置新的日期
        //获取流水位 = 3
        Integer glideBit = sysCodeRule.getGlidebit();
        //生成第一个流水号 001
        String  firstGliderNumber = CodeUtils.geneFirstGlideNumber(glideBit);
        //生成下一个流水号
        String  nextGliderNumber = CodeUtils.geneNextGlideNumber(firstGliderNumber);
        //生成客户编码
        code = sysCodeRule.getAreaprefix() + "" + new DateTime().toString(sysCodeRule.getAreatime()) + "-" + firstGliderNumber;
        //修改代码规则表
        //下一个序列号 = “003”
        sysCodeRule.setNextseq(sysCurDate);
        baseMapper.updateById(sysCodeRule);
        return  code;
    }
}




6,创建SysCodeRuleController

package com.example.ashun.controller;

import com.example.ashun.service.SysCodeRuleService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("SysCodeRule")
public class SysCodeRuleController {

    @Autowired
    private SysCodeRuleService sysCodeRuleService;


    @ApiOperation("生成流水编码信息")
    @PostMapping("create/{tabname}")
    public Object SysCodeRuleController(@PathVariable String tabname){

        String list = sysCodeRuleService.getCompanyCodeByTabName(tabname);

        return  list;
    }

}

可以根据自己的业务需求进行修改!

猜你喜欢

转载自blog.csdn.net/liujiahuan_/article/details/126034106