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;
}
}
可以根据自己的业务需求进行修改!