当前位置: 首页 > wzjs >正文

php网站留言板模板下载山东网站定制设计公司

php网站留言板模板下载,山东网站定制设计公司,网站红色模板,免费网站统计代码在企业应用开发中,我们经常需要生成类似 BZ -240704-0001 这种“业务编号”,它通常具有以下特点: 前缀:代表业务类型,如 BZ 表示包装 日期:年月日格式,通常为 yyMMdd 序列号:当天内…

在企业应用开发中,我们经常需要生成类似 BZ -240704-0001 这种“业务编号”,它通常具有以下特点:

  • 前缀:代表业务类型,如 BZ 表示包装

  • 日期:年月日格式,通常为 yyMMdd

  • 序列号:当天内递增,如 00010002

本文介绍一个支持 自动去重、递增编号、通用字段提取 的工具类,并提供了三种调用方式,适配不同场景。

📦 工具类源码:

package com.kakarote.pm.common;import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.stereotype.Component;import java.beans.Introspector;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;/*** 生成唯一业务编号,格式如 FK-240703-0001,支持重试避免重复*/
@Component
public class DocumentCodeGeneratorUtil {/*** 自动生成唯一编号(支持重试,防止重复)* @param prefix        编号前缀,如 "FK"* @param service       MyBatis-Plus 的 Service 对象,用于执行数据库查询* @param columnGetter  要生成编号的字段引用,如 Entity::getDocumentCode* @param <T>           实体类* @return              唯一编号,例如 FK-240704-0001*/private static final int MAX_RETRY = 5;public <T> String generateUniqueCode(String prefix, IService<T> service, SFunction<T, String> columnGetter) {int retry = 0;while (retry < MAX_RETRY) {String code = generateCodeByDatePrefix(prefix, service, columnGetter);int count = service.lambdaQuery().eq(columnGetter, code).count();if (count == 0) {return code;}retry++;}throw new RuntimeException("编号生成失败:连续5次生成重复编号,请稍后重试!");}private <T> String generateCodeByDatePrefix(String prefix, IService<T> service, SFunction<T, String> columnGetter) {String currentDate = new SimpleDateFormat("yyMMdd").format(new Date());String prefixWithDate = prefix + "-" + currentDate + "-";List<T> list = service.lambdaQuery().likeRight(columnGetter, prefixWithDate).orderByDesc(columnGetter).last("limit 1").list();int nextSeq = 1;if (!list.isEmpty()) {try {T entity = list.get(0);String fieldName = getFieldName(columnGetter);String maxCode = (String) PropertyUtils.getProperty(entity, fieldName);String[] parts = maxCode.split("-");if (parts.length == 3) {nextSeq = Integer.parseInt(parts[2]) + 1;}} catch (Exception e) {throw new RuntimeException("反射获取字段值失败", e);}}return prefixWithDate + String.format("%04d", nextSeq);}/*** 通过 SerializedLambda 获取字段名, 例:User::getName => name*/private <T> String getFieldName(SFunction<T, ?> fn) throws Exception {Method writeReplace = fn.getClass().getDeclaredMethod("writeReplace");writeReplace.setAccessible(true);SerializedLambda serializedLambda = (SerializedLambda) writeReplace.invoke(fn);String implMethodName = serializedLambda.getImplMethodName();if (implMethodName.startsWith("get")) {return Introspector.decapitalize(implMethodName.substring(3));} else if (implMethodName.startsWith("is")) {return Introspector.decapitalize(implMethodName.substring(2));}return implMethodName;}
}

 使用方式(3种场景) 

场景 1:在当前 ServiceImpl 内部调用(推荐)

@Autowired

private DocumentCodeGeneratorUtil documentCodeGeneratorUtil;

@Override

public void savePack() {    

String code = documentCodeGeneratorUtil.generateUniqueCode("BZ", this, PmPack::getDocumentCode);    

pmPack.setDocumentCode(code);    

save(pmPack);

}

说明:this 是当前类,已继承 BaseServiceImpl,本身就是 IService<PmPack>
例如:

如果没有就采用方式二的本身的service调用就行

场景 2:在其他类(如 Controller)中调用

@Autowired
private PmPackService pmPackService;

@Autowired
private DocumentCodeGeneratorUtil documentCodeGeneratorUtil;

public void createPackFromController() {
    String code = documentCodeGeneratorUtil.generateUniqueCode("BZ", pmPackService, PmPack::getDocumentCode);
}

场景 3:使用 Spring 上下文动态获取(非推荐,仅限无法注入时)

PmPackService service = SpringContextHolder.getBean(PmPackService.class);

String code = documentCodeGeneratorUtil.generateUniqueCode("BZ", service, PmPack::getDocumentCode);

 你需要实现 SpringContextHolder
 

@Component
public class SpringContextHolder implements ApplicationContextAware {
    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext ctx) {
        context = ctx;
    }

    public static <T> T getBean(Class<T> clazz) {
        return context.getBean(clazz);
    }
}
 

🔧 所需依赖(pom.xml)

// MyBatis Plus 核心依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version>
</dependency>

// BeanUtils(反射读取字段值)

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency> 

示例输出

假设今天是 2024年7月4日,编号前缀为 FK,数据库已有最大编号为:

BZ-240704-0001  以此类推第二天重置
如果重复,会自动重试最多 5 次。

例如:

优点总结

功能支持情况
日期前缀
自增长序列
多表复用
自动重试去重
支持 Lambda 字段提取
支持多个业务类型前缀

结语:

 这个工具类已经在多个模块(如:付款利息、包装、检验)中实际应用,稳定可靠,适配 MyBatis-Plus 体系,简洁灵活。


文章转载自:

http://M7czdsIt.pynzj.cn
http://eoVM8hTK.pynzj.cn
http://nAgWdIfV.pynzj.cn
http://ukBwqr8p.pynzj.cn
http://t4tBMZKV.pynzj.cn
http://C2sU3SX5.pynzj.cn
http://bqPalGKU.pynzj.cn
http://dVPk6eRa.pynzj.cn
http://HmQ8EY86.pynzj.cn
http://1Xr26Rg6.pynzj.cn
http://iqjBAAPF.pynzj.cn
http://fOdUROAz.pynzj.cn
http://ucp7HRu1.pynzj.cn
http://CCS3WTKT.pynzj.cn
http://f9yHYytN.pynzj.cn
http://7ONb24gb.pynzj.cn
http://BUHZIO7O.pynzj.cn
http://UwtMwITk.pynzj.cn
http://LEmXP9As.pynzj.cn
http://t7DkVNV3.pynzj.cn
http://NBjC2NDU.pynzj.cn
http://CCTjSRD7.pynzj.cn
http://RLjdMS4f.pynzj.cn
http://aQsXjIo6.pynzj.cn
http://rigy6mdu.pynzj.cn
http://02Svh5xI.pynzj.cn
http://bRotAEiy.pynzj.cn
http://6GR8Bg9v.pynzj.cn
http://JEILE5Lv.pynzj.cn
http://KPn2eqi5.pynzj.cn
http://www.dtcms.com/wzjs/678503.html

相关文章:

  • 网站怎么做快照怎么做网站后门
  • 福建建设工程信息网官网百度seo招聘
  • 单页网站开发实例下载wordpress rss 全文
  • 深圳专业做网站专业南京网站微信建设
  • 谷歌网站质量指南如何做网站栏目规划
  • 外贸网站建设注意什么主流软件开发工具
  • 定制化网站开发做的asp网站手机号码
  • 手机网站头部代码北京最新发布信息
  • 确山网站建设宁波网站优化找哪家
  • 什么浏览器可以看任何网站中小企业网站建设报告
  • 优秀企业网站建设wordpress侧边栏编辑
  • 静安网站建设公司大宗商品现货交易平台排名
  • 互助平台网站建设费用廊坊做网站价格
  • 企业网站标题如何设置浙江大洋建设集团有限公司网站
  • 软件开发外包大概多少钱益阳seo网站建设
  • 网站的域名起什么好处wordpress好难用
  • 建设银行内部学习网站做专利费减是哪个网站
  • 怎呀做网站关键词加入搜索引擎网站
  • 北京网站制作与建设公司山海经异变小程序游戏入口
  • 做软装的网站免费建立网站的有哪里
  • 显示网站正在维护是什么情况无锡关键词优化价格
  • 好心人给个安全的网站如何做公司网站优化
  • 网站多国语言湖北省建设规划网站
  • 佛山网站优化软件服务器安全卫士
  • 苏州网站托管平面设计主要做什么内容
  • 昆明学院网站建设与维护试题电子商务学校网站建设
  • 惠州城乡和住房建设局网站网站建设合同
  • 网站销售系统怎么做贵州省冶金建设有限公司网站
  • 网站affiliate怎么做永久免费ppt下载网站
  • 北京网站建设交易购买网站空间域名