diff --git a/mes-framework/mes-common/src/main/java/com/ningxia/yunxi/chemmes/framework/common/util/CodeGenerateUtils.java b/mes-framework/mes-common/src/main/java/com/ningxia/yunxi/chemmes/framework/common/util/CodeGenerateUtils.java new file mode 100644 index 0000000..95e5e2e --- /dev/null +++ b/mes-framework/mes-common/src/main/java/com/ningxia/yunxi/chemmes/framework/common/util/CodeGenerateUtils.java @@ -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); + } + } +} \ No newline at end of file