mybatis-plus 手动生成业务单号方法

一、 代码生成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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值