From d9b3b4b0ad0f4022cbb406a9fb3ad56a5e7f7ff3 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期五, 02 八月 2024 17:31:33 +0800
Subject: [PATCH] 修改仿真

---
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java |  517 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 512 insertions(+), 5 deletions(-)

diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java
index 23b87cf..880ecaf 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java
@@ -1,18 +1,31 @@
 package com.zt.life.modules.mainPart.taskReliability.service;
 
-import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONArray;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.spire.pdf.tables.table.convert.Convert;
 import com.zt.common.exception.RenException;
 import com.zt.common.service.BaseService;
 import com.zt.common.servlet.Result;
-import com.zt.common.utils.JsonUtils2;
 import com.zt.common.utils.UUIDUtil;
+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.XhProductModel;
+import com.zt.life.modules.mainPart.taskReliability.dao.*;
+import com.zt.common.utils.JsonUtils2;
 import com.zt.life.modules.mainPart.taskReliability.dao.SimulatAssessDao;
 import com.zt.life.modules.mainPart.taskReliability.dao.TimeDiagramDao;
-import com.zt.life.modules.mainPart.taskReliability.dto.ModelDto;
 import com.zt.life.modules.mainPart.taskReliability.dto.ProductStatusDto;
+import com.zt.life.modules.mainPart.taskReliability.dto.TaskModelCheckResult;
+import com.zt.life.modules.mainPart.taskReliability.model.*;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import com.zt.life.modules.mainPart.taskReliability.dto.StatusDto;
 import com.zt.life.modules.mainPart.taskReliability.model.ModelRbd;
 import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess;
@@ -20,8 +33,15 @@
 import com.zt.life.modules.mainPart.taskReliability.model.TimeDiagram;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
@@ -38,7 +58,46 @@
  * @since 1.0.0 2024-03-20
  */
 @Service
-public class SimulatAssessService extends BaseService<SimulatAssessDao, SimulatAssess> {
+public class SimulatAssessService  extends BaseService<SimulatAssessDao, SimulatAssess> {
+    private static final Logger logger = LoggerFactory.getLogger(SimulatAssessService.class);
+    private static final String RELIA_SIM_TASK_TYPE_SIMULATION = "calcreq";
+
+    @Value("${spring.redis.host}")
+    private String redisHost;
+    @Value("${spring.redis.port}")
+    private String redisPort;
+    @Value("${data.reliaSimLib.mainPy}")
+    private String reliaSimMain;
+    @Value("${data.reliaSimLib.resultHome}")
+    private String resultHome;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private TaskPhaseService taskPhaseService;
+    @Autowired
+    private SimulatAssessTaskPhaseModelService simulatAssessTaskPhaseModelService;
+    @Autowired
+    private TaskPhaseDao taskPhaseDao;
+    @Autowired
+    private TaskPhaseModelDao taskPhaseModelDao;
+    @Autowired
+    private OperatConditModelDao operatConditModelDao;
+    @Autowired
+    private ModelNodeAlgorithmDao modelNodeAlgorithmDao;
+    @Autowired
+    private AlgorithmDao algorithmDao;
+    @Autowired
+    private XhProductModelDao xhProductModelDao;
+    @Autowired
+    private ParamDataDao paramDataDao;
+    @Autowired
+    private TaskBinoParamDao taskBinoParamDao;
+    @Autowired
+    private TaskRepairParamDao taskRepairParamDao;
+
     @Autowired
     private TimeDiagramDao timeDiagramDao;
 
@@ -220,12 +279,13 @@
         setlineXy(modelJson3, 0, y, x2, y, null);
         jsonArray.add(modelJson3);
 
-        double curPointHour = 50, periodHour = 50;
+        double curPointHour = 10, periodHour = 50;
         while (curPointHour < totalHours) {
             JSONObject modelJson4 = new JSONObject(templetsStrMap.get("model"));
             double x = curPointHour * pointNumPerHour;
             setlineXy(modelJson4, x, y, x, y, null);
             jsonArray.add(modelJson4);
+            curPointHour += 10.0;
         }
 
         return jsonObject.toString();
@@ -588,4 +648,451 @@
         }
         return combineDiagram;
     }*/
+
+    @Transactional(rollbackFor = Exception.class)
+    public Result simulate(SimulatAssess simulatAssess) {
+        Result result = null;
+        // 1. 妫�鏌ユā鍨嬪畬鏁存��
+        List<TaskModelCheckResult> chkResult = taskService.checkTaskModel(simulatAssess.getProductId(),
+                simulatAssess.getTaskModelId());
+        if (chkResult.size() > 0) {
+            result = Result.error("妯″瀷涓嶅畬鏁达紝璇锋鏌ユā鍨嬪畾涔夊強鍙傛暟閰嶇疆銆�");
+            return result;
+        }
+
+        // 2. 缁勮渚涚畻娉曞簱浠跨湡鐨勬ā鍨媥ml
+        assembleModelXml(simulatAssess);
+
+        // 3. 璋冪敤绠楁硶搴擄紝杩涜浠跨湡璁$畻
+        result = callReliaSimLib(simulatAssess);
+
+        return result;
+    }
+
+    private Result callReliaSimLib(SimulatAssess simulatAssess) {
+        Result result = null;
+        InputStream is = null;
+        BufferedReader br = null;
+        try {
+            setParamToRedis(simulatAssess);
+
+            Process process = null;
+            String command = "python " + reliaSimMain;
+            command += " -ip " + redisHost + " -port " + redisPort;
+            command += " -taskType " + RELIA_SIM_TASK_TYPE_SIMULATION + " -taskId " + simulatAssess.getId().toString();
+            logger.info("cmd鍛戒护涓猴細" + command);
+            if(System.getProperty("os.name").toLowerCase().indexOf("windows") > -1){
+                process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", command});
+            }else if(System.getProperty("os.name").toLowerCase().indexOf("linux") > -1){
+                process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command});
+            }else{
+                throw new Exception("鏆備笉鏀寔璇ユ搷浣滅郴缁燂紝杩涜鍚姩绠楁硶搴撹绠楋紒");
+            }
+            is = process.getInputStream();
+            // 浠ュ懡浠よ鏂瑰紡璋冪敤绠楁硶搴撴椂锛屾帴鍙g害瀹氳繑鍥炵殑缁撴灉鏄痷tf-8缂栫爜
+            br = new BufferedReader(new InputStreamReader(is,"utf-8"));
+            String line = br.readLine();
+            logger.info("绠楁硶搴撹繑鍥炵粨鏋滐細" + line);
+//            int exitCode = process.waitFor(); // 寮傛鏂瑰紡锛屼笉绛夊緟绠楁硶搴撹绠楀畬姣曪紝鎵�浠ヨ娉ㄩ噴鎺夎琛�
+            if (line != null) {
+                ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class);
+                if ("0".equals(rtn.getCode())) {
+                    logger.info("鍚姩绠楁硶搴撴垚鍔熴��");
+                    result = Result.ok();
+                } else {
+                    String errorMsg = rtn.getErrorMsg();
+                    throw new RuntimeException("鍚姩绠楁硶搴撳け璐�: errorMsg=" + errorMsg);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("鍚姩绠楁硶搴撲豢鐪熸椂鍙戠敓Exception锛�", e);
+            e.printStackTrace();
+            result = Result.error(e.getMessage());
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return result;
+    }
+
+    private void setParamToRedis(SimulatAssess simulatAssess) {
+        String key = simulatAssess.getId().toString() + RELIA_SIM_TASK_TYPE_SIMULATION;
+        logger.info("redis key锛�" + key);
+        com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
+        jsonObject.put("xmlfile", simulatAssess.getXml());
+        // 浠跨湡娆℃暟
+        jsonObject.put("simulate_times", simulatAssess.getSimulatFrequency());
+        // 閲囨牱鍛ㄦ湡
+        jsonObject.put("timeslice", simulatAssess.getSamplPeriod()/60.0);   // 鍗曚綅缁熶竴鎹㈢畻涓哄皬鏃�
+        jsonObject.put("result_home", resultHome);
+        jsonObject.put("seed", 1000);
+        redisTemplate.opsForValue().set(key, jsonObject.toJSONString());
+    }
+
+    private void assembleModelXml(SimulatAssess simulatAssess) {
+        Long productId = simulatAssess.getProductId();
+        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);
+        List<TaskRepairParam> taskRepairParams = taskRepairParamDao.getTaskRepairParams(taskId);
+
+        // 1. 璁$畻鍚勪换鍔¢樁娈电殑杩愯鏃堕暱
+        List<TaskPhase> taskPhases = calcTaskPhaseDuration(task);
+        // 2. 璁$畻鍚勫伐鍐垫ā鍨嬬殑杩愯鏃堕暱
+        List<TaskPhaseModel> taskPhaseModelAll = new ArrayList<>();
+        for (TaskPhase taskPhase : taskPhases) {
+            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");
+            addTasksTag(taskPhaseModelAll, root);
+            addModelsTag(productId,
+                    productList,
+                    paramDataList,
+                    taskPhaseModelAll,
+                    binoParams,
+                    taskRepairParams,
+                    root,
+                    failureModels, repairModels);
+            addFailureModelsTag(failureModels, root);
+            addRepairModelsTag(repairModels, root);
+            saveSimulatAssessTaskPhaseModel(simulatAssess,
+                    task,
+                    taskPhases,
+                    taskPhaseModelAll);
+
+            // 杈撳嚭鏍煎紡鍖杧ml
+            XMLWriter xmlWriter = null;
+            try {
+                OutputFormat format = OutputFormat.createPrettyPrint();
+                format.setEncoding("UTF-8");
+                StringWriter writer = new StringWriter();
+                xmlWriter = new XMLWriter(writer, format);
+                xmlWriter.write(document);
+                simulatAssess.setXml(writer.toString());
+            } finally {
+                if (xmlWriter != null) xmlWriter.close();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("缁勮绠楁硶搴撲豢鐪熻绠楃敤妯″瀷XML澶辫触: " + e.getMessage());
+        }
+    }
+
+    private void saveSimulatAssessTaskPhaseModel(SimulatAssess simulatAssess,
+                                                 Task task,
+                                                 List<TaskPhase> taskPhases,
+                                                 List<TaskPhaseModel> taskPhaseModelAll) {
+        int sort = 1;
+        for (TaskPhaseModel tpm : taskPhaseModelAll) {
+            TaskPhase phase = taskPhases.stream().filter(item ->
+                    tpm.getPhaseId().equals(item.getId())).collect(Collectors.toList()).get(0);
+            SimulatAssessTaskPhaseModel satpm = new SimulatAssessTaskPhaseModel();
+            satpm.setId(UUIDUtil.generateId());
+            satpm.setFzId(simulatAssess.getId());
+            satpm.setTaskId(task.getId());
+            satpm.setTaskName(task.getTaskName());
+            satpm.setTaskDuration(task.getTaskDuration());
+            satpm.setPhaseId(tpm.getPhaseId());
+            satpm.setPhaseName(phase.getPhaseName());
+            satpm.setPhaseDurationRate(phase.getPhaseDurationRate());
+            satpm.setPhaseDuration(phase.getPhaseDuration());
+            satpm.setPhaseConstraint(null); // TODO
+            satpm.setGkId(tpm.getOperatConditId());
+            satpm.setGkName(tpm.getOperatConditName());
+            satpm.setGkDurationRate(tpm.getOperatConditDurationRate());
+            satpm.setGkDuration(tpm.getOperatConditDuration());
+            satpm.setSort(sort++);
+            simulatAssessTaskPhaseModelService.insert(satpm);
+        }
+    }
+
+    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 void addFailureModelsTag(List<FailureModel> failureModels,
+                                     Element root) {
+        Element ele = null;
+        Element failureModelsTag = root.addElement("failure_models");
+        for (FailureModel failureModel : failureModels) {
+            Element failureModelTag = failureModelsTag.addElement("failure_model");
+            failureModelTag.addAttribute("name", failureModel.getId().toString());
+            failureModelTag.addAttribute("type", failureModel.getType());
+            switch (failureModel.getType()) {
+                case FailureModel.TYPE_EXP:
+                    ele = failureModelTag.addElement("failure-rate");
+                    ele.addAttribute("value", String.valueOf(failureModel.getParam1()));
+                    break;
+                case FailureModel.TYPE_BIN:
+                    ele = failureModelTag.addElement("reliability");
+                    ele.addAttribute("value", String.valueOf(failureModel.getParam1()));
+                    ele = failureModelTag.addElement("n");
+                    ele.addAttribute("value", String.valueOf(failureModel.getParam2()));
+                    ele = failureModelTag.addElement("k");
+                    ele.addAttribute("value", String.valueOf(failureModel.getParam3()));
+                    break;
+                case FailureModel.TYPE_WBL:
+                    ele = failureModelTag.addElement("scale");
+                    ele.addAttribute("value", String.valueOf(failureModel.getParam2()));
+                    ele = failureModelTag.addElement("shape");
+                    ele.addAttribute("value", String.valueOf(failureModel.getParam3()));
+                    break;
+                case FailureModel.TYPE_FIX:
+                    ele = failureModelTag.addElement("unreliability");
+                    ele.addAttribute("value", String.valueOf(failureModel.getParam1()));
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    private void addRepairModelsTag(List<RepairModel> repairModels,
+                                     Element root) {
+        Element ele = null;
+        Element repairModelsTag = root.addElement("repair_models");
+        for (RepairModel repairModel : repairModels) {
+            Element repairModelTag = repairModelsTag.addElement("repair_model");
+            repairModelTag.addAttribute("name", repairModel.getId().toString());
+            repairModelTag.addAttribute("type", repairModel.getType());
+            switch (repairModel.getType()) {
+                case RepairModel.TYPE_EXP:
+                    ele = repairModelTag.addElement("repair-rate");
+                    ele.addAttribute("value", String.valueOf(repairModel.getParam1()));
+                    break;
+                case RepairModel.TYPE_WBL:
+                    ele = repairModelTag.addElement("scale");
+                    ele.addAttribute("value", String.valueOf(repairModel.getParam2()));
+                    ele = repairModelTag.addElement("shape");
+                    ele.addAttribute("value", String.valueOf(repairModel.getParam3()));
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    private void calcTaskPhaseModelDuration(TaskPhase taskPhase,
+                                                            List<TaskPhaseModel> taskPhaseModelAll) {
+        List<TaskPhaseModel> taskPhaseModels = taskPhaseModelDao.getListByPhaseId(taskPhase.getId());
+        double totalRate = taskPhaseModels.stream().mapToDouble(TaskPhaseModel::getOperatConditDurationRate).sum();
+        double sum = 0.0;
+        for (TaskPhaseModel taskPhaseModel : taskPhaseModels) {
+            double duration = taskPhase.getPhaseDuration() * taskPhaseModel.getOperatConditDurationRate() / totalRate;
+            taskPhaseModel.setOperatConditDuration(duration);
+            sum += duration;
+            taskPhaseModelAll.add(taskPhaseModel);
+        }
+        // 鎶婇浂澶磋ˉ鍒版渶鍚庝竴涓伐鍐垫ā鍨�
+        double duration = taskPhaseModels.get(taskPhaseModels.size()-1).getOperatConditDuration();
+        taskPhaseModels.get(taskPhaseModels.size()-1).setOperatConditDuration(duration + taskPhase.getPhaseDuration() - sum);
+    }
+
+    private List<TaskPhase> calcTaskPhaseDuration(Task task) {
+        List<TaskPhase> taskPhases = taskPhaseDao.getListByTaskId(task.getId());
+        double totalRate = taskPhases.stream().mapToDouble(TaskPhase::getPhaseDurationRate).sum();
+        double sum = 0.0;
+        for (TaskPhase taskPhase : taskPhases) {
+            double duration = task.getTaskDuration() * taskPhase.getPhaseDurationRate() / totalRate;
+            taskPhase.setPhaseDuration(duration);
+            sum += duration;
+        }
+        // 鎶婇浂澶磋ˉ鍒版渶鍚庝竴涓樁娈�
+        double duration = taskPhases.get(taskPhases.size()-1).getPhaseDuration();
+        taskPhases.get(taskPhases.size()-1).setPhaseDuration(duration + task.getTaskDuration() - sum);
+
+        return taskPhases;
+    }
+
+    private void addModelsTag(Long productId,
+                              List<XhProductModel> productList,
+                              List<ParamData> paramDataList,
+                              List<TaskPhaseModel> taskPhaseModelAll,
+                              List<TaskBinoParam> binoParams,
+                              List<TaskRepairParam> taskRepairParams,
+                              Element root,
+                              List<FailureModel> failureModels,
+                              List<RepairModel> repairModels) {
+        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);
+            node2DOM(productId,
+                    productList,
+                    paramDataList,
+                    gkModelsAssembled,
+                    algorithmList,
+                    modelNodeAndVnodeList,
+                    binoParams,
+                    taskRepairParams,
+                    computerNode, modelTag,
+                    failureModels, repairModels);
+        }
+    }
+
+    // 閫掑綊鍑芥暟
+    private void node2DOM(Long productId,
+                          List<XhProductModel> productList,
+                          List<ParamData> paramDataList,
+                          List<OperatConditModel> gkModelsAssembled,
+                          List<Algorithm> algorithmList,
+                          List<ModelNode> modelNodeAndVnodeList,
+                          List<TaskBinoParam> binoParams,
+                          List<TaskRepairParam> taskRepairParams,
+                          ModelNode node,
+                          Element parent,
+                          List<FailureModel> failureModels,
+                          List<RepairModel> repairModels) {
+        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);
+                node2DOM(product.getId(),
+                        productList,
+                        paramDataList,
+                        gkModelsAssembled,
+                        algorithmListSub,
+                        modelNodeAndVnodeListSub,
+                        binoParams,
+                        taskRepairParams,
+                        computerNode, parent,
+                        failureModels, repairModels);
+            } else if ("5".equals(product.getProductType())) {
+                // 璁惧
+                ParamData paramData = paramDataList.stream().filter(item ->
+                        dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0);
+                Element nodeTag = parent.addElement("node");
+                nodeTag.addAttribute("name", dataId.toString());
+                nodeTag.addAttribute("type", "node");
+
+                FailureModel failureModel = new FailureModel();
+                failureModel.setId(UUIDUtil.generateId());
+                failureModel.setType(FailureModel.TYPE_EXP);
+                failureModel.setParam1(1.0 / paramData.getTaskMtbcfRegulate());
+                failureModels.add(failureModel);
+
+                Element failureTag = nodeTag.addElement("failure_model");
+                failureTag.addAttribute("name", failureModel.getId().toString());
+                if (1 == paramData.getRepairable()) {
+                    RepairModel repairModel = new RepairModel();
+                    repairModel.setId(UUIDUtil.generateId());
+                    repairModel.setType(RepairModel.TYPE_EXP);
+                    repairModel.setParam1(1.0 / paramData.getRepairMttcr());
+                    repairModels.add(repairModel);
+                    Element repairTag = nodeTag.addElement("repair_model");
+                    repairTag.addAttribute("name", repairModel.getId().toString());
+                }
+            }
+        } 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());
+            }
+            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(",");
+            for (String nodeStr : computerNodeListStr) {
+                ModelNode mn = modelNodeAndVnodeList.stream().filter(item ->
+                        nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0);
+                node2DOM(null,
+                        productList,
+                        paramDataList,
+                        gkModelsAssembled,
+                        algorithmList,
+                        modelNodeAndVnodeList,
+                        binoParams,
+                        taskRepairParams,
+                        mn, element,
+                        failureModels, repairModels);
+            }
+        }
+    }
+
+    private FailureModel createFailureModel(ParamData paramData) {
+        FailureModel failureModel = new FailureModel();
+        failureModel.setId(UUIDUtil.generateId());
+        switch (paramData.getReliabDistribType()) {
+            case 1:
+                failureModel.setType(FailureModel.TYPE_EXP);
+                failureModel.setParam1(1.0 / paramData.getTaskMtbcfRegulate());
+                break;
+            case 2:
+                failureModel.setType(FailureModel.TYPE_WBL);
+                failureModel.setParam2(paramData.getTaskMtbcfOtherParams2());
+                failureModel.setParam3(paramData.getTaskMtbcfOtherParams3());
+                break;
+            case 3:
+                failureModel.setType(FailureModel.TYPE_BIN);
+                break;
+            default:
+                break;
+        }
+
+        return failureModel;
+    }
 }

--
Gitblit v1.9.1