From 12d84be70c42c5669ffc5db470ff54b71d093728 Mon Sep 17 00:00:00 2001 From: xyc <jc_xiong@hotmail.com> Date: 星期四, 26 九月 2024 10:28:15 +0800 Subject: [PATCH] 1)新增可靠性评定XML生成功能; 2)可靠性仿真评估与可靠性评定的算法包分开成2个包,启动脚本也相应地分开。 --- modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java | 381 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 340 insertions(+), 41 deletions(-) diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java index eb10bb2..15eea74 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java @@ -1,11 +1,7 @@ package com.zt.life.modules.mainPart.taskReliability.service; -import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.XML; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.zt.common.constant.Constant; -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; @@ -14,15 +10,11 @@ import com.zt.common.utils.TreeUtils; import com.zt.common.utils.UUIDUtil; import com.zt.core.shiro.ImportUtil; +import com.zt.life.modules.mainPart.basicInfo.dao.ParamDataDao; import com.zt.life.modules.mainPart.basicInfo.dao.XhProductModelDao; import com.zt.life.modules.mainPart.basicInfo.model.ParamData; -import com.zt.life.modules.mainPart.basicInfo.model.ProductImg; import com.zt.life.modules.mainPart.basicInfo.model.XhProductModel; -import com.zt.life.modules.mainPart.basicInfo.service.ParamDataService; -import com.zt.life.modules.mainPart.sysPictureBase.service.SysPictureBaseService; -import com.zt.life.modules.mainPart.taskReliability.dao.AssessResultDao; -import com.zt.life.modules.mainPart.taskReliability.dao.ReliabilityAssessDao; -import com.zt.life.modules.mainPart.taskReliability.dto.TaskModelCheckResultDto; +import com.zt.life.modules.mainPart.taskReliability.dao.*; import com.zt.life.modules.mainPart.taskReliability.model.*; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -47,6 +39,7 @@ import java.io.*; import java.util.*; +import java.util.stream.Collectors; /** @@ -64,17 +57,33 @@ private String redisHost; @Value("${spring.redis.port}") private String redisPort; - @Value("${data.reliaSimLib.mainPy}") - private String reliaSimMain; - @Value("${data.reliaSimLib.resultHome}") + @Value("${data.assessLib.mainPy}") + private String assessMain; + @Value("${data.assessLib.resultHome}") private String resultHome; - @Value("${data.reliaSimLib.resultHome}") + @Value("${data.assessLib.resultHome}") private String path; @Autowired private RedisTemplate redisTemplate; @Autowired + private TaskService taskService; + @Autowired + private SimulatAssessService simulatAssessService; + @Autowired private AssessResultDao assessResultDao; + @Autowired + private XhProductModelDao xhProductModelDao; + @Autowired + private ParamDataDao paramDataDao; + @Autowired + private ModelNodeAlgorithmDao modelNodeAlgorithmDao; + @Autowired + private AlgorithmDao algorithmDao; + @Autowired + private OperatConditModelDao operatConditModelDao; + @Autowired + private ReliabilityAssessDao reliabilityAssessDao; public List<ReliabilityAssess> page(AssessResult assessResult) { Long assessId = baseDao.getAssessId(assessResult.getItemId(), assessResult.getProductId(), assessResult.getTaskId()); @@ -186,7 +195,10 @@ } + // 寤虹珛浜у搧缁撴瀯鏍戞椂锛岀浉鍚岀殑璁惧澶氫釜浣跨敤鏃讹紝澶氫釜璁惧浣跨敤鐩稿悓鐨勫悕绉般�傝繖鏍凤紝鍦ㄦ澶勯�氳繃鍚嶇О鏉ュ垽鏂槸鍚︽槸鐩稿悓鐨勮澶囷紝鐩稿悓鐨勮澶囷紝闇�瑕佹嬁鍑烘潵浣滀负瀛愭爣绛惧祵濂楄繘xml銆� private void assembleModelXml(AssessResult assessResult) { +/* + // 娴嬭瘯绠楁硶搴撶敤 String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "\n" + "<des name=\"General system\" gama=\"0.7\">\n" + @@ -218,31 +230,30 @@ " </models>\n" + "</des>"; assessResult.setXml(xml); -/* - Long productId = simulatAssess.getProductId(); +*/ + Long productId = assessResult.getProductId(); + Long taskId = assessResult.getTaskId(); + Long itemId = assessResult.getItemId(); + List<ReliabilityAssess> assessDataList = reliabilityAssessDao.getProductList(productId, itemId); + Task task = taskService.get(taskId); XhProductModel product = xhProductModelDao.getById(productId); List<XhProductModel> productList = xhProductModelDao.getByShipId(productId); List<ParamData> paramDataList = paramDataDao.getDeviceParams(productId); - Long taskId = simulatAssess.getTaskModelId(); - Task task = taskService.get(taskId); - List<TaskBinoParam> binoParams = taskBinoParamDao.getBinoParams(taskId); // 1. 璁$畻鍚勪换鍔¢樁娈电殑杩愯鏃堕暱 - List<TaskPhase> taskPhases = calcTaskPhaseDuration(task); + List<TaskPhase> taskPhases = simulatAssessService.calcTaskPhaseDuration(task); // 2. 璁$畻鍚勫伐鍐垫ā鍨嬬殑杩愯鏃堕暱 List<TaskPhaseModel> taskPhaseModelAll = new ArrayList<>(); for (TaskPhase taskPhase : taskPhases) { - calcTaskPhaseModelDuration(taskPhase, taskPhaseModelAll); + simulatAssessService.calcTaskPhaseModelDuration(taskPhase, taskPhaseModelAll); } // 3. 灏嗗悇宸ュ喌妯″瀷閫掑綊鎷嗚В涓哄畬鏁寸殑鍙緵绠楁硶鍖呬豢鐪熻绠楃殑妯″瀷 try { - List<FailureModel> failureModels = new ArrayList<>(); - List<RepairModel> repairModels = new ArrayList<>(); - Document document = DocumentHelper.createDocument(); // 娣诲姞root鑺傜偣 Element root = document.addElement("des"); root.addAttribute("name", "General system"); + root.addAttribute("gama", assessResult.getConfidence().toString()); addTasksTag(taskPhaseModelAll, root); addModelsTag(taskId, productId, @@ -251,15 +262,8 @@ productList, paramDataList, taskPhaseModelAll, - binoParams, - root, - failureModels, repairModels); - addFailureModelsTag(failureModels, root); - addRepairModelsTag(repairModels, root); - saveSimulatAssessTaskPhaseModel(simulatAssess, - task, - taskPhases, - taskPhaseModelAll); + assessDataList, + root); // 杈撳嚭鏍煎紡鍖杧ml XMLWriter xmlWriter = null; @@ -269,17 +273,310 @@ StringWriter writer = new StringWriter(); xmlWriter = new XMLWriter(writer, format); xmlWriter.write(document); - simulatAssess.setXml(writer.toString()); + assessResult.setXml(writer.toString()); } finally { if (xmlWriter != null) xmlWriter.close(); } - // XML瀛樼洏 - insert(simulatAssess); } catch (Exception e) { e.printStackTrace(); - throw new RuntimeException("缁勮绠楁硶搴撲豢鐪熻绠楃敤妯″瀷XML澶辫触: " + e.getMessage()); + throw new RenException("缁勮绠楁硶搴撲豢鐪熻绠楃敤妯″瀷XML澶辫触: " + e.getMessage()); } -*/ + } + + private void addModelsTag(Long taskId, + Long productId, + String productName, + String productNamePath, + List<XhProductModel> productList, + List<ParamData> paramDataList, + List<TaskPhaseModel> taskPhaseModelAll, + List<ReliabilityAssess> assessDataList, + Element root) { + Element modelsTag = root.addElement("models"); + for (TaskPhaseModel taskPhaseModel : taskPhaseModelAll) { + Element modelTag = modelsTag.addElement("model"); + modelTag.addAttribute("name", taskPhaseModel.getOperatConditId().toString()); + List<OperatConditModel> gkModelsAssembled = operatConditModelDao.getGKModelAssembled( + taskPhaseModel.getOperatConditId()); + OperatConditModel gkModelTop = gkModelsAssembled.stream().filter(item -> + productId.equals(item.getProductId())).collect(Collectors.toList()).get(0); + List<ModelNode> modelNodeAndVnodeList = modelNodeAlgorithmDao.getListByModelId(gkModelTop.getModelId()); + List<Algorithm> algorithmList = algorithmDao.getListByModelId(gkModelTop.getModelId()); + // 灏嗘ā鍨嬭浆鎹负DOM锛屾坊鍔犲埌model鏍囩 + Algorithm endAlgo = algorithmList.stream().filter(item -> + "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); + List<ModelNode> list = new ArrayList<>(); + list.add(computerNode); + node2DOM(taskId, + taskPhaseModel, + gkModelTop.getModelId(), + productId, + productName, + productNamePath, + productList, + paramDataList, + gkModelsAssembled, + algorithmList, + modelNodeAndVnodeList, + assessDataList, + false, + null, + list, + null, null, null, null, + modelTag); + } + } + + // 閫掑綊鍑芥暟 + private void node2DOM(Long taskId, + TaskPhaseModel taskPhaseModel, + Long modelId, + Long productId, + String productName, + String productNamePath, + List<XhProductModel> productList, + List<ParamData> paramDataList, + List<OperatConditModel> gkModelsAssembled, + List<Algorithm> algorithmList, + List<ModelNode> modelNodeAndVnodeList, + List<ReliabilityAssess> assessDataList, + boolean sameNameGroup, + String sameNameGroupAlgorithmType, + List<ModelNode> nodeList, + Integer distType, + String NoE, + String ToE, + String F, + Element parent) { + 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(); + 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) { + List<ReliabilityAssess> assessDatas = assessDataList.stream().filter(item -> + node.getDataId().equals(item.getId())).collect(Collectors.toList()); + NoEStr += ","; + ToEStr += ","; + FStr += ","; + 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"; + } + } + 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); + } + } else { + // 涓嶅悓璁惧锛堝彧鏈�1涓級 + ModelNode node = nodeList.get(0); + if ("node".equals(node.getNodeType())) { + Long dataId = node.getDataId(); + XhProductModel product = productList.stream().filter(item -> + dataId.equals(item.getId())).collect(Collectors.toList()).get(0); + if ("3,4,10".contains(product.getProductType())) { + // 绯荤粺銆佸垎绯荤粺銆佽櫄鍗曞厓 + OperatConditModel gkModel = gkModelsAssembled.stream().filter(item -> + dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); + List<Algorithm> algorithmListSub = algorithmDao.getListByModelId(gkModel.getModelId()); + List<ModelNode> modelNodeAndVnodeListSub = modelNodeAlgorithmDao.getListByModelId(gkModel.getModelId()); + Algorithm endAlgo = algorithmListSub.stream().filter(item -> + "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); + List<ModelNode> list = new ArrayList<>(); + list.add(computerNode); + node2DOM(taskId, + taskPhaseModel, + gkModel.getModelId(), + product.getId(), + product.getName(), + product.getNamePath(), + productList, + paramDataList, + gkModelsAssembled, + algorithmListSub, + modelNodeAndVnodeListSub, + assessDataList, + false, + null, + list, + null, null, null, null, + parent); + } else if ("5".equals(product.getProductType())) { + // 璁惧 + Element nodeTag = parent.addElement("node"); + nodeTag.addAttribute("name", dataId.toString()); + nodeTag.addAttribute("real_name", product.getName()); + nodeTag.addAttribute("name_path", product.getNamePath()); + if (distType == 3) { + // 浜岄」鍒嗗竷 + nodeTag.addAttribute("distType", "ber"); + nodeTag.addAttribute("NoE", NoE); + } else { + nodeTag.addAttribute("distType", "exp"); + nodeTag.addAttribute("ToE", ToE); + } + nodeTag.addAttribute("F", F); + } + } else { + // vnode锛堣繍绠楄妭鐐癸級 + Algorithm algo = algorithmList.stream().filter(item -> + node.getId().equals(item.getId())).collect(Collectors.toList()).get(0); + Element element = parent.addElement("logic"); + if (null == productId) { + element.addAttribute("name", algo.getId().toString()); + } else { + element.addAttribute("name", productId.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"); + } + // 鏍规嵁鍚嶅瓧杩涜鍒嗙粍澶勭悊 + String[] computerNodeListStr = algo.getComputerList().split(","); + 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) { + 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); + } else { + List<ModelNode> list = new ArrayList<>(); + list.add(mn); + groupByNameMap.put(name, list); + } + } + } + Iterator<String> iterator = groupByNameMap.keySet().iterator(); + while (iterator.hasNext()) { + String name = iterator.next(); + List<ModelNode> list = groupByNameMap.get(name); + if (list.size() > 1) { + // 鐩稿悓鍚嶇О鐨勮澶� + node2DOM(taskId, + taskPhaseModel, + modelId, + null, + null, + null, + productList, + paramDataList, + gkModelsAssembled, + algorithmList, + modelNodeAndVnodeList, + assessDataList, + true, + algo.getAlgorithmType(), + list, + null, null, null, null, + element); + } else { + // 涓嶅悓鍚嶇О鑺傜偣锛�1涓妭鐐癸級 + Integer distTypeParam = null; + String NoEStr = null; + String ToEStr = null; + String FStr = null; + ModelNode oneNode = list.get(0); + if (oneNode.getDataId() != null) { + List<ParamData> paramDatas = paramDataList.stream().filter(item -> + oneNode.getDataId().equals(item.getProductId())).collect(Collectors.toList()); + if (paramDatas.size() > 0) { + distTypeParam = paramDatas.get(0).getReliabDistribType(); + } + List<ReliabilityAssess> assessDatas = 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"; + } + } + node2DOM(taskId, + taskPhaseModel, + modelId, + null, + null, + null, + productList, + paramDataList, + gkModelsAssembled, + algorithmList, + modelNodeAndVnodeList, + assessDataList, + false, + null, + list, + distTypeParam, NoEStr, ToEStr, FStr, + element); + } + } + } + } + } + + private void addTasksTag(List<TaskPhaseModel> taskPhaseModelAll, + Element root) { + Element tasksTag = root.addElement("tasks"); + for (TaskPhaseModel taskPhaseModel : taskPhaseModelAll) { + Element taskTag = tasksTag.addElement("task"); + taskTag.addAttribute("duration", String.valueOf(taskPhaseModel.getOperatConditDuration())); + taskTag.addAttribute("model", taskPhaseModel.getOperatConditId().toString()); + } } private Result callReliaAssessLib(AssessResult assessResult) { @@ -290,7 +587,7 @@ setParamToRedis(assessResult); Process process = null; - String command = "python " + reliaSimMain; + String command = "python " + assessMain; command += " -ip " + redisHost + " -port " + redisPort; command += " -taskType " + RELIA_ASSESS_TASK_TYPE_SIMULATION + " -taskId " + assessResult.getId().toString(); logger.info("cmd鍛戒护涓猴細" + command); @@ -317,6 +614,8 @@ throw new RuntimeException("鍚姩绠楁硶搴撳け璐�: errorMsg=" + errorMsg); } } + + deleteAssessInfoInRedis(assessResult.getId()); //TODO锛堝彂甯冩椂鏀惧紑锛� } catch (Exception e) { logger.error("鍚姩鍙潬鎬ц瘎瀹氱畻娉曞簱鏃跺彂鐢烢xception锛�", e); e.printStackTrace(); @@ -351,8 +650,8 @@ redisTemplate.opsForValue().set(key, jsonObject.toJSONString()); } - public void deleteAssessInfoInRedis(Long simId) { - redisTemplate.delete(simId.toString() + RELIA_ASSESS_TASK_TYPE_SIMULATION); + public void deleteAssessInfoInRedis(Long assessId) { + redisTemplate.delete(assessId.toString() + RELIA_ASSESS_TASK_TYPE_SIMULATION); } -- Gitblit v1.9.1