From 664db98c9e8595ce4dd636a27f480e3a08b81ff5 Mon Sep 17 00:00:00 2001 From: xyc <jc_xiong@hotmail.com> Date: 星期五, 21 二月 2025 11:13:51 +0800 Subject: [PATCH] 新增可忽略的维修时间 --- modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java | 2283 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 2,264 insertions(+), 19 deletions(-) diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java index 9f7995f..af14543 100644 --- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java +++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java @@ -1,32 +1,124 @@ package com.zt.life.modules.mainPart.taskReliability.service; -import com.zt.common.service.BaseService; -import com.zt.life.modules.mainPart.taskReliability.dao.SimulatAssessDao; -import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess; -import org.springframework.stereotype.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.utils.CommonUtils; +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 org.apache.commons.beanutils.PropertyUtils; +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 java.util.List; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.*; +import java.util.stream.Collectors; /** * simulat_assess * - * @author zt generator + * @author zt generator * @since 1.0.0 2024-03-20 */ @Service -public class SimulatAssessService extends BaseService<SimulatAssessDao, SimulatAssess> { +public class SimulatAssessService extends BaseService<SimulatAssessDao, SimulatAssess> { + private static final Logger logger = LoggerFactory.getLogger(SimulatAssessService.class); + public static final String RELIA_SIM_TASK_TYPE_SIMULATION = "calcreq"; + public static final String RELIA_SIM_TASK_TYPE_PROGRESS = "calcprog"; - /** - * 鍒嗛〉鏌ヨ - * - * @param queryFilter - * @return - */ - /* public List<SimulatAssess> page(QueryFilter queryFilter) { - return baseDao.getList(queryFilter.getQueryParams()); - }*/ + @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<String, JSONObject> templetsMap = new HashMap<>(); + Map<String, String> templetsStrMap = new HashMap<>(); + Map<Integer, String> templetsStrMap2 = new HashMap<>(); + + private JSONObject xmlJSONObj; + /** * 鍒犻櫎 @@ -38,10 +130,2163 @@ } public Integer getNumById(Long productId, Long taskModelId) { - return baseDao.getNumById(productId,taskModelId); + return baseDao.getNumById(productId, taskModelId); } - public List<SimulatAssess> getList(Long productId, Long taskModelId) { - return baseDao.getList(productId,taskModelId); + public List<SimulatAssess> 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<ProductStatusDto> 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<SimulatAssessTaskPhaseModel> modelDtoList = baseDao.getModelList(productId, fzId); + // 鎵�鏈夐樁娈垫ā鍨嬬殑鑺傜偣闆嗗悎 锛堢嚎鏉★級 + List<ProductStatusDto> 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<TimeDiagramStatusDto> statusDtoList = new ArrayList<>(); + List<TimeDiagramStatusDto> 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 + 10); + 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<String, Integer> 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<String, Integer> mapSpace = GetStringSpace.getStringSpaceSize(curPointHour.toString(), null, 20); + JSONObject textJson = new JSONObject(templetsStrMap.get("text")); + JsonUtils2.setJsonValueByPath(textJson, "id".split("/"), UUIDUtil.generateId().toString()); + JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), curPointHour.toString()); + + JsonUtils2.setJsonValueByPath(textJson, "size/width".split("/"), mapSpace.get("width") + 20); + + double x11 = x - mapSpace.get("width") / 2 - 5; + JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), x11); + JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y2 - 10); + jsonArray.add(textJson); + + curPointHour += periodHour; + } + + List<TimeDiagramStatusDto> 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<List<TimeDiagramStatusDto>> lineArray = new ArrayList(); + lineArray.add(statusDtoList); + lineArray.add(statusDtoListNew); + + List<List<TimeDiagramStatusDto>> smallStatusDtoList = new ArrayList<>(); + for (int j = 0; j < lineArray.size(); j++) { + List<TimeDiagramStatusDto> 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<TimeDiagramStatusDto> 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<String, Object> params = new HashMap<String, Object>(); + params.put("projectId", 10000); + params.put("diagramId", 10000); + String modelStr2 = ""; + List<TimeDiagram> 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<ProductStatusDto> getStatusData(Long productId, Long taskId) { + + List<ProductStatusDto> dbList = this.getProduct(productId, taskId); + List<ProductStatusDto> 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<SimulatAssessTaskPhaseModel> 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("M"); + 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) { + if (StringUtils.isBlank(status)) { + status = "M"; + } + 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<String, Object> params = new HashMap<String, Object>(); + params.put("projectId", projectId); + params.put("diagramId", diagramId); + + TimeDiagram diagram = null; + + List<TimeDiagram> 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<TaskModelCheckResultDto> simulateChecK(SimulatAssess simulatAssess) { + List<TaskModelCheckResultDto> result = null; + // 1. 妫�鏌ユā鍨嬪畬鏁存�� + List<TaskModelCheckResultDto> chkResult = taskService.checkTaskModel(simulatAssess.getProductId(), + simulatAssess.getTaskModelId()); + if (chkResult.size() > 0) { + return chkResult; + } + return result; + } + + public Boolean simulate(SimulatAssess simulatAssess) { + Boolean result = false; + // 2. 缁勮渚涚畻娉曞簱浠跨湡鐨勬ā鍨媥ml + assembleModelXml(simulatAssess); + + // 3. 璋冪敤绠楁硶搴擄紝杩涜浠跨湡璁$畻 + result = callReliaSimLib(simulatAssess); + + return result; + } + + public List<SimulatAssess> process(QueryFilter queryFilter) { + List<SimulatAssess> 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澶辫触銆傝妫�鏌edis鏄惁宸插惎鍔ㄣ��"); + } + + 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("绠楁硶搴揚ID锛�" + pid); + is = process.getInputStream(); + // 浠ュ懡浠よ鏂瑰紡璋冪敤绠楁硶搴撴椂锛屾帴鍙g害瀹氳繑鍥炵殑缁撴灉鏄痷tf-8缂栫爜 + br = new BufferedReader(new InputStreamReader(is, "utf-8")); + String line = br.readLine(); + logger.info("绠楁硶搴撹繑鍥炵粨鏋滐細" + line); +// int exitCode = process.waitFor(); // 寮傛鏂瑰紡锛屼笉绛夊緟绠楁硶搴撹绠楀畬姣曪紝鎵�浠ヨ娉ㄩ噴鎺夎琛� + if (line != null) { + ReliaSimLibResult rtn = 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("鍚姩鍙潬鎬т豢鐪熻瘎浼扮畻娉曞簱浠跨湡鏃跺彂鐢烢xception锛�", 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<XhProductModel> productList = xhProductModelDao.getByShipId(productId); + List<ParamData> paramDataList = paramDataDao.getDeviceParams(productId); + Long taskId = simulatAssess.getTaskModelId(); + Task task = taskService.get(taskId); + if (simulatAssess.getTaskDuration() != null) { + task.setTaskDuration(simulatAssess.getTaskDuration()); + } + List<TaskBinoParam> binoParams = taskBinoParamDao.getBinoParams(taskId); + + // 1. 璁$畻鍚勪换鍔¢樁娈电殑杩愯鏃堕暱 + List<TaskPhase> taskPhases = calcTaskPhaseDuration(task); + // 2. 璁$畻鍚勫伐鍐垫ā鍨嬬殑杩愯鏃堕暱 + List<TaskPhaseModel> taskPhaseModelAll = new ArrayList<>(); + for (TaskPhase taskPhase : taskPhases) { + calcTaskPhaseModelDuration(taskPhase, taskPhaseModelAll); + } + // 3. 灏嗗悇宸ュ喌妯″瀷閫掑綊鎷嗚В涓哄畬鏁寸殑鍙緵绠楁硶鍖呬豢鐪熻绠楃殑妯″瀷 + try { + List<FailureModel> failureModels = new ArrayList<>(); + List<RepairModel> repairModels = new ArrayList<>(); + + Document document = DocumentHelper.createDocument(); + // 娣诲姞root鑺傜偣 + Element root = document.addElement("des"); + root.addAttribute("name", "General system"); + addTasksTag(taskPhaseModelAll, root); + addModelsTag(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); + + // 杈撳嚭鏍煎紡鍖杧ml + XMLWriter xmlWriter = null; + try { + OutputFormat format = OutputFormat.createPrettyPrint(); + format.setEncoding("UTF-8"); + StringWriter writer = new StringWriter(); + xmlWriter = new XMLWriter(writer, format); + xmlWriter.write(document); + simulatAssess.setXml(writer.toString()); + } finally { + if (xmlWriter != null) xmlWriter.close(); + } + // XML瀛樼洏 + insert(simulatAssess); + } catch (Exception e) { + e.printStackTrace(); + throw new RenException("缁勮绠楁硶搴撲豢鐪熻绠楃敤妯″瀷XML澶辫触: " + e.getMessage()); + } + } + + private void saveSimulatAssessTaskPhaseModel(SimulatAssess simulatAssess, + Task task, + List<TaskPhase> taskPhases, + List<TaskPhaseModel> taskPhaseModelAll) { + int sort = 1; + for (TaskPhaseModel tpm : taskPhaseModelAll) { + TaskPhase phase = taskPhases.stream().filter(item -> + tpm.getPhaseId().equals(item.getId())).collect(Collectors.toList()).get(0); + SimulatAssessTaskPhaseModel satpm = new SimulatAssessTaskPhaseModel(); + satpm.setId(UUIDUtil.generateId()); + satpm.setFzId(simulatAssess.getId()); + satpm.setTaskId(task.getId()); + satpm.setTaskName(task.getTaskName()); + satpm.setTaskDuration(task.getTaskDuration()); + satpm.setPhaseId(tpm.getPhaseId()); + satpm.setPhaseName(phase.getPhaseName()); + satpm.setPhaseDurationRate(phase.getPhaseDurationRate()); + satpm.setPhaseDuration(phase.getPhaseDuration()); + satpm.setPhaseConstraint(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<TaskPhaseModel> taskPhaseModelAll, + Element root) { + Element tasksTag = root.addElement("tasks"); + for (TaskPhaseModel taskPhaseModel : taskPhaseModelAll) { + Element taskTag = tasksTag.addElement("task"); + taskTag.addAttribute("duration", String.valueOf(taskPhaseModel.getOperatConditDuration())); +// taskTag.addAttribute("model", taskPhaseModel.getOperatConditId().toString()); + taskTag.addAttribute("model", taskPhaseModel.getId().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<FailureModel> failureModels, + Element root) { + Element ele = null; + Element failureModelsTag = root.addElement("failure_models"); + for (FailureModel failureModel : failureModels) { + Element failureModelTag = failureModelsTag.addElement("failure_model"); + failureModelTag.addAttribute("name", failureModel.getId().toString()); + failureModelTag.addAttribute("type", failureModel.getType()); + switch (failureModel.getType()) { + case FailureModel.TYPE_EXP: + ele = failureModelTag.addElement("failure-rate"); + ele.addAttribute("value", String.valueOf(failureModel.getParam1())); + break; + case FailureModel.TYPE_BIN: + ele = failureModelTag.addElement("p"); + ele.addAttribute("value", String.valueOf(failureModel.getParam1())); + ele = failureModelTag.addElement("n"); + ele.addAttribute("value", String.valueOf(failureModel.getParam2())); + ele = failureModelTag.addElement("m"); + 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<RepairModel> repairModels, + Element root) { + Element ele = null; + Element repairModelsTag = root.addElement("repair_models"); + for (RepairModel repairModel : repairModels) { + Element repairModelTag = repairModelsTag.addElement("repair_model"); + repairModelTag.addAttribute("name", repairModel.getId().toString()); + repairModelTag.addAttribute("type", repairModel.getType()); + switch (repairModel.getType()) { + case RepairModel.TYPE_EXP: + ele = repairModelTag.addElement("repair-rate"); + ele.addAttribute("value", String.valueOf(repairModel.getParam1())); + break; + case RepairModel.TYPE_WBL: + ele = repairModelTag.addElement("scale"); + ele.addAttribute("value", String.valueOf(repairModel.getParam2())); + ele = repairModelTag.addElement("shape"); + ele.addAttribute("value", String.valueOf(repairModel.getParam3())); + break; + 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<TaskPhaseModel> taskPhaseModelAll) { + List<TaskPhaseModel> taskPhaseModels = taskPhaseModelDao.getListByPhaseId(taskPhase.getId()); + double totalRate = taskPhaseModels.stream().mapToDouble(TaskPhaseModel::getOperatConditDurationRate).sum(); + double sum = 0.0; + for (TaskPhaseModel taskPhaseModel : taskPhaseModels) { + double duration = taskPhase.getPhaseDuration() * taskPhaseModel.getOperatConditDurationRate() / totalRate; + taskPhaseModel.setOperatConditDuration(duration); + sum += duration; + + List<TaskPhaseConstraintDto> 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<TaskPhase> calcTaskPhaseDuration(Task task) { + List<TaskPhase> taskPhases = taskPhaseDao.getListByTaskId(task.getId()); + double totalRate = taskPhases.stream().mapToDouble(TaskPhase::getPhaseDurationRate).sum(); + double sum = 0.0; + for (TaskPhase taskPhase : taskPhases) { + double duration = task.getTaskDuration() * taskPhase.getPhaseDurationRate() / totalRate; + taskPhase.setPhaseDuration(duration); + sum += duration; + } + // 鎶婇浂澶磋ˉ鍒版渶鍚庝竴涓樁娈� + 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<XhProductModel> productList, + List<ParamData> paramDataList, + List<TaskPhaseModel> taskPhaseModelAll, + List<TaskBinoParam> binoParams, + Element root, + List<FailureModel> failureModels, + List<RepairModel> repairModels) { + Element modelsTag = root.addElement("models"); + for (TaskPhaseModel taskPhaseModel : taskPhaseModelAll) { + Element modelTag = modelsTag.addElement("model"); +// modelTag.addAttribute("name", taskPhaseModel.getOperatConditId().toString()); + modelTag.addAttribute("name", taskPhaseModel.getId().toString()); + List<OperatConditModel> gkModelsAssembled = operatConditModelDao.getGKModelAssembled( + taskPhaseModel.getOperatConditId()); + OperatConditModel gkModelTop = gkModelsAssembled.stream().filter(item -> + productId.equals(item.getProductId())).collect(Collectors.toList()).get(0); + List<ModelNode> modelNodeAndVnodeList = modelNodeAlgorithmDao.getListByModelId(gkModelTop.getModelId()); + List<Algorithm> algorithmList = algorithmDao.getListByModelId(gkModelTop.getModelId()); + // 灏嗘ā鍨嬭浆鎹负DOM锛屾坊鍔犲埌model鏍囩 + Algorithm endAlgo = algorithmList.stream().filter(item -> + "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); + ModelNode computerNode = modelNodeAndVnodeList.stream().filter(item -> + endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); + node2DOM(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<XhProductModel> productList, + List<ParamData> paramDataList, + List<OperatConditModel> gkModelsAssembled, + List<Algorithm> algorithmList, + List<ModelNode> modelNodeAndVnodeList, + List<TaskBinoParam> binoParams, + ModelNode node, + Element parent, + List<FailureModel> failureModels, + List<RepairModel> repairModels) { + if ("node".equals(node.getNodeType())) { + Long dataId = node.getDataId(); + XhProductModel product = productList.stream().filter(item -> + dataId.equals(item.getId())).collect(Collectors.toList()).get(0); + if ("3,4,10".contains(product.getProductType())) { + // 绯荤粺銆佸垎绯荤粺銆佽櫄鍗曞厓 + OperatConditModel gkModel = gkModelsAssembled.stream().filter(item -> + dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); + List<Algorithm> algorithmListSub = algorithmDao.getListByModelId(gkModel.getModelId()); + List<ModelNode> modelNodeAndVnodeListSub = modelNodeAlgorithmDao.getListByModelId(gkModel.getModelId()); + Algorithm endAlgo = algorithmListSub.stream().filter(item -> + "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); + ModelNode computerNode = modelNodeAndVnodeListSub.stream().filter(item -> + endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); + node2DOM(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) { + if (null != ratio && ratio != 1.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 = null; + if (1 == paramData.getRepairable() && + isRepairDirac(simulatAssess.getRepairDiracFlag(), taskPhaseModel, product.getId())) { + failureModel = createFailureModelDirac(); + } else { + failureModel = createFailureModel(paramData, taskBinoParam); + } + failureModels.add(failureModel); + Element failureTag = nodeTag.addElement("failure_model"); + failureTag.addAttribute("name", failureModel.getId().toString()); + + if (1 == paramData.getRepairable()) { + // 鍙拷鐣ョ殑缁翠慨鏃堕棿 + if (paramData.getNegligibleRepairTime() != null && paramData.getNegligibleRepairTime().doubleValue() > 0) { + nodeTag.addAttribute("negligible_repair_time", String.valueOf(paramData.getNegligibleRepairTime())); + } + // 鍙淮淇� + 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 FailureModel createFailureModelDirac() { + FailureModel failureModel = new FailureModel(); + failureModel.setId(UUIDUtil.generateId()); + failureModel.setType(FailureModel.TYPE_FIX); + failureModel.setParam1(1); + + 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<TaskPhaseConstraintDto> 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<WeakDto> 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<Long, WeakDto> map = new HashMap<>(); + JSONObject xmlJSONObj = XML.toJSONObject(xml); + JSONArray jsonArray = xmlJSONObj.getJSONObject("ResultNodes").getJSONArray("ResultNode"); + for (int i = 0; i < jsonArray.size(); i++) { + Long productId1; + String nameValue = jsonArray.getJSONObject(i).get("name").toString(); + if (StringUtils.isNotBlank(nameValue)) { + productId1 = Convert.toLong(nameValue.split("-")[0]); + + Double mtbf = null; + Double mttr = null; + Double msr = null; + if (!jsonArray.getJSONObject(i).get("mttf").equals("inf")){ + mtbf = (Double)jsonArray.getJSONObject(i).get("mttf"); + }else{ + mtbf = 0.0; + } + if (!jsonArray.getJSONObject(i).get("mttr").equals("inf")){ + mttr = (Double)jsonArray.getJSONObject(i).get("mttr"); + }else{ + mttr = 0.0; + } + if (!jsonArray.getJSONObject(i).get("msr").equals("inf")){ + msr = (Double)jsonArray.getJSONObject(i).get("msr"); + }else{ + msr = 0.0; + } + + 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<WeakDto> productList = baseDao.getProductList(taskId, productId); + for (WeakDto item : productList) { + if (map.get(item.getId()) != null) { + 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<WeakDto> treeList = new ArrayList<>(); + if (productList.size() > 0) { + treeList = TreeUtils.build(productList); + this.getIsweak(treeList.get(0).getChildren()); + } + + return treeList; + } + + private void getIsweak(List<WeakDto> treeList) { + WeakDto minDto = null; + for (WeakDto dto : treeList) { + if (dto.getMtbfTime() != null) { + 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<Long> idList = new ArrayList<>(); + List<TaskModelCheckResultDto> result = null; +/* SchemeComparDto dto = new SchemeComparDto(); + List<SimulaDataDto> dataDtoList = new ArrayList<>(); + List<SchemeComparCurve> curveList = new ArrayList<>(); + List<Double> xData = new ArrayList<>(); + + SimulaDataDto data;*/ + + List<SimulatAssess> 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<Double> doubleArray = new ArrayList<>(); + List<Double> 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(" "); + // 閬嶅巻瀛愬瓧绗︿覆鏁扮粍锛屽皢姣忎釜鍏冪礌杞崲涓篸ouble骞跺瓨鍌ㄥ埌double鏁扮粍涓� + Double j = 0.0; + for (int a = 0; a < arr.length - 1; a++) { + j = samplPeriod + j; + if (!StringUtils.isEmpty(arr[a])) { + doubleArray.add(Double.parseDouble(arr[a])); + } + xList.add(j); + } + + param.setXData(xList); + param.setYData(doubleArray); + + Double mttfMle = null; + Double mttrMle = null; + Double mtbf = null; + Double mttr = null; + Double msr = null; + if (!jsonArray.getJSONObject(i).get("mttf").equals("inf")){ + mtbf = (Double)jsonArray.getJSONObject(i).get("mttf"); + }else{ + mtbf = 0.0; + } + if (!jsonArray.getJSONObject(i).get("mttr").equals("inf")){ + mttr = (Double)jsonArray.getJSONObject(i).get("mttr"); + }else{ + mttr = 0.0; + } + if (!jsonArray.getJSONObject(i).get("msr").equals("inf")){ + msr = (Double)jsonArray.getJSONObject(i).get("msr"); + }else{ + msr = 0.0; + } + + if (!jsonArray.getJSONObject(i).get("mttr_MLE").equals("inf")){ + mttrMle = (Double)jsonArray.getJSONObject(i).get("mttr_MLE"); + }else{ + mttrMle = 0.0; + } + if(!jsonArray.getJSONObject(i).get("mttf_MLE").equals("inf")){ + mttfMle = (Double) jsonArray.getJSONObject(i).get("mttf_MLE"); + }else{ + mttfMle = 0.0; + } + data.setMtbf(mtbf); + data.setMttr(mttr); + data.setMsr(msr); + data.setMttfMle(mttfMle); + data.setMttrMle(mttrMle); + } + data.setCurveParam(param); + } + + return data; + } + + public String verify(Long taskId) { + StringBuilder result = new StringBuilder(); + Task task = taskService.get(taskId); + double taskTime = task.getTaskDuration(); + List<OperatConditModel> list = baseDao.getModel(taskId); + List<Double> reliabiyList = new ArrayList<>(); + String modelStr2 = ""; + for (OperatConditModel model : list) { + if (model.getProductId().equals(task.getProductId())) { + modelStr2 = model.getContent(); + continue; + } + List<verifyDto> 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<SimulaDataDto> dataDtoList = new ArrayList<>(); + List<SchemeComparCurve> curveList = new ArrayList<>(); + List<Double> 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 { + Object obj = mapper.readValue(new File(filePath), Object.class); + 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(); + } + } + } +/* + public Boolean mySimulate(SimulatAssess simulatAssess) { + logger.info("浠跨湡璇勪及寮�濮�"); + // 1. 浠跨湡鍒濆鍖� + SimulateStaticDataDto simulateStaticDataDto = new SimulateStaticDataDto(); + SimulateDynamicDataDto simulateDynamicDataDto = new SimulateDynamicDataDto(); + initSimulate(simulatAssess, simulateStaticDataDto, simulateDynamicDataDto); + logger.info("浠跨湡璇勪及鍒濆鍖栧畬鎴�"); + + // 2. 浠跨湡澶勭悊 + for (int i = 0; i < simulatAssess.getSimulatFrequency(); i++) { + doSimulate(i, simulatAssess, simulateStaticDataDto, simulateDynamicDataDto); + } + logger.info("浠跨湡璇勪及浠跨湡澶勭悊瀹屾垚"); + + return true; + } + + private void initSimulate(SimulatAssess simulatAssess, + SimulateStaticDataDto simulateStaticDataDto, + SimulateDynamicDataDto simulateDynamicDataDto) { + Date beginDate = new Date(); + XhProductModel product = xhProductModelDao.getById(simulatAssess.getProductId()); + List<XhProductModel> productList = xhProductModelDao.getByShipId(product.getId()); + List<ParamData> paramDataList = paramDataDao.getDeviceParams(product.getId()); + Task task = taskService.get(simulatAssess.getTaskModelId()); + if (simulatAssess.getTaskDuration() != null) { + task.setTaskDuration(simulatAssess.getTaskDuration()); + } + List<TaskBinoParam> binoParams = taskBinoParamDao.getBinoParams(task.getId()); + + // 1. 璁$畻鍚勪换鍔¢樁娈电殑杩愯鏃堕暱 + List<TaskPhase> taskPhases = calcTaskPhaseDuration(task); + // 2. 璁$畻鍚勫伐鍐垫ā鍨嬬殑杩愯鏃堕暱 + List<TaskPhaseModel> taskPhaseModelAll = new ArrayList<>(); + for (TaskPhase taskPhase : taskPhases) { + calcTaskPhaseModelDuration(taskPhase, taskPhaseModelAll); + } + Date date1 = new Date(); + logger.info("鏁版嵁鍑嗗鏃堕棿锛�" + CommonUtils.getDatePoor(date1, beginDate)); + // 3. 灏嗗悇宸ュ喌妯″瀷閫掑綊鎷嗚В涓哄畬鏁寸殑鍙緵浠跨湡璁$畻鐨勯樁娈靛伐鍐垫ā鍨嬫暟鎹� + createAllModelData(simulatAssess.getRepairDiracFlag(), + task.getId(), + product.getId(), + product.getName(), + product.getNamePath(), + productList, + paramDataList, + taskPhaseModelAll, + binoParams, + simulateStaticDataDto); + Date date2 = new Date(); + logger.info("鐢熸垚闃舵宸ュ喌妯″瀷鏁版嵁鏃堕棿锛�" + CommonUtils.getDatePoor(date2, date1)); + // 4. 鐢熸垚闈欐�佷簨浠跺垪琛� + createStaticEventList(simulateStaticDataDto, task.getTaskDuration()); + Date date3 = new Date(); + logger.info("鐢熸垚闈欐�佷簨浠跺垪琛ㄦ椂闂达細" + CommonUtils.getDatePoor(date3, date2)); + // 5. 鐢熸垚鍔ㄦ�佷豢鐪熸暟鎹� + createDynamicSimulateData(simulatAssess, simulateStaticDataDto, simulateDynamicDataDto); + Date date4 = new Date(); + logger.info("鐢熸垚鍔ㄦ�佷豢鐪熸暟鎹椂闂达細" + CommonUtils.getDatePoor(date4, date3)); + // 6. 瀛樼洏 + saveSimulatAssessTaskPhaseModel(simulatAssess, + task, + taskPhases, + taskPhaseModelAll); + } + + private void createDynamicSimulateData(SimulatAssess simulatAssess, + SimulateStaticDataDto simulateStaticDataDto, + SimulateDynamicDataDto simulateDynamicDataDto) { + List<SimulateNode> nodeList = simulateDynamicDataDto.getNodeList(); + Map<Long, SimulateModelData> modelDataMap = simulateStaticDataDto.getModelDataMap(); + for (Long key : modelDataMap.keySet()) { + for (SimulateNode node : modelDataMap.get(key).getActualNodeList()) { + List<SimulateNode> nodes = nodeList.stream().filter(item -> + node.getId().equals(item.getId())).collect(Collectors.toList()); + if (nodes.size() == 0) { + nodeList.add(node.clone()); + } + } + } + simulateDynamicDataDto.setStaticNodeNum(nodeList.size()); + + for (SimulateNode node : nodeList) { + List<List<SimulateStatus>> statusData = new ArrayList<>(); + node.setStatusData(statusData); + for (int i = 0; i < simulatAssess.getSimulatFrequency(); i++) { + List<SimulateStatus> statusList = new ArrayList<>(); + statusData.add(statusList); + } + } + } + + private void createStaticEventList(SimulateStaticDataDto simulateStaticDataDto, double taskDuration) { + Map<Long, SimulateModelData> modelDataMap = simulateStaticDataDto.getModelDataMap(); + Map<Long, SimulatePhaseModel> modelStartTimeMap = simulateStaticDataDto.getModelStartTimeMap(); + for (Long key : modelStartTimeMap.keySet()) { + // 1. 闃舵宸ュ喌妯″瀷鍒囨崲浜嬩欢 + double startTime = modelStartTimeMap.get(key).getStartTime(); + SimulateEvent event = new SimulateEvent(); + event.setId(UUIDUtil.generateId()); + event.setType(SimulateEvent.TYPE_MODEL_CHG); + event.setTime(startTime); + event.setNodeId(key.toString()); + simulateStaticDataDto.getStaticEventList().add(event); + + // 2. 鏈夎繍琛屾瘮鐨勮澶囪妭鐐圭殑cycon/cycoff浜嬩欢 + List<SimulateNode> nodes = modelDataMap.get(key).getActualNodeList().stream().filter(item -> + item.getIsLeafNode() && item.getCycOffDuration() != null).collect(Collectors.toList()); + if (nodes.size() > 0) { + List<SimulateEvent> cycEventList = new ArrayList<>(); + simulateStaticDataDto.getCycEventMap().put(key, cycEventList); + for (SimulateNode node : nodes) { +// event = new SimulateEvent(); +// event.setId(UUIDUtil.generateId()); +// event.setType(SimulateEvent.TYPE_CYCON); +// event.setTime(startTime); +// event.setNodeId(node.getId()); +// cycEventList.add(event); + event = new SimulateEvent(); + event.setId(UUIDUtil.generateId()); + event.setType(SimulateEvent.TYPE_CYCOFF); + event.setTime(startTime + node.getCycOnDuration()); + event.setNodeId(node.getId()); + cycEventList.add(event); + } + } + } + + // 3. 浠跨湡缁撴潫浜嬩欢 + SimulateEvent event = new SimulateEvent(); + event.setId(UUIDUtil.generateId()); + event.setType(SimulateEvent.TYPE_END); + event.setTime(taskDuration); + simulateStaticDataDto.getStaticEventList().add(event); + } + + private void createAllModelData(boolean repairDiracFlag, + Long taskId, + Long productId, + String productName, + String productNamePath, + List<XhProductModel> productList, + List<ParamData> paramDataList, + List<TaskPhaseModel> taskPhaseModelAll, + List<TaskBinoParam> binoParams, + SimulateStaticDataDto simulateStaticDataDto) { + double startTime = 0; + for (TaskPhaseModel taskPhaseModel : taskPhaseModelAll) { + List<OperatConditModel> gkModelsAssembled = operatConditModelDao.getGKModelAssembled( + taskPhaseModel.getOperatConditId()); + OperatConditModel gkModelTop = gkModelsAssembled.stream().filter(item -> + productId.equals(item.getProductId())).collect(Collectors.toList()).get(0); + List<ModelNode> modelNodeAndVnodeList = modelNodeAlgorithmDao.getListByModelId(gkModelTop.getModelId()); + List<Algorithm> algorithmList = algorithmDao.getListByModelId(gkModelTop.getModelId()); + // 灏嗘ā鍨嬭浆鎹负Tree + SimulateNode root = new SimulateNode(); + 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); + Date beginDate = new Date(); + node2Tree(repairDiracFlag, + taskId, + taskPhaseModel, + productId, + productName, + productNamePath, + productList, + paramDataList, + gkModelsAssembled, + algorithmList, + modelNodeAndVnodeList, + binoParams, + computerNode, root); + Date date1 = new Date(); + logger.info("node2Tree鏃堕棿锛�" + CommonUtils.getDatePoor(date1, beginDate)); + SimulateModelData simulateModelData = new SimulateModelData(); + SimulateNode.treeToModelData(root, simulateModelData); + Date date2 = new Date(); + logger.info("treeToModelData鏃堕棿锛�" + CommonUtils.getDatePoor(date2, date1)); + simulateStaticDataDto.getModelDataMap().put(taskPhaseModel.getId(), simulateModelData); + SimulatePhaseModel simulatePhaseModel = new SimulatePhaseModel(); + simulatePhaseModel.setId(taskPhaseModel.getId()); + simulatePhaseModel.setStartTime(startTime); + simulateStaticDataDto.getModelStartTimeMap().put(taskPhaseModel.getId(), simulatePhaseModel); + startTime += taskPhaseModel.getOperatConditDuration(); + } + } + + // 閫掑綊鍑芥暟 + private void node2Tree(boolean repairDiracFlag, + Long taskId, + TaskPhaseModel taskPhaseModel, + Long productId, + String productName, + String productNamePath, + List<XhProductModel> productList, + List<ParamData> paramDataList, + List<OperatConditModel> gkModelsAssembled, + List<Algorithm> algorithmList, + List<ModelNode> modelNodeAndVnodeList, + List<TaskBinoParam> binoParams, + ModelNode node, + SimulateNode simulateNode) { + if ("node".equals(node.getNodeType())) { + simulateNode.setIsActualNode(true); + 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<Algorithm> algorithmListSub = algorithmDao.getListByModelId(gkModel.getModelId()); + List<ModelNode> modelNodeAndVnodeListSub = modelNodeAlgorithmDao.getListByModelId(gkModel.getModelId()); + Algorithm endAlgo = algorithmListSub.stream().filter(item -> + "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); + ModelNode computerNode = modelNodeAndVnodeListSub.stream().filter(item -> + endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); + node2Tree(repairDiracFlag, + taskId, + taskPhaseModel, + product.getId(), + product.getName(), + product.getNamePath(), + productList, + paramDataList, + gkModelsAssembled, + algorithmListSub, + modelNodeAndVnodeListSub, + binoParams, + computerNode, simulateNode); + } else if ("5".equals(product.getProductType())) { + // 璁惧 + simulateNode.setIsLeafNode(true); + simulateNode.setFailureRate(1.0); + Integer deviceNo = node.getDeviceNo(); + simulateNode.setId(dataId.toString() + "-" + deviceNo); + simulateNode.setName(product.getName() + "-" + deviceNo); + simulateNode.setNamePath(product.getNamePath()); + + ParamData paramData = paramDataList.stream().filter(item -> + dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); + Double ratio = paramData.getTaskMtbcfOperatingRatio(); + if (null != ratio && ratio != 1.0) { + // 闂存柇鍨嬭澶囩殑澶勭悊 + simulateNode.setRunningRatio(ratio); + double cycon = taskPhaseModel.getOperatConditDuration() * ratio; + double cycdown = taskPhaseModel.getOperatConditDuration() - cycon; + simulateNode.setCycOnDuration(cycon); + simulateNode.setCycOffDuration(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 -> dataId.equals(item.getProductId())) + .collect(Collectors.toList()).get(0); + } + if (1 == paramData.getRepairable() && + isRepairDirac(repairDiracFlag, taskPhaseModel, product.getId())) { + simulateNode.setIsRepairDirac(true); + } else { + simulateNode.setIsRepairDirac(false); + simulateNode.setFailureModel(createFailureModel(paramData, taskBinoParam)); + } + if (1 == paramData.getRepairable()) { + // 鍙淮淇� + simulateNode.setRepairModel(createRepairModel(paramData)); + } + } + } else { + // vnode锛堣繍绠楄妭鐐癸級 + Algorithm algo = algorithmList.stream().filter(item -> + node.getId().equals(item.getId())).collect(Collectors.toList()).get(0); + if (null == productId) { + simulateNode.setIsActualNode(false); + simulateNode.setId(algo.getId().toString()); + } else { + simulateNode.setIsActualNode(true); + simulateNode.setId(productId.toString()); + simulateNode.setName(productName); + simulateNode.setNamePath(productNamePath); + } + if (SimulateNode.LOGIC_TYPE_SERIES.equals(algo.getAlgorithmType())) { + simulateNode.setLogicType(SimulateNode.LOGIC_TYPE_SERIES); + } else if (SimulateNode.LOGIC_TYPE_PARALLEL.equals(algo.getAlgorithmType())) { + simulateNode.setLogicType(SimulateNode.LOGIC_TYPE_PARALLEL); + } else if (SimulateNode.LOGIC_TYPE_VOTE.equals(algo.getAlgorithmType())) { + simulateNode.setLogicType(SimulateNode.LOGIC_TYPE_VOTE); + simulateNode.setVoteNum(algo.getVoteNum()); + } else if ("switch".equals(algo.getAlgorithmType())) { + simulateNode.setLogicType(SimulateNode.LOGIC_TYPE_STANDBY); + simulateNode.setVoteNum(algo.getVoteNum()); + } else if ("warm_switch".equals(algo.getAlgorithmType())) { + simulateNode.setLogicType(SimulateNode.LOGIC_TYPE_WARM_STANDBY); + simulateNode.setVoteNum(algo.getVoteNum()); + } else if (SimulateNode.LOGIC_TYPE_BRIDGE.equals(algo.getAlgorithmType())) { + simulateNode.setLogicType(SimulateNode.LOGIC_TYPE_BRIDGE); + } + String[] computerNodeListStr = algo.getComputerList().split(","); + for (String nodeStr : computerNodeListStr) { + SimulateNode sn = new SimulateNode(); + simulateNode.getChildren().add(sn); + ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> + nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); + node2Tree(repairDiracFlag, + taskId, + taskPhaseModel, + null, + null, + null, + productList, + paramDataList, + gkModelsAssembled, + algorithmList, + modelNodeAndVnodeList, + binoParams, + mn, sn); + } + } + } + + private void doSimulate(int sCnt, SimulatAssess simulatAssess, + SimulateStaticDataDto simulateStaticDataDto, + SimulateDynamicDataDto simulateDynamicDataDto) { + // 1. 浠跨湡浜嬩欢鍒濆鍖� + initSimulateEvent(simulateStaticDataDto, simulateDynamicDataDto); + // 2. 浠跨湡鏃堕挓鍒濆鍖� + double lastTime = 0.0; + // 3. 浠跨湡浜嬩欢姝诲惊鐜紙浠跨湡缁撴潫浜嬩欢閫�鍑猴級 + for (;;) { + boolean hasModelChgEvent = false; + // 3.1 浠庝豢鐪熶簨浠跺垪琛ㄤ腑鏌ヨ鍑轰簨浠舵椂闂存渶灏忕殑浜嬩欢闆嗗悎 + List<SimulateEvent> minEventList = getMinEventList(simulateDynamicDataDto.getEventList()); + double currentTime = minEventList.get(0).getTime(); + // 3.2 鏈�灏忔椂闂翠簨浠堕泦鍚堝鐞� + List<SimulateEvent> endEvents = minEventList.stream().filter(item -> + SimulateEvent.TYPE_END==item.getType()).collect(Collectors.toList()); + if (endEvents.size() > 0) { + break; + } + List<SimulateEvent> modelChgEvents = minEventList.stream().filter(item -> + SimulateEvent.TYPE_MODEL_CHG==item.getType()).collect(Collectors.toList()); + if (modelChgEvents.size() > 0) { + hasModelChgEvent = true; + SimulateEvent modelChgEvent = modelChgEvents.get(0); + // 3.2.1 鏂伴樁娈垫暟鎹姞杞� + loadNewModelData(simulateStaticDataDto, simulateDynamicDataDto, modelChgEvent); + } + List<SimulateNode> leafNodes = simulateDynamicDataDto.getNodeList().stream().filter(item -> + item.getIsLeafNode()).collect(Collectors.toList()); + for (SimulateNode leafNode : leafNodes) { + // 3.2.2 鑰楁椂鍙婄姸鎬佸鐞嗭紙瀵规墍鏈夊彾瀛愯妭鐐瑰鐞嗭級 + handleLifeAndStatus(currentTime-lastTime, currentTime, leafNode, simulateDynamicDataDto.getNodeList()); + } + if (hasModelChgEvent) { + // 3.2.3 闃舵宸ュ喌妯″瀷鍒囨崲澶勭悊 + // 浜岄」鍒嗗竷璁惧澶勭悊 + // 绉婚櫎璇ラ樁娈靛垏鎹簨浠� + removeEvent(simulateDynamicDataDto, modelChgEvents.get(0)); + } + List<SimulateEvent> cycoffEvents = minEventList.stream().filter(item -> + SimulateEvent.TYPE_CYCOFF==item.getType()).collect(Collectors.toList()); + for (SimulateEvent cycoffEvent : cycoffEvents) { + // 3.2.4 cycoff浜嬩欢澶勭悊 + SimulateNode node = simulateDynamicDataDto.getNodeList().stream().filter(item -> + cycoffEvent.getNodeId().equals(item.getId())).collect(Collectors.toList()).get(0); + node.setStatus(SimulateStatus.STATUS_CYCDOWN); + // 绉婚櫎璇ycoff浜嬩欢 + removeEvent(simulateDynamicDataDto, cycoffEvent); + } + // 3.2.5 杩唬澶勭悊 + + } + } + + private void removeEvent(SimulateDynamicDataDto simulateDynamicDataDto, SimulateEvent event) { + Iterator<SimulateEvent> iterator = simulateDynamicDataDto.getEventList().iterator(); + while (iterator.hasNext()) { + SimulateEvent item = iterator.next(); + if (event.getId().equals(item.getId())) iterator.remove(); + } + } + + private void handleLifeAndStatus(double deltaTime, + double currentTime, + SimulateNode node, + List<SimulateNode> nodeList) { + // 鑰楁椂澶勭悊 + if (SimulateStatus.STATUS_ACTIVE.equals(node.getStatus()) || + SimulateStatus.STATUS_WARM.equals(node.getStatus())) { + node.setLifeTime(node.getLifeTime()-deltaTime*node.getFailureRate()); + } + if (node.getRepairTime()>0 && node.getRepairModel()!=null) { + double repairTime = node.getRepairTime()-deltaTime; + if (repairTime < 0) repairTime = 0; + node.setRepairTime(repairTime); + } + // 鐘舵�佸鐞� + if (SimulateStatus.STATUS_ACTIVE.equals(node.getStatus()) && + node.getLifeTime()<=0) { + if (node.getRepairModel()==null) { + node.setStatus(SimulateStatus.STATUS_FAILED); + } else { + node.setStatus(SimulateStatus.STATUS_MAINTENANCE); + double repairTime = createRepairTime(node.getRepairModel()); + node.setRepairTime(repairTime); + node.setLifeTime(0.0); + node.getFailureEvent().setType(SimulateEvent.TYPE_EXPECT_REPAIR); + node.getFailureEvent().setTime(currentTime+repairTime); + } + setMayChangeStatus(node, nodeList); + } + if (SimulateStatus.STATUS_MAINTENANCE.equals(node.getStatus()) && + node.getRepairTime()<=0) { + node.setStatus(SimulateStatus.STATUS_ACTIVE); + double lifeTime = createLifeTime(node.getFailureModel()); + node.setLifeTime(lifeTime); + node.setRepairTime(0.0); + node.getFailureEvent().setType(SimulateEvent.TYPE_EXPECT_FAIL); + node.getFailureEvent().setTime(currentTime+lifeTime); + setMayChangeStatus(node, nodeList); + } + } + + private void setMayChangeStatus(SimulateNode node, + List<SimulateNode> nodeList) { + node.setMayChangeStatus(true); + for (String pid : node.getPids()) { + SimulateNode pNode = nodeList.stream().filter(item -> + pid.equals(item.getId())).collect(Collectors.toList()).get(0); + pNode.setMayChangeStatus(true); + } + } + + private void loadNewModelData(SimulateStaticDataDto simulateStaticDataDto, + SimulateDynamicDataDto simulateDynamicDataDto, + SimulateEvent modelChgEvent) { + // 鍒犻櫎浠跨湡鍔ㄦ�佹暟鎹腑鐨勮櫄鑺傜偣 + Iterator<SimulateNode> iterator = simulateDynamicDataDto.getNodeList().iterator(); + while (iterator.hasNext()) { + SimulateNode item = iterator.next(); + if (!item.getIsActualNode()) iterator.remove(); + } + // 鎵�鏈夊疄鑺傜偣鍒濆鍖栦负鏈娇鐢� + for (SimulateNode node : simulateDynamicDataDto.getNodeList()) { + node.setIsUsed(false); + } + // 鍔犲叆璇ラ樁娈靛伐鍐垫ā鍨嬬殑鎵�鏈夎櫄鑺傜偣 + SimulateModelData modelData = simulateStaticDataDto.getModelDataMap().get(Long.valueOf(modelChgEvent.getNodeId())); + for (SimulateNode vnode : modelData.getVirtualNodeList()) { + simulateDynamicDataDto.getNodeList().add(vnode.clone()); + } + // 鎶婅闃舵宸ュ喌妯″瀷涓殑鎵�鏈夊疄鑺傜偣鐨勫唴瀹规嫹璐濆埌浠跨湡鍔ㄦ�佹暟鎹腑鐨勫疄鑺傜偣 + for (SimulateNode anode : modelData.getActualNodeList()) { + SimulateNode node = simulateDynamicDataDto.getNodeList().stream().filter(item -> + anode.getId().equals(item.getId())).collect(Collectors.toList()).get(0); + node.setPid(anode.getPid()); + node.setNamePath(anode.getNamePath()); + node.setPids(anode.getCids()); + node.setCids(anode.getCids()); + node.setIsLeafNode(anode.getIsLeafNode()); + node.setIsUsed(anode.getIsUsed()); + node.setFailureRate(anode.getFailureRate()); +// node.setRunningRatio(anode.getRunningRatio()); +// node.setCycOnDuration(anode.getCycOnDuration()); +// node.setCycOffDuration(anode.getCycOffDuration()); + node.setFailureModel(anode.getFailureModel()); + node.setRepairModel(anode.getRepairModel()); + node.setIsRepairDirac(anode.getIsRepairDirac()); + node.setLogicType(anode.getLogicType()); + node.setVoteNum(anode.getVoteNum()); + node.setNodeNo(anode.getNodeNo()); + } + // 鎶婅闃舵宸ュ喌妯″瀷涓殑cycoff浜嬩欢鍔犲叆鍒颁豢鐪熶簨浠跺垪琛� + List<SimulateEvent> cycEvents = simulateStaticDataDto.getCycEventMap().get(Long.valueOf(modelChgEvent.getNodeId())); + for (SimulateEvent event : cycEvents) { + simulateDynamicDataDto.getEventList().add(event); + } + } + + private List<SimulateEvent> getMinEventList(List<SimulateEvent> eventList) { + List<SimulateEvent> result = new ArrayList<>(); + double minTime = Double.MAX_VALUE; + for (SimulateEvent event : eventList) { + if (event.getTime() <= minTime) { + minTime = event.getTime(); + result.add(event); + } + } + return result; + } + + private void initSimulateEvent(SimulateStaticDataDto simulateStaticDataDto, + SimulateDynamicDataDto simulateDynamicDataDto) { + simulateDynamicDataDto.getEventList().clear(); + simulateDynamicDataDto.getEventList().addAll(simulateStaticDataDto.getStaticEventList()); + + List<SimulateNode> leafNodeList = simulateDynamicDataDto.getNodeList().stream().filter(item -> + item.getIsLeafNode()).collect(Collectors.toList()); + for (SimulateNode leafNode : leafNodeList) { + double lifeTime = createLifeTime(leafNode.getFailureModel()); + // 涓轰簡鎻愰珮鏁堢巼锛屽姩鎬佷簨浠跺垪琛ㄥ強璁惧鑺傜偣閲屽悓鏃朵繚瀛橀鏈熸晠闅�/淇浜嬩欢瀹炰綋鐨勬寚閽� + SimulateEvent event = new SimulateEvent(); + event.setId(UUIDUtil.generateId()); + event.setType(SimulateEvent.TYPE_EXPECT_FAIL); + event.setTime(lifeTime); + event.setNodeId(leafNode.getId()); + simulateDynamicDataDto.getEventList().add(event); + leafNode.setFailureEvent(event); + leafNode.setLifeTime(lifeTime); + leafNode.setRepairTime(0.0); + leafNode.setStatus(SimulateStatus.STATUS_ACTIVE); + } + } + + private double createLifeTime(FailureModel failureModel) { + return 0.0; + } + + private double createRepairTime(RepairModel repairModel) { + return 0.0; + } + + */ } -- Gitblit v1.9.1