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/taskReliability/service/SimulatAssessService.java | 459 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 456 insertions(+), 3 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 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); + } + } + } } -- Gitblit v1.9.1