一、 代码生成SerialNumberDO类[附数据库设计]
package cn.serialnumber;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 流水号表 DO
*
* @author 芋道源码
*/
@TableName("table_namer")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SerialNumberDO extends BaseDO {
/**
* id
*/
@TableId
private Long id;
/**
* 规则 '流水号的首字母'
*/
private String rule;
/**
* 流水号 20240101
*/
private String serialNumber;
/**
* 乐观锁
*/
private String revision;
}
二、准备SerialNumVO类
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
/**
* 流水号表 SerialNumVO
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SerialNumVO{
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1654")
private Long id;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "规则 流水号的首字母")
private String rule;
@Schema(description = "流水号 20240101")
private String serialNumber;
@Schema(description = "乐观锁")
private String revision;
}
三、实现这个方法——controller/sevice/Impl
@GetMapping("/get")
@Operation(summary = "获得流水号表")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('cloud:serial-number:query')")
public CommonResult<SerialNumberRespVO> getSerialNumber(@RequestParam("id") Long id) {
SerialNumberDO serialNumber = serialNumberService.getSerialNumber(id);
return success(serialNumber);
}
String getSerialNumber(String rule);
@Override
public String getSerialNumber(String rule) {
//获取流水号
String serialNumber = "";
QueryWrapper<SerialNumberDO> wrapper = new QueryWrapper<>();
wrapper.eq("rule", rule);
SerialNumberDO doLists = serialNumberMapper.selectOne(wrapper);
SerialNumberDO serialNumberDO = new SerialNumberDO();
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String now= dateFormat.format(date);
if (doLists != null && !StringUtils.isBlank(doLists.getSerialNumber())) {
//20240101
String last= doLists.getSerialNumber().toString().substring(0,8);
if(!now.equals(last))
{
//天数不同 从0001开始
doLists.setSerialNumber(now + "0001");
serialNumberMapper.updateById(doLists);
return rule+now + "0001";
}else{
//天数相同
String serial = doLists.getSerialNumber();
String time=serial.substring(0,8);
int number=Integer.parseInt(serial.substring(8))+1 ;
doLists.setSerialNumber(time+String.format("%04d",number));
serialNumberMapper.updateById(doLists);
return rule + "" + doLists.getSerialNumber();
}
} else {
//无数据
serialNumber = rule + "" + now + "0001";
serialNumberDO.setId(IdWorker.getId());
serialNumberDO.setRule(rule);
serialNumberDO.setSerialNumber(now + "0001");
serialNumberDO.setDeleted(false);
serialNumberMapper.insert(serialNumberDO);
return serialNumber;
}
}
四、使用(传入需要的前规则)
vo.setCode(serialNumberService.getSerialNumber("CKSQ")); // 传入需要的规则
// 最终输出: CKSQ2024021101、CKSQ2024021102、CKSQ2024021103