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.db.query.QueryFilter; 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.export.service.DownloadService; 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 com.zt.life.modules.mainPart.utils.OSUtils.ProcessUtils; import io.swagger.models.auth.In; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; 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 javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.nio.file.FileAlreadyExistsException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; 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<>(); Map templetsStrMap2 = 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 TimeDiagramDto getTimeDiagram(Long productId, Long taskId, Long fzId, double smallWidth, double minPointNum) { TimeDiagramDto timeDiagramDto = new TimeDiagramDto(); timeDiagramDto.setSmallWidth(smallWidth); timeDiagramDto.setMinPointNum(minPointNum); 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"); JSONObject jsonObject3 = new JSONObject(templetStr); JSONArray jsonArray3 = jsonObject3.getJSONArray("cells"); String modelStr2 = 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(); //时序图线 List statusDtoList = new ArrayList<>(); List statusDtoListOld = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { x1 = 0; groupY = groupHeight * i; ProductStatusDto dto = list.get(i); double startTime = 0.0; int status2 = 5; for (StatusDto status : dto.getStatusList()) { switch (status.getStatus()) { case "O": y = groupY; status2 = 5; break; case "F": y = groupY;// + spaceHeight; status2 = 1; break; case "I": y = groupY;// + spaceHeight; status2 = 3; break; case "S": y = groupY;// + spaceHeight; status2 = 2; break; case "M": y = groupY;// + 2 * spaceHeight; status2 = 4; break; } x2 = x1 + status.getTimes() * pointNumPerHour + 5; if (i == 0) { statusDtoList.add(new TimeDiagramStatusDto(x1, x2, status2)); } else { statusDtoListOld.add(new TimeDiagramStatusDto(x1, x2, status2)); } 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); jsonArray3.add(textJson); } //阶段模型及刻度 x1 = 0; x2 = 0; double y1 = -60; y = -40; double y2 = -30; 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; } List statusDtoListNew = new ArrayList<>(); while (statusDtoListOld.size() > 0) { //statusDtoListOld.stream().sorted(Comparator.comparing(TimeDiagramStatusDto::getX1)).collect(Collectors.toList()); statusDtoListOld.sort(Comparator.comparing(TimeDiagramStatusDto::getX1, Comparator.naturalOrder())); TimeDiagramStatusDto nextStatusDto = statusDtoListOld.get(0); if (statusDtoListNew.size() == 0) { statusDtoListNew.add(nextStatusDto); } else { TimeDiagramStatusDto currentStatusDto = statusDtoListNew.get(statusDtoListNew.size() - 1); if (nextStatusDto.getStatus() < currentStatusDto.getStatus()) { if (nextStatusDto.getX1() == currentStatusDto.getX1() && nextStatusDto.getX2() == currentStatusDto.getX2()) { currentStatusDto.setStatus(nextStatusDto.getStatus()); } else if (nextStatusDto.getX1() == currentStatusDto.getX1() && nextStatusDto.getX2() < currentStatusDto.getX2()) { statusDtoListOld.add(new TimeDiagramStatusDto(nextStatusDto.getX2(), currentStatusDto.getX2(), currentStatusDto.getStatus())); currentStatusDto.setStatus(nextStatusDto.getStatus()); currentStatusDto.setX2(nextStatusDto.getX2()); } else if (nextStatusDto.getX1() == currentStatusDto.getX1() && nextStatusDto.getX2() > currentStatusDto.getX2()) { currentStatusDto.setStatus(nextStatusDto.getStatus()); currentStatusDto.setX2(nextStatusDto.getX2()); } else if (nextStatusDto.getX1() > currentStatusDto.getX1() && nextStatusDto.getX2() >= currentStatusDto.getX2()) { currentStatusDto.setX2(nextStatusDto.getX1()); statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus())); } else if (nextStatusDto.getX1() > currentStatusDto.getX1() && nextStatusDto.getX2() < currentStatusDto.getX2()) { statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus())); statusDtoListOld.add(new TimeDiagramStatusDto(nextStatusDto.getX2(), currentStatusDto.getX2(), currentStatusDto.getStatus())); currentStatusDto.setX2(nextStatusDto.getX1()); } } else { if (nextStatusDto.getX1() >= currentStatusDto.getX2()) { statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus())); } else if (nextStatusDto.getX2() > currentStatusDto.getX2()) { statusDtoListOld.add(new TimeDiagramStatusDto(currentStatusDto.getX2(), nextStatusDto.getX2(), nextStatusDto.getStatus())); } } } statusDtoListOld.remove(0); } timeDiagramDto.setTotalWidth(x2); double pointRate = timeDiagramDto.getTotalWidth() / timeDiagramDto.getSmallWidth(); List> lineArray = new ArrayList(); lineArray.add(statusDtoList); lineArray.add(statusDtoListNew); List> smallStatusDtoList = new ArrayList<>(); for (int j = 0; j < lineArray.size(); j++) { List tmpStatusDtoList = new ArrayList<>(); int lastStatus = 5; Boolean isFirst = true; x1 = 0; for (double i = 0; i < timeDiagramDto.getSmallWidth(); i = i + timeDiagramDto.getMinPointNum()) { int netStatus = getPointStatus(lineArray.get(j), i * pointRate, (i + timeDiagramDto.getMinPointNum()) * pointRate - 1); if (!isFirst) { if (lastStatus != netStatus) { tmpStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); lastStatus = netStatus; x1 = i; } } else { lastStatus = netStatus; isFirst = false; } x2 = i + timeDiagramDto.getMinPointNum() - 1; } tmpStatusDtoList.add(new TimeDiagramStatusDto(x1, x2, lastStatus)); smallStatusDtoList.add(tmpStatusDtoList); } JSONObject jsonObject2 = new JSONObject(modelStr2); JSONArray jsonArray2 = jsonObject2.getJSONArray("cells"); y = 10; for (int i = 0; i < smallStatusDtoList.size(); i++) { for (TimeDiagramStatusDto status : smallStatusDtoList.get(i)) { JSONObject lineJson = new JSONObject(templetsStrMap2.get(status.getStatus())); setlineXy(lineJson, status.getX1(), y, status.getX2() + 5, y, ""); JsonUtils2.setJsonValueByPath(lineJson, "data/status".split("/"), status.getStatus()); JsonUtils2.setJsonValueByPath(lineJson, "id".split("/"), UUIDUtil.generateId().toString()); jsonArray2.add(lineJson); } y = y + 25; } //图例 int spaceWitdth = 80; x1 = 0; x2 = spaceWitdth - 11; y = 60; 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); jsonArray2.add(f); } timeDiagramDto.setDiagramJson(jsonObject.toString()); timeDiagramDto.setSmallDiagramJson(jsonObject2.toString()); timeDiagramDto.setTextDiagramJson(jsonObject3.toString()); return timeDiagramDto; } private int getPointStatus(List dtoList, double x1, double x2) { int status = 5; boolean findStart = false; for (int i = 0; i < dtoList.size(); i++) { if (x2 <= dtoList.get(i).getX1()) { break; } if (!findStart) { if (dtoList.get(i).getX1() >= x1 && x1 <= dtoList.get(i).getX2()) { status = dtoList.get(i).getStatus(); findStart = true; } } if (dtoList.get(i).getX2() >= x2) { if (dtoList.get(i).getStatus() < status) status = dtoList.get(i).getStatus(); } } return status; } 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 String getPetsInfo() { Map params = new HashMap(); params.put("projectId", 10000); params.put("diagramId", 10000); String modelStr2 = ""; List list_style = baseDao.getTimeDiagram(params); if (list_style.size() > 0) { modelStr2 = list_style.get(0).getContent2(); 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()); templetsStrMap2.put(5, jsonObject.toString()); } if ("故障".equals(nodeMarker)) { templetsMap.put("F", jsonObject); templetsStrMap.put("F", jsonObject.toString()); templetsStrMap2.put(1, jsonObject.toString()); } if ("空闲".equals(nodeMarker)) { templetsMap.put("I", jsonObject); templetsStrMap.put("I", jsonObject.toString()); templetsStrMap2.put(3, jsonObject.toString()); } if ("备份".equals(nodeMarker)) { templetsMap.put("S", jsonObject); templetsStrMap.put("S", jsonObject.toString()); templetsStrMap2.put(2, jsonObject.toString()); } if ("未用".equals(nodeMarker)) { templetsMap.put("M", jsonObject); templetsStrMap.put("M", jsonObject.toString()); templetsStrMap2.put(4, 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()); } } } } return modelStr2; } public List getStatusData(Long productId, Long taskId) { List dbList = this.getProduct(productId, taskId); List childList = new ArrayList<>(); for (ProductStatusDto item : dbList) { int sameNum = item.getSameSbNum() == null ? 1 : item.getSameSbNum(); for (int i = 1; i <= sameNum; i++) { try { ProductStatusDto newRow = null; if (sameNum > 1) { newRow = item.clone(); } else newRow = item; if ("5".equals(newRow.getProductType())) { newRow.setDeviceNo(i); newRow.setDataId(item.getId().toString() + "-" + i); if (i > 1) { newRow.setName(item.getName() + "-" + i); } } else { newRow.setDeviceNo(0); newRow.setDataId(item.getId().toString()); } childList.add(newRow); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } } childList.sort(Comparator.comparing(ProductStatusDto::getDeviceNo, Comparator.naturalOrder())); for (ProductStatusDto item : childList) { JSONArray jsonArray = dialgramJson.getJSONArray(item.getDataId()); if (jsonArray != null) { this.processJSONArray(jsonArray, item, taskId); } } childList.removeIf(item -> item.getStatusList().size() == 0); 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 List simulateChecK(SimulatAssess simulatAssess) { List result = null; // 1. 检查模型完整性 List chkResult = taskService.checkTaskModel(simulatAssess.getProductId(), simulatAssess.getTaskModelId()); if (chkResult.size() > 0) { return chkResult; } return result; } public Boolean simulate(SimulatAssess simulatAssess) { Boolean result = false; // 2. 组装供算法库仿真的模型xml assembleModelXml(simulatAssess); // 3. 调用算法库,进行仿真计算 result = callReliaSimLib(simulatAssess); return result; } public List process(QueryFilter queryFilter) { List page = baseDao.getProcessList(queryFilter.getParams()); return queryFilter.getPageList(page); } private Boolean callReliaSimLib(SimulatAssess simulatAssess) { Boolean result = false; InputStream is = null; BufferedReader br = null; try { try { setParamToRedis(simulatAssess); } catch (Exception e) { throw new RenException("访问Redis失败。请检查Redis是否已启动。"); } 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 RenException("暂不支持该操作系统,进行启动算法库计算!"); } long pid = ProcessUtils.getProcessId(process); logger.info("算法库PID:" + pid); 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("启动可靠性仿真评估算法库成功。"); newProcess(simulatAssess, pid, command); update(simulatAssess); result = true; } else { String errorMsg = rtn.getErrorMsg(); throw new RenException("启动可靠性仿真评估算法库失败: errorMsg=" + errorMsg); } } } catch (IOException e) { logger.error("启动可靠性仿真评估算法库仿真时发生Exception:", e); e.printStackTrace(); throw new RenException("启动可靠性仿真评估算法库失败: errorMsg=" + 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; } public void newProcess(SimulatAssess simulatAssess, long pid, String command) { simulatAssess.setPid(pid); simulatAssess.setCommandLine(command); simulatAssess.setProcessIsAlive(true); simulatAssess.setProcessStartTime(new Date()); simulatAssess.setProgress(0); } 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); if (simulatAssess.getTaskDuration() != null) { task.setTaskDuration(simulatAssess.getTaskDuration()); } 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(simulatAssess, 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 RenException("组装算法库仿真计算用模型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; case RepairModel.TYPE_DIRAC: ele = repairModelTag.addElement("repair-time"); ele.addAttribute("value", String.valueOf(repairModel.getParam1())); 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(SimulatAssess simulatAssess, 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(simulatAssess, taskId, taskPhaseModel, gkModelTop.getModelId(), productId, productName, productNamePath, productList, paramDataList, gkModelsAssembled, algorithmList, modelNodeAndVnodeList, binoParams, computerNode, modelTag, failureModels, repairModels); } } // 递归函数 private void node2DOM(SimulatAssess simulatAssess, 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(simulatAssess, 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())) { // 设备 Integer deviceNo = node.getDeviceNo(); Element nodeTag = parent.addElement("node"); nodeTag.addAttribute("name", dataId.toString() + "-" + deviceNo); nodeTag.addAttribute("real_name", product.getName() + "-" + deviceNo); 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 = null; if (isRepairDirac(simulatAssess.getRepairDiracFlag(), taskPhaseModel, product.getId())) { repairModel = createRepairModelDirac(0); } else { 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"); element.addAttribute("k", algo.getVoteNum().toString()); } 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(simulatAssess, 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() == null && taskBinoParam.getSuccessTimes() == null) || (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 boolean isRepairDirac(Boolean repairDiracFlag, TaskPhaseModel taskPhaseModel, Long productId) { boolean result = false; if (repairDiracFlag != null && repairDiracFlag) { if (taskPhaseModel.getPhaseConstraints() == null) { result = true; } else { List list = taskPhaseModel.getPhaseConstraints().stream().filter(item -> productId.equals(item.getProductId())).collect(Collectors.toList()); if (list.size() == 0) { result = true; } } } return result; } private RepairModel createRepairModelDirac(double time) { RepairModel repairModel = new RepairModel(); repairModel.setId(UUIDUtil.generateId()); repairModel.setType(RepairModel.TYPE_DIRAC); repairModel.setParam1(0); return repairModel; } private RepairModel createRepairModel(ParamData paramData) { RepairModel repairModel = new RepairModel(); repairModel.setId(UUIDUtil.generateId()); switch (paramData.getRepairDistribType()) { case 1: // 指数分布 repairModel.setType(RepairModel.TYPE_EXP); repairModel.setParam1(1.0 / paramData.getRepairMttcr()); break; case 2: // 威布尔分布 repairModel.setType(RepairModel.TYPE_WBL); repairModel.setParam2(paramData.getRepairMttcrOtherParams2()); repairModel.setParam3(paramData.getRepairMttcrOtherParams3()); break; default: break; } return repairModel; } public List getReliabilityWeakness(Long fzId, Long taskId, Long productId) { String filePath = path + "/" + fzId + "/" + "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(); } } Map map = new HashMap<>(); 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; String nameValue = jsonArray.getJSONObject(i).get("name").toString(); if (StringUtils.isNotBlank(nameValue)) { productId1 = Convert.toLong(nameValue.split("-")[0]); Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); WeakDto weakDto = new WeakDto(); weakDto.setId(productId1); weakDto.setMtbf(mtbf); weakDto.setMttr(mttr); weakDto.setMsr(msr); if (map.get(productId1) == null) { map.put(productId1, weakDto); } else { if (weakDto.getMsr() < map.get(productId1).getMsr()) { map.put(productId1, weakDto); } } } } List productList = baseDao.getProductList(taskId, productId); for (WeakDto item : productList) { WeakDto dto = map.get(item.getId()); item.setMtbf(dto.getMtbf()); item.setMttr(dto.getMttr()); item.setMsr(dto.getMsr()); item.setMtbfTime(dto.getMtbf() / item.getTimeRate()); item.setIsWeak(0); } List treeList = new ArrayList<>(); if (productList.size() > 0) { treeList = TreeUtils.build(productList); 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 SimulatResult SchemeCompar(String[] taskList, Long showProductId, Integer samplPeriod, Integer simulatFrequency) { SimulatResult simulatResult = new SimulatResult(); List idList = new ArrayList<>(); List result = null; /* SchemeComparDto dto = new SchemeComparDto(); List dataDtoList = new ArrayList<>(); List curveList = new ArrayList<>(); List xData = new ArrayList<>(); SimulaDataDto data;*/ List simulatAssessList = new ArrayList<>(); Task task; double maxTaskDuration = 0.0; for (String taskId : taskList) { task = taskService.get(Long.parseLong(taskId)); if (task.getTaskDuration() > maxTaskDuration) { maxTaskDuration = task.getTaskDuration(); } SimulatAssess simulatAssess = new SimulatAssess(); Long id = UUIDUtil.generateId(); simulatAssess.setId(id); simulatAssess.setName(""); simulatAssess.setProductId(showProductId); simulatAssess.setSamplPeriod(samplPeriod); simulatAssess.setSimulatFrequency(simulatFrequency); simulatAssess.setTaskDuration(maxTaskDuration); simulatAssess.setTaskModelId(Long.parseLong(taskId)); simulatAssessList.add(simulatAssess); result = simulateChecK(simulatAssess); if (result != null) { simulatResult.setType("errorList"); simulatResult.setErrList(result); return simulatResult; } idList.add(id); } for (SimulatAssess simulatAssess : simulatAssessList) { simulatAssess.setTaskDuration(maxTaskDuration); this.simulate(simulatAssess); } simulatResult.setType("idList"); simulatResult.setIdList(idList); return simulatResult; } public SimulaDataDto getResultXML(SimulatAssess simulatAssess) { if (simulatAssess.getDataType() != null && simulatAssess.getDataType().equals("fz")) { simulatAssess.setName(simulatAssess.getName()); 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().toString()); 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++) { String nameValue = jsonArray.getJSONObject(i).get("name").toString(); if (nameValue.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; Double b = 100.0; for (int a = 0; a < arr.length - 1; a++) { if (Convert.toDouble(arr[a]) < Convert.toDouble(arr[a+1])) { System.out.println(arr[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; } public String verify(Long taskId) { StringBuilder result = new StringBuilder(); Task task = taskService.get(taskId); double taskTime = task.getTaskDuration(); List list = baseDao.getModel(taskId); List reliabiyList = new ArrayList<>(); String modelStr2 = ""; for (OperatConditModel model : list) { if (model.getProductId().equals(task.getProductId())) { modelStr2 = model.getContent(); continue; } List listNodes = baseDao.getNode(model.getModelId()); for (verifyDto node : listNodes) { //lmd,reliabiy,failRate double lmd = 1 / node.getMtbf(); double reliabiy = Math.exp(-1 * lmd * taskTime); double failRate = 1 - reliabiy; node.setLmd(lmd); node.setReliabiy(reliabiy); node.setFailRate(failRate); } int total = listNodes.size(); String modelStr = model.getContent(); //找到表决数量 if (modelStr.contains("switch")) { double a = 0; double lmd = listNodes.get(0).getLmd(); result.append("\n").append(total).append("个相同设备旁联,3选1,MTTBCF是").append(listNodes.get(0).getMtbf()).append("\n"); for (int i = 0; i <= total - 1; i++) { double ijc = getjc(i); double b = Math.pow(taskTime * lmd, i) * Math.exp(-1 * lmd * taskTime) / ijc; a = a + b; result.append("有").append(i + 1).append("个设备好的的概率为").append(b).append("\n"); } result.append("整个旁联系统的可靠度为").append(new Formatter().format("%.4f", a)).append("\n"); reliabiyList.add(a); } else if (modelStr.contains("parallel")) { double a = 1; result.append("\n并联设备有").append(total).append("个\n"); for (int i = 0; i < listNodes.size(); i++) { a = a * listNodes.get(i).getFailRate(); result.append("第").append(i + 1).append("个设备的MTBCF为").append(listNodes.get(i).getMtbf()).append(",").append(i + 1).append("个设备并联的失效率为").append(a).append("\n"); } double reliabiy = 1 - a; result.append("整个并联系统的失效率为").append(a).append("整个并联系统的可靠度为").append(new Formatter().format("%.4f", reliabiy)).append("\n"); reliabiyList.add(reliabiy); } else if (modelStr.contains("vote")) { Integer voteNum = baseDao.getVoteNum(model.getModelId()); if (voteNum != null) { result.append("\n").append(total).append("个相同设备表决,MTBCF为").append(listNodes.get(0).getMtbf()).append("表决数量为").append(voteNum).append("个\n"); double a = 0; double zjc = getjc(total); double reliabiy = listNodes.get(0).getReliabiy(); for (int i = voteNum; i <= total; i++) { double ijc = getjc(i); double nijc = getjc(total - i); double b = (zjc / (ijc * nijc)) * Math.pow(reliabiy, i) * Math.pow(1 - reliabiy, total - i); a = a + b; result.append("有").append(i).append("个设备是好的概率为").append(b).append("\n"); } result.append("整个表决系统的可靠度为").append(new Formatter().format("%.4f", a)).append("\n"); reliabiyList.add(a); } } } double totalReliabiy = 1; if (modelStr2.contains("parallel")) { for (Double reliabiy : reliabiyList) { totalReliabiy = totalReliabiy * (1 - reliabiy); } totalReliabiy = 1 - totalReliabiy; } else { for (Double reliabiy : reliabiyList) { totalReliabiy = totalReliabiy * reliabiy; } } result.append("\n整个总体系统的可靠度为").append(totalReliabiy).append("\n"); return String.valueOf(result); } Double getjc(int a) { double result = 1.0; for (int i = a; i > 0; i--) result = result * i; return result; } public SchemeComparDto getEcharts(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); simulatAssess.setDataType("fz"); 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.setSymbol("none"); 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 void downloadXml(HttpServletRequest request, HttpServletResponse response, String type, Long id, Integer xml) { if (type.equals("fz")) { if (xml == 1) { SimulatAssess simulatAssess = this.get(id); String xml1 = simulatAssess.getXml(); writeToTxt(request, response, xml1, "仿真输入"); } else { String filePath = path + "/" + id + "/" + "result.xml"; String xml1; InputStream in = null; try { in = new FileInputStream(filePath); xml1 = IOUtils.toString(in); } catch (IOException e) { e.printStackTrace(); throw new RenException("文件不存在或者文件打不开"); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } writeToTxt(request, response, xml1, "仿真输出"); } } else if (type.equals("sxt")) { if (xml == 1) { String filePath = path + "/" + id + "/" + "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("文件不存在或者文件打不开"); } writeToTxt(request, response, jsonStr, "时序图输入"); } else { SimulatAssess simulatAssess = this.get(id); TimeDiagramDto timeDiagram = getTimeDiagram(simulatAssess.getProductId(), simulatAssess.getTaskModelId(), simulatAssess.getId(), 1200, 5); String xml2 = timeDiagram.getDiagramJson(); writeToTxt(request, response, xml2, "时序图输出"); } } } public void writeToTxt(HttpServletRequest request, HttpServletResponse response, String jsonString, String name) {//设置响应的字符集 //设置响应内容的类型 BufferedOutputStream buff = null; ServletOutputStream outStr = null; try { response.setContentType("text/plain;charset=UTF-8"); String encodedFilename = DownloadService.getNameEncoder(request, name + "xml.txt"); response.addHeader("Content-Disposition", "attachment;filename=" + encodedFilename); outStr = response.getOutputStream(); buff = new BufferedOutputStream(outStr); buff.write(jsonString.getBytes("UTF-8")); buff.flush(); buff.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { buff.close(); outStr.close(); } catch (Exception e) { e.printStackTrace(); } } } }