|  |  | 
 |  |  | 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.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; | 
 |  |  | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 
 |  |  |     Map<Integer, String> templetsStrMap2 = new HashMap<>(); | 
 |  |  |  | 
 |  |  |     private JSONObject xmlJSONObj; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 分页查询 | 
 |  |  | 
 |  |  |         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); | 
 |  |  | 
 |  |  |                         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()); | 
 |  |  | 
 |  |  |                 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()); | 
 |  |  | 
 |  |  |             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)) { | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @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.error("模型不完整,请检查模型定义及参数配置。"); | 
 |  |  | //            result = Result.ok(chkResult); | 
 |  |  |             return result; | 
 |  |  |             return chkResult; | 
 |  |  |         } | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public Boolean simulate(SimulatAssess simulatAssess) { | 
 |  |  |         Boolean result = false; | 
 |  |  |         // 2. 组装供算法库仿真的模型xml | 
 |  |  |         assembleModelXml(simulatAssess); | 
 |  |  |  | 
 |  |  | 
 |  |  |         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 { | 
 |  |  |             setParamToRedis(simulatAssess); | 
 |  |  |             try { | 
 |  |  |                 setParamToRedis(simulatAssess); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 throw new RenException("访问Redis失败。请检查Redis是否已启动。"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             Process process = null; | 
 |  |  |             String command = "python " + reliaSimMain; | 
 |  |  | 
 |  |  |             } else if (System.getProperty("os.name").toLowerCase().indexOf("linux") > -1) { | 
 |  |  |                 process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command}); | 
 |  |  |             } else { | 
 |  |  |                 throw new Exception("暂不支持该操作系统,进行启动算法库计算!"); | 
 |  |  |                 throw new RenException("暂不支持该操作系统,进行启动算法库计算!"); | 
 |  |  |             } | 
 |  |  |             long pid = ProcessUtils.getProcessId(process); | 
 |  |  |             logger.info("算法库PID:" + pid); | 
 |  |  |             is = process.getInputStream(); | 
 |  |  |             // 以命令行方式调用算法库时,接口约定返回的结果是utf-8编码 | 
 |  |  |             br = new BufferedReader(new InputStreamReader(is, "utf-8")); | 
 |  |  | 
 |  |  |             if (line != null) { | 
 |  |  |                 ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class); | 
 |  |  |                 if ("0".equals(rtn.getCode())) { | 
 |  |  |                     logger.info("启动算法库成功。"); | 
 |  |  |                     result = Result.ok(); | 
 |  |  |                     logger.info("启动可靠性仿真评估算法库成功。"); | 
 |  |  |                     newProcess(simulatAssess, pid, command); | 
 |  |  |                     update(simulatAssess); | 
 |  |  |                     result = true; | 
 |  |  |                 } else { | 
 |  |  |                     String errorMsg = rtn.getErrorMsg(); | 
 |  |  |                     throw new RuntimeException("启动算法库失败: errorMsg=" + errorMsg); | 
 |  |  |                     throw new RenException("启动可靠性仿真评估算法库失败: errorMsg=" + errorMsg); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             logger.error("启动算法库仿真时发生Exception:", e); | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             logger.error("启动可靠性仿真评估算法库仿真时发生Exception:", e); | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             result = Result.error(e.getMessage()); | 
 |  |  |             throw new RenException("启动可靠性仿真评估算法库失败: errorMsg=" + e.getMessage()); | 
 |  |  |         } finally { | 
 |  |  |             if (is != null) { | 
 |  |  |                 try { | 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         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) { | 
 |  |  | 
 |  |  |         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. 计算各任务阶段的运行时长 | 
 |  |  | 
 |  |  |             Element root = document.addElement("des"); | 
 |  |  |             root.addAttribute("name", "General system"); | 
 |  |  |             addTasksTag(taskPhaseModelAll, root); | 
 |  |  |             addModelsTag(taskId, | 
 |  |  |             addModelsTag(simulatAssess, | 
 |  |  |                     taskId, | 
 |  |  |                     productId, | 
 |  |  |                     product.getName(), | 
 |  |  |                     product.getNamePath(), | 
 |  |  | 
 |  |  |             insert(simulatAssess); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             throw new RuntimeException("组装算法库仿真计算用模型XML失败: " + e.getMessage()); | 
 |  |  |             throw new RenException("组装算法库仿真计算用模型XML失败: " + e.getMessage()); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |                     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; | 
 |  |  |             } | 
 |  |  | 
 |  |  |         return taskPhases; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void addModelsTag(Long taskId, | 
 |  |  |     private void addModelsTag(SimulatAssess simulatAssess, | 
 |  |  |                               Long taskId, | 
 |  |  |                               Long productId, | 
 |  |  |                               String productName, | 
 |  |  |                               String productNamePath, | 
 |  |  | 
 |  |  |                     "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, | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 递归函数 | 
 |  |  |     private void node2DOM(Long taskId, | 
 |  |  |     private void node2DOM(SimulatAssess simulatAssess, | 
 |  |  |                           Long taskId, | 
 |  |  |                           TaskPhaseModel taskPhaseModel, | 
 |  |  |                           Long modelId, | 
 |  |  |                           Long productId, | 
 |  |  | 
 |  |  |                         "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(), | 
 |  |  | 
 |  |  |                         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"); | 
 |  |  |  | 
 |  |  | 
 |  |  |  | 
 |  |  |                 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()); | 
 |  |  | 
 |  |  |             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, | 
 |  |  | 
 |  |  |                 break; | 
 |  |  |             case 3: | 
 |  |  |                 // 二项分布 | 
 |  |  |                 if (taskBinoParam.getSimulatTimes().intValue() == taskBinoParam.getSuccessTimes().intValue()) { | 
 |  |  |                 if ((taskBinoParam.getSimulatTimes() == null && taskBinoParam.getSuccessTimes() == null) || | 
 |  |  |                         (taskBinoParam.getSimulatTimes().intValue() == taskBinoParam.getSuccessTimes().intValue())) { | 
 |  |  |                     // 相等则为成败型 | 
 |  |  |                     failureModel.setType(FailureModel.TYPE_FIX); | 
 |  |  |                     failureModel.setParam1(taskBinoParam.getSuccessRate()); | 
 |  |  | 
 |  |  |         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; | 
 |  |  | 
 |  |  |  | 
 |  |  |     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 { | 
 |  |  | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         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()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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) { | 
 |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         xmlJSONObj = XML.toJSONObject(xml); | 
 |  |  |         simulatAssess.setShowProductId(simulatAssess.getProductId()); | 
 |  |  |         simulatAssess.setShowProductId(simulatAssess.getProductId().toString()); | 
 |  |  |         SimulaDataDto data = this.getResultData(simulatAssess); | 
 |  |  |         return data; | 
 |  |  |     } | 
 |  |  | 
 |  |  |         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(" "); | 
 |  |  |                     // 遍历子字符串数组,将每个元素转换为double并存储到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(" "); | 
 |  |  |                 // 遍历子字符串数组,将每个元素转换为double并存储到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; | 
 |  |  |     } | 
 |  |  | } |