feat(biz): 工具

This commit is contained in:
zxy 2026-05-22 14:47:47 +08:00
parent 1884ead27a
commit 9d32907946

View File

@ -0,0 +1,111 @@
package com.ningxia.yunxi.chemmes.framework.common.util;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* 通用编码生成工具类
*
* @author system
*/
public class CodeGenerateUtils {
/**
* 生成基于日期和序列号的编码自动获取当前日期
*
* @param prefix 编码前缀
* @param dateFormat 日期格式 "yyyyMM" "yyyyMMdd"
* @param sequenceLength 序列号长度
* @param currentSequence 当前最大序列号完整编码
* @return 新生成的编码
*/
public static String generateCodeWithDateSequence(String prefix, String dateFormat,
int sequenceLength, String currentSequence) {
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern(dateFormat));
return generateCodeWithDateAndSequence(prefix, dateStr, sequenceLength, currentSequence);
}
/**
* 生成基于日期和序列号的编码传入日期字符串
*
* @param prefix 编码前缀
* @param dateStr 日期字符串 "202605" "20260522"
* @param sequenceLength 序列号长度
* @param currentSequence 当前最大序列号完整编码
* @return 新生成的编码
*/
public static String generateCodeWithDateAndSequence(String prefix, String dateStr,
int sequenceLength, String currentSequence) {
// 检查当前序列号是否有效
int expectedLength = prefix.length() + dateStr.length() + sequenceLength;
if (currentSequence == null || currentSequence.length() < expectedLength) {
// 无有效序列号 1 开始
return prefix + dateStr + String.format("%0" + sequenceLength + "d", 1);
}
// 提取日期部分进行比较
String datePartInSequence = currentSequence.substring(prefix.length(), prefix.length() + dateStr.length());
if (!datePartInSequence.equals(dateStr)) {
// 日期不同重新开始序列
return prefix + dateStr + String.format("%0" + sequenceLength + "d", 1);
}
// 日期相同序列号递增
String sequencePart = currentSequence.substring(prefix.length() + dateStr.length());
try {
int sequence = Integer.parseInt(sequencePart);
sequence++;
return prefix + dateStr + String.format("%0" + sequenceLength + "d", sequence);
} catch (NumberFormatException e) {
// 解析失败重新开始
return prefix + dateStr + String.format("%0" + sequenceLength + "d", 1);
}
}
/**
* 生成基于年月和序列号的编码已废弃请使用 generateCodeWithDateAndSequence
*
* @param prefix 编码前缀
* @param yearMonth 年月字符串 "202605"
* @param sequenceLength 序列号长度
* @param currentSequence 当前最大序列号完整编码
* @return 新生成的编码
* @deprecated 使用 generateCodeWithDateAndSequence 替代
*/
@Deprecated
public static String generateCodeWithYearMonthSequence(String prefix, String yearMonth,
int sequenceLength, String currentSequence) {
return generateCodeWithDateAndSequence(prefix, yearMonth, sequenceLength, currentSequence);
}
/**
* 生成简单序列号编码不含日期
*
* @param prefix 编码前缀
* @param sequenceLength 序列号长度
* @param currentSequence 当前最大序列号完整编码
* @return 新生成的编码
*/
public static String generateSimpleSequenceCode(String prefix, int sequenceLength, String currentSequence) {
if (currentSequence == null || currentSequence.length() < prefix.length() + sequenceLength) {
// 无有效序列号 1 开始
return prefix + String.format("%0" + sequenceLength + "d", 1);
}
// 检查前缀是否匹配
if (!currentSequence.startsWith(prefix)) {
return prefix + String.format("%0" + sequenceLength + "d", 1);
}
// 前缀相同序列号递增
String sequencePart = currentSequence.substring(prefix.length());
try {
int sequence = Integer.parseInt(sequencePart);
sequence++;
return prefix + String.format("%0" + sequenceLength + "d", sequence);
} catch (NumberFormatException e) {
// 解析失败重新开始
return prefix + String.format("%0" + sequenceLength + "d", 1);
}
}
}