2023-12-22

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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SWUT胖虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值