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