Newer
Older
casic-metering-biz-xichang / casic-metering-common / src / main / java / com / casic / missiles / utils / QualityNoUtil.java
package com.casic.missiles.utils;

import cn.hutool.core.date.DateUtil;
import com.casic.missiles.enums.quality.QualityTableEnum;
import org.apache.commons.lang3.StringUtils;

import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BiFunction;

/**
 * 编码生成器
 */
public class QualityNoUtil {
    /**
     * 编码信息
     *
     * @param labCode   实验室编码
     * @param groupNo   组编码
     * @param tableEnum 枚举
     * @param func      方法体
     * @return
     */
    public static String genMaxNo(String labCode, String groupNo, QualityTableEnum tableEnum, BiFunction<QualityTableEnum, String, Long> func) {
        return genMaxNo(null, labCode, groupNo, tableEnum, func);
    }

    public static String genMaxNo(Integer yearTime, String labCode, String groupNo, QualityTableEnum tableEnum, BiFunction<QualityTableEnum, String, Long> func) {
        String code = getCode(yearTime, tableEnum.getFileNoEnum().getCode(), labCode, tableEnum.getFileTypeEnum().getCode(), groupNo, 0l);
        String queryCode = code.substring(0, tableEnum.getFixedLength());
        Long maxNo = func.apply(tableEnum, queryCode);
        String newCode = getCode(yearTime,tableEnum.getFileNoEnum().getCode(), labCode, tableEnum.getFileTypeEnum().getCode(), groupNo, maxNo);
        return newCode;
    }

    public static String convertToYearNo(String labCode, Integer yearTime, Integer yearNum) {
        return labCode + yearTime + yearNum;
    }

    public static String genZeroMaxNo(String labCode, String groupNo, QualityTableEnum tableEnum) {
        return genZeroMaxNo(null, labCode, groupNo, tableEnum);
    }

    public static String genZeroMaxNo(Integer yearTime, String labCode, String groupNo, QualityTableEnum tableEnum) {
        String newCode = getZeroCode(yearTime,tableEnum.getFileNoEnum().getCode(), labCode, tableEnum.getFileTypeEnum().getCode(), groupNo, 0l);
        return newCode;
    }
    public static String getZeroCode(Integer yearNo, String fileNo, String labNo, String recordTypeNo, String groupNo, long nowNum){
        StringBuilder builder = new StringBuilder();
        //年号
        if (yearNo == null) {
            yearNo = DateUtil.thisYear();
        }
        builder.append(fileNo).append("-");
        builder.append(labNo).append("-");
        builder.append(recordTypeNo).append("-");
        if (StringUtils.isNotEmpty(groupNo)) {
            builder.append(groupNo);
        }
        builder.append(yearNo);
        builder.append("000");
        return String.valueOf(builder);
    }

    public static synchronized String getCode(Integer yearNo, String fileNo, String labNo, String recordTypeNo, String groupNo, long nowNum) {
        //年号
        if (yearNo == null) {
            yearNo = DateUtil.thisYear();
        }
        StringBuilder builder = new StringBuilder();
        builder.append(fileNo).append("-");
        builder.append(labNo).append("-");
        builder.append(recordTypeNo).append("-");
        if (StringUtils.isNotEmpty(groupNo)) {
            builder.append(groupNo);
        }
        builder.append(yearNo);

        AtomicLong count = new AtomicLong(nowNum);
        if (nowNum == 0) {
            count = new AtomicLong(0);
            builder.append("00").append(count.incrementAndGet());
        } else {
            String format = String.format("%03d", count.incrementAndGet());
            builder.append(format);
        }
        return String.valueOf(builder);
    }

}