From 4df461673ff8b350df032429c07bc973a3b83c7f Mon Sep 17 00:00:00 2001 From: xyc <jc_xiong@hotmail.com> Date: 星期五, 02 八月 2024 09:58:35 +0800 Subject: [PATCH] 修改仿真后台 --- modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java | 9 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhase.java | 4 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/TaskService.java | 8 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/TaskController.java | 5 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseModelDao.java | 2 modules/mainPart/src/main/resources/mapper/taskReliability/OperatConditModelDao.xml | 12 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhaseModel.java | 4 modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseDao.xml | 9 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java | 459 ++++++++++++++++++++++++++++++++++++++ modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseDao.java | 1 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/SimulatAssessTaskPhaseModel.java | 6 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/OperatConditModelDao.java | 1 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ReliaSimLibResult.java | 2 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/RepairModel.java | 27 ++ modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java | 128 ---------- modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java | 3 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/FailureModel.java | 27 ++ modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseModelDao.xml | 8 18 files changed, 567 insertions(+), 148 deletions(-) diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java index 8562456..43d6bdb 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java @@ -2,14 +2,13 @@ import com.alibaba.fastjson.JSONObject; import com.zt.common.servlet.Result; -import com.zt.life.modules.mainPart.taskReliability.model.PythonResult; +import com.zt.life.modules.mainPart.taskReliability.model.ReliaSimLibResult; import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.io.BufferedReader; @@ -66,7 +65,7 @@ // if (exitCode == 0) { logger.info("鍚姩python璁$畻鎴愬姛"); if (line != null) { - PythonResult rtn = JSONObject.parseObject(line, PythonResult.class); + ReliaSimLibResult rtn = JSONObject.parseObject(line, ReliaSimLibResult.class); if ("0".equals(rtn.getCode())) { result = Result.ok(); } else { @@ -115,7 +114,6 @@ private void setParamToRedis(SimulatAssess simulatAssess) { String key = simulatAssess.getId().toString() + taskType; logger.info("redis key锛�" + key); -/* String xmlfile = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<des name=\"General system\">\n" + " <tasks>\n" + @@ -244,7 +242,7 @@ " </repair_model>\n" + " </repair_models>\n" + "</des>"; -*/ +/* String xmlfile = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<des name=\"General system\">\n" + " <tasks>\n" + @@ -345,6 +343,7 @@ " </repair_model>\n" + " </repair_models>\n" + "</des>"; +*/ JSONObject jsonObject = new JSONObject(); /* Long simulate_times = 10000L; diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java index 0932a48..992308e 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java @@ -113,7 +113,8 @@ @PostMapping("analyze") public Result<Long> analyze(@RequestBody SimulatAssess simulatAssess) { //鏁堥獙鏁版嵁 - Result result = pythonLib.callPython(simulatAssess); +// Result result = pythonLib.callPython(simulatAssess); + Result result = simulatAssessService.simulate(simulatAssess); return result; } diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/TaskController.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/TaskController.java index 183d77c..ed86acf 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/TaskController.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/TaskController.java @@ -66,8 +66,9 @@ @GetMapping("checkTaskModel") @ApiOperation("浠诲姟妯″瀷瀹屾暣鎬ф鏌�") public Result<List<TaskModelCheckResult>> checkTaskModel(Long productId){ - List<TaskModelCheckResult> checkResult = taskService.checkTaskModel(productId); - return Result.ok(checkResult); +// List<TaskModelCheckResult> checkResult = taskService.checkTaskModel(productId); +// return Result.ok(checkResult); + return Result.ok(); } @PostMapping diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/OperatConditModelDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/OperatConditModelDao.java index 9e9d362..75a0b8c 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/OperatConditModelDao.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/OperatConditModelDao.java @@ -30,4 +30,5 @@ void deleteByOperatConditId(Long operatConditId); List<OperatConditModel> getGKModelTrees(Long productId); + List<OperatConditModel> getGKModelAssembled(Long gkId); } diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseDao.java index 1ae594b..fdcba0c 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseDao.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseDao.java @@ -23,4 +23,5 @@ Integer getMaxSort(Long taskId); List<Long> getPhaseByTask(Long taskId); + List<TaskPhase> getListByTaskId(Long taskId); } diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseModelDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseModelDao.java index 7c74423..d05a613 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseModelDao.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskPhaseModelDao.java @@ -1,6 +1,7 @@ package com.zt.life.modules.mainPart.taskReliability.dao; import com.zt.common.dao.BaseDao; +import com.zt.life.modules.mainPart.taskReliability.model.TaskPhase; import com.zt.life.modules.mainPart.taskReliability.model.TaskPhaseModel; import org.apache.ibatis.annotations.Mapper; @@ -20,4 +21,5 @@ List<TaskPhaseModel> getList(Map<String, Object> params); + List<TaskPhaseModel> getListByPhaseId(Long phaseId); } diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/FailureModel.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/FailureModel.java new file mode 100644 index 0000000..83a3553 --- /dev/null +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/FailureModel.java @@ -0,0 +1,27 @@ +package com.zt.life.modules.mainPart.taskReliability.model; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class FailureModel { + public static final String TYPE_EXP = "exponential"; + public static final String TYPE_BIN = "binomial"; + public static final String TYPE_WBL = "weibull"; + public static final String TYPE_FIX = "fixed"; + + @ApiModelProperty(value = "ID") + private Long id; + + @ApiModelProperty(value = "type") + private String type; + + @ApiModelProperty(value = "鍙傛暟1") + private double param1; + + @ApiModelProperty(value = "鍙傛暟2") + private double param2; + + @ApiModelProperty(value = "鍙傛暟3") + private double param3; +} diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/PythonResult.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ReliaSimLibResult.java similarity index 89% rename from modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/PythonResult.java rename to modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ReliaSimLibResult.java index 1f7685f..bf6399b 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/PythonResult.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ReliaSimLibResult.java @@ -4,7 +4,7 @@ import lombok.Data; @Data -public class PythonResult { +public class ReliaSimLibResult { @ApiModelProperty(value = "code") private String code; diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/RepairModel.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/RepairModel.java new file mode 100644 index 0000000..17e3026 --- /dev/null +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/RepairModel.java @@ -0,0 +1,27 @@ +package com.zt.life.modules.mainPart.taskReliability.model; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class RepairModel { + public static final String TYPE_EXP = "exponential"; + public static final String TYPE_BIN = "binomial"; + public static final String TYPE_WBL = "weibull"; + public static final String TYPE_FIX = "fixed"; + + @ApiModelProperty(value = "ID") + private Long id; + + @ApiModelProperty(value = "type") + private String type; + + @ApiModelProperty(value = "鍙傛暟1") + private double param1; + + @ApiModelProperty(value = "鍙傛暟2") + private double param2; + + @ApiModelProperty(value = "鍙傛暟3") + private double param3; +} diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/SimulatAssessTaskPhaseModel.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/SimulatAssessTaskPhaseModel.java index 055353a..707c092 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/SimulatAssessTaskPhaseModel.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/SimulatAssessTaskPhaseModel.java @@ -45,6 +45,9 @@ @ApiModelProperty(value = "闃舵鏃堕暱") private Double phaseDuration; + @ApiModelProperty(value = "闃舵绾︽潫锛堜笉鍙淮淇澶囩被鍨嬪垪琛紝鐢ㄩ�楀彿闅斿紑锛�") + private String phaseConstraint; + @ApiModelProperty(value = "宸ュ喌妯″瀷ID") private Long gkId; @@ -57,6 +60,9 @@ @ApiModelProperty(value = "宸ュ喌妯″瀷鏃堕暱") private Double gkDuration; + @ApiModelProperty(value = "宸ュ喌妯″瀷鎺掑簭") + private Integer sort; + @ApiModelProperty(value = "澶囨敞") private String remark; diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhase.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhase.java index f9246d5..33523e2 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhase.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhase.java @@ -46,4 +46,8 @@ @TableField(exist = false) private Double operatConditDuration; + + @ApiModelProperty(value = "闃舵鏃堕暱") + @TableField(exist = false) + private Double phaseDuration; } diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhaseModel.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhaseModel.java index defaef1..29f5673 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhaseModel.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/TaskPhaseModel.java @@ -48,5 +48,9 @@ @TableField(exist = false) private String isCheck; + @ApiModelProperty(value = "宸ュ喌杩愯鏃堕暱") + @TableField(exist = false) + private double operatConditDuration; + } diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java index 8c2af11..9836118 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java @@ -189,134 +189,6 @@ modelLineList.addAll(linesToAdd); } - private boolean createIfXmlFromRbd(ModelRbd modelRbd, - List<Algorithm> algorithmList, - List<ModelNode> modelNodeAndVnodeList) { - boolean result = true; - - try { - Document document = DocumentHelper.createDocument(); - // 娣诲姞root鑺傜偣 - Element root = document.addElement("DES"); - root.addAttribute("Name", "A System"); - // 娣诲姞terminal鑺傜偣鍒皉oot1 - Element terminal = root.addElement("Node"); - terminal.addAttribute("Name", "Terminal"); - terminal.addAttribute("Type", "NODE"); - - // 灏嗘ā鍨嬭浆鎹负DOM锛屾坊鍔犲埌root - 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(algorithmList, modelNodeAndVnodeList, computerNode, root); - - // 娣诲姞start鑺傜偣鍒皉oot - Element start = root.addElement("Node"); - start.addAttribute("Name", "Start"); - start.addAttribute("Type", "NODE"); - // 娣诲姞link锛堣矾寰勶級鍒皉oot - Element link = root.addElement("Link"); - Element block = link.addElement("Block"); - block.addAttribute("Name", "Terminal"); - block = link.addElement("Block"); - block.addAttribute("Name", computerNode.getId().toString()); - block = link.addElement("Block"); - block.addAttribute("Name", "Start"); - -// document.setXMLEncoding("UTF-8"); -// String xmlString = document.asXML(); - // 杈撳嚭鏍煎紡鍖杧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); - modelRbd.setPublishedXml(writer.toString()); - } finally { - if (xmlWriter!=null) xmlWriter.close(); - } - } catch (Exception e) { - e.printStackTrace(); - result = false; - } - - return result; - } - - // 閫掑綊鍑芥暟 - private void node2DOM(List<Algorithm> algorithmList, - List<ModelNode> modelNodeAndVnodeList, - ModelNode node, - Element parent) { - if ("node".equals(node.getNodeType())) { - Long dataId = node.getDataId(); - XhProductModel xhProductModel = xhProductModelDao.getById(dataId); - if (xhProductModel == null) return; - if ("5".equals(xhProductModel.getProductType())) { - // 璁惧 - ParamData paramData = paramDataDao.getParamData(dataId, "expect"); - if (paramData == null) return; - Element element = parent.addElement("Node"); - element.addAttribute("Name", dataId.toString()); - element.addAttribute("Type", "NODE"); - Element failureTag = element.addElement("Failure"); - failureTag.addAttribute("Dist", "EXP"); // TODO:闇�璁句负鍏蜂綋鐨勫垎甯� - Element argsTag = failureTag.addElement("Args"); - Double value = new Double(paramData.getTaskMtbcfRegulate()); - value = 1.0/value; - argsTag.addAttribute("value", value.toString()); - if (1==paramData.getRepairable()) { - Element repairTag = element.addElement("Repair"); - repairTag.addAttribute("Dist", "EXP"); // TODO:闇�璁句负鍏蜂綋鐨勫垎甯� - argsTag = repairTag.addElement("Args"); - value = new Double(paramData.getRepairMttcr()); - value = 1.0/value; - argsTag.addAttribute("value", value.toString()); - Element repairTimeLimitTag = element.addElement("RepairTimeLimit"); - repairTimeLimitTag.setText(String.valueOf(paramData.getRepairMttcr())); - } - } else if ("10".equals(xhProductModel.getProductType())) { - // 铏氬崟浣� - ModelRbd rbdXDY = modelRbdDao.getDiagramOfXDY(dataId); - if (rbdXDY == null) return; - List<Algorithm> algorithmListXDY = algorithmDao.getListByModelId(rbdXDY.getId()); - List<ModelNode> modelNodeAndVnodeListXDY =modelNodeAlgorithmDao.getListByModelId(rbdXDY.getId()); - Algorithm endAlgo = algorithmListXDY.stream().filter(item -> - "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); - ModelNode computerNode = modelNodeAndVnodeListXDY.stream().filter(item -> - endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); - node2DOM(algorithmListXDY, modelNodeAndVnodeListXDY, computerNode, parent); - } - } else { - // vnode锛堣繍绠楄妭鐐癸級 - Algorithm algo = algorithmList.stream().filter(item -> - node.getId().equals(item.getId())).collect(Collectors.toList()).get(0); - Element element = parent.addElement("Logic"); - element.addAttribute("Name", algo.getId().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("VoteValue", 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 nd = modelNodeAndVnodeList.stream().filter(item -> - nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); - node2DOM(algorithmList, modelNodeAndVnodeList, nd, element); - } - } - } - private boolean getAlgorithmFromRbd(ModelRbd modelRbd, List<ModelNode> modelNodeList, List<ModelLine> modelLineList, 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 a5c5b9d..9709216 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,13 +1,37 @@ package com.zt.life.modules.mainPart.taskReliability.service; +import com.alibaba.fastjson.JSONObject; import com.zt.common.service.BaseService; -import com.zt.life.modules.mainPart.taskReliability.dao.SimulatAssessDao; +import com.zt.common.servlet.Result; +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.life.modules.mainPart.taskReliability.dto.ProductStatusDto; -import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess; +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 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.util.List; +import java.util.stream.Collectors; /** @@ -17,9 +41,41 @@ * @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; /** * 鍒嗛〉鏌ヨ @@ -55,4 +111,401 @@ public List<ProductStatusDto> getChildren(Long productId, Long taskId) { return baseDao.getChildren(productId, taskId); } + + @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 = 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); + JSONObject jsonObject = new 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); + // 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, + 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 = taskPhaseModel.getOperatConditDurationRate() * taskPhase.getPhaseDuration() / totalRate; + taskPhaseModel.setOperatConditDuration(duration); + sum += duration; + taskPhaseModelAll.add(taskPhaseModel); + } + // 鎶婇浂澶磋ˉ鍒版渶鍚庝竴涓伐鍐垫ā鍨� + taskPhaseModels.get(taskPhaseModels.size()-1).setOperatConditDuration(totalRate - 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; + } + // 鎶婇浂澶磋ˉ鍒版渶鍚庝竴涓樁娈� + taskPhases.get(taskPhases.size()-1).setPhaseDuration(task.getTaskDuration() - sum); + + return taskPhases; + } + + private void addModelsTag(Long productId, + List<XhProductModel> productList, + List<ParamData> paramDataList, + List<TaskPhaseModel> taskPhaseModelAll, + 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(productList, + paramDataList, + gkModelsAssembled, + algorithmList, + modelNodeAndVnodeList, + computerNode, modelTag, + failureModels, repairModels); + } + } + + // 閫掑綊鍑芥暟 + private void node2DOM(List<XhProductModel> productList, + List<ParamData> paramDataList, + List<OperatConditModel> gkModelsAssembled, + List<Algorithm> algorithmList, + List<ModelNode> modelNodeAndVnodeList, + 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".equals(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(productList, + paramDataList, + gkModelsAssembled, + algorithmListSub, + modelNodeAndVnodeListSub, + 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"); + element.addAttribute("name", algo.getId().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 md = modelNodeAndVnodeList.stream().filter(item -> + nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); + node2DOM(productList, + paramDataList, + gkModelsAssembled, + algorithmList, + modelNodeAndVnodeList, + md, element, + failureModels, repairModels); + } + } + } } diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/TaskService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/TaskService.java index af3f35b..3a77b32 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/TaskService.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/TaskService.java @@ -76,13 +76,7 @@ * @param productId 浜у搧鑺傜偣ID锛堜竴鑸负鎬讳綋锛� * @return 妫�鏌ュ嚭鐨勯敊璇殑List锛岄暱搴︿负0琛ㄧず娌℃湁閿欒锛屼笉浼氳繑鍥瀗ull */ - public List<TaskModelCheckResult> checkTaskModel(Long productId) { - List<TaskModelCheckResult> result = new ArrayList<>(); - result = doCheckTaskModel(productId, null); - return result; - } - - private List<TaskModelCheckResult> doCheckTaskModel(Long productId, Long taskModelId) { + public List<TaskModelCheckResult> checkTaskModel(Long productId, Long taskModelId) { List<TaskModelCheckResult> checkResult = new ArrayList<>(); List<XhProductModel> deviceUsedList = new ArrayList<>(); // 妫�鏌ュ璞℃ā鍨嬩腑浣跨敤鍒扮殑鎵�鏈夎澶� diff --git a/modules/mainPart/src/main/resources/mapper/taskReliability/OperatConditModelDao.xml b/modules/mainPart/src/main/resources/mapper/taskReliability/OperatConditModelDao.xml index 84d252a..84acf4f 100644 --- a/modules/mainPart/src/main/resources/mapper/taskReliability/OperatConditModelDao.xml +++ b/modules/mainPart/src/main/resources/mapper/taskReliability/OperatConditModelDao.xml @@ -63,8 +63,18 @@ a.is_delete = 0 and b.is_delete = 0 <if test="productId!=null"> - and b.product_id=${productId} + and b.product_id=#{productId} </if> ORDER BY a.operat_condit_id, a.product_id </select> + <select id="getGKModelAssembled" resultType="com.zt.life.modules.mainPart.taskReliability.model.OperatConditModel"> + select + a.* + FROM + operat_condit_model a + where + a.is_delete = 0 + and a.is_disabled = 0 + and a.operat_condit_id=#{gkId} + </select> </mapper> diff --git a/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseDao.xml b/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseDao.xml index 84856c9..d48ad1c 100644 --- a/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseDao.xml +++ b/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseDao.xml @@ -30,5 +30,14 @@ and task_id =${taskId} order by phase_sort </select> + <select id="getListByTaskId" resultType="com.zt.life.modules.mainPart.taskReliability.model.TaskPhase"> + SELECT + a.* + FROM + task_phase a + where a.is_delete = 0 + and a.task_id=#{taskId} + ORDER BY a.phase_sort + </select> </mapper> diff --git a/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseModelDao.xml b/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseModelDao.xml index 88819da..d7edc5b 100644 --- a/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseModelDao.xml +++ b/modules/mainPart/src/main/resources/mapper/taskReliability/TaskPhaseModelDao.xml @@ -18,5 +18,13 @@ and a.product_id = ${productId} order by a.CREATE_DATE </select> + <select id="getListByPhaseId" resultType="com.zt.life.modules.mainPart.taskReliability.model.TaskPhaseModel"> + SELECT + a.* + FROM + task_phase_model a + where a.is_delete = 0 + and a.phase_id=#{phaseId} + </select> </mapper> -- Gitblit v1.9.1