From 664db98c9e8595ce4dd636a27f480e3a08b81ff5 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期五, 21 二月 2025 11:13:51 +0800
Subject: [PATCH] 新增可忽略的维修时间

---
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/TestScheme/service/TestSchemeService.java |  188 ++++++++++++++++++++++++++++-------------------
 1 files changed, 112 insertions(+), 76 deletions(-)

diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/TestScheme/service/TestSchemeService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/TestScheme/service/TestSchemeService.java
index e39eb41..8ed7861 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/TestScheme/service/TestSchemeService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/TestScheme/service/TestSchemeService.java
@@ -1,17 +1,18 @@
 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.util.ArrayList;
 import java.util.Formatter;
 import java.util.List;
-import java.util.stream.Collectors;
+
 
 
 /**
@@ -24,17 +25,6 @@
 public class TestSchemeService extends BaseService<TestSchemeDao, TestScheme> {
 
     /**
-     * 鍒嗛〉鏌ヨ
-     *
-     * @param queryFilter
-     * @return
-     */
-   /* public List<TestScheme> page(QueryFilter queryFilter) {
-        return baseDao.getList(queryFilter.getQueryParams());
-    }
-*/
-
-    /**
      * 鍒犻櫎
      *
      * @param ids
@@ -44,35 +34,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 +103,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 +119,16 @@
         double e = 2.71828182845904523536;  //鑷劧鏁癳
 
         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 +137,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 +159,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 +169,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 +192,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 +206,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;
+    }
 }

--
Gitblit v1.9.1