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 | 184 ++++++++++++++++++++++++++------------------- 1 files changed, 107 insertions(+), 77 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 439e250..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,20 +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.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; + /** @@ -27,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 @@ -47,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("鎸夐闄╁悕涔夊�兼煡璇�")) { - result = this.getCondition1(dto, list); - } else if (dto.getTjlx().equals("涓嶉檺瀹氱敓浜ф柟椋庨櫓鏌ヨ")) { - result = this.getCondition2(dto, list); - } else if (dto.getTjlx().equals("涓嶉檺瀹氳瀹氬�兼煡璇�")) { - 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(BigDecimal.ONE.subtract(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; } @@ -84,11 +103,9 @@ double T = 0; //鎬昏瘯楠屾椂闂� double TST1 = 0; //T/胃1 double TST0 = 0; //T/胃0 - Integer finalC = C; - Stream<TestScheme> testSchemeStream = list.stream().filter(k -> k.getPa().equals(dto.getUserRisk()) && k.getPc() == (2 * finalC + 2)); - TestScheme data3 = testSchemeStream.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; @@ -102,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()); @@ -115,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; @@ -138,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()); @@ -147,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(BigDecimal.ONE.subtract(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; - } + 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; @@ -173,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 + 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); @@ -185,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