package com.itheima.maven.annotation;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.itheima.maven.annotation.JDBCConnect.query;
/**
* 生成编号
*
* @author YZH
* @date 2023/12/22
*/
public class generateNumber {
public static void main(String[] args) throws SQLException, ParseException, ClassNotFoundException {
generateSeriaNumber(FloweBoxTypeEnum.ZX);
}
/**
* 生成seria编号
*
* @param floweBoxTypeEnum flowe box类型枚举
* @return {@link String}
* @throws SQLException sqlexception
* @throws ParseException 解析异常
* @throws ClassNotFoundException 未找到类异常
*/
public static String generateSeriaNumber(FloweBoxTypeEnum floweBoxTypeEnum) throws SQLException, ClassNotFoundException {
//
DateTime date = DateUtil.date();
int dayOfWeek = DateUtil.dayOfWeek(date)-1;
ResultSet query = query();
if (query == null){
return floweBoxTypeEnum.getName()+ RandomUtil.randomNumbers(3)+dayOfWeek+"0001";
}else {
// 生成模板字符串:例如HX1235
String newSeriaNumber = floweBoxTypeEnum.getName()+ RandomUtil.randomNumbers(3)+dayOfWeek;
// 寻找数据库中后四位那个最大的字符串
String maxSerialNumber = findMaxSerialNumber(query);
// 根据最大的那个字符串然后后四位加1并返回 0009
String nextSerialNumber = generateNextSerialNumber(maxSerialNumber);
// 然后拼起来
String completeSerialNumber = newSeriaNumber+nextSerialNumber;
// 判断一下生成的字符串在结果集中是否已经存在
if (isSerialNumberExist(query,completeSerialNumber)){
String nextBiggerSerialNumber = generateNextSerialNumber(nextSerialNumber);
return newSeriaNumber+nextBiggerSerialNumber;
}else {
return completeSerialNumber;
}
}
}
/**
* 从ResultSet中获取所有的序列号,并返回最大的序列号
*
* @param resultSet 包含序列号的ResultSet
* @return 最大的序列号
*/
public static String findMaxSerialNumber(ResultSet resultSet) {
List<String> serialNumbers = new ArrayList<>();
try {
// 遍历ResultSet获取序列号
while (resultSet.next()) {
String serialNumber = resultSet.getString("serial_number");
serialNumbers.add(serialNumber);
}
} catch (SQLException e) {
throw new RuntimeException();
}
// 在列表中查找并返回最大的序列号
return findMaxSerialNumber(serialNumbers);
}
public static String findMaxSerialNumber(List<String> serialNumbers) {
if (serialNumbers.isEmpty()) {
// 如果列表为空,返回null或者你认为合适的默认值
return null;
}
// 使用 Collections.max 方法和自定义比较器来找到最大的字符串
return Collections.max(serialNumbers, (s1, s2) -> {
// 提取字符串的最后四位数字并进行比较
int num1 = Integer.parseInt(s1.substring(s1.length() - 4));
int num2 = Integer.parseInt(s2.substring(s2.length() - 4));
return Integer.compare(num1, num2);
});
}
/**
* 生成下一个序列号
*
* @param maxSerialNumber 最大序列号
* @return {@link String}
*/
public static String generateNextSerialNumber(String maxSerialNumber) {
if (maxSerialNumber == null) {
// 如果最大序列号为null,可以返回默认的起始序列号
return "0001";
}
// 提取最后四位数字
String lastFourDigits = maxSerialNumber.substring(maxSerialNumber.length() - 4);
// 将字符串转换为整数并加一
int nextNumber = Integer.parseInt(lastFourDigits) + 1;
// 格式化为四位数,例如:0009 生成新的序列号
return String.format("%04d", nextNumber);
}
/**
* 是否存在序列号
*
* @param resultSet 结果集
* @param targetSerialNumber 目标序列号
* @return boolean
* @throws SQLException sqlexception
*/
public static boolean isSerialNumberExist(ResultSet resultSet, String targetSerialNumber) throws SQLException {
while (resultSet.next()) {
String serialNumber = resultSet.getString("serial_number");
if (targetSerialNumber.equals(serialNumber)) {
// 找到了目标序列号
return true;
}
}
// 结果集中没有找到目标序列号
return false;
}
}
2023-12-22
最新推荐文章于 2024-11-03 11:01:20 发布