From fbde4ed692dd1d5da72fb7a41bd0e3c4103fc898 Mon Sep 17 00:00:00 2001 From: xyc <jc_xiong@hotmail.com> Date: 星期五, 15 十一月 2024 17:01:48 +0800 Subject: [PATCH] 修改二项分布基本可靠性计算公式 --- modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java | 684 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 502 insertions(+), 182 deletions(-) diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java index f6132a6..93e99b1 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java @@ -5,11 +5,13 @@ import cn.hutool.json.XML; import com.fasterxml.jackson.databind.ObjectMapper; import com.spire.pdf.tables.table.convert.Convert; +import com.zt.common.db.query.QueryFilter; import com.zt.common.exception.RenException; import com.zt.common.service.BaseService; import com.zt.common.servlet.Result; import com.zt.common.utils.TreeUtils; import com.zt.common.utils.UUIDUtil; +import com.zt.life.export.service.DownloadService; import com.zt.life.modules.mainPart.basicInfo.dao.ParamDataDao; import com.zt.life.modules.mainPart.basicInfo.dao.XhProductModelDao; import com.zt.life.modules.mainPart.basicInfo.model.ParamData; @@ -24,7 +26,10 @@ import com.zt.life.modules.mainPart.taskReliability.dto.TaskPhaseConstraintDto; import com.zt.life.modules.mainPart.taskReliability.model.*; import com.zt.life.modules.mainPart.utils.GetStringSpace; +import com.zt.life.modules.mainPart.utils.OSUtils.ProcessUtils; +import io.swagger.models.auth.In; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; @@ -42,8 +47,14 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.*; +import java.nio.file.FileAlreadyExistsException; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -110,7 +121,6 @@ Map<Integer, String> templetsStrMap2 = new HashMap<>(); private JSONObject xmlJSONObj; - /** * 鍒嗛〉鏌ヨ @@ -196,9 +206,9 @@ double pointNumPerHour = 60.0 / simulatAssess.getSamplPeriod(); //鏃跺簭鍥剧嚎 - List<List<TimeDiagramStatusDto>> lineArray = new ArrayList(); + List<TimeDiagramStatusDto> statusDtoList = new ArrayList<>(); + List<TimeDiagramStatusDto> statusDtoListOld = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { - List<TimeDiagramStatusDto> statusDtoList = new ArrayList<>(); x1 = 0; groupY = groupHeight * i; ProductStatusDto dto = list.get(i); @@ -228,7 +238,11 @@ break; } x2 = x1 + status.getTimes() * pointNumPerHour + 5; - statusDtoList.add(new TimeDiagramStatusDto(x1, x2, status2)); + if (i == 0) { + statusDtoList.add(new TimeDiagramStatusDto(x1, x2, status2)); + } else { + statusDtoListOld.add(new TimeDiagramStatusDto(x1, x2, status2)); + } JSONObject lineJson = new JSONObject(templetsStrMap.get(status.getStatus())); setlineXy(lineJson, x1, y, x2, y, ""); JsonUtils2.setJsonValueByPath(lineJson, "data/status".split("/"), status.getStatus()); @@ -239,8 +253,6 @@ x1 = x2 - 5; jsonArray.add(lineJson); } - lineArray.add(statusDtoList); - JSONObject textJson = new JSONObject(templetsStrMap.get("text")); JsonUtils2.setJsonValueByPath(textJson, "id".split("/"), UUIDUtil.generateId().toString()); JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), dto.getName()); @@ -324,67 +336,76 @@ curPointHour += periodHour; } + List<TimeDiagramStatusDto> statusDtoListNew = new ArrayList<>(); + while (statusDtoListOld.size() > 0) { + //statusDtoListOld.stream().sorted(Comparator.comparing(TimeDiagramStatusDto::getX1)).collect(Collectors.toList()); + statusDtoListOld.sort(Comparator.comparing(TimeDiagramStatusDto::getX1, Comparator.naturalOrder())); + TimeDiagramStatusDto nextStatusDto = statusDtoListOld.get(0); + if (statusDtoListNew.size() == 0) { + statusDtoListNew.add(nextStatusDto); + } else { + TimeDiagramStatusDto currentStatusDto = statusDtoListNew.get(statusDtoListNew.size() - 1); + if (nextStatusDto.getStatus() < currentStatusDto.getStatus()) { + if (nextStatusDto.getX1() == currentStatusDto.getX1() && nextStatusDto.getX2() == currentStatusDto.getX2()) { + currentStatusDto.setStatus(nextStatusDto.getStatus()); + } else if (nextStatusDto.getX1() == currentStatusDto.getX1() && nextStatusDto.getX2() < currentStatusDto.getX2()) { + statusDtoListOld.add(new TimeDiagramStatusDto(nextStatusDto.getX2(), currentStatusDto.getX2(), currentStatusDto.getStatus())); + currentStatusDto.setStatus(nextStatusDto.getStatus()); + currentStatusDto.setX2(nextStatusDto.getX2()); + } else if (nextStatusDto.getX1() == currentStatusDto.getX1() && nextStatusDto.getX2() > currentStatusDto.getX2()) { + currentStatusDto.setStatus(nextStatusDto.getStatus()); + currentStatusDto.setX2(nextStatusDto.getX2()); + } else if (nextStatusDto.getX1() > currentStatusDto.getX1() && nextStatusDto.getX2() >= currentStatusDto.getX2()) { + currentStatusDto.setX2(nextStatusDto.getX1()); + statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus())); + } else if (nextStatusDto.getX1() > currentStatusDto.getX1() && nextStatusDto.getX2() < currentStatusDto.getX2()) { + statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus())); + statusDtoListOld.add(new TimeDiagramStatusDto(nextStatusDto.getX2(), currentStatusDto.getX2(), currentStatusDto.getStatus())); + currentStatusDto.setX2(nextStatusDto.getX1()); + } + } else { + if (nextStatusDto.getX1() >= currentStatusDto.getX2()) { + statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus())); + } else if (nextStatusDto.getX2() > currentStatusDto.getX2()) { + statusDtoListOld.add(new TimeDiagramStatusDto(currentStatusDto.getX2(), nextStatusDto.getX2(), nextStatusDto.getStatus())); + } + } + } + statusDtoListOld.remove(0); + } timeDiagramDto.setTotalWidth(x2); double pointRate = timeDiagramDto.getTotalWidth() / timeDiagramDto.getSmallWidth(); - List<TimeDiagramStatusDto> subStatusDtoList = new ArrayList<>(); - int lastStatus = 5; - boolean isFirst = true; - x1 = 0; - for (double i = 0; i < timeDiagramDto.getSmallWidth(); i = i + timeDiagramDto.getMinPointNum()) { - int netStatus = 5; - for (int j = 1; j < list.size(); j++) { - if (i >= 448) { - System.out.println(111); - } - int tmpStatus = getPointStatus(lineArray.get(j), i * pointRate, (i + timeDiagramDto.getMinPointNum()) * pointRate - 1); - if (tmpStatus < netStatus) { - netStatus = tmpStatus; - } - } - if (!isFirst) { - if (lastStatus != netStatus) { - subStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); - lastStatus = netStatus; - x1 = i; - } - } else { - lastStatus = netStatus; - isFirst = false; - } - x2 = i + timeDiagramDto.getMinPointNum() - 1; - } - subStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); + List<List<TimeDiagramStatusDto>> lineArray = new ArrayList(); + lineArray.add(statusDtoList); + lineArray.add(statusDtoListNew); - List<TimeDiagramStatusDto> parentStatusDtoList = new ArrayList<>(); - lastStatus = 5; - isFirst = true; - x1 = 0; - for (double i = 0; i < timeDiagramDto.getSmallWidth(); i = i + timeDiagramDto.getMinPointNum()) { - if (i >= 448) { - System.out.println(111); - } - int netStatus = getPointStatus(lineArray.get(0), i * pointRate, (i + timeDiagramDto.getMinPointNum()) * pointRate - 1); - if (!isFirst) { - if (lastStatus != netStatus) { - parentStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); + List<List<TimeDiagramStatusDto>> smallStatusDtoList = new ArrayList<>(); + for (int j = 0; j < lineArray.size(); j++) { + List<TimeDiagramStatusDto> tmpStatusDtoList = new ArrayList<>(); + int lastStatus = 5; + Boolean isFirst = true; + x1 = 0; + for (double i = 0; i < timeDiagramDto.getSmallWidth(); i = i + timeDiagramDto.getMinPointNum()) { + int netStatus = getPointStatus(lineArray.get(j), i * pointRate, (i + timeDiagramDto.getMinPointNum()) * pointRate - 1); + if (!isFirst) { + if (lastStatus != netStatus) { + tmpStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); + lastStatus = netStatus; + x1 = i; + } + } else { lastStatus = netStatus; - x1 = i; + isFirst = false; } - } else { - lastStatus = netStatus; - isFirst = false; + x2 = i + timeDiagramDto.getMinPointNum() - 1; } - x2 = i + timeDiagramDto.getMinPointNum() - 1; + tmpStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); + smallStatusDtoList.add(tmpStatusDtoList); } - parentStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); JSONObject jsonObject2 = new JSONObject(modelStr2); JSONArray jsonArray2 = jsonObject2.getJSONArray("cells"); - List<List<TimeDiagramStatusDto>> smallStatusDtoList = new ArrayList<>(); - smallStatusDtoList.add(parentStatusDtoList); - smallStatusDtoList.add(subStatusDtoList); - y = 10; for (int i = 0; i < smallStatusDtoList.size(); i++) { for (TimeDiagramStatusDto status : smallStatusDtoList.get(i)) { @@ -536,13 +557,36 @@ } public List<ProductStatusDto> getStatusData(Long productId, Long taskId) { - List<ProductStatusDto> childList = this.getProduct(productId, taskId); + + List<ProductStatusDto> dbList = this.getProduct(productId, taskId); + List<ProductStatusDto> childList = new ArrayList<>(); + for (ProductStatusDto item : dbList) { + if (item.getSameSbNum() > 1) { + for (int i = 1; i <= item.getSameSbNum(); i++) { + try { + ProductStatusDto newRow = item.clone(); + newRow.setDeviceNo(i); + newRow.setName(item.getName() + "-" + i); + newRow.setDataId(item.getId().toString() + "-" + i); + childList.add(newRow); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + } + } else { + item.setDeviceNo(0); + item.setDataId(item.getId().toString()); + childList.add(item); + } + } + childList.sort(Comparator.comparing(ProductStatusDto::getDeviceNo, Comparator.naturalOrder())); for (ProductStatusDto item : childList) { - JSONArray jsonArray = dialgramJson.getJSONArray(String.valueOf(item.getId())); + JSONArray jsonArray = dialgramJson.getJSONArray(item.getDataId()); if (jsonArray != null) { this.processJSONArray(jsonArray, item, taskId); } } + childList.removeIf(item -> item.getStatusList().size() == 0); return childList; } @@ -606,16 +650,19 @@ } @Transactional(rollbackFor = Exception.class) - public Result simulate(SimulatAssess simulatAssess) { - Result result = null; + public List<TaskModelCheckResultDto> simulateChecK(SimulatAssess simulatAssess) { + List<TaskModelCheckResultDto> result = null; // 1. 妫�鏌ユā鍨嬪畬鏁存�� List<TaskModelCheckResultDto> chkResult = taskService.checkTaskModel(simulatAssess.getProductId(), simulatAssess.getTaskModelId()); if (chkResult.size() > 0) { - result = Result.ok(chkResult); - return result; + return chkResult; } + return result; + } + public Boolean simulate(SimulatAssess simulatAssess) { + Boolean result = false; // 2. 缁勮渚涚畻娉曞簱浠跨湡鐨勬ā鍨媥ml assembleModelXml(simulatAssess); @@ -625,8 +672,13 @@ return result; } - private Result callReliaSimLib(SimulatAssess simulatAssess) { - Result result = null; + public List<SimulatAssess> process(QueryFilter queryFilter) { + List<SimulatAssess> page = baseDao.getProcessList(queryFilter.getParams()); + return queryFilter.getPageList(page); + } + + private Boolean callReliaSimLib(SimulatAssess simulatAssess) { + Boolean result = false; InputStream is = null; BufferedReader br = null; try { @@ -648,6 +700,8 @@ } else { throw new RenException("鏆備笉鏀寔璇ユ搷浣滅郴缁燂紝杩涜鍚姩绠楁硶搴撹绠楋紒"); } + long pid = ProcessUtils.getProcessId(process); + logger.info("绠楁硶搴揚ID锛�" + pid); is = process.getInputStream(); // 浠ュ懡浠よ鏂瑰紡璋冪敤绠楁硶搴撴椂锛屾帴鍙g害瀹氳繑鍥炵殑缁撴灉鏄痷tf-8缂栫爜 br = new BufferedReader(new InputStreamReader(is, "utf-8")); @@ -658,7 +712,9 @@ ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class); if ("0".equals(rtn.getCode())) { logger.info("鍚姩鍙潬鎬т豢鐪熻瘎浼扮畻娉曞簱鎴愬姛銆�"); - result = Result.ok(); + newProcess(simulatAssess, pid, command); + update(simulatAssess); + result = true; } else { String errorMsg = rtn.getErrorMsg(); throw new RenException("鍚姩鍙潬鎬т豢鐪熻瘎浼扮畻娉曞簱澶辫触: errorMsg=" + errorMsg); @@ -686,6 +742,14 @@ } return result; + } + + public void newProcess(SimulatAssess simulatAssess, long pid, String command) { + simulatAssess.setPid(pid); + simulatAssess.setCommandLine(command); + simulatAssess.setProcessIsAlive(true); + simulatAssess.setProcessStartTime(new Date()); + simulatAssess.setProgress(0); } private void setParamToRedis(SimulatAssess simulatAssess) { @@ -720,6 +784,9 @@ List<ParamData> paramDataList = paramDataDao.getDeviceParams(productId); Long taskId = simulatAssess.getTaskModelId(); Task task = taskService.get(taskId); + if (simulatAssess.getTaskDuration() != null) { + task.setTaskDuration(simulatAssess.getTaskDuration()); + } List<TaskBinoParam> binoParams = taskBinoParamDao.getBinoParams(taskId); // 1. 璁$畻鍚勪换鍔¢樁娈电殑杩愯鏃堕暱 @@ -739,7 +806,8 @@ Element root = document.addElement("des"); root.addAttribute("name", "General system"); addTasksTag(taskPhaseModelAll, root); - addModelsTag(taskId, + addModelsTag(simulatAssess, + taskId, productId, product.getName(), product.getNamePath(), @@ -876,6 +944,10 @@ ele = repairModelTag.addElement("shape"); ele.addAttribute("value", String.valueOf(repairModel.getParam3())); break; + case RepairModel.TYPE_DIRAC: + ele = repairModelTag.addElement("repair-time"); + ele.addAttribute("value", String.valueOf(repairModel.getParam1())); + break; default: break; } @@ -918,7 +990,8 @@ return taskPhases; } - private void addModelsTag(Long taskId, + private void addModelsTag(SimulatAssess simulatAssess, + Long taskId, Long productId, String productName, String productNamePath, @@ -944,7 +1017,8 @@ "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); ModelNode computerNode = modelNodeAndVnodeList.stream().filter(item -> endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); - node2DOM(taskId, + node2DOM(simulatAssess, + taskId, taskPhaseModel, gkModelTop.getModelId(), productId, @@ -962,7 +1036,8 @@ } // 閫掑綊鍑芥暟 - private void node2DOM(Long taskId, + private void node2DOM(SimulatAssess simulatAssess, + Long taskId, TaskPhaseModel taskPhaseModel, Long modelId, Long productId, @@ -992,7 +1067,8 @@ "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); ModelNode computerNode = modelNodeAndVnodeListSub.stream().filter(item -> endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); - node2DOM(taskId, + node2DOM(simulatAssess, + taskId, taskPhaseModel, gkModel.getModelId(), product.getId(), @@ -1008,9 +1084,10 @@ failureModels, repairModels); } else if ("5".equals(product.getProductType())) { // 璁惧 + Integer deviceNo = node.getDeviceNo(); Element nodeTag = parent.addElement("node"); - nodeTag.addAttribute("name", dataId.toString()); - nodeTag.addAttribute("real_name", product.getName()); + nodeTag.addAttribute("name", deviceNo == 0 ? dataId.toString() : dataId.toString() + "-" + deviceNo); + nodeTag.addAttribute("real_name", deviceNo == 0 ? product.getName() : product.getName() + "-" + deviceNo); nodeTag.addAttribute("name_path", product.getNamePath()); nodeTag.addAttribute("type", "node"); @@ -1042,7 +1119,12 @@ if (1 == paramData.getRepairable()) { // 鍙淮淇� - RepairModel repairModel = createRepairModel(paramData); + RepairModel repairModel = null; + if (isRepairDirac(simulatAssess.getRepairDiracFlag(), taskPhaseModel, product.getId())) { + repairModel = createRepairModelDirac(0); + } else { + repairModel = createRepairModel(paramData); + } repairModels.add(repairModel); Element repairTag = nodeTag.addElement("repair_model"); repairTag.addAttribute("name", repairModel.getId().toString()); @@ -1077,7 +1159,8 @@ for (String nodeStr : computerNodeListStr) { ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); - node2DOM(taskId, + node2DOM(simulatAssess, + taskId, taskPhaseModel, modelId, null, @@ -1132,23 +1215,46 @@ return failureModel; } + private boolean isRepairDirac(Boolean repairDiracFlag, TaskPhaseModel taskPhaseModel, Long productId) { + boolean result = false; + + if (repairDiracFlag != null && repairDiracFlag) { + if (taskPhaseModel.getPhaseConstraints() == null) { + result = true; + } else { + List<TaskPhaseConstraintDto> list = taskPhaseModel.getPhaseConstraints().stream().filter(item -> + productId.equals(item.getProductId())).collect(Collectors.toList()); + if (list.size() == 0) { + result = true; + } + } + } + + return result; + } + + private RepairModel createRepairModelDirac(double time) { + RepairModel repairModel = new RepairModel(); + repairModel.setId(UUIDUtil.generateId()); + repairModel.setType(RepairModel.TYPE_DIRAC); + repairModel.setParam1(0); + return repairModel; + } + private RepairModel createRepairModel(ParamData paramData) { RepairModel repairModel = new RepairModel(); repairModel.setId(UUIDUtil.generateId()); switch (paramData.getRepairDistribType()) { case 1: // 鎸囨暟鍒嗗竷 - repairModel.setType(FailureModel.TYPE_EXP); + repairModel.setType(RepairModel.TYPE_EXP); repairModel.setParam1(1.0 / paramData.getRepairMttcr()); break; case 2: // 濞佸竷灏斿垎甯� - repairModel.setType(FailureModel.TYPE_WBL); + repairModel.setType(RepairModel.TYPE_WBL); repairModel.setParam2(paramData.getRepairMttcrOtherParams2()); repairModel.setParam3(paramData.getRepairMttcrOtherParams3()); - break; - case 3: - // 浜岄」鍒嗗竷锛堢淮淇病鏈夛級 break; default: break; @@ -1159,8 +1265,7 @@ public List<WeakDto> getReliabilityWeakness(Long fzId, Long taskId, Long productId) { String filePath = path + "/" + fzId + "/" + "result.xml"; - List<WeakDto> list = new ArrayList<>(); - Map<Long, WeakDto> map = new HashMap<>(); + String xml; InputStream in = null; try { @@ -1180,50 +1285,46 @@ } - List<WeakDto> productList = baseDao.getProductList(taskId, productId); - for (WeakDto dto : productList) { - map.put(dto.getId(), dto); - } + Map<Long, WeakDto> map = new HashMap<>(); JSONObject xmlJSONObj = XML.toJSONObject(xml); JSONArray jsonArray = xmlJSONObj.getJSONObject("ResultNodes").getJSONArray("ResultNode"); for (int i = 0; i < jsonArray.size(); i++) { WeakDto data = new WeakDto(); Long productId1; - Object nameValue = jsonArray.getJSONObject(i).get("name"); - if (nameValue instanceof Long) { - productId1 = (Long) nameValue; - if (map.get(productId1) != null) { - WeakDto weakDto = map.get(productId1); - Double mtbfTime = null; + String nameValue = jsonArray.getJSONObject(i).get("name").toString(); + if (StringUtils.isNotBlank(nameValue)) { + productId1 = Convert.toLong(nameValue.split("-")[0]); - Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); - Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); - Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); - - data.setMtbf(mtbf); - data.setMttr(mttr); - data.setMsr(msr); - - if (weakDto != null) { - data.setId(weakDto.getId()); - data.setSort(weakDto.getSort()); - data.setPid(weakDto.getPid()); - data.setName(weakDto.getName()); - data.setProductType(weakDto.getProductType()); - data.setTimeRate(weakDto.getTimeRate()); - mtbfTime = mtbf / weakDto.getTimeRate(); + Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); + Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); + Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); + WeakDto weakDto = new WeakDto(); + weakDto.setId(productId1); + weakDto.setMtbf(mtbf); + weakDto.setMttr(mttr); + weakDto.setMsr(msr); + if (map.get(productId1) == null) { + map.put(productId1, weakDto); + } else { + if (weakDto.getMsr() < map.get(productId1).getMsr()) { + map.put(productId1, weakDto); } - - data.setMtbfTime(mtbfTime); - data.setIsWeak(0); - - list.add(data); } } } + List<WeakDto> productList = baseDao.getProductList(taskId, productId); + for (WeakDto item : productList) { + WeakDto dto = map.get(item.getId()); + item.setMtbf(dto.getMtbf()); + item.setMttr(dto.getMttr()); + item.setMsr(dto.getMsr()); + item.setMtbfTime(dto.getMtbf() / item.getTimeRate()); + item.setIsWeak(0); + } + List<WeakDto> treeList = new ArrayList<>(); - if (list.size() > 0) { - treeList = TreeUtils.build(list); + if (productList.size() > 0) { + treeList = TreeUtils.build(productList); this.getIsweak(treeList.get(0).getChildren()); } @@ -1248,43 +1349,55 @@ } } - public SchemeComparDto SchemeCompar(String[] taskList, Long showProductId) { - SchemeComparDto dto = new SchemeComparDto(); + public SimulatResult SchemeCompar(String[] taskList, Long showProductId, Integer samplPeriod, Integer simulatFrequency) { + SimulatResult simulatResult = new SimulatResult(); + List<Long> idList = new ArrayList<>(); + List<TaskModelCheckResultDto> result = null; +/* SchemeComparDto dto = new SchemeComparDto(); List<SimulaDataDto> dataDtoList = new ArrayList<>(); List<SchemeComparCurve> curveList = new ArrayList<>(); List<Double> xData = new ArrayList<>(); - SimulatAssess simulatAssess; - SimulaDataDto data; + + SimulaDataDto data;*/ + + List<SimulatAssess> simulatAssessList = new ArrayList<>(); Task task; + double maxTaskDuration = 0.0; for (String taskId : taskList) { - Long taskModelId = Long.parseLong(taskId); - task = taskService.get(taskModelId); - simulatAssess = this.getByTaskId(taskModelId); - SimulaDataDto resultData; - if (showProductId != null) { - simulatAssess.setProductId(showProductId); - resultData = this.getResultXML(simulatAssess); - } else { - resultData = this.getResultXML(simulatAssess); + task = taskService.get(Long.parseLong(taskId)); + if (task.getTaskDuration() > maxTaskDuration) { + maxTaskDuration = task.getTaskDuration(); } - data = resultData; - data.setName(task.getTaskName()); - dataDtoList.add(data); - xData = resultData.getCurveParam().getXData(); + SimulatAssess simulatAssess = new SimulatAssess(); + Long id = UUIDUtil.generateId(); + simulatAssess.setId(id); + simulatAssess.setName(""); + simulatAssess.setProductId(showProductId); + simulatAssess.setSamplPeriod(samplPeriod); + simulatAssess.setSimulatFrequency(simulatFrequency); + simulatAssess.setTaskDuration(maxTaskDuration); + simulatAssess.setTaskModelId(Long.parseLong(taskId)); - SchemeComparCurve curve = new SchemeComparCurve(); - curve.setName(task.getTaskName()); - curve.setSmooth(true); - curve.setType("line"); - curve.setData(resultData.getCurveParam().getYData()); - curveList.add(curve); + simulatAssessList.add(simulatAssess); + result = simulateChecK(simulatAssess); + if (result != null) { + simulatResult.setType("errorList"); + simulatResult.setErrList(result); + return simulatResult; + } + idList.add(id); } - dto.setXDataList(xData); - dto.setDataList(dataDtoList); - dto.setCurveList(curveList); - return dto; + + for (SimulatAssess simulatAssess : simulatAssessList) { + simulatAssess.setTaskDuration(maxTaskDuration); + this.simulate(simulatAssess); + } + + simulatResult.setType("idList"); + simulatResult.setIdList(idList); + return simulatResult; } public SimulaDataDto getResultXML(SimulatAssess simulatAssess) { @@ -1313,7 +1426,7 @@ } } xmlJSONObj = XML.toJSONObject(xml); - simulatAssess.setShowProductId(simulatAssess.getProductId()); + simulatAssess.setShowProductId(simulatAssess.getProductId().toString()); SimulaDataDto data = this.getResultData(simulatAssess); return data; } @@ -1325,50 +1438,257 @@ samplPeriod = samplPeriod / 60; JSONArray jsonArray = xmlJSONObj.getJSONObject("ResultNodes").getJSONArray("ResultNode"); for (int i = 0; i < jsonArray.size(); i++) { - Long productId = null; - Object nameValue = jsonArray.getJSONObject(i).get("name"); - if (nameValue instanceof Long) { - productId = (Long) nameValue; - if (productId.equals(simulatAssess.getShowProductId())) { - Object object = jsonArray.getJSONObject(i).get("phase"); - List<Double> doubleArray = new ArrayList<>(); - List<Double> xList = new ArrayList<>(); - String availability = null; - if (object instanceof JSONArray) { - JSONArray jsonArray2 = jsonArray.getJSONObject(i).getJSONArray("phase"); - for (int j = 0; j < jsonArray2.size(); j++) { - if (availability != null) { - availability = availability + " " + jsonArray2.getJSONObject(j).get("availability"); - } else { - availability = (String) jsonArray2.getJSONObject(j).get("availability"); - } + String nameValue = jsonArray.getJSONObject(i).get("name").toString(); + if (nameValue.equals(simulatAssess.getShowProductId())) { + Object object = jsonArray.getJSONObject(i).get("phase"); + List<Double> doubleArray = new ArrayList<>(); + List<Double> xList = new ArrayList<>(); + String availability = null; + if (object instanceof JSONArray) { + JSONArray jsonArray2 = jsonArray.getJSONObject(i).getJSONArray("phase"); + for (int j = 0; j < jsonArray2.size(); j++) { + if (availability != null) { + availability = availability + " " + jsonArray2.getJSONObject(j).get("availability"); + } else { + availability = (String) jsonArray2.getJSONObject(j).get("availability"); } - } else { - JSONObject jsonObject2 = jsonArray.getJSONObject(i).getJSONObject("phase"); - availability = (String) jsonObject2.get("availability"); } - - String[] arr = availability.split(" "); - // 閬嶅巻瀛愬瓧绗︿覆鏁扮粍锛屽皢姣忎釜鍏冪礌杞崲涓篸ouble骞跺瓨鍌ㄥ埌double鏁扮粍涓� - Double j = 0.0; - for (int a = 0; a < arr.length; a++) { - j = samplPeriod + j; - doubleArray.add(Double.parseDouble(arr[a])); - xList.add(j); - } - - param.setXData(xList); - param.setYData(doubleArray); - Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); - Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); - Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); - data.setMtbf(mtbf); - data.setMttr(mttr); - data.setMsr(msr); + } else { + JSONObject jsonObject2 = jsonArray.getJSONObject(i).getJSONObject("phase"); + availability = (String) jsonObject2.get("availability"); } - data.setCurveParam(param); + + String[] arr = availability.split(" "); + // 閬嶅巻瀛愬瓧绗︿覆鏁扮粍锛屽皢姣忎釜鍏冪礌杞崲涓篸ouble骞跺瓨鍌ㄥ埌double鏁扮粍涓� + Double j = 0.0; + for (int a = 0; a < arr.length; a++) { + j = samplPeriod + j; + doubleArray.add(Double.parseDouble(arr[a])); + xList.add(j); + } + + param.setXData(xList); + param.setYData(doubleArray); + Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); + Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); + Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); + data.setMtbf(mtbf); + data.setMttr(mttr); + data.setMsr(msr); + } + data.setCurveParam(param); + } + + return data; + } + + public String verify(Long taskId) { + StringBuilder result = new StringBuilder(); + Task task = taskService.get(taskId); + double taskTime = task.getTaskDuration(); + List<OperatConditModel> list = baseDao.getModel(taskId); + List<Double> reliabiyList = new ArrayList<>(); + String modelStr2 = ""; + for (OperatConditModel model : list) { + if (model.getProductId().equals(task.getProductId())) { + modelStr2 = model.getContent(); + continue; + } + List<verifyDto> listNodes = baseDao.getNode(model.getModelId()); + for (verifyDto node : listNodes) { + //lmd,reliabiy,failRate + double lmd = 1 / node.getMtbf(); + double reliabiy = Math.exp(-1 * lmd * taskTime); + double failRate = 1 - reliabiy; + node.setLmd(lmd); + node.setReliabiy(reliabiy); + node.setFailRate(failRate); + } + int total = listNodes.size(); + String modelStr = model.getContent(); + //鎵惧埌琛ㄥ喅鏁伴噺 + + if (modelStr.contains("switch")) { + double a = 0; + double lmd = listNodes.get(0).getLmd(); + result.append("\n").append(total).append("涓浉鍚岃澶囨梺鑱�,3閫�1,MTTBCF鏄�").append(listNodes.get(0).getMtbf()).append("\n"); + for (int i = 0; i <= total - 1; i++) { + double ijc = getjc(i); + double b = Math.pow(taskTime * lmd, i) * Math.exp(-1 * lmd * taskTime) / ijc; + a = a + b; + result.append("鏈�").append(i + 1).append("涓澶囧ソ鐨勭殑姒傜巼涓�").append(b).append("\n"); + } + result.append("鏁翠釜鏃佽仈绯荤粺鐨勫彲闈犲害涓�").append(new Formatter().format("%.4f", a)).append("\n"); + reliabiyList.add(a); + } else if (modelStr.contains("parallel")) { + double a = 1; + result.append("\n骞惰仈璁惧鏈�").append(total).append("涓猏n"); + for (int i = 0; i < listNodes.size(); i++) { + a = a * listNodes.get(i).getFailRate(); + result.append("绗�").append(i + 1).append("涓澶囩殑MTBCF涓�").append(listNodes.get(i).getMtbf()).append(",").append(i + 1).append("涓澶囧苟鑱旂殑澶辨晥鐜囦负").append(a).append("\n"); + } + double reliabiy = 1 - a; + result.append("鏁翠釜骞惰仈绯荤粺鐨勫け鏁堢巼涓�").append(a).append("鏁翠釜骞惰仈绯荤粺鐨勫彲闈犲害涓�").append(new Formatter().format("%.4f", reliabiy)).append("\n"); + reliabiyList.add(reliabiy); + } else if (modelStr.contains("vote")) { + Integer voteNum = baseDao.getVoteNum(model.getModelId()); + if (voteNum != null) { + result.append("\n").append(total).append("涓浉鍚岃澶囪〃鍐�,MTBCF涓�").append(listNodes.get(0).getMtbf()).append("琛ㄥ喅鏁伴噺涓�").append(voteNum).append("涓猏n"); + double a = 0; + double zjc = getjc(total); + double reliabiy = listNodes.get(0).getReliabiy(); + for (int i = voteNum; i <= total; i++) { + double ijc = getjc(i); + double nijc = getjc(total - i); + double b = (zjc / (ijc * nijc)) * Math.pow(reliabiy, i) * Math.pow(1 - reliabiy, total - i); + a = a + b; + result.append("鏈�").append(i).append("涓澶囨槸濂界殑姒傜巼涓�").append(b).append("\n"); + } + result.append("鏁翠釜琛ㄥ喅绯荤粺鐨勫彲闈犲害涓�").append(new Formatter().format("%.4f", a)).append("\n"); + reliabiyList.add(a); + } + } } - return data; + double totalReliabiy = 1; + if (modelStr2.contains("parallel")) { + for (Double reliabiy : reliabiyList) { + totalReliabiy = totalReliabiy * (1 - reliabiy); + } + totalReliabiy = 1 - totalReliabiy; + } else { + for (Double reliabiy : reliabiyList) { + totalReliabiy = totalReliabiy * reliabiy; + } + } + result.append("\n鏁翠釜鎬讳綋绯荤粺鐨勫彲闈犲害涓�").append(totalReliabiy).append("\n"); + return String.valueOf(result); + } + + Double getjc(int a) { + double result = 1.0; + for (int i = a; i > 0; i--) + result = result * i; + return result; + } + + public SchemeComparDto getEcharts(String[] taskList, Long showProductId) { + SchemeComparDto dto = new SchemeComparDto(); + List<SimulaDataDto> dataDtoList = new ArrayList<>(); + List<SchemeComparCurve> curveList = new ArrayList<>(); + List<Double> xData = new ArrayList<>(); + SimulatAssess simulatAssess; + SimulaDataDto data; + + Task task; + for (String taskId : taskList) { + Long taskModelId = Long.parseLong(taskId); + task = taskService.get(taskModelId); + simulatAssess = this.getByTaskId(taskModelId); + simulatAssess.setDataType("fz"); + SimulaDataDto resultData; + if (showProductId != null) { + simulatAssess.setProductId(showProductId); + resultData = this.getResultXML(simulatAssess); + } else { + resultData = this.getResultXML(simulatAssess); + } + + data = resultData; + data.setName(task.getTaskName()); + dataDtoList.add(data); + xData = resultData.getCurveParam().getXData(); + + SchemeComparCurve curve = new SchemeComparCurve(); + curve.setName(task.getTaskName()); + curve.setSmooth(true); + curve.setType("line"); + curve.setData(resultData.getCurveParam().getYData()); + curveList.add(curve); + } + dto.setXDataList(xData); + dto.setDataList(dataDtoList); + dto.setCurveList(curveList); + return dto; + } + + public void downloadXml(HttpServletRequest request, HttpServletResponse response, String type, Long id, Integer xml) { + if (type.equals("fz")) { + if (xml == 1) { + SimulatAssess simulatAssess = this.get(id); + String xml1 = simulatAssess.getXml(); + writeToTxt(request, response, xml1, "浠跨湡杈撳叆"); + } else { + String filePath = path + "/" + id + "/" + "result.xml"; + String xml1; + InputStream in = null; + + try { + in = new FileInputStream(filePath); + xml1 = IOUtils.toString(in); + } catch (IOException e) { + e.printStackTrace(); + throw new RenException("鏂囦欢涓嶅瓨鍦ㄦ垨鑰呮枃浠舵墦涓嶅紑"); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + writeToTxt(request, response, xml1, "浠跨湡杈撳嚭"); + } + } else if (type.equals("sxt")) { + if (xml == 1) { + String filePath = path + "/" + id + "/" + "status.json"; + ObjectMapper mapper = new ObjectMapper(); + String jsonStr = null; + try { + // 浣跨敤 ObjectMapper 鐨� readValue 鏂规硶锛屽皢鏂囦欢涓殑 JSON 鏁版嵁杞崲涓轰竴涓� Java 瀵硅薄 + // 杩欓噷浣跨敤 Object 绫讳綔涓烘硾鍨嬪弬鏁帮紝琛ㄧず浠绘剰绫诲瀷鐨勫璞� + Object obj = mapper.readValue(new File(filePath), Object.class); + // 浣跨敤 ObjectMapper 鐨� writeValueAsString 鏂规硶锛屽皢 Java 瀵硅薄杞崲涓� JSON 瀛楃涓� + jsonStr = mapper.writeValueAsString(obj); + + } catch (IOException e) { + // 澶勭悊寮傚父 + e.printStackTrace(); + throw new RenException("鏂囦欢涓嶅瓨鍦ㄦ垨鑰呮枃浠舵墦涓嶅紑"); + } + writeToTxt(request, response, jsonStr, "鏃跺簭鍥捐緭鍏�"); + } else { + SimulatAssess simulatAssess = this.get(id); + TimeDiagramDto timeDiagram = getTimeDiagram(simulatAssess.getProductId(), simulatAssess.getTaskModelId(), simulatAssess.getId(), 1200, 5); + String xml2 = timeDiagram.getDiagramJson(); + writeToTxt(request, response, xml2, "鏃跺簭鍥捐緭鍑�"); + } + } + } + + public void writeToTxt(HttpServletRequest request, HttpServletResponse response, String jsonString, String name) {//璁剧疆鍝嶅簲鐨勫瓧绗﹂泦 + //璁剧疆鍝嶅簲鍐呭鐨勭被鍨� + BufferedOutputStream buff = null; + ServletOutputStream outStr = null; + try { + response.setContentType("text/plain;charset=UTF-8"); + String encodedFilename = DownloadService.getNameEncoder(request, name + "xml.txt"); + response.addHeader("Content-Disposition", "attachment;filename=" + encodedFilename); + outStr = response.getOutputStream(); + buff = new BufferedOutputStream(outStr); + buff.write(jsonString.getBytes("UTF-8")); + buff.flush(); + buff.close(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + buff.close(); + outStr.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } } } -- Gitblit v1.9.1