package com.zt.life.modules.mainPart.taskReliability.service; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONArray; import com.fasterxml.jackson.databind.ObjectMapper; import com.spire.pdf.tables.table.convert.Convert; import com.zt.common.exception.RenException; import com.zt.common.service.BaseService; import com.zt.common.servlet.Result; import com.zt.common.utils.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.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.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.zt.life.modules.mainPart.taskReliability.dto.StatusDto; import com.zt.life.modules.mainPart.taskReliability.model.ModelRbd; import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess; 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.awt.*; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.util.ArrayList; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; 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); private static final String RELIA_SIM_TASK_TYPE_SIMULATION = "calcreq"; @Value("${spring.redis.host}") private String redisHost; @Value("${spring.redis.port}") private String redisPort; @Value("${data.reliaSimLib.mainPy}") private String reliaSimMain; @Value("${data.reliaSimLib.resultHome}") private String resultHome; @Autowired private RedisTemplate redisTemplate; @Autowired private TaskService taskService; @Autowired private TaskPhaseService taskPhaseService; @Autowired private SimulatAssessTaskPhaseModelService simulatAssessTaskPhaseModelService; @Autowired private TaskPhaseDao taskPhaseDao; @Autowired private TaskPhaseModelDao taskPhaseModelDao; @Autowired private OperatConditModelDao operatConditModelDao; @Autowired private ModelNodeAlgorithmDao modelNodeAlgorithmDao; @Autowired private AlgorithmDao algorithmDao; @Autowired private XhProductModelDao xhProductModelDao; @Autowired private ParamDataDao paramDataDao; @Autowired private TaskBinoParamDao taskBinoParamDao; @Autowired private TaskRepairParamDao taskRepairParamDao; @Autowired private TimeDiagramDao timeDiagramDao; @Value("${data.reliaSimLib.resultHome}") private String path; private JSONObject dialgramJson; String templetStr = "{\"cells\":[]}"; Map templetsMap = new HashMap<>(); Map templetsStrMap = new HashMap<>(); /** * 分页查询 * * @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 productId, Long taskModelId) { return baseDao.getList(productId, 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 = 0; 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); 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("%.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); } 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 = -130; 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 = -100; y = -70; double y2 = -50; 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(); 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, 18); 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("/"), 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; } JSONObject modelJson3 = new JSONObject(templetsStrMap.get("model")); setlineXy(modelJson3, 0, y, x2, y, null); jsonArray.add(modelJson3); Integer curPointHour = 50, periodHour = 50; 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); 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); } /* public void combineDiagram(TimeDiagram networkDiagram) { if (!networkDiagram.getDiagramId().equals(1L) && !networkDiagram.getDiagramId().equals(2L)) return null; Map params = new HashMap(); params.put("projectId", networkDiagram.getProjectId()); ProjectNetworkDiagram combineDiagram = null; params.put("diagramId", 100); List list = baseDao.getList(params); if (list.size() > 0) { combineDiagram = list.get(0); } ProjectNetworkDiagram phaseDiagram = null; params.put("diagramId", 1); List list1 = baseDao.getList(params); if (list1.size() > 0) { phaseDiagram = list1.get(0); } ProjectNetworkDiagram inspectDiagram = null; params.put("diagramId", 2); List list2 = baseDao.getList(params); if (list2.size() > 0) { inspectDiagram = list2.get(0); } String jsonStr = ""; Map> leftMap = new Hashtable<>(); Map> rightMap = new Hashtable<>(); if (phaseDiagram != null && inspectDiagram != null) { String inspectJsonStr = inspectDiagram.getContent(); JSONObject inspectJsonObj = new JSONObject(inspectJsonStr); JSONArray inspectJsonArray = inspectJsonObj.getJSONArray("cells"); String phaseJsonStr = phaseDiagram.getContent(); JSONObject phaseJsonObj = new JSONObject(phaseJsonStr); JSONArray phaseJsonArray = phaseJsonObj.getJSONArray("cells"); JSONArray leftArray = inspectJsonArray.stream().filter(iter -> "edge".equals(((JSONObject) iter).get("shape")) && "left".equals(((JSONObject) iter).get("phaseType"))).collect(Collectors.toCollection(JSONArray::new)); int leftPhaseMaxX = 0; int phaseY = 0; String leftPhaseMaxId = ""; for (int i = 0; i < leftArray.size(); i++) { Map tmpMap = new Hashtable<>(); JSONObject lineObject = (JSONObject) leftArray.get(i); String phaseId = lineObject.getStr("phaseId"); JSONArray phaseArray = phaseJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) && phaseId.equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); tmpMap.put("lineId", lineObject.getStr("id")); tmpMap.put("phaseId", phaseId); String portId = ""; if (phaseArray.size() > 0) { JSONObject phaseObject = (JSONObject) phaseArray.get(0); Object portIdObject = JsonUtils2.getArrJsonValueByPath(phaseObject, "ports/items/".split("/"), "group", "right", "id"); //portId = portIdObject == null ? "" : portIdObject.toString(); Object xObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/x".split("/")); int x = xObject == null ? 0 : Convert.toInt(xObject.toString()); if (x > leftPhaseMaxX) { leftPhaseMaxX = x; leftPhaseMaxId = phaseObject.getStr("id"); } if (phaseY == 0) { Object yObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/y".split("/")); phaseY = yObject == null ? 0 : Convert.toInt(yObject.toString()); } } tmpMap.put("portId", portId); leftMap.put(lineObject.getStr("id"), tmpMap); } JSONArray rightArray = inspectJsonArray.stream().filter(iter -> "edge".equals(((JSONObject) iter).get("shape")) && "right".equals(((JSONObject) iter).get("phaseType"))).collect(Collectors.toCollection(JSONArray::new)); int rightPhaseMinX = 10000000; String rightPhaseMinId = ""; for (int i = 0; i < rightArray.size(); i++) { Map tmpMap = new Hashtable<>(); JSONObject lineObject = (JSONObject) rightArray.get(i); String phaseId = lineObject.getStr("phaseId"); JSONArray phaseArray = phaseJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) && phaseId.equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); tmpMap.put("lineId", lineObject.getStr("id")); tmpMap.put("phaseId", phaseId); String portId = ""; if (phaseArray.size() > 0) { JSONObject phaseObject = (JSONObject) phaseArray.get(0); Object portIdObject = JsonUtils2.getArrJsonValueByPath(phaseObject, "ports/items/".split("/"), "group", "left", "id"); //portId = portIdObject == null ? "" : portIdObject.toString(); Object xObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/x".split("/")); int x = xObject == null ? 100000000 : Convert.toInt(xObject.toString()); if (x < rightPhaseMinX) { rightPhaseMinX = x; rightPhaseMinId = phaseObject.getStr("id"); } } tmpMap.put("portId", portId); rightMap.put(lineObject.getStr("id"), tmpMap); } JSONArray startArray = inspectJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) && "10000".equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); int inspectBeginX = 0; int inspectY = 0; if (startArray.size() > 0) { JSONObject inspectObject = (JSONObject) startArray.get(0); Object xObject = JsonUtils2.getJsonValueByPath(inspectObject, "position/x".split("/")); inspectBeginX = xObject == null ? 0 : Convert.toInt(xObject.toString()); Object yObject = JsonUtils2.getJsonValueByPath(inspectObject, "position/y".split("/")); inspectY = yObject == null ? 0 : Convert.toInt(yObject.toString()); } JSONArray endArray = inspectJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) && "20000".equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); int inspectEndX = 10000000; if (endArray.size() > 0) { JSONObject inspectObject = (JSONObject) endArray.get(0); Object xObject = JsonUtils2.getJsonValueByPath(inspectObject, "position/x".split("/")); inspectEndX = xObject == null ? 100000000 : Convert.toInt(xObject.toString()); } JSONObject beginObject = null; JSONObject endObject = null; for (int i = 0; i < inspectJsonArray.size(); i++) { JSONObject inspectObject = (JSONObject) inspectJsonArray.get(i); String inspectObjectId = inspectObject.getStr("id"); if (leftMap.get(inspectObjectId) != null) { JsonUtils2.setJsonValueByPath(inspectObject, "target/cell".split("/"), leftMap.get(inspectObjectId).get("phaseId")); JsonUtils2.setJsonValueByPath(inspectObject, "target/port".split("/"), leftMap.get(inspectObjectId).get("portId")); } if (rightMap.get(inspectObjectId) != null) { JsonUtils2.setJsonValueByPath(inspectObject, "target/cell".split("/"), rightMap.get(inspectObjectId).get("phaseId")); JsonUtils2.setJsonValueByPath(inspectObject, "target/port".split("/"), rightMap.get(inspectObjectId).get("portId")); } if ("10000".equals(inspectObjectId)) { //inspectJsonArray.remove(inspectObject); beginObject = inspectObject; } if ("20000".equals(inspectObjectId)) { //inspectJsonArray.remove(inspectObject); endObject = inspectObject; } } if (endObject != null) inspectJsonArray.remove(endObject); if (beginObject != null) inspectJsonArray.remove(beginObject); for (int i = 0; i < phaseJsonArray.size(); i++) { JSONObject phaseObject = (JSONObject) phaseJsonArray.get(i); if ("custom-circle".equals(phaseObject.getStr("shape"))) { Object xObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/x".split("/")); Object yObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/y".split("/")); int x = Convert.toInt(xObject.toString()); int y = Convert.toInt(yObject.toString()); if (x <= leftPhaseMaxX) x = x + (inspectBeginX - leftPhaseMaxX); else if (x >= rightPhaseMinX) x = x + (inspectEndX - rightPhaseMinX); y = y + (inspectY - phaseY); JsonUtils2.setJsonValueByPath(phaseObject, "position/x".split("/"), x); JsonUtils2.setJsonValueByPath(phaseObject, "position/y".split("/"), y); } } for (int i = 0; i < phaseJsonArray.size(); i++) { JSONObject phaseObject = (JSONObject) phaseJsonArray.get(i); if ("edge".equals(phaseObject.getStr("shape"))) { Object sourceId = JsonUtils2.getJsonValueByPath(phaseObject, "source/cell".split("/")); Object targetId = JsonUtils2.getJsonValueByPath(phaseObject, "target/cell".split("/")); if (leftPhaseMaxId.equals(sourceId) && rightPhaseMinId.equals(targetId)) { phaseJsonArray.remove(phaseObject); } } } inspectJsonArray.addAll(phaseJsonArray); jsonStr = inspectJsonObj.toString(); } else if (phaseDiagram != null) { jsonStr = phaseDiagram.getContent(); } else if (inspectDiagram != null) { jsonStr = inspectDiagram.getContent(); } if (combineDiagram != null) { combineDiagram.setContent(jsonStr); baseDao.updateById(combineDiagram); } else { combineDiagram = new ProjectNetworkDiagram(); combineDiagram.setProjectId(networkDiagram.getProjectId()); combineDiagram.setDiagramId(100L); combineDiagram.setContent(jsonStr); baseDao.insert(combineDiagram); } return combineDiagram; }*/ @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); jsonObject.put("seed", 1000); redisTemplate.opsForValue().set(key, jsonObject.toJSONString()); } private void assembleModelXml(SimulatAssess simulatAssess) { Long productId = simulatAssess.getProductId(); List productList = xhProductModelDao.getByShipId(productId); List paramDataList = paramDataDao.getDeviceParams(productId); Long taskId = simulatAssess.getTaskModelId(); Task task = taskService.get(taskId); List binoParams = taskBinoParamDao.getBinoParams(taskId); List taskRepairParams = taskRepairParamDao.getTaskRepairParams(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(productId, productList, paramDataList, taskPhaseModelAll, binoParams, taskRepairParams, 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(); } } 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(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 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 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 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 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; taskPhaseModelAll.add(taskPhaseModel); } // 把零头补到最后一个工况模型 double duration = taskPhaseModels.get(taskPhaseModels.size() - 1).getOperatConditDuration(); taskPhaseModels.get(taskPhaseModels.size() - 1).setOperatConditDuration(duration + taskPhase.getPhaseDuration() - sum); } private 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 productId, List productList, List paramDataList, List taskPhaseModelAll, List binoParams, List taskRepairParams, 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(productId, productList, paramDataList, gkModelsAssembled, algorithmList, modelNodeAndVnodeList, binoParams, taskRepairParams, computerNode, modelTag, failureModels, repairModels); } } // 递归函数 private void node2DOM(Long productId, List productList, List paramDataList, List gkModelsAssembled, List algorithmList, List modelNodeAndVnodeList, List binoParams, List taskRepairParams, 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(product.getId(), productList, paramDataList, gkModelsAssembled, algorithmListSub, modelNodeAndVnodeListSub, binoParams, taskRepairParams, computerNode, parent, failureModels, repairModels); } else if ("5".equals(product.getProductType())) { // 设备 ParamData paramData = paramDataList.stream().filter(item -> dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); Element nodeTag = parent.addElement("node"); nodeTag.addAttribute("name", dataId.toString()); nodeTag.addAttribute("type", "node"); FailureModel failureModel = new FailureModel(); failureModel.setId(UUIDUtil.generateId()); failureModel.setType(FailureModel.TYPE_EXP); failureModel.setParam1(1.0 / paramData.getTaskMtbcfRegulate()); failureModels.add(failureModel); Element failureTag = nodeTag.addElement("failure_model"); failureTag.addAttribute("name", failureModel.getId().toString()); if (1 == paramData.getRepairable()) { RepairModel repairModel = new RepairModel(); repairModel.setId(UUIDUtil.generateId()); repairModel.setType(RepairModel.TYPE_EXP); repairModel.setParam1(1.0 / paramData.getRepairMttcr()); repairModels.add(repairModel); Element repairTag = nodeTag.addElement("repair_model"); repairTag.addAttribute("name", repairModel.getId().toString()); } } } else { // vnode(运算节点) Algorithm algo = algorithmList.stream().filter(item -> node.getId().equals(item.getId())).collect(Collectors.toList()).get(0); Element element = parent.addElement("logic"); if (null == productId) { element.addAttribute("name", algo.getId().toString()); } else { element.addAttribute("name", productId.toString()); } if ("series".equals(algo.getAlgorithmType())) { element.addAttribute("type", "series"); } else if ("parallel".equals(algo.getAlgorithmType())) { element.addAttribute("type", "parallel"); } else if ("vote".equals(algo.getAlgorithmType())) { element.addAttribute("type", "vote"); element.addAttribute("k", algo.getVoteNum().toString()); } else if ("switch".equals(algo.getAlgorithmType())) { element.addAttribute("type", "standby"); } else if ("bridge".equals(algo.getAlgorithmType())) { element.addAttribute("type", "bridge"); } String[] computerNodeListStr = algo.getComputerList().split(","); for (String nodeStr : computerNodeListStr) { ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); node2DOM(null, productList, paramDataList, gkModelsAssembled, algorithmList, modelNodeAndVnodeList, binoParams, taskRepairParams, mn, element, failureModels, repairModels); } } } private FailureModel createFailureModel(ParamData paramData) { FailureModel failureModel = new FailureModel(); failureModel.setId(UUIDUtil.generateId()); switch (paramData.getReliabDistribType()) { case 1: failureModel.setType(FailureModel.TYPE_EXP); failureModel.setParam1(1.0 / paramData.getTaskMtbcfRegulate()); break; case 2: failureModel.setType(FailureModel.TYPE_WBL); failureModel.setParam2(paramData.getTaskMtbcfOtherParams2()); failureModel.setParam3(paramData.getTaskMtbcfOtherParams3()); break; case 3: failureModel.setType(FailureModel.TYPE_BIN); break; default: break; } return failureModel; } }