|  |  | 
 |  |  | 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; | 
 |  |  | 
 |  |  |     Map<Integer, String> templetsStrMap2 = new HashMap<>(); | 
 |  |  |  | 
 |  |  |     private JSONObject xmlJSONObj; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 分页查询 | 
 |  |  | 
 |  |  |  | 
 |  |  |         List<TimeDiagramStatusDto> statusDtoListNew = new ArrayList<>(); | 
 |  |  |         while (statusDtoListOld.size() > 0) { | 
 |  |  |             statusDtoListOld.stream().sorted(Comparator.comparing(TimeDiagramStatusDto::getX1)).collect(Collectors.toList()); | 
 |  |  |             //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); | 
 |  |  | 
 |  |  |                         currentStatusDto.setX2(nextStatusDto.getX1()); | 
 |  |  |                         statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus())); | 
 |  |  |                     } else if (nextStatusDto.getX1() > currentStatusDto.getX1() && nextStatusDto.getX2() < currentStatusDto.getX2()) { | 
 |  |  |                         currentStatusDto.setX2(nextStatusDto.getX1()); | 
 |  |  |                         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.getX2() > currentStatusDto.getX2()) { | 
 |  |  |                     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())); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public Boolean simulate(SimulatAssess simulatAssess) { | 
 |  |  |         Boolean result = false; | 
 |  |  |         // 2. 组装供算法库仿真的模型xml | 
 |  |  | 
 |  |  |         result = callReliaSimLib(simulatAssess); | 
 |  |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<SimulatAssess> process(QueryFilter queryFilter) { | 
 |  |  |         List<SimulatAssess> page = baseDao.getProcessList(queryFilter.getParams()); | 
 |  |  |         return queryFilter.getPageList(page); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private Boolean callReliaSimLib(SimulatAssess simulatAssess) { | 
 |  |  | 
 |  |  |             } else { | 
 |  |  |                 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")); | 
 |  |  | 
 |  |  |                 ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class); | 
 |  |  |                 if ("0".equals(rtn.getCode())) { | 
 |  |  |                     logger.info("启动可靠性仿真评估算法库成功。"); | 
 |  |  |                     newProcess(simulatAssess, pid, command); | 
 |  |  |                     update(simulatAssess); | 
 |  |  |                     result = true; | 
 |  |  |                 } else { | 
 |  |  |                     String errorMsg = rtn.getErrorMsg(); | 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         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) { | 
 |  |  | 
 |  |  |                 // 设备 | 
 |  |  |                 Integer deviceNo = node.getDeviceNo(); | 
 |  |  |                 Element nodeTag = parent.addElement("node"); | 
 |  |  |                 nodeTag.addAttribute("name", deviceNo == 0 ? dataId.toString() : dataId.toString()+"-"+deviceNo); | 
 |  |  |                 nodeTag.addAttribute("real_name", deviceNo == 0 ? product.getName() : product.getName()+"-"+deviceNo); | 
 |  |  |                 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"); | 
 |  |  |  | 
 |  |  | 
 |  |  |         return failureModel; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private boolean isRepairDirac(boolean repairDiracFlag, TaskPhaseModel taskPhaseModel, Long productId) { | 
 |  |  |     private boolean isRepairDirac(Boolean repairDiracFlag, TaskPhaseModel taskPhaseModel, Long productId) { | 
 |  |  |         boolean result = false; | 
 |  |  |  | 
 |  |  |         if (repairDiracFlag) { | 
 |  |  |             if (taskPhaseModel.getPhaseConstraints() != null) { | 
 |  |  |         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) { | 
 |  |  | 
 |  |  |     private RepairModel createRepairModelDirac(double time) { | 
 |  |  |         RepairModel repairModel = new RepairModel(); | 
 |  |  |         repairModel.setId(UUIDUtil.generateId()); | 
 |  |  |         repairModel.setType(RepairModel.TYPE_DIRAC); | 
 |  |  |         repairModel.setParam1(0); | 
 |  |  |         return repairModel; | 
 |  |  |     } | 
 |  |  | 
 |  |  |  | 
 |  |  |     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()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  | 
 |  |  |  | 
 |  |  |             simulatAssessList.add(simulatAssess); | 
 |  |  |             result = simulateChecK(simulatAssess); | 
 |  |  |             if (result!=null){ | 
 |  |  |             if (result != null) { | 
 |  |  |                 simulatResult.setType("errorList"); | 
 |  |  |                 simulatResult.setErrList(result); | 
 |  |  |                 return simulatResult; | 
 |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         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; | 
 |  |  |     } | 
 |  |  |  |