| | |
| | | package com.zt.life.modules.mainPart.taskReliability.service; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | 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.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.servlet.Result; |
| | | import com.zt.common.utils.JsonUtils2; |
| | | import com.zt.common.utils.UUIDUtil; |
| | | 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 com.zt.life.modules.mainPart.utils.GetStringSpace; |
| | | import org.dom4j.Document; |
| | | import org.dom4j.DocumentHelper; |
| | | import org.dom4j.Element; |
| | |
| | | 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; |
| | | import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssessTaskPhaseModel; |
| | | 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.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.awt.*; |
| | | import java.io.BufferedReader; |
| | | import java.io.InputStream; |
| | | import java.io.InputStreamReader; |
| | |
| | | import java.util.HashMap; |
| | | import java.util.Hashtable; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | * @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"; |
| | | |
| | |
| | | private XhProductModelDao xhProductModelDao; |
| | | @Autowired |
| | | private ParamDataDao paramDataDao; |
| | | @Autowired |
| | | private TaskBinoParamDao taskBinoParamDao; |
| | | @Autowired |
| | | private TaskRepairParamDao taskRepairParamDao; |
| | | |
| | | @Autowired |
| | | private TimeDiagramDao timeDiagramDao; |
| | | |
| | | @Value("${data.reliaSimLib.resultHome}") |
| | | private String path; |
| | | |
| | | |
| | | private JSONObject dialgramJson; |
| | | |
| | |
| | | x2 = x1 + status.getTimes() * pointNumPerHour + 5; |
| | | JSONObject lineJson = new JSONObject(templetsStrMap.get(status.getStatus())); |
| | | setlineXy(lineJson, x1, y, x2, y, ""); |
| | | |
| | | JsonUtils2.setJsonValueByPath(lineJson,"data/status".split("/"),status.getStatus()); |
| | | JsonUtils2.setJsonValueByPath(lineJson,"data/startTimes".split("/"),String.format("%.4f", x1)); |
| | | JsonUtils2.setJsonValueByPath(lineJson,"data/endTimes".split("/"),String.format("%.4f", x1 + status.getTimes())); |
| | | JsonUtils2.setJsonValueByPath(lineJson, "id".split("/"), UUIDUtil.generateId().toString()); |
| | | x1 = x2 - 5; |
| | | jsonArray.add(lineJson); |
| | |
| | | int spaceWitdth = 80; |
| | | x1 = -spaceWitdth; |
| | | x2 = -11; |
| | | y = -100; |
| | | y = -130; |
| | | String[] tlArr = "O,F,I,S,M".split(","); |
| | | for (String s : tlArr) { |
| | | JSONObject f = templetsMap.get(s); |
| | |
| | | //阶段模型及刻度 |
| | | x1 = 0; |
| | | x2 = 0; |
| | | double y1 = -60; |
| | | y = -30; |
| | | double y2 = -10; |
| | | JSONObject modelJson = new JSONObject(templetsStrMap.get("model")); |
| | | double y1 = -100; |
| | | y = -70; |
| | | double y2 = -50; |
| | | |
| | | setlineXy(modelJson, x1, y1, x1, y2, null); |
| | | JSONObject modelJson = new JSONObject(templetsStrMap.get("model")); |
| | | setlineXy(modelJson, 2, y1, 2, y2, null); |
| | | jsonArray.add(modelJson); |
| | | double totalHours = 0; |
| | | for (int i = 0; i < modelDtoList.size(); i++) { |
| | | JSONObject modelJson2 = new JSONObject(templetsStrMap.get("model")); |
| | | SimulatAssessTaskPhaseModel modelDto = modelDtoList.get(i); |
| | | totalHours = totalHours + modelDto.getGkDuration(); |
| | | x2 = x2 + modelDto.getGkDuration() * pointNumPerHour; |
| | | double gkPoint = modelDto.getGkDuration() * pointNumPerHour; |
| | | x2 = x2 + gkPoint; |
| | | if (i < modelDtoList.size() - 1) { |
| | | setlineXy(modelJson2, x2, y1, x2, y, null); |
| | | } else { |
| | | setlineXy(modelJson2, x2, y1, x2, y2, null); |
| | | } |
| | | |
| | | jsonArray.add(modelJson2); |
| | | |
| | | //判断是否有模型 |
| | | ModelRbd modelRbd = baseDao.getModelByProductGk(modelDto.getGkId(), productId); |
| | | String modelName = "未用"; |
| | | String modelId = ""; |
| | | if (modelRbd != null) { |
| | | modelName = modelRbd.getModelName(); |
| | | modelId = modelRbd.getId().toString(); |
| | | } |
| | | Map<String, Integer> mapSpace = GetStringSpace.getStringSpaceSize(modelName, null, 18); |
| | | JSONObject textJson = new JSONObject(templetsStrMap.get("text")); |
| | | JsonUtils2.setJsonValueByPath(textJson, "data/dataId".split("/"), modelDto.getGkId()); |
| | | JsonUtils2.setJsonValueByPath(textJson, "data/dataId".split("/"), modelId); |
| | | JsonUtils2.setJsonValueByPath(textJson, "id".split("/"), UUIDUtil.generateId().toString()); |
| | | JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), modelDto.getGkName()); |
| | | JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), x1 + 30); |
| | | JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), modelName); |
| | | |
| | | JsonUtils2.setJsonValueByPath(textJson, "size/width".split("/"), mapSpace.get("width") + 20); |
| | | |
| | | double x11 = x1 + ((gkPoint - mapSpace.get("width") - 20) / 2); |
| | | JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), x11); |
| | | JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y1); |
| | | jsonArray.add(textJson); |
| | | x1 = x2; |
| | |
| | | setlineXy(modelJson3, 0, y, x2, y, null); |
| | | jsonArray.add(modelJson3); |
| | | |
| | | double curPointHour = 50, periodHour = 50; |
| | | Integer curPointHour = 50, periodHour = 50; |
| | | while (curPointHour < totalHours) { |
| | | JSONObject modelJson4 = new JSONObject(templetsStrMap.get("model")); |
| | | double x = curPointHour * pointNumPerHour; |
| | | setlineXy(modelJson4, x, y, x, y, null); |
| | | setlineXy(modelJson4, x, y, x, y2, null); |
| | | jsonArray.add(modelJson4); |
| | | |
| | | Map<String, Integer> mapSpace = GetStringSpace.getStringSpaceSize(curPointHour.toString(), null, 20); |
| | | JSONObject textJson = new JSONObject(templetsStrMap.get("text")); |
| | | JsonUtils2.setJsonValueByPath(textJson, "id".split("/"), UUIDUtil.generateId().toString()); |
| | | JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), curPointHour.toString()); |
| | | |
| | | JsonUtils2.setJsonValueByPath(textJson, "size/width".split("/"), mapSpace.get("width") + 20); |
| | | |
| | | double x11 = x - mapSpace.get("width") / 2 - 5; |
| | | JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), x11); |
| | | JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y2); |
| | | jsonArray.add(textJson); |
| | | |
| | | curPointHour += periodHour; |
| | | } |
| | | |
| | | |
| | | return jsonObject.toString(); |
| | | } |
| | |
| | | JsonUtils2.setJsonValueByPath(lineJson, "source/y".split("/"), y1); |
| | | JsonUtils2.setJsonValueByPath(lineJson, "target/x".split("/"), x2); |
| | | JsonUtils2.setJsonValueByPath(lineJson, "target/y".split("/"), y2); |
| | | JsonUtils2.setJsonValueByPath(lineJson, "id".split("/"), UUIDUtil.generateId().toString()); |
| | | if (text != null) { |
| | | JsonUtils2.setArrJsonValueByPath(lineJson, "labels".split("/"), null, "0", "attrs/text/text", ""); |
| | | } |
| | |
| | | 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){ |
| | | 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){ |
| | | } else if (System.getProperty("os.name").toLowerCase().indexOf("linux") > -1) { |
| | | process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command}); |
| | | }else{ |
| | | } else { |
| | | throw new Exception("暂不支持该操作系统,进行启动算法库计算!"); |
| | | } |
| | | is = process.getInputStream(); |
| | | // 以命令行方式调用算法库时,接口约定返回的结果是utf-8编码 |
| | | br = new BufferedReader(new InputStreamReader(is,"utf-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); |
| | | ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class); |
| | | if ("0".equals(rtn.getCode())) { |
| | | logger.info("启动算法库成功。"); |
| | | result = Result.ok(); |
| | |
| | | private void setParamToRedis(SimulatAssess simulatAssess) { |
| | | String key = simulatAssess.getId().toString() + RELIA_SIM_TASK_TYPE_SIMULATION; |
| | | logger.info("redis key:" + key); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | 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("timeslice", simulatAssess.getSamplPeriod() / 60.0); // 单位统一换算为小时 |
| | | jsonObject.put("result_home", resultHome); |
| | | jsonObject.put("seed", 1000); |
| | | redisTemplate.opsForValue().set(key, jsonObject.toJSONString()); |
| | |
| | | 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. 计算各工况模型的运行时长 |
| | |
| | | productList, |
| | | paramDataList, |
| | | taskPhaseModelAll, |
| | | binoParams, |
| | | taskRepairParams, |
| | | root, |
| | | failureModels, repairModels); |
| | | addFailureModelsTag(failureModels, root); |
| | |
| | | } |
| | | |
| | | private void addRepairModelsTag(List<RepairModel> repairModels, |
| | | Element root) { |
| | | Element root) { |
| | | Element ele = null; |
| | | Element repairModelsTag = root.addElement("repair_models"); |
| | | for (RepairModel repairModel : repairModels) { |
| | |
| | | } |
| | | |
| | | private void calcTaskPhaseModelDuration(TaskPhase taskPhase, |
| | | List<TaskPhaseModel> taskPhaseModelAll) { |
| | | List<TaskPhaseModel> taskPhaseModelAll) { |
| | | List<TaskPhaseModel> taskPhaseModels = taskPhaseModelDao.getListByPhaseId(taskPhase.getId()); |
| | | double totalRate = taskPhaseModels.stream().mapToDouble(TaskPhaseModel::getOperatConditDurationRate).sum(); |
| | | double sum = 0.0; |
| | |
| | | taskPhaseModelAll.add(taskPhaseModel); |
| | | } |
| | | // 把零头补到最后一个工况模型 |
| | | taskPhaseModels.get(taskPhaseModels.size()-1).setOperatConditDuration(taskPhase.getPhaseDuration() - sum); |
| | | double duration = taskPhaseModels.get(taskPhaseModels.size() - 1).getOperatConditDuration(); |
| | | taskPhaseModels.get(taskPhaseModels.size() - 1).setOperatConditDuration(duration + taskPhase.getPhaseDuration() - sum); |
| | | } |
| | | |
| | | private List<TaskPhase> calcTaskPhaseDuration(Task task) { |
| | |
| | | sum += duration; |
| | | } |
| | | // 把零头补到最后一个阶段 |
| | | taskPhases.get(taskPhases.size()-1).setPhaseDuration(task.getTaskDuration() - sum); |
| | | double duration = taskPhases.get(taskPhases.size() - 1).getPhaseDuration(); |
| | | taskPhases.get(taskPhases.size() - 1).setPhaseDuration(duration + task.getTaskDuration() - sum); |
| | | |
| | | return taskPhases; |
| | | } |
| | |
| | | List<XhProductModel> productList, |
| | | List<ParamData> paramDataList, |
| | | List<TaskPhaseModel> taskPhaseModelAll, |
| | | List<TaskBinoParam> binoParams, |
| | | List<TaskRepairParam> taskRepairParams, |
| | | Element root, |
| | | List<FailureModel> failureModels, |
| | | List<RepairModel> repairModels) { |
| | |
| | | "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, |
| | | node2DOM(productId, |
| | | productList, |
| | | paramDataList, |
| | | gkModelsAssembled, |
| | | algorithmList, |
| | | modelNodeAndVnodeList, |
| | | binoParams, |
| | | taskRepairParams, |
| | | computerNode, modelTag, |
| | | failureModels, repairModels); |
| | | } |
| | | } |
| | | |
| | | // 递归函数 |
| | | private void node2DOM(List<XhProductModel> productList, |
| | | 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, |
| | |
| | | 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())) { |
| | | if ("3,4,10".contains(product.getProductType())) { |
| | | // 系统、分系统、虚单元 |
| | | OperatConditModel gkModel = gkModelsAssembled.stream().filter(item -> |
| | | dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); |
| | |
| | | "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, |
| | | node2DOM(product.getId(), |
| | | productList, |
| | | paramDataList, |
| | | gkModelsAssembled, |
| | | algorithmListSub, |
| | | modelNodeAndVnodeListSub, |
| | | binoParams, |
| | | taskRepairParams, |
| | | computerNode, parent, |
| | | failureModels, repairModels); |
| | | } else if ("5".equals(product.getProductType())) { |
| | |
| | | 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()) { |
| | |
| | | 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 (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())) { |
| | |
| | | } |
| | | String[] computerNodeListStr = algo.getComputerList().split(","); |
| | | for (String nodeStr : computerNodeListStr) { |
| | | ModelNode md = modelNodeAndVnodeList.stream().filter(item -> |
| | | ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> |
| | | nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); |
| | | node2DOM(productList, |
| | | node2DOM(null, |
| | | productList, |
| | | paramDataList, |
| | | gkModelsAssembled, |
| | | algorithmList, |
| | | modelNodeAndVnodeList, |
| | | md, element, |
| | | 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; |
| | | } |
| | | } |