xyc
2024-10-22 3c2e46fef0e866901cbb5de889166b6fda748e5d
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/TestScheme/service/TestSchemeService.java
@@ -1,17 +1,22 @@
package com.zt.life.modules.mainPart.TestScheme.service;
import cn.hutool.core.convert.Convert;
import com.zt.common.service.BaseService;
import com.zt.life.modules.mainPart.TestScheme.dao.TestSchemeDao;
import com.zt.life.modules.mainPart.TestScheme.dto.ConditionDto;
import com.zt.life.modules.mainPart.TestScheme.dto.ResultDto;
import com.zt.life.modules.mainPart.TestScheme.model.TestScheme;
import org.apache.commons.math3.distribution.ChiSquaredDistribution;
import org.springframework.stereotype.Service;
import com.zt.common.db.query.QueryFilter;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
@@ -44,35 +49,67 @@
    }
    public List<ResultDto> getResult(ConditionDto dto) {
        this.insertNum();
        List<ResultDto> result = new ArrayList<>();
        List<TestScheme> list = baseDao.getList();
        if (dto.getTjlx().equals("条件1")) {
            result = this.getCondition1(dto, list);
        } else if (dto.getTjlx().equals("条件2")) {
            result = this.getCondition2(dto, list);
        } else if (dto.getTjlx().equals("条件3")) {
            result = this.getCondition3(dto, list);
        switch (dto.getTjlx()) {
            case "按风险名义值查询":
                result = this.getCondition1(dto);
                break;
            case "不限定生产方风险查询":
                result = this.getCondition2(dto);
                break;
            case "不限定检验上限查询":
                result = this.getCondition3(dto);
                break;
        }
        return result;
    }
    private List<ResultDto> getCondition1(ConditionDto dto, List<TestScheme> list) {
        List<ResultDto> result = new ArrayList<>();
        int C = 0;
        double oldvalue = 0;
        for (int i = 1; i <= 10; i++) {
            Integer finalI = i;
            TestScheme data1 = list.stream().filter(k -> k.getPa().equals(dto.getUserRisk()) && k.getPc() == (2 * finalI + 2)).findFirst().get();//
            TestScheme data2 = list.stream().filter(k -> k.getPa().equals(1 - dto.getUserRisk()) && k.getPc() == (2 * finalI + 2)).findFirst().get();//
            if (data1 != null && data2 != null) {
                Double value = data2.getValue() / data1.getValue();
                double strate = dto.getMinAccepValue() / dto.getSpecifiedValue();
    private void insertNum() {
        baseDao.insertNum();
    }
                if (value >= strate) {
                    C = i;
                    if (strate - oldvalue < value - strate)
                        C = i - 1;
                    break;
    private List<ResultDto> getCondition1(ConditionDto dto) {
        List<ResultDto> result = new ArrayList<>();
        int C = 1;
        double oldvalue = 0;
        double strate = dto.getMinAccepValue() / dto.getSpecifiedValue();
        for (int i = 1; i <= 10000; i++) {
            Double data1 = getUpperQuantile(1 - dto.getProductionRisk(), 2 * i + 2);
            Double data2 = getUpperQuantile(dto.getUserRisk(), 2 * i + 2);//算法计算
            if (data1 != null && data2 != null) {
                double value = data1 / data2;
                System.out.println(value);
                if (dto.getUserRisk() < 1 - dto.getProductionRisk()) {
                    if (oldvalue != 0) {
                        if (value > strate) {
                            C = i;
                            if (strate - oldvalue < value - strate) {
                                C = i - 1;
                            }
                            break;
                        }
                    } else {
                        if (value > strate) {
                            C = i;
                            break;
                        }
                    }
                } else {
                    if (oldvalue != 0) {
                        if (value < strate) {
                            C = i;
                            if (oldvalue - strate < strate - value) {
                                C = i - 1;
                            }
                            break;
                        }
                    } else {
                        if (value < strate) {
                            C = i;
                            break;
                        }
                    }
                }
                oldvalue = value;
            }
@@ -81,12 +118,13 @@
        double T = 0;     //总试验时间
        double TST1 = 0;  //T/θ1
        double TST0 = 0;  //T/θ0
        Integer finalC = C;
        TestScheme data3 = list.stream().filter(k -> k.getPa().equals(1 - dto.getUserRisk()) && k.getPc() == (2 * finalC + 2)).findFirst().get();//
        Double data3 = getUpperQuantile(dto.getUserRisk(), 2 * C + 2);
        if (data3 != null) {
            TST1 = data3.getValue() / 2; //T/θ1
            TST1 = data3 / 2; //T/θ1
            //TST1 = Convert.ToDouble(TST1.ToString("G2")); //取两位有效数字
            if (TST1 < 10) TST1 = TST1 + 0.1;
            if (TST1 < 10) {
                TST1 = TST1 + 0.1;
            }
            T = TST1 * dto.getMinAccepValue();  //总试验时间
            TST0 = T / dto.getSpecifiedValue(); //T/θ0    TST1 * minAccepValue / specifiedValue
        }
@@ -96,11 +134,16 @@
        double e = 2.71828182845904523536;  //自然数e
        for (int r = 0; r <= C; r++) {
            productionRisk = productionRisk + Math.pow(TST0, r) * Math.pow(e, -TST0) / getjc(r);
            double a = Math.pow(TST0, r) * Math.pow(e, -TST0) / getjc(r);
           /* if (r>35){
                System.out.println(111);
            }*/
            productionRisk = productionRisk + a;
            userRisk = userRisk + Math.pow(TST1, r) * Math.pow(e, -TST1) / getjc(r);
        }
        ResultDto resultDto = new ResultDto();
        productionRisk = 1 - productionRisk;
        ResultDto resultDto = new ResultDto();
        resultDto.setAcceptNumber(C);
        resultDto.setTotalTestTime(String.valueOf(Math.round(T)));
        resultDto.setProductionRiskReal(new Formatter().format("%.2f", productionRisk * 100).toString());
@@ -109,20 +152,19 @@
        return result;
    }
    public List<ResultDto> getCondition2(ConditionDto dto, List<TestScheme> list) {
    public List<ResultDto> getCondition2(ConditionDto dto) {
        List<ResultDto> result = new ArrayList<>();
        for (Integer i = 0; i < dto.getShowFailureTime(); i++) {
            Integer finalI = i;
            List<TestScheme> data = list.stream().filter(k -> k.getPa().equals(dto.getUserRisk()) && k.getPc() == (2 * finalI + 2)).collect(Collectors.toList());//
            ResultDto resultDto = new ResultDto();
            double T = 0;
            double TST1 = 0; //  T/θ1
            double TST0 = 0;//  T/θ0
            for (TestScheme item : data) {
                TST1 = item.getValue() / 2;
                T = TST1 * dto.getMinAccepValue();
                TST0 = T / dto.getSpecifiedValue(); //  T/θ0
            }
        for (int i = 0; i < dto.getShowFailureTime(); i++) {
            double T;
            double TST1; //  T/θ1
            double TST0;//  T/θ0
            Double data2 = getUpperQuantile(dto.getUserRisk(), 2 * i + 2);
            TST1 = data2 / 2;
            T = TST1 * dto.getMinAccepValue();
            TST0 = T / dto.getSpecifiedValue(); //  T/θ0
            double productionRisk = 0;
            double userRisk = 0;
            double e = 2.71828182845904523536;
@@ -132,6 +174,7 @@
            }
            productionRisk = 1 - productionRisk;
            ResultDto resultDto = new ResultDto();
            resultDto.setAcceptNumber(i + 1);
            resultDto.setTotalTestTime(String.valueOf(Math.round(T)));
            resultDto.setProductionRiskReal(new Formatter().format("%.2f", productionRisk * 100).toString());
@@ -141,24 +184,21 @@
        return result;
    }
    private List<ResultDto> getCondition3(ConditionDto dto, List<TestScheme> list) {
    private List<ResultDto> getCondition3(ConditionDto dto) {
        List<ResultDto> result = new ArrayList<>();
        for (int i = 0; i <= dto.getShowFailureTime(); i++) {
            Integer finalI = i;
            List<TestScheme> data = list.stream().filter(k -> k.getPa().equals(dto.getUserRisk()) && k.getPc() == (2 * finalI + 2)).collect(Collectors.toList());//
            List<TestScheme> data2 = list.stream().filter(k -> k.getPa().equals(1 - dto.getProductionRisk()) && k.getPc() == (2 * finalI + 2)).collect(Collectors.toList());//
            double T = 0;
            double TST1 = 0; //  T/θ1
            double TST0 = 0;//  T/θ0
            double ST0 = 0; // θ0
            for (TestScheme item : data) {
                TST1 = item.getValue() / 2;
                T = TST1 * dto.getMinAccepValue();
                for (TestScheme item2 : data2) {
                    ST0 = item.getValue() * dto.getMinAccepValue() / item2.getValue();
                }
                TST0 = T / ST0;
            }
        for (int i = 0; i < dto.getShowFailureTime(); i++) {
            double T;
            double TST1; //  T/θ1
            double TST0;//  T/θ0
            double ST0; // θ0
            Double data1 = getUpperQuantile(dto.getUserRisk(), 2 * i + 2);
            Double data2 = getUpperQuantile(1 - dto.getProductionRisk(), 2 * i + 2);
            TST1 = data1 / 2;
            T = TST1 * dto.getMinAccepValue();
            ST0 = data1 * dto.getMinAccepValue() / data2;
            TST0 = T / ST0;
            double productionRisk = 0;
            double userRisk = 0;
@@ -167,10 +207,12 @@
                productionRisk = productionRisk + Math.pow(TST0, r) * Math.pow(e, -TST0) / getjc(r);
                userRisk = userRisk + Math.pow(TST1, r) * Math.pow(e, -TST1) / getjc(r);
            }
            productionRisk = 1 - productionRisk;
            ResultDto resultDto = new ResultDto();
            resultDto.setAcceptNumber(i);
            resultDto.setAcceptNumber(i + 1);
            resultDto.setTotalTestTime(String.valueOf(Math.round(T)));
            resultDto.setNumber(String.valueOf(Math.round(ST0)));
            resultDto.setSpecifiedValue(String.valueOf(Math.round(ST0)));//检验上限
            resultDto.setProductionRiskReal(new Formatter().format("%.2f", productionRisk * 100).toString());
            resultDto.setUserRiskReal(new Formatter().format("%.2f", userRisk * 100).toString());
            result.add(resultDto);
@@ -179,10 +221,19 @@
    }
    //计算阶乘
    int getjc(int a) {
        int result = 1;
    Double getjc(int a) {
        double result = 1.0;
        for (int i = a; i > 0; i--)
            result = result * i;
        return result;
    }
    //卡方分布的上侧α分位数算法
    public Double getUpperQuantile(Double alpha, Integer degreesOfFreedom) {
        ChiSquaredDistribution chiSquaredDistribution = new ChiSquaredDistribution(degreesOfFreedom);
        Double upperQuantile = chiSquaredDistribution.inverseCumulativeProbability(1 - alpha);
        String str = String.format("%.4f", upperQuantile);
        upperQuantile = Convert.toDouble(str);
        return upperQuantile;
    }
}