|  |  | 
 |  |  |  | 
 |  |  |         // 3. 调用算法库,进行评定计算 | 
 |  |  |         result = callReliaAssessLib(assessResult); | 
 |  |  |         if (result.getCode() != 0) throw new RenException(result.getMsg()); | 
 |  |  |  | 
 |  |  |         assessResultDao.insert(assessResult); | 
 |  |  |  | 
 |  |  |         List<ReliabilityAssess> list = this.getAssess(assessResult, assessId); | 
 |  |  | 
 |  |  |             for (ReliabilityAssess assess : list) { | 
 |  |  |                 Double result1 = null; | 
 |  |  |                 for (int i = 0; i < jsonArray.size(); i++) { | 
 |  |  |                     String nameValue = (String) jsonArray.getJSONObject(i).get("name"); | 
 |  |  |                     String nameValue = jsonArray.getJSONObject(i).get("name").toString(); | 
 |  |  |                     if (nameValue.contains(assess.getId().toString())) { | 
 |  |  |                         // 获取对应的值 | 
 |  |  |                         result1 = (Double)  jsonArray.getJSONObject(i).get("value"); | 
 |  |  |                         if (jsonArray.getJSONObject(i).get("value") instanceof Double){ | 
 |  |  |                             result1 = (Double)  jsonArray.getJSONObject(i).get("value"); | 
 |  |  |                         }else{ | 
 |  |  |                             String[] values = jsonArray.getJSONObject(i).get("value").toString().split(","); | 
 |  |  |                             result1 = Double.valueOf(values[1]); | 
 |  |  |                         } | 
 |  |  |                         break; // 如果找到就退出循环 | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  | 
 |  |  |     private void assembleModelXml(AssessResult assessResult) { | 
 |  |  | /* | 
 |  |  |         // 测试算法库用 | 
 |  |  |         String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + | 
 |  |  |                 "\n" + | 
 |  |  |                 "<des name=\"General system\" gama=\"0.7\">\n" + | 
 |  |  |         String xml = "<des name=\"General system\" gama=\"0.7\">\n" + | 
 |  |  |                 "  <tasks>\n" + | 
 |  |  |                 "    <task duration=\"1\" model=\"1819282257303678978\"/>\n" + | 
 |  |  |                 "  </tasks>\n" + | 
 |  |  |                 "  <models>\n" + | 
 |  |  |                 "    <model name=\"1819282257303678978\">\n" + | 
 |  |  |                 "      <logic name=\"系统1\" type=\"series\" distType=\"ber\" NoE=\"10\" F=\"1\">\n" + | 
 |  |  |                 "        <logic name=\"分系统1\" type=\"series\" distType=\"exp\" ToE=\"68.0\" F=\"1\">\n" + | 
 |  |  |                 "      <logic name=\"系统\" type=\"series\" >\n" + | 
 |  |  |                 "        <logic name=\"分系统1\" type=\"series\"  >\n" + | 
 |  |  |                 "          <logic name=\"v1\" type=\"parallel\" nums=\"2\">\n" + | 
 |  |  |                 "              <node name=\"设备1\" distType=\"ber\" NoE=\"20\" F=\"1\"/>\n" + | 
 |  |  |                 "              <node name=\"设备1\" distType=\"exp\" ToE=\"20\" F=\"1\"/>\n" + | 
 |  |  |                 "          </logic>\n" + | 
 |  |  |                 "          <node name=\"设备2\" distType=\"exp\" ToE=\"62.0\" F=\"1\"/>\n" + | 
 |  |  |                 "          <node name=\"设备2\" distType=\"exp\" ToE=\"0.3\" F=\"1\"/>\n" + | 
 |  |  |                 "        </logic>\n" + | 
 |  |  |                 "        <logic name=\"分系统2\" type=\"series\" distType=\"ber\" NoE=\"14\" F=\"0\">\n" + | 
 |  |  |                 "          <node name=\"设备3\" distType=\"ber\" NoE=\"58\" F=\"0\"/>\n" + | 
 |  |  |                 "        <logic name=\"分系统2\" type=\"series\" >\n" + | 
 |  |  |                 "          <node name=\"设备3\" distType=\"exp\" ToE=\"0.2\" F=\"0\"/>\n" + | 
 |  |  |                 "          <node name=\"设备4\" distType=\"ber\"  NoE=\"18\" F=\"0\"/>\n" + | 
 |  |  |                 "          <logic name=\"v2\" type=\"series\" nums=\"2\">\n" + | 
 |  |  |                 "              <node name=\"设备5\" distType=\"exp\" ToE=\"88.0\" F=\"1\"/>\n" + | 
 |  |  |                 "              <node name=\"设备5\" distType=\"exp\" ToE=\"0.5,0,6\" F=\"1,2\"/>\n" + | 
 |  |  |                 "          </logic>          \n" + | 
 |  |  |                 "          <node name=\"设备6\" distType=\"ber\"  NoE=\"71.52\" F=\"1\"/>\n" + | 
 |  |  |                 "          <node name=\"设备6\" distType=\"exp\"  ToE=\"0.3\" F=\"1\"/>\n" + | 
 |  |  |                 "        </logic>\n" + | 
 |  |  |                 "        <logic name=\"分系统3\" type=\"vote\" distType=\"exp\" nums=\"3\" k=\"2\" ToE=\"68.0\" F=\"2\">\n" + | 
 |  |  |                 "          <node name=\"设备7\" distType=\"exp\"  ToE=\"86\" F=\"1\"/>\n" + | 
 |  |  |                 "        <logic name=\"分系统3\" type=\"vote\" nums=\"3\" k=\"2\" >\n" + | 
 |  |  |                 "          <node name=\"设备7\" distType=\"exp\"  ToE=\"87\" F=\"1\"/>\n" + | 
 |  |  |                 "        </logic>\n" + | 
 |  |  |                 "      </logic>\n" + | 
 |  |  |                 "    </model>\n" + | 
 |  |  |                 "  </models>\n" + | 
 |  |  |                 "</des>"; | 
 |  |  |         assessResult.setXml(xml); | 
 |  |  |         String xml1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + | 
 |  |  |                 "\n" + | 
 |  |  |                 "<des name=\"General system\" gama=\"0.6\">\n" + | 
 |  |  |                 "  <tasks>\n" + | 
 |  |  |                 "    <task duration=\"1.0\" model=\"1839217232446533633\"/>\n" + | 
 |  |  |                 "  </tasks>\n" + | 
 |  |  |                 "  <models>\n" + | 
 |  |  |                 "    <model name=\"1839217232446533633\">\n" + | 
 |  |  |                 "      <logic name=\"1727338143768926498\" real_name=\"评审用船A\" type=\"series\">\n" + | 
 |  |  |                 "        <logic name=\"1727338125295232953\" real_name=\"通信系统\" name_path=\"通信系统\" type=\"series\">\n" + | 
 |  |  |                 "            <logic name=\"v1\" type=\"parallel\" nums=\"2\">\n" + | 
 |  |  |                 "              <node name=\"1727338347041863487,1727338104458428136\" real_name=\"对讲机\" name_path=\"通信系统,对讲机b\" distType=\"ber\" NoE=\"0,10\" F=\"0,1\"/>\n" + | 
 |  |  |                 "            </logic>\n" + | 
 |  |  |                 "          <node name=\"1727338109884317860\" real_name=\"交换机\" name_path=\"通信系统,交换机\" distType=\"exp\" ToE=\"10\" F=\"1\"/>\n" + | 
 |  |  |                 "        </logic>\n" + | 
 |  |  |                 "        <logic name=\"1727338132480394459\" real_name=\"空调系统\" name_path=\"空调系统\" type=\"vote\" k=\"2\" nums=\"3\">\n" + | 
 |  |  |                 "            <node name=\"1727338148414415252,1727338894880570868,1727338666019181419\" real_name=\"空调\" name_path=\"空调系统,空调c\" distType=\"exp\" ToE=\"88,87,86\" F=\"8,7,6\"/>\n" + | 
 |  |  |                 "        </logic>\n" + | 
 |  |  |                 "        <logic name=\"1727338199831104683\" real_name=\"电力系统\" name_path=\"电力系统\" type=\"series\">\n" + | 
 |  |  |                 "          <node name=\"1727338129701280729\" real_name=\"发电机2\" name_path=\"电力系统,发电机2\" distType=\"ber\" NoE=\"20\" F=\"2\"/>\n" + | 
 |  |  |                 "          <node name=\"1727338865212183133\" real_name=\"发电机1\" name_path=\"电力系统,发电机1\" distType=\"exp\" ToE=\"20\" F=\"2\"/>\n" + | 
 |  |  |                 "          <node name=\"1727338589328410328\" real_name=\"配电板\" name_path=\"电力系统,配电板\" distType=\"exp\" ToE=\"50\" F=\"5\"/>\n" + | 
 |  |  |                 "          <logic name=\"v3\" type=\"series\" nums=\"2\">\n" + | 
 |  |  |                 "            <node name=\"1727338101737644187,1727338554151292452\" real_name=\"蓄电池\" name_path=\"电力系统,蓄电池a\" distType=\"exp\" ToE=\"30,40\" F=\"3,4\"/>\n" + | 
 |  |  |                 "          </logic>\n" + | 
 |  |  |                 "        </logic>\n" + | 
 |  |  |                 "      </logic>\n" + | 
 |  |  |                 "    </model>\n" + | 
 |  |  |                 "  </models>\n" + | 
 |  |  |                 "</des>"; | 
 |  |  |         assessResult.setXml(xml1); | 
 |  |  | */ | 
 |  |  |         Long productId = assessResult.getProductId(); | 
 |  |  |         Long taskId = assessResult.getTaskId(); | 
 |  |  | 
 |  |  |                               List<TaskPhaseModel> taskPhaseModelAll, | 
 |  |  |                               List<ReliabilityAssess> assessDataList, | 
 |  |  |                               Element root) { | 
 |  |  |         Map<String, Integer> vCounter = new HashMap<>(); | 
 |  |  |         vCounter.put("v", 0); | 
 |  |  |         Element modelsTag = root.addElement("models"); | 
 |  |  |         for (TaskPhaseModel taskPhaseModel : taskPhaseModelAll) { | 
 |  |  |             Element modelTag = modelsTag.addElement("model"); | 
 |  |  | 
 |  |  |                     null, | 
 |  |  |                     list, | 
 |  |  |                     null, null, null, null, | 
 |  |  |                     modelTag); | 
 |  |  |                     modelTag, | 
 |  |  |                     vCounter); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |                           String NoE, | 
 |  |  |                           String ToE, | 
 |  |  |                           String F, | 
 |  |  |                           Element parent) { | 
 |  |  |                           Element parent, | 
 |  |  |                           Map<String, Integer> vCounter) { | 
 |  |  |         if (sameNameGroup) { | 
 |  |  |             // 相同设备的分组 | 
 |  |  |             Element sameNameGroupTag = parent.addElement("logic"); | 
 |  |  |             sameNameGroupTag.addAttribute("name", | 
 |  |  |                     nodeList.stream().map(item -> item.getId().toString()).collect(Collectors.joining(","))); | 
 |  |  |             if ("parallel".equals(sameNameGroupAlgorithmType)) { | 
 |  |  |                 sameNameGroupTag.addAttribute("type", "parallel"); | 
 |  |  |             } else { | 
 |  |  |                 sameNameGroupTag.addAttribute("type", "series"); | 
 |  |  |             } | 
 |  |  |             sameNameGroupTag.addAttribute("nums", String.valueOf(nodeList.size())); | 
 |  |  |             Long dataId = nodeList.get(0).getDataId(); | 
 |  |  |             XhProductModel product = productList.stream().filter(item -> | 
 |  |  |                     dataId.equals(item.getId())).collect(Collectors.toList()).get(0); | 
 |  |  |             ParamData paramData = paramDataList.stream().filter(item -> | 
 |  |  |                     dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); | 
 |  |  |             String NoEStr = ""; | 
 |  |  |             String ToEStr = ""; | 
 |  |  |             String FStr = ""; | 
 |  |  |             for (ModelNode node : nodeList) { | 
 |  |  | //            for (ModelNode node : nodeList) { | 
 |  |  |                 List<ReliabilityAssess> assessDatas = assessDataList.stream().filter(item -> | 
 |  |  |                         node.getDataId().equals(item.getId())).collect(Collectors.toList()); | 
 |  |  |                         dataId.equals(item.getId())).collect(Collectors.toList()); | 
 |  |  |                 NoEStr += ","; | 
 |  |  |                 ToEStr += ","; | 
 |  |  |                 FStr += ","; | 
 |  |  | 
 |  |  |                     ToEStr += assessDatas.get(0).getRunTimes() != null ? assessDatas.get(0).getRunTimes().toString() : "0"; | 
 |  |  |                     FStr += assessDatas.get(0).getFailNum() != null ? assessDatas.get(0).getFailNum().toString() : "0"; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  | //            } | 
 |  |  |             NoEStr = NoEStr.substring(1); | 
 |  |  |             ToEStr = ToEStr.substring(1); | 
 |  |  |             FStr = FStr.substring(1); | 
 |  |  |             for (ModelNode node : nodeList) { | 
 |  |  |                 List<ModelNode> list = new ArrayList<>(); | 
 |  |  |                 list.add(node); | 
 |  |  |                 node2DOM(taskId, | 
 |  |  |                         taskPhaseModel, | 
 |  |  |                         modelId, | 
 |  |  |                         null, | 
 |  |  |                         null, | 
 |  |  |                         null, | 
 |  |  |                         productList, | 
 |  |  |                         paramDataList, | 
 |  |  |                         gkModelsAssembled, | 
 |  |  |                         algorithmList, | 
 |  |  |                         modelNodeAndVnodeList, | 
 |  |  |                         assessDataList, | 
 |  |  |                         false, | 
 |  |  |                         null, | 
 |  |  |                         list, | 
 |  |  |                         paramData.getReliabDistribType(), NoEStr, ToEStr, FStr, | 
 |  |  |                         sameNameGroupTag); | 
 |  |  |  | 
 |  |  |             int counter = vCounter.get("v"); | 
 |  |  |             counter++; | 
 |  |  |             vCounter.put("v", counter); | 
 |  |  |             Element sameNameGroupTag = parent.addElement("logic"); | 
 |  |  |             sameNameGroupTag.addAttribute("name", | 
 |  |  |                     "v"+counter); | 
 |  |  |             if ("parallel".equals(sameNameGroupAlgorithmType)) { | 
 |  |  |                 sameNameGroupTag.addAttribute("type", "parallel"); | 
 |  |  |             } else { | 
 |  |  |                 sameNameGroupTag.addAttribute("type", "series"); | 
 |  |  |             } | 
 |  |  |             sameNameGroupTag.addAttribute("nums", String.valueOf(nodeList.size())); | 
 |  |  |             Element nodeTag = sameNameGroupTag.addElement("node"); | 
 |  |  |             nodeTag.addAttribute("name", | 
 |  |  |                     nodeList.stream().map(item -> item.getDataId().toString()+"-"+item.getDeviceNo().toString()). | 
 |  |  |                             collect(Collectors.joining(","))); | 
 |  |  |             nodeTag.addAttribute("real_name", product.getSameSbName()); | 
 |  |  |             nodeTag.addAttribute("name_path", product.getNamePath()); | 
 |  |  |             if (paramData.getReliabDistribType() == 3) { | 
 |  |  |                 // 二项分布 | 
 |  |  |                 nodeTag.addAttribute("distType", "ber"); | 
 |  |  |                 nodeTag.addAttribute("NoE", NoEStr); | 
 |  |  |             } else { | 
 |  |  |                 nodeTag.addAttribute("distType", "exp"); | 
 |  |  |                 nodeTag.addAttribute("ToE", ToEStr); | 
 |  |  |             } | 
 |  |  |             nodeTag.addAttribute("F", FStr); | 
 |  |  |         } else { | 
 |  |  |             // 不同设备(只有1个) | 
 |  |  |             ModelNode node = nodeList.get(0); | 
 |  |  | 
 |  |  |                             null, | 
 |  |  |                             list, | 
 |  |  |                             null, null, null, null, | 
 |  |  |                             parent); | 
 |  |  |                             parent, | 
 |  |  |                             vCounter); | 
 |  |  |                 } else if ("5".equals(product.getProductType())) { | 
 |  |  |                     // 设备 | 
 |  |  |                     Element nodeTag = parent.addElement("node"); | 
 |  |  | 
 |  |  |                 // vnode(运算节点) | 
 |  |  |                 Algorithm algo = algorithmList.stream().filter(item -> | 
 |  |  |                         node.getId().equals(item.getId())).collect(Collectors.toList()).get(0); | 
 |  |  |                 if (!"series,parallel,vote".contains(algo.getAlgorithmType())) { | 
 |  |  |                     throw new RenException("可靠性评定功能目前只支持串联、并联和表决。"); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 Element element = parent.addElement("logic"); | 
 |  |  |                 if (null == productId) { | 
 |  |  |                     element.addAttribute("name", algo.getId().toString()); | 
 |  |  | 
 |  |  |                     element.addAttribute("real_name", productName); | 
 |  |  |                     element.addAttribute("name_path", productNamePath); | 
 |  |  |                 } | 
 |  |  |                 if ("series".equals(algo.getAlgorithmType())) { | 
 |  |  |                     element.addAttribute("type", "series"); | 
 |  |  |                 } else if ("parallel".equals(algo.getAlgorithmType())) { | 
 |  |  |                     element.addAttribute("type", "parallel"); | 
 |  |  |                 } else if ("vote".equals(algo.getAlgorithmType())) { | 
 |  |  |                     element.addAttribute("type", "vote"); | 
 |  |  |                     element.addAttribute("k", algo.getVoteNum().toString()); | 
 |  |  |                 } else if ("switch".equals(algo.getAlgorithmType())) { | 
 |  |  |                     element.addAttribute("type", "standby"); | 
 |  |  |                 } else if ("bridge".equals(algo.getAlgorithmType())) { | 
 |  |  |                     element.addAttribute("type", "bridge"); | 
 |  |  |                 } | 
 |  |  |                 // 根据名字进行分组处理 | 
 |  |  |                 element.addAttribute("type", algo.getAlgorithmType()); | 
 |  |  |  | 
 |  |  |                 String[] computerNodeListStr = algo.getComputerList().split(","); | 
 |  |  |  | 
 |  |  |                 List<Integer> distTypes = new ArrayList<>(); | 
 |  |  |                 List<ModelNode> nodes = new ArrayList<>(); | 
 |  |  |                 List<ReliabilityAssess> assessDatas = new ArrayList<>(); | 
 |  |  |                 for (String nodeStr : computerNodeListStr) { | 
 |  |  |                     ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> | 
 |  |  |                             nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); | 
 |  |  |                     nodes.add(mn); | 
 |  |  |                     if (mn.getDataId() == null) { | 
 |  |  |                         distTypes.add(null); | 
 |  |  |                         assessDatas.add(null); | 
 |  |  |                     } else { | 
 |  |  |                         List<ParamData> paramDatas1 = paramDataList.stream().filter(item -> | 
 |  |  |                                 mn.getDataId().equals(item.getProductId())).collect(Collectors.toList()); | 
 |  |  |                         if (paramDatas1.size() > 0) { | 
 |  |  |                             distTypes.add(paramDatas1.get(0).getReliabDistribType()); | 
 |  |  |                         } else { | 
 |  |  |                             distTypes.add(null); | 
 |  |  |                         } | 
 |  |  |                         List<ReliabilityAssess> assessDatas1 = assessDataList.stream().filter(item -> | 
 |  |  |                                 mn.getDataId().equals(item.getId())).collect(Collectors.toList()); | 
 |  |  |                         if (assessDatas1.size() > 0) { | 
 |  |  |                             assessDatas.add(assessDatas1.get(0)); | 
 |  |  |                         } else { | 
 |  |  |                             assessDatas.add(null); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 根据同类设备名称进行分组处理(改为根据dataId进行分组) | 
 |  |  |                 Map<String, List<ModelNode>> groupByNameMap = new HashMap<>(); | 
 |  |  |                 for (String nodeStr : computerNodeListStr) { | 
 |  |  |                     ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> | 
 |  |  |                             nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); | 
 |  |  |                     if (mn.getDataId() == null) { | 
 |  |  |                     String sameSbName = null; | 
 |  |  |                     if (mn.getDataId() != null) { | 
 |  |  | //                        XhProductModel product = productList.stream().filter(item -> | 
 |  |  | //                                mn.getDataId().equals(item.getId())).collect(Collectors.toList()).get(0); | 
 |  |  | //                        if ("5".equals(product.getProductType())) sameSbName = product.getSameSbName(); | 
 |  |  |                         sameSbName = mn.getDataId().toString(); | 
 |  |  |                     } | 
 |  |  |                     if (sameSbName == null) { | 
 |  |  |                         List<ModelNode> list = new ArrayList<>(); | 
 |  |  |                         list.add(mn); | 
 |  |  |                         groupByNameMap.put(mn.getId().toString(), list); | 
 |  |  |                     } else { | 
 |  |  |                         XhProductModel product = productList.stream().filter(item -> | 
 |  |  |                                 mn.getDataId().equals(item.getId())).collect(Collectors.toList()).get(0); | 
 |  |  |                         String name = product.getName(); | 
 |  |  |                         if (groupByNameMap.containsKey(name)) { | 
 |  |  |                             groupByNameMap.get(name).add(mn); | 
 |  |  |                         if (groupByNameMap.containsKey(sameSbName)) { | 
 |  |  |                             groupByNameMap.get(sameSbName).add(mn); | 
 |  |  |                         } else { | 
 |  |  |                             List<ModelNode> list = new ArrayList<>(); | 
 |  |  |                             list.add(mn); | 
 |  |  |                             groupByNameMap.put(name, list); | 
 |  |  |                             groupByNameMap.put(sameSbName, list); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 表决 | 
 |  |  |                 if ("vote".equals(algo.getAlgorithmType())) { | 
 |  |  |                     element.addAttribute("k", algo.getVoteNum().toString()); | 
 |  |  |                     if (groupByNameMap.size() == 1) { | 
 |  |  |                         // 只有1个分组,说明设备都相同 | 
 |  |  |                         element.addAttribute("nums", String.valueOf(computerNodeListStr.length)); | 
 |  |  |                         Element nodeTag = element.addElement("node"); | 
 |  |  |                         createNodeTagSameDevice(nodes, distTypes, assessDatas, nodeTag); | 
 |  |  |                     } else { | 
 |  |  |                         // 不全是相同设备,按不同设备处理 | 
 |  |  |                         for (int i = 0; i < computerNodeListStr.length; i++) { | 
 |  |  |                             List<ModelNode> list = new ArrayList<>(); | 
 |  |  |                             list.add(nodes.get(i)); | 
 |  |  |                             String NoEStr = "0"; | 
 |  |  |                             String ToEStr = "0"; | 
 |  |  |                             String FStr = "0"; | 
 |  |  |                             if (assessDatas.get(i) != null) { | 
 |  |  |                                 NoEStr = assessDatas.get(i).getRunNum() != null ? assessDatas.get(i).getRunNum().toString() : "0"; | 
 |  |  |                                 ToEStr = assessDatas.get(i).getRunTimes() != null ? assessDatas.get(i).getRunTimes().toString() : "0"; | 
 |  |  |                                 FStr = assessDatas.get(i).getFailNum() != null ? assessDatas.get(i).getFailNum().toString() : "0"; | 
 |  |  |                             } | 
 |  |  |                             node2DOM(taskId, | 
 |  |  |                                     taskPhaseModel, | 
 |  |  |                                     modelId, | 
 |  |  |                                     null, | 
 |  |  |                                     null, | 
 |  |  |                                     null, | 
 |  |  |                                     productList, | 
 |  |  |                                     paramDataList, | 
 |  |  |                                     gkModelsAssembled, | 
 |  |  |                                     algorithmList, | 
 |  |  |                                     modelNodeAndVnodeList, | 
 |  |  |                                     assessDataList, | 
 |  |  |                                     false, | 
 |  |  |                                     null, | 
 |  |  |                                     list, | 
 |  |  |                                     distTypes.get(i), NoEStr, ToEStr, FStr, | 
 |  |  |                                     element, | 
 |  |  |                                     vCounter); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if ("parallel".equals(algo.getAlgorithmType())) { | 
 |  |  |                     if (groupByNameMap.size() == 1) { | 
 |  |  |                         // 只有1个分组,说明设备都相同 | 
 |  |  |                         element.addAttribute("nums", String.valueOf(computerNodeListStr.length)); | 
 |  |  |                         Element nodeTag = element.addElement("node"); | 
 |  |  |                         createNodeTagSameDevice(nodes, distTypes, assessDatas, nodeTag); | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 Iterator<String> iterator = groupByNameMap.keySet().iterator(); | 
 |  |  |                 while (iterator.hasNext()) { | 
 |  |  |                     String name = iterator.next(); | 
 |  |  | 
 |  |  |                                 algo.getAlgorithmType(), | 
 |  |  |                                 list, | 
 |  |  |                                 null, null, null, null, | 
 |  |  |                                 element); | 
 |  |  |                                 element, | 
 |  |  |                                 vCounter); | 
 |  |  |                     } else { | 
 |  |  |                         // 不同名称节点(1个节点) | 
 |  |  |                         Integer distTypeParam = null; | 
 |  |  | 
 |  |  |                             if (paramDatas.size() > 0) { | 
 |  |  |                                 distTypeParam = paramDatas.get(0).getReliabDistribType(); | 
 |  |  |                             } | 
 |  |  |                             List<ReliabilityAssess> assessDatas = assessDataList.stream().filter(item -> | 
 |  |  |                             List<ReliabilityAssess> assessDatas1 = assessDataList.stream().filter(item -> | 
 |  |  |                                     oneNode.getDataId().equals(item.getId())).collect(Collectors.toList()); | 
 |  |  |                             if (assessDatas.size() > 0) { | 
 |  |  |                                 NoEStr = assessDatas.get(0).getRunNum() != null ? assessDatas.get(0).getRunNum().toString() : "0"; | 
 |  |  |                                 ToEStr = assessDatas.get(0).getRunTimes() != null ? assessDatas.get(0).getRunTimes().toString() : "0"; | 
 |  |  |                                 FStr = assessDatas.get(0).getFailNum() != null ? assessDatas.get(0).getFailNum().toString() : "0"; | 
 |  |  |                             if (assessDatas1.size() > 0) { | 
 |  |  |                                 NoEStr = assessDatas1.get(0).getRunNum() != null ? assessDatas1.get(0).getRunNum().toString() : "0"; | 
 |  |  |                                 ToEStr = assessDatas1.get(0).getRunTimes() != null ? assessDatas1.get(0).getRunTimes().toString() : "0"; | 
 |  |  |                                 FStr = assessDatas1.get(0).getFailNum() != null ? assessDatas1.get(0).getFailNum().toString() : "0"; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                         node2DOM(taskId, | 
 |  |  | 
 |  |  |                                 null, | 
 |  |  |                                 list, | 
 |  |  |                                 distTypeParam, NoEStr, ToEStr, FStr, | 
 |  |  |                                 element); | 
 |  |  |                                 element, | 
 |  |  |                                 vCounter); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void createNodeTagSameDevice(List<ModelNode> nodes, | 
 |  |  |                                          List<Integer> distTypes, | 
 |  |  |                                          List<ReliabilityAssess> assessDatas, | 
 |  |  |                                          Element nodeTag) { | 
 |  |  |         String NoEStr = ""; | 
 |  |  |         String ToEStr = ""; | 
 |  |  |         String FStr = ""; | 
 |  |  |         for (ReliabilityAssess assessData : assessDatas) { | 
 |  |  |             if (assessData != null) { | 
 |  |  |                 NoEStr += "," + (assessData.getRunNum() != null ? assessData.getRunNum().toString() : "0"); | 
 |  |  |                 ToEStr += "," + (assessData.getRunTimes() != null ? assessData.getRunTimes().toString() : "0"); | 
 |  |  |                 FStr += "," + (assessData.getFailNum() != null ? assessData.getFailNum().toString() : "0"); | 
 |  |  |                 break; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         NoEStr = NoEStr.substring(1); | 
 |  |  |         ToEStr = ToEStr.substring(1); | 
 |  |  |         FStr = FStr.substring(1); | 
 |  |  |  | 
 |  |  |         nodeTag.addAttribute("name", | 
 |  |  |                 nodes.stream().map(item -> item.getDataId().toString()+"-"+item.getDeviceNo().toString()). | 
 |  |  |                         collect(Collectors.joining(","))); | 
 |  |  |         if (distTypes.get(0) == 3) { | 
 |  |  |             // 二项分布 | 
 |  |  |             nodeTag.addAttribute("distType", "ber"); | 
 |  |  |             nodeTag.addAttribute("NoE", NoEStr); | 
 |  |  |         } else { | 
 |  |  |             nodeTag.addAttribute("distType", "exp"); | 
 |  |  |             nodeTag.addAttribute("ToE", ToEStr); | 
 |  |  |         } | 
 |  |  |         nodeTag.addAttribute("F", FStr); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void addTasksTag(List<TaskPhaseModel> taskPhaseModelAll, | 
 |  |  | 
 |  |  |         InputStream is = null; | 
 |  |  |         BufferedReader br = null; | 
 |  |  |         try { | 
 |  |  |             setParamToRedis(assessResult); | 
 |  |  |             try { | 
 |  |  |                 setParamToRedis(assessResult); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 throw new RenException("访问Redis失败。请检查Redis是否已启动。"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             Process process = null; | 
 |  |  |             String command = "python " + assessMain; | 
 |  |  | 
 |  |  |             } 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("暂不支持该操作系统,进行启动算法库计算!"); | 
 |  |  |             } | 
 |  |  |             is = process.getInputStream(); | 
 |  |  |             // 以命令行方式调用算法库时,接口约定返回的结果是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("启动可靠性评定算法库成功。"); | 
 |  |  |                     if (exitCode ==0) { | 
 |  |  |                         deleteAssessInfoInRedis(assessResult.getId()); | 
 |  |  |                         result = Result.ok(); | 
 |  |  |                     } else { | 
 |  |  |                         result = Result.error("可靠性评定算法库计算失败: exitCode=" + exitCode); | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     String errorMsg = rtn.getErrorMsg(); | 
 |  |  |                     throw new RuntimeException("启动算法库失败: errorMsg=" + errorMsg); | 
 |  |  |                     throw new RenException("启动可靠性评定算法库失败: errorMsg=" + errorMsg); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             deleteAssessInfoInRedis(assessResult.getId()); //TODO(发布时放开) | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             logger.error("启动可靠性评定算法库时发生Exception:", e); | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             result = Result.error(e.getMessage()); | 
 |  |  |             throw new RenException("启动可靠性评定算法库失败: errorMsg=" + e.getMessage()); | 
 |  |  |         } finally { | 
 |  |  |             if (is != null) { | 
 |  |  |                 try { |