package com.zt.life.modules.mainPart.taskReliability.service; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONArray; import cn.hutool.json.XML; 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.TreeUtils; 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.*; import com.zt.life.modules.mainPart.taskReliability.dto.ProductStatusDto; import com.zt.life.modules.mainPart.taskReliability.dto.TaskModelCheckResultDto; import com.zt.life.modules.mainPart.taskReliability.dto.TaskPhaseConstraintDto; import com.zt.life.modules.mainPart.taskReliability.model.*; import com.zt.life.modules.mainPart.utils.GetStringSpace; import org.apache.commons.io.IOUtils; 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.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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.*; import java.util.*; import java.util.stream.Collectors; /** * simulat_assess * * @author zt generator * @since 1.0.0 2024-03-20 */ @Service public class SimulatAssessService extends BaseService { private static final Logger logger = LoggerFactory.getLogger(SimulatAssessService.class); public static final String RELIA_SIM_TASK_TYPE_SIMULATION = "calcreq"; public static final String RELIA_SIM_TASK_TYPE_PROGRESS = "calcprog"; @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; @Value("${data.reliaSimLib.fixedRandomSeed}") private String fixedRandomSeed; @Autowired private RedisTemplate redisTemplate; @Autowired private TaskService taskService; @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; @Value("${data.reliaSimLib.resultHome}") private String path; private JSONObject dialgramJson; String templetStr = "{\"cells\":[]}"; Map templetsMap = new HashMap<>(); Map templetsStrMap = new HashMap<>(); private JSONObject xmlJSONObj; /** * 分页查询 * * @param queryFilter * @return */ /* public List page(QueryFilter queryFilter) { return baseDao.getList(queryFilter.getQueryParams()); }*/ /** * 删除 * * @param ids */ public void delete(Long[] ids) { super.deleteLogic(ids); } public Integer getNumById(Long productId, Long taskModelId) { return baseDao.getNumById(productId, taskModelId); } public List getList(Long taskModelId) { return baseDao.getList(taskModelId); } public SimulatAssess getByTaskId(Long taskModelId) { return baseDao.getByTaskId(taskModelId); } public SimulatAssess getParams(Long id, Long taskModelId) { return baseDao.getParams(id, taskModelId); } public List getProduct(Long productId, Long taskId) { return baseDao.getChildren(productId, taskId); } public String getTimeDiagram(Long productId, Long taskId, Long fzId) { String filePath = path + "/" + fzId + "/" + "status.json"; ObjectMapper mapper = new ObjectMapper(); String jsonStr = null; try { // 使用 ObjectMapper 的 readValue 方法,将文件中的 JSON 数据转换为一个 Java 对象 // 这里使用 Object 类作为泛型参数,表示任意类型的对象 Object obj = mapper.readValue(new File(filePath), Object.class); // 使用 ObjectMapper 的 writeValueAsString 方法,将 Java 对象转换为 JSON 字符串 jsonStr = mapper.writeValueAsString(obj); } catch (IOException e) { // 处理异常 e.printStackTrace(); throw new RenException("文件不存在或者文件打不开"); } dialgramJson = new JSONObject(jsonStr); // 阶段模型 List modelDtoList = baseDao.getModelList(productId, fzId); // 所有阶段模型的节点集合 (线条) List list = this.getStatusData(productId, taskId); // 每次仿真记录 SimulatAssess simulatAssess = this.get(fzId); JSONObject jsonObject = new JSONObject(templetStr); JSONArray jsonArray = jsonObject.getJSONArray("cells"); this.getPetsInfo(); double x1 = 0; double x2 = 0; int y = -10; int groupY = 0; int spaceHeight = 20; int groupHeight = 20; double pointNumPerHour = 60.0 / simulatAssess.getSamplPeriod(); //时序图线 for (int i = 0; i < list.size(); i++) { x1 = 0; groupY = groupHeight * i; ProductStatusDto dto = list.get(i); double startTime = 0.0; for (StatusDto status : dto.getStatusList()) { switch (status.getStatus()) { case "O": y = groupY; break; case "F": y = groupY;// + spaceHeight; break; case "I": case "S": case "M": y = groupY;// + 2 * spaceHeight; break; } 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("%.1f", startTime)); JsonUtils2.setJsonValueByPath(lineJson, "data/endTimes".split("/"), String.format("%.1f", startTime + status.getTimes())); JsonUtils2.setJsonValueByPath(lineJson, "id".split("/"), UUIDUtil.generateId().toString()); startTime = startTime + status.getTimes(); x1 = x2 - 5; jsonArray.add(lineJson); } JSONObject textJson = new JSONObject(templetsStrMap.get("text")); JsonUtils2.setJsonValueByPath(textJson, "id".split("/"), UUIDUtil.generateId().toString()); JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), dto.getName()); JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), 20); JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y - 15); jsonArray.add(textJson); } //图例 int spaceWitdth = 80; x1 = -spaceWitdth; x2 = -11; y = -110; String[] tlArr = "O,F,I,S,M".split(","); for (String s : tlArr) { JSONObject f = templetsMap.get(s); x1 = x1 + spaceWitdth; x2 = x2 + spaceWitdth; setlineXy(f, x1, y, x2, y, null); jsonArray.add(f); } //阶段模型及刻度 x1 = 0; x2 = 0; double y1 = -80; y = -60; double y2 = -50; JSONObject modelJson = new JSONObject(templetsStrMap.get("model")); setlineXy(modelJson, 1, y1, 1, 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(); 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 mapSpace = GetStringSpace.getStringSpaceSize(modelName, null, 12); JSONObject textJson = new JSONObject(templetsStrMap.get("text")); JsonUtils2.setJsonValueByPath(textJson, "data/dataId".split("/"), modelId); JsonUtils2.setJsonValueByPath(textJson, "id".split("/"), UUIDUtil.generateId().toString()); JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), "模型" + (i + 1)); JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/modelName".split("/"), modelName); JsonUtils2.setJsonValueByPath(textJson, "size/width".split("/"), mapSpace.get("width") + 10); double x11 = x1 + ((gkPoint - mapSpace.get("width") + 12) / 2); JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), x11); JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y1 - 10); jsonArray.add(textJson); x1 = x2; } JSONObject modelJson3 = new JSONObject(templetsStrMap.get("model")); setlineXy(modelJson3, 0, y, x2, y, null); jsonArray.add(modelJson3); //刻度 Integer curPointHour = 100, periodHour = 100; while (curPointHour < totalHours) { JSONObject modelJson4 = new JSONObject(templetsStrMap.get("model")); double x = curPointHour * pointNumPerHour; setlineXy(modelJson4, x, y, x, y2, null); jsonArray.add(modelJson4); Map 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 - 10); jsonArray.add(textJson); curPointHour += periodHour; } return jsonObject.toString(); } public void setlineXy(JSONObject lineJson, double x1, double y1, double x2, double y2, String text) { JsonUtils2.setJsonValueByPath(lineJson, "source/x".split("/"), x1); 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", ""); } } public void getPetsInfo() { Map params = new HashMap(); params.put("projectId", 10000); params.put("diagramId", 10000); List list_style = baseDao.getTimeDiagram(params); if (list_style.size() > 0) { String modelStr = list_style.get(0).getContent(); JSONObject modelJson = new JSONObject(modelStr); JSONArray modelJsonArray = modelJson.getJSONArray("cells"); for (int i = 0; i < modelJsonArray.size(); i++ ) { JSONObject jsonObject = modelJsonArray.getJSONObject(i); if (jsonObject.get("shape").equals("edge")) { JSONArray tmpArray = jsonObject.getJSONArray("labels"); JSONObject tmpJSONObject = (JSONObject) tmpArray.get(0); Object nodeMarker = JsonUtils2.getJsonValueByPath(tmpJSONObject, "attrs/text/text".split("/")); if ("运行".equals(nodeMarker)) { templetsMap.put("O", jsonObject); templetsStrMap.put("O", jsonObject.toString()); } if ("故障".equals(nodeMarker)) { templetsMap.put("F", jsonObject); templetsStrMap.put("F", jsonObject.toString()); } if ("空闲".equals(nodeMarker)) { templetsMap.put("I", jsonObject); templetsStrMap.put("I", jsonObject.toString()); } if ("备份".equals(nodeMarker)) { templetsMap.put("S", jsonObject); templetsStrMap.put("S", jsonObject.toString()); } if ("未用".equals(nodeMarker)) { templetsMap.put("M", jsonObject); templetsStrMap.put("M", jsonObject.toString()); } if ("模型".equals(nodeMarker)) { JsonUtils2.setJsonValueByPath(tmpJSONObject, "attrs/text/text".split("/"), ""); templetsMap.put("model", jsonObject); templetsStrMap.put("model", jsonObject.toString()); } } else if (jsonObject.get("shape").equals("custom-rect")) { Object nodeMarker = JsonUtils2.getJsonValueByPath(jsonObject, "attrs/label/textWrap/text".split("/")); if ("文字模板1".equals(nodeMarker)) { templetsMap.put("text", jsonObject); templetsStrMap.put("text", jsonObject.toString()); } } else if (jsonObject.get("shape").equals("image")) { Object nodeMarker = JsonUtils2.getJsonValueByPath(jsonObject, "data/imagePost".split("/")); if ("center".equals(nodeMarker)) { templetsMap.put("center", jsonObject); templetsStrMap.put("center", jsonObject.toString()); } if ("top".equals(nodeMarker)) { templetsMap.put("top", jsonObject); templetsStrMap.put("top", jsonObject.toString()); } if ("right".equals(nodeMarker)) { templetsMap.put("right", jsonObject); templetsStrMap.put("right", jsonObject.toString()); } if ("bottom".equals(nodeMarker)) { templetsMap.put("bottom", jsonObject); templetsStrMap.put("bottom", jsonObject.toString()); } if ("left".equals(nodeMarker)) { templetsMap.put("left", jsonObject); templetsStrMap.put("left", jsonObject.toString()); } } } } } public List getStatusData(Long productId, Long taskId) { List childList = this.getProduct(productId, taskId); for (ProductStatusDto item : childList) { JSONArray jsonArray = dialgramJson.getJSONArray(String.valueOf(item.getId())); if (jsonArray != null) { this.processJSONArray(jsonArray, item, taskId); } } return childList; } public void processJSONArray(JSONArray jsonArray, ProductStatusDto productStatusDto, Long taskId) { List phaseModelList = baseDao.getTaskPhaseModelByTaskId(taskId); String status = null; Double times = null; JSONArray jsonArray2 = jsonArray.getJSONArray(0); for (int j = 0; j < jsonArray2.size(); j++) { JSONArray jsonArray3 = jsonArray2.getJSONArray(j); if (jsonArray3.size() == 0) { StatusDto statusDto = new StatusDto(); statusDto.setTimes(phaseModelList.get(j).getGkDuration()); statusDto.setStatus(""); productStatusDto.getStatusList().add(statusDto); } else { for (int a = 0; a < jsonArray3.size(); a++) { JSONArray jsonArray4 = jsonArray3.getJSONArray(a); for (int b = 0; b < jsonArray4.size(); b++) { Object item = jsonArray4.get(b); if (item instanceof Double) { times = (Double) item; } else { status = String.valueOf(item); } } if (status != null || times != null) { StatusDto statusDto = new StatusDto(); statusDto.setTimes(times); statusDto.setStatus(status); productStatusDto.getStatusList().add(statusDto); } } } } } public TimeDiagram getDiagram(String projectId, String diagramId, String showType, String isShow, String digramParams, String majorId, Integer winWidth, Integer winHeight) { Map params = new HashMap(); params.put("projectId", projectId); params.put("diagramId", diagramId); TimeDiagram diagram = null; List list = baseDao.getTimeDiagram(params); if (list.size() > 0) { diagram = list.get(0); } else { diagram = new TimeDiagram(); diagram.setProjectId(Convert.toLong(projectId)); diagram.setDiagramId(Convert.toLong(diagramId)); } return diagram; } public void updateDiagram(TimeDiagram diagram) { timeDiagramDao.updateById(diagram); } @Transactional(rollbackFor = Exception.class) public Result simulate(SimulatAssess simulatAssess) { Result result = null; // 1. 检查模型完整性 List chkResult = taskService.checkTaskModel(simulatAssess.getProductId(), simulatAssess.getTaskModelId()); if (chkResult.size() > 0) { result = Result.error("模型不完整,请检查模型定义及参数配置。"); return result; } // 2. 组装供算法库仿真的模型xml 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(); // 以命令行方式调用算法库时,接口约定返回的结果是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 = 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); if (null != fixedRandomSeed && "1".equals(fixedRandomSeed)) { // 固定种子 jsonObject.put("seed", 1000); } else { // 随机种子 jsonObject.put("seed", new Random().nextInt(1000)); } redisTemplate.opsForValue().set(key, jsonObject.toJSONString()); } public void deleteSimInfoInRedis(Long simId) { redisTemplate.delete(simId.toString() + RELIA_SIM_TASK_TYPE_SIMULATION); redisTemplate.delete(simId.toString() + RELIA_SIM_TASK_TYPE_PROGRESS); } private void assembleModelXml(SimulatAssess simulatAssess) { Long productId = simulatAssess.getProductId(); XhProductModel product = xhProductModelDao.getById(productId); List productList = xhProductModelDao.getByShipId(productId); List paramDataList = paramDataDao.getDeviceParams(productId); Long taskId = simulatAssess.getTaskModelId(); Task task = taskService.get(taskId); List binoParams = taskBinoParamDao.getBinoParams(taskId); // 1. 计算各任务阶段的运行时长 List taskPhases = calcTaskPhaseDuration(task); // 2. 计算各工况模型的运行时长 List taskPhaseModelAll = new ArrayList<>(); for (TaskPhase taskPhase : taskPhases) { calcTaskPhaseModelDuration(taskPhase, taskPhaseModelAll); } // 3. 将各工况模型递归拆解为完整的可供算法包仿真计算的模型 try { List failureModels = new ArrayList<>(); List repairModels = new ArrayList<>(); Document document = DocumentHelper.createDocument(); // 添加root节点 Element root = document.addElement("des"); root.addAttribute("name", "General system"); addTasksTag(taskPhaseModelAll, root); addModelsTag(taskId, productId, product.getName(), product.getNamePath(), productList, paramDataList, taskPhaseModelAll, binoParams, root, failureModels, repairModels); addFailureModelsTag(failureModels, root); addRepairModelsTag(repairModels, root); saveSimulatAssessTaskPhaseModel(simulatAssess, task, taskPhases, taskPhaseModelAll); // 输出格式化xml 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(); } // XML存盘 insert(simulatAssess); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("组装算法库仿真计算用模型XML失败: " + e.getMessage()); } } private void saveSimulatAssessTaskPhaseModel(SimulatAssess simulatAssess, Task task, List taskPhases, List 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(tpm.getPhaseConstraints().stream().map(item -> item.getProductId().toString()).collect(Collectors.joining(","))); satpm.setGkId(tpm.getOperatConditId()); satpm.setGkName(tpm.getOperatConditName()); satpm.setGkDurationRate(tpm.getOperatConditDurationRate()); satpm.setGkDuration(tpm.getOperatConditDuration()); satpm.setSort(sort++); simulatAssessTaskPhaseModelService.insert(satpm); } } public void addTasksTag(List 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()); if (null != taskPhaseModel.getPhaseConstraints() && taskPhaseModel.getPhaseConstraints().size() > 0) { taskTag.addAttribute("NAM", taskPhaseModel.getPhaseConstraints().stream().map(item -> item.getProductId().toString()).collect(Collectors.joining(","))); } } } private void addFailureModelsTag(List 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("reliability"); ele.addAttribute("value", String.valueOf(failureModel.getParam1())); break; default: break; } } } private void addRepairModelsTag(List 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; } } } public void calcTaskPhaseModelDuration(TaskPhase taskPhase, List taskPhaseModelAll) { List 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; List taskRepairConstraints = taskRepairParamDao.getTaskRepairConstraints(taskPhase.getTaskId(), taskPhaseModel.getPhaseId(), taskPhaseModel.getOperatConditId()); taskPhaseModel.setPhaseConstraints(taskRepairConstraints); taskPhaseModelAll.add(taskPhaseModel); } // 把零头补到最后一个工况模型 double duration = taskPhaseModels.get(taskPhaseModels.size() - 1).getOperatConditDuration(); taskPhaseModels.get(taskPhaseModels.size() - 1).setOperatConditDuration(duration + taskPhase.getPhaseDuration() - sum); } public List calcTaskPhaseDuration(Task task) { List 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 taskId, Long productId, String productName, String productNamePath, List productList, List paramDataList, List taskPhaseModelAll, List binoParams, Element root, List failureModels, List repairModels) { Element modelsTag = root.addElement("models"); for (TaskPhaseModel taskPhaseModel : taskPhaseModelAll) { Element modelTag = modelsTag.addElement("model"); modelTag.addAttribute("name", taskPhaseModel.getOperatConditId().toString()); List gkModelsAssembled = operatConditModelDao.getGKModelAssembled( taskPhaseModel.getOperatConditId()); OperatConditModel gkModelTop = gkModelsAssembled.stream().filter(item -> productId.equals(item.getProductId())).collect(Collectors.toList()).get(0); List modelNodeAndVnodeList = modelNodeAlgorithmDao.getListByModelId(gkModelTop.getModelId()); List 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(taskId, taskPhaseModel, gkModelTop.getModelId(), productId, productName, productNamePath, productList, paramDataList, gkModelsAssembled, algorithmList, modelNodeAndVnodeList, binoParams, computerNode, modelTag, failureModels, repairModels); } } // 递归函数 private void node2DOM(Long taskId, TaskPhaseModel taskPhaseModel, Long modelId, Long productId, String productName, String productNamePath, List productList, List paramDataList, List gkModelsAssembled, List algorithmList, List modelNodeAndVnodeList, List binoParams, ModelNode node, Element parent, List failureModels, List 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 algorithmListSub = algorithmDao.getListByModelId(gkModel.getModelId()); List 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(taskId, taskPhaseModel, gkModel.getModelId(), product.getId(), product.getName(), product.getNamePath(), productList, paramDataList, gkModelsAssembled, algorithmListSub, modelNodeAndVnodeListSub, binoParams, computerNode, parent, failureModels, repairModels); } else if ("5".equals(product.getProductType())) { // 设备 Element nodeTag = parent.addElement("node"); nodeTag.addAttribute("name", dataId.toString()); nodeTag.addAttribute("real_name", product.getName()); nodeTag.addAttribute("name_path", product.getNamePath()); nodeTag.addAttribute("type", "node"); ParamData paramData = paramDataList.stream().filter(item -> dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); Double ratio = paramData.getTaskMtbcfOperatingRatio(); if (null != ratio && ratio > 0) { // 间断型设备的处理 double cycon = taskPhaseModel.getOperatConditDuration() * ratio; double cycdown = taskPhaseModel.getOperatConditDuration() - cycon; nodeTag.addAttribute("cycon", String.valueOf(cycon)); nodeTag.addAttribute("cycdown", String.valueOf(cycdown)); } TaskBinoParam taskBinoParam = null; if (3 == paramData.getReliabDistribType()) { // 二项分布处理 taskBinoParam = binoParams.stream() .filter(item -> taskId.equals(item.getTaskId())) .filter(item -> taskPhaseModel.getPhaseId().equals(item.getPhaseId())) .filter(item -> taskPhaseModel.getOperatConditId().equals(item.getOperatConditId())) .filter(item -> modelId.equals(item.getModelId())) .filter(item -> dataId.equals(item.getProductId())) .collect(Collectors.toList()).get(0); } FailureModel failureModel = createFailureModel(paramData, taskBinoParam); failureModels.add(failureModel); Element failureTag = nodeTag.addElement("failure_model"); failureTag.addAttribute("name", failureModel.getId().toString()); if (1 == paramData.getRepairable()) { // 可维修 RepairModel repairModel = createRepairModel(paramData); 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()); element.addAttribute("real_name", productName); element.addAttribute("name_path", productNamePath); } if ("series".equals(algo.getAlgorithmType())) { element.addAttribute("type", "series"); } else if ("parallel".equals(algo.getAlgorithmType())) { element.addAttribute("type", "parallel"); } else if ("vote".equals(algo.getAlgorithmType())) { element.addAttribute("type", "vote"); element.addAttribute("k", algo.getVoteNum().toString()); } else if ("switch".equals(algo.getAlgorithmType())) { element.addAttribute("type", "standby"); } else if ("bridge".equals(algo.getAlgorithmType())) { element.addAttribute("type", "bridge"); } String[] computerNodeListStr = algo.getComputerList().split(","); for (String nodeStr : computerNodeListStr) { ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); node2DOM(taskId, taskPhaseModel, modelId, null, null, null, productList, paramDataList, gkModelsAssembled, algorithmList, modelNodeAndVnodeList, binoParams, mn, element, failureModels, repairModels); } } } private FailureModel createFailureModel(ParamData paramData, TaskBinoParam taskBinoParam) { 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: // 二项分布 if (taskBinoParam.getSimulatTimes().intValue() == taskBinoParam.getSuccessTimes().intValue()) { // 相等则为成败型 failureModel.setType(FailureModel.TYPE_FIX); failureModel.setParam1(taskBinoParam.getSuccessRate()); } else { // 二项分布 failureModel.setType(FailureModel.TYPE_BIN); failureModel.setParam1(taskBinoParam.getSuccessRate()); failureModel.setParam2(taskBinoParam.getSimulatTimes()); failureModel.setParam3(taskBinoParam.getSuccessTimes()); } break; default: break; } return failureModel; } private RepairModel createRepairModel(ParamData paramData) { RepairModel repairModel = new RepairModel(); repairModel.setId(UUIDUtil.generateId()); switch (paramData.getRepairDistribType()) { case 1: // 指数分布 repairModel.setType(FailureModel.TYPE_EXP); repairModel.setParam1(1.0 / paramData.getRepairMttcr()); break; case 2: // 威布尔分布 repairModel.setType(FailureModel.TYPE_WBL); repairModel.setParam2(paramData.getRepairMttcrOtherParams2()); repairModel.setParam3(paramData.getRepairMttcrOtherParams3()); break; case 3: // 二项分布(维修没有) break; default: break; } return repairModel; } public List getReliabilityWeakness(Long fzId, Long taskId, Long productId) { String filePath = path + "/" + fzId + "/" + "result.xml"; List list = new ArrayList<>(); Map map = new HashMap<>(); String xml; InputStream in = null; try { in = new FileInputStream(filePath); xml = IOUtils.toString(in); } catch (IOException e) { e.printStackTrace(); throw new RenException("文件不存在或者文件打不开"); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } List productList = baseDao.getProductList(taskId, productId); for (WeakDto dto : productList) { map.put(dto.getId(), dto); } JSONObject xmlJSONObj = XML.toJSONObject(xml); JSONArray jsonArray = xmlJSONObj.getJSONObject("ResultNodes").getJSONArray("ResultNode"); for (int i = 0; i < jsonArray.size(); i++) { WeakDto data = new WeakDto(); Long productId1; Object nameValue = jsonArray.getJSONObject(i).get("name"); if (nameValue instanceof Long) { productId1 = (Long) nameValue; if (map.get(productId1) != null) { WeakDto weakDto = map.get(productId1); Double mtbfTime = null; Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); data.setMtbf(mtbf); data.setMttr(mttr); data.setMsr(msr); if (weakDto != null) { data.setId(weakDto.getId()); data.setSort(weakDto.getSort()); data.setPid(weakDto.getPid()); data.setName(weakDto.getName()); data.setProductType(weakDto.getProductType()); data.setTimeRate(weakDto.getTimeRate()); mtbfTime = mtbf / weakDto.getTimeRate(); } data.setMtbfTime(mtbfTime); data.setIsWeak(0); list.add(data); } } } List treeList = new ArrayList<>(); if (list.size() > 0) { treeList = TreeUtils.build(list); this.getIsweak(treeList.get(0).getChildren()); } return treeList; } private void getIsweak(List treeList) { WeakDto minDto = null; for (WeakDto dto : treeList) { if (dto.getProductType() == 10) continue; if (minDto == null) { minDto = dto; } if (dto.getMtbfTime() < minDto.getMtbfTime()) { minDto = dto; } } minDto.setIsWeak(1); if (minDto.getChildren().size() > 0) { this.getIsweak(minDto.getChildren()); } } public SchemeComparDto SchemeCompar(String[] taskList, Long showProductId) { SchemeComparDto dto = new SchemeComparDto(); List dataDtoList = new ArrayList<>(); List curveList = new ArrayList<>(); List xData = new ArrayList<>(); SimulatAssess simulatAssess; SimulaDataDto data; Task task; for (String taskId : taskList) { Long taskModelId = Long.parseLong(taskId); task = taskService.get(taskModelId); simulatAssess = this.getByTaskId(taskModelId); SimulaDataDto resultData; if (showProductId != null) { simulatAssess.setProductId(showProductId); resultData = this.getResultXML(simulatAssess); } else { resultData = this.getResultXML(simulatAssess); } data = resultData; data.setName(task.getTaskName()); dataDtoList.add(data); xData = resultData.getCurveParam().getXData(); SchemeComparCurve curve = new SchemeComparCurve(); curve.setName(task.getTaskName()); curve.setSmooth(true); curve.setType("line"); curve.setData(resultData.getCurveParam().getYData()); curveList.add(curve); } dto.setXDataList(xData); dto.setDataList(dataDtoList); dto.setCurveList(curveList); return dto; } public SimulaDataDto getResultXML(SimulatAssess simulatAssess) { if (simulatAssess.getDataType() != null && simulatAssess.getDataType().equals("fz")) { Integer num = this.getNumById(simulatAssess.getProductId(), simulatAssess.getTaskModelId()); simulatAssess.setName("仿真记录" + (num + 1)); this.update(simulatAssess); } String filePath = path + "/" + simulatAssess.getId() + "/" + "result.xml"; String xml; InputStream in = null; try { in = new FileInputStream(filePath); xml = IOUtils.toString(in); } catch (IOException e) { e.printStackTrace(); throw new RenException("文件不存在或者文件打不开"); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } xmlJSONObj = XML.toJSONObject(xml); simulatAssess.setShowProductId(simulatAssess.getProductId()); SimulaDataDto data = this.getResultData(simulatAssess); return data; } public SimulaDataDto getResultData(SimulatAssess simulatAssess) { SimulaDataDto data = new SimulaDataDto(); CurveParam param = new CurveParam(); Double samplPeriod = Double.valueOf(simulatAssess.getSamplPeriod()); samplPeriod = samplPeriod / 60; JSONArray jsonArray = xmlJSONObj.getJSONObject("ResultNodes").getJSONArray("ResultNode"); for (int i = 0; i < jsonArray.size(); i++) { Long productId = null; Object nameValue = jsonArray.getJSONObject(i).get("name"); if (nameValue instanceof Long) { productId = (Long) nameValue; if (productId.equals(simulatAssess.getShowProductId())) { Object object = jsonArray.getJSONObject(i).get("phase"); List doubleArray = new ArrayList<>(); List xList = new ArrayList<>(); String availability = null; if (object instanceof JSONArray) { JSONArray jsonArray2 = jsonArray.getJSONObject(i).getJSONArray("phase"); for (int j = 0; j < jsonArray2.size(); j++) { if (availability != null) { availability = availability + " " + jsonArray2.getJSONObject(j).get("availability"); } else { availability = (String) jsonArray2.getJSONObject(j).get("availability"); } } } else { JSONObject jsonObject2 = jsonArray.getJSONObject(i).getJSONObject("phase"); availability = (String) jsonObject2.get("availability"); } String[] arr = availability.split(" "); // 遍历子字符串数组,将每个元素转换为double并存储到double数组中 Double j = 0.0; for (int a = 0; a < arr.length; a++) { j = samplPeriod + j; doubleArray.add(Double.parseDouble(arr[a])); xList.add(j); } param.setXData(xList); param.setYData(doubleArray); Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); data.setMtbf(mtbf); data.setMttr(mttr); data.setMsr(msr); } data.setCurveParam(param); } } return data; } }