|  |  | 
 |  |  |  | 
 |  |  | 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.modules.mainPart.basicInfo.dao.ParamDataDao; | 
 |  |  | import com.zt.life.modules.mainPart.basicInfo.dao.XhProductModelDao; | 
 |  |  | 
 |  |  | 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.TaskModelCheckResult; | 
 |  |  | 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.XMLWriter; | 
 |  |  | import org.slf4j.Logger; | 
 |  |  | import org.slf4j.LoggerFactory; | 
 |  |  | import com.zt.life.modules.mainPart.taskReliability.dto.StatusDto; | 
 |  |  | import com.zt.life.modules.mainPart.taskReliability.model.ModelRbd; | 
 |  |  | import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess; | 
 |  |  | import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssessTaskPhaseModel; | 
 |  |  | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.io.BufferedReader; | 
 |  |  | import java.io.InputStream; | 
 |  |  | import java.io.InputStreamReader; | 
 |  |  | import java.io.StringWriter; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.io.File; | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.Hashtable; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Map; | 
 |  |  | import java.io.*; | 
 |  |  | import java.nio.file.FileAlreadyExistsException; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.regex.Matcher; | 
 |  |  | import java.util.regex.Pattern; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 
 |  |  |  * @since 1.0.0 2024-03-20 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | public class SimulatAssessService  extends BaseService<SimulatAssessDao, SimulatAssess> { | 
 |  |  | public class SimulatAssessService extends BaseService<SimulatAssessDao, SimulatAssess> { | 
 |  |  |     private static final Logger logger = LoggerFactory.getLogger(SimulatAssessService.class); | 
 |  |  |     private static final String RELIA_SIM_TASK_TYPE_SIMULATION = "calcreq"; | 
 |  |  |     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; | 
 |  |  | 
 |  |  |     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 TaskPhaseService taskPhaseService; | 
 |  |  |     @Autowired | 
 |  |  |     private SimulatAssessTaskPhaseModelService simulatAssessTaskPhaseModelService; | 
 |  |  |     @Autowired | 
 |  |  | 
 |  |  |     String templetStr = "{\"cells\":[]}"; | 
 |  |  |     Map<String, JSONObject> templetsMap = new HashMap<>(); | 
 |  |  |     Map<String, String> templetsStrMap = new HashMap<>(); | 
 |  |  |     Map<Integer, String> templetsStrMap2 = new HashMap<>(); | 
 |  |  |  | 
 |  |  |     private JSONObject xmlJSONObj; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 分页查询 | 
 |  |  | 
 |  |  |         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.getChildren(productId, taskId); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getTimeDiagram(Long productId, Long taskId, Long fzId) { | 
 |  |  |     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; | 
 |  |  | 
 |  |  |         JSONObject jsonObject = new JSONObject(templetStr); | 
 |  |  |         JSONArray jsonArray = jsonObject.getJSONArray("cells"); | 
 |  |  |  | 
 |  |  |         this.getPetsInfo(); | 
 |  |  |         JSONObject jsonObject3 = new JSONObject(templetStr); | 
 |  |  |         JSONArray jsonArray3 = jsonObject3.getJSONArray("cells"); | 
 |  |  |  | 
 |  |  |         String modelStr2 = this.getPetsInfo(); | 
 |  |  |         double x1 = 0; | 
 |  |  |         double x2 = 0; | 
 |  |  |         int y = 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); | 
 |  |  |             } | 
 |  |  | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), dto.getName()); | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), 20); | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y - 15); | 
 |  |  |             jsonArray.add(textJson); | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //图例 | 
 |  |  |         int spaceWitdth = 80; | 
 |  |  |         x1 = -spaceWitdth; | 
 |  |  |         x2 = -11; | 
 |  |  |         y = -100; | 
 |  |  |         String[] tlArr = "O,F,I,S,M".split(","); | 
 |  |  |         for (String s : tlArr) { | 
 |  |  |             JSONObject f = templetsMap.get(s); | 
 |  |  |             x1 = x1 + spaceWitdth; | 
 |  |  |             x2 = x2 + spaceWitdth; | 
 |  |  |             setlineXy(f, x1, y, x2, y, null); | 
 |  |  |             jsonArray.add(f); | 
 |  |  |             jsonArray3.add(textJson); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //阶段模型及刻度 | 
 |  |  |         x1 = 0; | 
 |  |  |         x2 = 0; | 
 |  |  |         double y1 = -60; | 
 |  |  |         y = -30; | 
 |  |  |         double y2 = -10; | 
 |  |  |         JSONObject modelJson = new JSONObject(templetsStrMap.get("model")); | 
 |  |  |         y = -40; | 
 |  |  |         double y2 = -30; | 
 |  |  |  | 
 |  |  |         setlineXy(modelJson, x1, y1, x1, y2, null); | 
 |  |  |         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(); | 
 |  |  |             x2 = x2 + modelDto.getGkDuration() * pointNumPerHour; | 
 |  |  |             double gkPoint = modelDto.getGkDuration() * pointNumPerHour; | 
 |  |  |             x2 = x2 + gkPoint; | 
 |  |  |             if (i < modelDtoList.size() - 1) { | 
 |  |  |                 setlineXy(modelJson2, x2, y1, x2, y, null); | 
 |  |  |             } else { | 
 |  |  | 
 |  |  |                 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("/"), modelName); | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), x1 + 30); | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y1); | 
 |  |  |             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); | 
 |  |  |  | 
 |  |  |         double curPointHour = 50, periodHour = 50; | 
 |  |  |         //刻度 | 
 |  |  |         Integer curPointHour = 100, periodHour = 100; | 
 |  |  |         while (curPointHour < totalHours) { | 
 |  |  |             JSONObject modelJson4 = new JSONObject(templetsStrMap.get("model")); | 
 |  |  |             double x = curPointHour * pointNumPerHour; | 
 |  |  |             setlineXy(modelJson4, x, y, x, y, null); | 
 |  |  |             setlineXy(modelJson4, x, y, x, y2, null); | 
 |  |  |             jsonArray.add(modelJson4); | 
 |  |  |  | 
 |  |  |             Map<String, Integer> mapSpace = GetStringSpace.getStringSpaceSize(curPointHour.toString(), null, 20); | 
 |  |  |             JSONObject textJson = new JSONObject(templetsStrMap.get("text")); | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "id".split("/"), UUIDUtil.generateId().toString()); | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "attrs/label/textWrap/text".split("/"), curPointHour.toString()); | 
 |  |  |  | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "size/width".split("/"), mapSpace.get("width") + 20); | 
 |  |  |  | 
 |  |  |             double x11 = x - mapSpace.get("width") / 2 - 5; | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "position/x".split("/"), x11); | 
 |  |  |             JsonUtils2.setJsonValueByPath(textJson, "position/y".split("/"), y2 - 10); | 
 |  |  |             jsonArray.add(textJson); | 
 |  |  |  | 
 |  |  |             curPointHour += periodHour; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return jsonObject.toString(); | 
 |  |  |         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 void getPetsInfo() { | 
 |  |  |     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"); | 
 |  |  | 
 |  |  |                     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("/"), ""); | 
 |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return modelStr2; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<ProductStatusDto> getStatusData(Long productId, Long taskId) { | 
 |  |  |         List<ProductStatusDto> childList = this.getProduct(productId, taskId); | 
 |  |  |  | 
 |  |  |         List<ProductStatusDto> dbList = this.getProduct(productId, taskId); | 
 |  |  |         List<ProductStatusDto> childList = new ArrayList<>(); | 
 |  |  |         for (ProductStatusDto item : dbList) { | 
 |  |  |             if (item.getSameSbNum() > 1) { | 
 |  |  |                 for (int i = 1; i <= item.getSameSbNum(); i++) { | 
 |  |  |                     try { | 
 |  |  |                         ProductStatusDto newRow = item.clone(); | 
 |  |  |                         newRow.setDeviceNo(i); | 
 |  |  |                         newRow.setName(item.getName() + "-" + i); | 
 |  |  |                         newRow.setDataId(item.getId().toString() + "-" + i); | 
 |  |  |                         childList.add(newRow); | 
 |  |  |                     } catch (CloneNotSupportedException e) { | 
 |  |  |                         e.printStackTrace(); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 item.setDeviceNo(0); | 
 |  |  |                 item.setDataId(item.getId().toString()); | 
 |  |  |                 childList.add(item); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         childList.sort(Comparator.comparing(ProductStatusDto::getDeviceNo, Comparator.naturalOrder())); | 
 |  |  |         for (ProductStatusDto item : childList) { | 
 |  |  |             JSONArray jsonArray = dialgramJson.getJSONArray(String.valueOf(item.getId())); | 
 |  |  |             JSONArray jsonArray = dialgramJson.getJSONArray(item.getDataId()); | 
 |  |  |             if (jsonArray != null) { | 
 |  |  |                 this.processJSONArray(jsonArray, item, taskId); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         childList.removeIf(item -> item.getStatusList().size() == 0); | 
 |  |  |         return childList; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         timeDiagramDao.updateById(diagram); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /*    public void combineDiagram(TimeDiagram networkDiagram) { | 
 |  |  |  | 
 |  |  |         if (!networkDiagram.getDiagramId().equals(1L) && !networkDiagram.getDiagramId().equals(2L)) | 
 |  |  |             return null; | 
 |  |  |         Map<String, Object> params = new HashMap<String, Object>(); | 
 |  |  |         params.put("projectId", networkDiagram.getProjectId()); | 
 |  |  |  | 
 |  |  |         ProjectNetworkDiagram combineDiagram = null; | 
 |  |  |         params.put("diagramId", 100); | 
 |  |  |         List<ProjectNetworkDiagram> list = baseDao.getList(params); | 
 |  |  |         if (list.size() > 0) { | 
 |  |  |             combineDiagram = list.get(0); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         ProjectNetworkDiagram phaseDiagram = null; | 
 |  |  |         params.put("diagramId", 1); | 
 |  |  |         List<ProjectNetworkDiagram> list1 = baseDao.getList(params); | 
 |  |  |         if (list1.size() > 0) { | 
 |  |  |             phaseDiagram = list1.get(0); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         ProjectNetworkDiagram inspectDiagram = null; | 
 |  |  |         params.put("diagramId", 2); | 
 |  |  |         List<ProjectNetworkDiagram> list2 = baseDao.getList(params); | 
 |  |  |         if (list2.size() > 0) { | 
 |  |  |             inspectDiagram = list2.get(0); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         String jsonStr = ""; | 
 |  |  |         Map<String, Map<String, String>> leftMap = new Hashtable<>(); | 
 |  |  |         Map<String, Map<String, String>> rightMap = new Hashtable<>(); | 
 |  |  |         if (phaseDiagram != null && inspectDiagram != null) { | 
 |  |  |             String inspectJsonStr = inspectDiagram.getContent(); | 
 |  |  |             JSONObject inspectJsonObj = new JSONObject(inspectJsonStr); | 
 |  |  |             JSONArray inspectJsonArray = inspectJsonObj.getJSONArray("cells"); | 
 |  |  |  | 
 |  |  |             String phaseJsonStr = phaseDiagram.getContent(); | 
 |  |  |             JSONObject phaseJsonObj = new JSONObject(phaseJsonStr); | 
 |  |  |             JSONArray phaseJsonArray = phaseJsonObj.getJSONArray("cells"); | 
 |  |  |  | 
 |  |  |             JSONArray leftArray = inspectJsonArray.stream().filter(iter -> "edge".equals(((JSONObject) iter).get("shape")) | 
 |  |  |                     && "left".equals(((JSONObject) iter).get("phaseType"))).collect(Collectors.toCollection(JSONArray::new)); | 
 |  |  |             int leftPhaseMaxX = 0; | 
 |  |  |             int phaseY = 0; | 
 |  |  |             String leftPhaseMaxId = ""; | 
 |  |  |             for (int i = 0; i < leftArray.size(); i++) { | 
 |  |  |                 Map<String, String> tmpMap = new Hashtable<>(); | 
 |  |  |  | 
 |  |  |                 JSONObject lineObject = (JSONObject) leftArray.get(i); | 
 |  |  |                 String phaseId = lineObject.getStr("phaseId"); | 
 |  |  |                 JSONArray phaseArray = phaseJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) | 
 |  |  |                         && phaseId.equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); | 
 |  |  |  | 
 |  |  |                 tmpMap.put("lineId", lineObject.getStr("id")); | 
 |  |  |                 tmpMap.put("phaseId", phaseId); | 
 |  |  |                 String portId = ""; | 
 |  |  |                 if (phaseArray.size() > 0) { | 
 |  |  |                     JSONObject phaseObject = (JSONObject) phaseArray.get(0); | 
 |  |  |                     Object portIdObject = JsonUtils2.getArrJsonValueByPath(phaseObject, "ports/items/".split("/"), "group", "right", "id"); | 
 |  |  |                     //portId = portIdObject == null ? "" : portIdObject.toString(); | 
 |  |  |                     Object xObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/x".split("/")); | 
 |  |  |                     int x = xObject == null ? 0 : Convert.toInt(xObject.toString()); | 
 |  |  |                     if (x > leftPhaseMaxX) { | 
 |  |  |                         leftPhaseMaxX = x; | 
 |  |  |                         leftPhaseMaxId = phaseObject.getStr("id"); | 
 |  |  |                     } | 
 |  |  |                     if (phaseY == 0) { | 
 |  |  |                         Object yObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/y".split("/")); | 
 |  |  |                         phaseY = yObject == null ? 0 : Convert.toInt(yObject.toString()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 tmpMap.put("portId", portId); | 
 |  |  |                 leftMap.put(lineObject.getStr("id"), tmpMap); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             JSONArray rightArray = inspectJsonArray.stream().filter(iter -> "edge".equals(((JSONObject) iter).get("shape")) | 
 |  |  |                     && "right".equals(((JSONObject) iter).get("phaseType"))).collect(Collectors.toCollection(JSONArray::new)); | 
 |  |  |             int rightPhaseMinX = 10000000; | 
 |  |  |             String rightPhaseMinId = ""; | 
 |  |  |             for (int i = 0; i < rightArray.size(); i++) { | 
 |  |  |                 Map<String, String> tmpMap = new Hashtable<>(); | 
 |  |  |  | 
 |  |  |                 JSONObject lineObject = (JSONObject) rightArray.get(i); | 
 |  |  |                 String phaseId = lineObject.getStr("phaseId"); | 
 |  |  |                 JSONArray phaseArray = phaseJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) | 
 |  |  |                         && phaseId.equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); | 
 |  |  |  | 
 |  |  |                 tmpMap.put("lineId", lineObject.getStr("id")); | 
 |  |  |                 tmpMap.put("phaseId", phaseId); | 
 |  |  |                 String portId = ""; | 
 |  |  |                 if (phaseArray.size() > 0) { | 
 |  |  |                     JSONObject phaseObject = (JSONObject) phaseArray.get(0); | 
 |  |  |                     Object portIdObject = JsonUtils2.getArrJsonValueByPath(phaseObject, "ports/items/".split("/"), "group", "left", "id"); | 
 |  |  |                     //portId = portIdObject == null ? "" : portIdObject.toString(); | 
 |  |  |                     Object xObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/x".split("/")); | 
 |  |  |                     int x = xObject == null ? 100000000 : Convert.toInt(xObject.toString()); | 
 |  |  |                     if (x < rightPhaseMinX) { | 
 |  |  |                         rightPhaseMinX = x; | 
 |  |  |                         rightPhaseMinId = phaseObject.getStr("id"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 tmpMap.put("portId", portId); | 
 |  |  |                 rightMap.put(lineObject.getStr("id"), tmpMap); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             JSONArray startArray = inspectJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) | 
 |  |  |                     && "10000".equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); | 
 |  |  |             int inspectBeginX = 0; | 
 |  |  |             int inspectY = 0; | 
 |  |  |             if (startArray.size() > 0) { | 
 |  |  |                 JSONObject inspectObject = (JSONObject) startArray.get(0); | 
 |  |  |                 Object xObject = JsonUtils2.getJsonValueByPath(inspectObject, "position/x".split("/")); | 
 |  |  |                 inspectBeginX = xObject == null ? 0 : Convert.toInt(xObject.toString()); | 
 |  |  |                 Object yObject = JsonUtils2.getJsonValueByPath(inspectObject, "position/y".split("/")); | 
 |  |  |                 inspectY = yObject == null ? 0 : Convert.toInt(yObject.toString()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             JSONArray endArray = inspectJsonArray.stream().filter(iter -> "custom-circle".equals(((JSONObject) iter).get("shape")) | 
 |  |  |                     && "20000".equals(((JSONObject) iter).get("id"))).collect(Collectors.toCollection(JSONArray::new)); | 
 |  |  |             int inspectEndX = 10000000; | 
 |  |  |             if (endArray.size() > 0) { | 
 |  |  |                 JSONObject inspectObject = (JSONObject) endArray.get(0); | 
 |  |  |                 Object xObject = JsonUtils2.getJsonValueByPath(inspectObject, "position/x".split("/")); | 
 |  |  |                 inspectEndX = xObject == null ? 100000000 : Convert.toInt(xObject.toString()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             JSONObject beginObject = null; | 
 |  |  |             JSONObject endObject = null; | 
 |  |  |             for (int i = 0; i < inspectJsonArray.size(); i++) { | 
 |  |  |                 JSONObject inspectObject = (JSONObject) inspectJsonArray.get(i); | 
 |  |  |                 String inspectObjectId = inspectObject.getStr("id"); | 
 |  |  |                 if (leftMap.get(inspectObjectId) != null) { | 
 |  |  |                     JsonUtils2.setJsonValueByPath(inspectObject, "target/cell".split("/"), leftMap.get(inspectObjectId).get("phaseId")); | 
 |  |  |                     JsonUtils2.setJsonValueByPath(inspectObject, "target/port".split("/"), leftMap.get(inspectObjectId).get("portId")); | 
 |  |  |                 } | 
 |  |  |                 if (rightMap.get(inspectObjectId) != null) { | 
 |  |  |                     JsonUtils2.setJsonValueByPath(inspectObject, "target/cell".split("/"), rightMap.get(inspectObjectId).get("phaseId")); | 
 |  |  |                     JsonUtils2.setJsonValueByPath(inspectObject, "target/port".split("/"), rightMap.get(inspectObjectId).get("portId")); | 
 |  |  |                 } | 
 |  |  |                 if ("10000".equals(inspectObjectId)) { | 
 |  |  |                     //inspectJsonArray.remove(inspectObject); | 
 |  |  |                     beginObject = inspectObject; | 
 |  |  |                 } | 
 |  |  |                 if ("20000".equals(inspectObjectId)) { | 
 |  |  |                     //inspectJsonArray.remove(inspectObject); | 
 |  |  |                     endObject = inspectObject; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (endObject != null) | 
 |  |  |                 inspectJsonArray.remove(endObject); | 
 |  |  |             if (beginObject != null) | 
 |  |  |                 inspectJsonArray.remove(beginObject); | 
 |  |  |  | 
 |  |  |             for (int i = 0; i < phaseJsonArray.size(); i++) { | 
 |  |  |                 JSONObject phaseObject = (JSONObject) phaseJsonArray.get(i); | 
 |  |  |                 if ("custom-circle".equals(phaseObject.getStr("shape"))) { | 
 |  |  |                     Object xObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/x".split("/")); | 
 |  |  |                     Object yObject = JsonUtils2.getJsonValueByPath(phaseObject, "position/y".split("/")); | 
 |  |  |                     int x = Convert.toInt(xObject.toString()); | 
 |  |  |                     int y = Convert.toInt(yObject.toString()); | 
 |  |  |                     if (x <= leftPhaseMaxX) | 
 |  |  |                         x = x + (inspectBeginX - leftPhaseMaxX); | 
 |  |  |                     else if (x >= rightPhaseMinX) | 
 |  |  |                         x = x + (inspectEndX - rightPhaseMinX); | 
 |  |  |                     y = y + (inspectY - phaseY); | 
 |  |  |                     JsonUtils2.setJsonValueByPath(phaseObject, "position/x".split("/"), x); | 
 |  |  |                     JsonUtils2.setJsonValueByPath(phaseObject, "position/y".split("/"), y); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             for (int i = 0; i < phaseJsonArray.size(); i++) { | 
 |  |  |                 JSONObject phaseObject = (JSONObject) phaseJsonArray.get(i); | 
 |  |  |                 if ("edge".equals(phaseObject.getStr("shape"))) { | 
 |  |  |                     Object sourceId = JsonUtils2.getJsonValueByPath(phaseObject, "source/cell".split("/")); | 
 |  |  |                     Object targetId = JsonUtils2.getJsonValueByPath(phaseObject, "target/cell".split("/")); | 
 |  |  |                     if (leftPhaseMaxId.equals(sourceId) && rightPhaseMinId.equals(targetId)) { | 
 |  |  |                         phaseJsonArray.remove(phaseObject); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             inspectJsonArray.addAll(phaseJsonArray); | 
 |  |  |             jsonStr = inspectJsonObj.toString(); | 
 |  |  |         } else if (phaseDiagram != null) { | 
 |  |  |             jsonStr = phaseDiagram.getContent(); | 
 |  |  |         } else if (inspectDiagram != null) { | 
 |  |  |             jsonStr = inspectDiagram.getContent(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (combineDiagram != null) { | 
 |  |  |             combineDiagram.setContent(jsonStr); | 
 |  |  |             baseDao.updateById(combineDiagram); | 
 |  |  |         } else { | 
 |  |  |             combineDiagram = new ProjectNetworkDiagram(); | 
 |  |  |             combineDiagram.setProjectId(networkDiagram.getProjectId()); | 
 |  |  |             combineDiagram.setDiagramId(100L); | 
 |  |  |             combineDiagram.setContent(jsonStr); | 
 |  |  |             baseDao.insert(combineDiagram); | 
 |  |  |         } | 
 |  |  |         return combineDiagram; | 
 |  |  |     }*/ | 
 |  |  |  | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public Result simulate(SimulatAssess simulatAssess) { | 
 |  |  |         Result result = null; | 
 |  |  |     public List<TaskModelCheckResultDto> simulateChecK(SimulatAssess simulatAssess) { | 
 |  |  |         List<TaskModelCheckResultDto> result = null; | 
 |  |  |         // 1. 检查模型完整性 | 
 |  |  |         List<TaskModelCheckResult> chkResult = taskService.checkTaskModel(simulatAssess.getProductId(), | 
 |  |  |         List<TaskModelCheckResultDto> chkResult = taskService.checkTaskModel(simulatAssess.getProductId(), | 
 |  |  |                 simulatAssess.getTaskModelId()); | 
 |  |  |         if (chkResult.size() > 0) { | 
 |  |  |             result = Result.error("模型不完整,请检查模型定义及参数配置。"); | 
 |  |  |             return result; | 
 |  |  |             return chkResult; | 
 |  |  |         } | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public Boolean simulate(SimulatAssess simulatAssess) { | 
 |  |  |         Boolean result = false; | 
 |  |  |         // 2. 组装供算法库仿真的模型xml | 
 |  |  |         assembleModelXml(simulatAssess); | 
 |  |  |  | 
 |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private Result callReliaSimLib(SimulatAssess simulatAssess) { | 
 |  |  |         Result result = null; | 
 |  |  |     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 { | 
 |  |  |             setParamToRedis(simulatAssess); | 
 |  |  |             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){ | 
 |  |  |             if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) { | 
 |  |  |                 process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", command}); | 
 |  |  |             }else if(System.getProperty("os.name").toLowerCase().indexOf("linux") > -1){ | 
 |  |  |             } else if (System.getProperty("os.name").toLowerCase().indexOf("linux") > -1) { | 
 |  |  |                 process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command}); | 
 |  |  |             }else{ | 
 |  |  |                 throw new Exception("暂不支持该操作系统,进行启动算法库计算!"); | 
 |  |  |             } 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")); | 
 |  |  |             br = new BufferedReader(new InputStreamReader(is, "utf-8")); | 
 |  |  |             String line = br.readLine(); | 
 |  |  |             logger.info("算法库返回结果:" + line); | 
 |  |  | //            int exitCode = process.waitFor(); // 异步方式,不等待算法库计算完毕,所以要注释掉该行 | 
 |  |  |             if (line != null) { | 
 |  |  |                 ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class); | 
 |  |  |                 if ("0".equals(rtn.getCode())) { | 
 |  |  |                     logger.info("启动算法库成功。"); | 
 |  |  |                     result = Result.ok(); | 
 |  |  |                     logger.info("启动可靠性仿真评估算法库成功。"); | 
 |  |  |                     newProcess(simulatAssess, pid, command); | 
 |  |  |                     update(simulatAssess); | 
 |  |  |                     result = true; | 
 |  |  |                 } else { | 
 |  |  |                     String errorMsg = rtn.getErrorMsg(); | 
 |  |  |                     throw new RuntimeException("启动算法库失败: errorMsg=" + errorMsg); | 
 |  |  |                     throw new RenException("启动可靠性仿真评估算法库失败: errorMsg=" + errorMsg); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             logger.error("启动算法库仿真时发生Exception:", e); | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             logger.error("启动可靠性仿真评估算法库仿真时发生Exception:", e); | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             result = Result.error(e.getMessage()); | 
 |  |  |             throw new RenException("启动可靠性仿真评估算法库失败: errorMsg=" + e.getMessage()); | 
 |  |  |         } finally { | 
 |  |  |             if (is != null) { | 
 |  |  |                 try { | 
 |  |  | 
 |  |  |         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); | 
 |  |  | 
 |  |  |         // 仿真次数 | 
 |  |  |         jsonObject.put("simulate_times", simulatAssess.getSimulatFrequency()); | 
 |  |  |         // 采样周期 | 
 |  |  |         jsonObject.put("timeslice", simulatAssess.getSamplPeriod()/60.0);   // 单位统一换算为小时 | 
 |  |  |         jsonObject.put("timeslice", simulatAssess.getSamplPeriod() / 60.0);   // 单位统一换算为小时 | 
 |  |  |         jsonObject.put("result_home", resultHome); | 
 |  |  |         jsonObject.put("seed", 1000); | 
 |  |  |         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); | 
 |  |  |         List<TaskRepairParam> taskRepairParams = taskRepairParamDao.getTaskRepairParams(taskId); | 
 |  |  |  | 
 |  |  |         // 1. 计算各任务阶段的运行时长 | 
 |  |  |         List<TaskPhase> taskPhases = calcTaskPhaseDuration(task); | 
 |  |  | 
 |  |  |             Element root = document.addElement("des"); | 
 |  |  |             root.addAttribute("name", "General system"); | 
 |  |  |             addTasksTag(taskPhaseModelAll, root); | 
 |  |  |             addModelsTag(productId, | 
 |  |  |             addModelsTag(simulatAssess, | 
 |  |  |                     taskId, | 
 |  |  |                     productId, | 
 |  |  |                     product.getName(), | 
 |  |  |                     product.getNamePath(), | 
 |  |  |                     productList, | 
 |  |  |                     paramDataList, | 
 |  |  |                     taskPhaseModelAll, | 
 |  |  |                     binoParams, | 
 |  |  |                     taskRepairParams, | 
 |  |  |                     root, | 
 |  |  |                     failureModels, repairModels); | 
 |  |  |             addFailureModelsTag(failureModels, root); | 
 |  |  | 
 |  |  |             } finally { | 
 |  |  |                 if (xmlWriter != null) xmlWriter.close(); | 
 |  |  |             } | 
 |  |  |             // XML存盘 | 
 |  |  |             insert(simulatAssess); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             throw new RuntimeException("组装算法库仿真计算用模型XML失败: " + e.getMessage()); | 
 |  |  |             throw new RenException("组装算法库仿真计算用模型XML失败: " + e.getMessage()); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |             satpm.setPhaseName(phase.getPhaseName()); | 
 |  |  |             satpm.setPhaseDurationRate(phase.getPhaseDurationRate()); | 
 |  |  |             satpm.setPhaseDuration(phase.getPhaseDuration()); | 
 |  |  |             satpm.setPhaseConstraint(null); // TODO | 
 |  |  |             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()); | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void addTasksTag(List<TaskPhaseModel> taskPhaseModelAll, | 
 |  |  |                              Element root) { | 
 |  |  |     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()); | 
 |  |  |             if (null != taskPhaseModel.getPhaseConstraints() && taskPhaseModel.getPhaseConstraints().size() > 0) { | 
 |  |  |                 taskTag.addAttribute("NAM", | 
 |  |  |                         taskPhaseModel.getPhaseConstraints().stream().map(item -> | 
 |  |  |                                 item.getProductId().toString()).collect(Collectors.joining(","))); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |                     ele.addAttribute("value", String.valueOf(failureModel.getParam3())); | 
 |  |  |                     break; | 
 |  |  |                 case FailureModel.TYPE_FIX: | 
 |  |  |                     ele = failureModelTag.addElement("unreliability"); | 
 |  |  |                     ele = failureModelTag.addElement("reliability"); | 
 |  |  |                     ele.addAttribute("value", String.valueOf(failureModel.getParam1())); | 
 |  |  |                     break; | 
 |  |  |                 default: | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void addRepairModelsTag(List<RepairModel> repairModels, | 
 |  |  |                                      Element root) { | 
 |  |  |                                     Element root) { | 
 |  |  |         Element ele = null; | 
 |  |  |         Element repairModelsTag = root.addElement("repair_models"); | 
 |  |  |         for (RepairModel repairModel : repairModels) { | 
 |  |  | 
 |  |  |                     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; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void calcTaskPhaseModelDuration(TaskPhase taskPhase, | 
 |  |  |                                                             List<TaskPhaseModel> taskPhaseModelAll) { | 
 |  |  |     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; | 
 |  |  | 
 |  |  |             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); | 
 |  |  |         double duration = taskPhaseModels.get(taskPhaseModels.size() - 1).getOperatConditDuration(); | 
 |  |  |         taskPhaseModels.get(taskPhaseModels.size() - 1).setOperatConditDuration(duration + taskPhase.getPhaseDuration() - sum); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private List<TaskPhase> calcTaskPhaseDuration(Task task) { | 
 |  |  |     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; | 
 |  |  | 
 |  |  |             sum += duration; | 
 |  |  |         } | 
 |  |  |         // 把零头补到最后一个阶段 | 
 |  |  |         double duration = taskPhases.get(taskPhases.size()-1).getPhaseDuration(); | 
 |  |  |         taskPhases.get(taskPhases.size()-1).setPhaseDuration(duration + task.getTaskDuration() - sum); | 
 |  |  |         double duration = taskPhases.get(taskPhases.size() - 1).getPhaseDuration(); | 
 |  |  |         taskPhases.get(taskPhases.size() - 1).setPhaseDuration(duration + task.getTaskDuration() - sum); | 
 |  |  |  | 
 |  |  |         return taskPhases; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void addModelsTag(Long productId, | 
 |  |  |     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, | 
 |  |  |                               List<TaskRepairParam> taskRepairParams, | 
 |  |  |                               Element root, | 
 |  |  |                               List<FailureModel> failureModels, | 
 |  |  |                               List<RepairModel> repairModels) { | 
 |  |  | 
 |  |  |                     "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); | 
 |  |  |             ModelNode computerNode = modelNodeAndVnodeList.stream().filter(item -> | 
 |  |  |                     endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); | 
 |  |  |             node2DOM(productList, | 
 |  |  |             node2DOM(simulatAssess, | 
 |  |  |                     taskId, | 
 |  |  |                     taskPhaseModel, | 
 |  |  |                     gkModelTop.getModelId(), | 
 |  |  |                     productId, | 
 |  |  |                     productName, | 
 |  |  |                     productNamePath, | 
 |  |  |                     productList, | 
 |  |  |                     paramDataList, | 
 |  |  |                     gkModelsAssembled, | 
 |  |  |                     algorithmList, | 
 |  |  |                     modelNodeAndVnodeList, | 
 |  |  |                     binoParams, | 
 |  |  |                     taskRepairParams, | 
 |  |  |                     computerNode, modelTag, | 
 |  |  |                     failureModels, repairModels); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 递归函数 | 
 |  |  |     private void node2DOM(List<XhProductModel> productList, | 
 |  |  |     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, | 
 |  |  |                           List<TaskRepairParam> taskRepairParams, | 
 |  |  |                           ModelNode node, | 
 |  |  |                           Element parent, | 
 |  |  |                           List<FailureModel> failureModels, | 
 |  |  | 
 |  |  |                         "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0); | 
 |  |  |                 ModelNode computerNode = modelNodeAndVnodeListSub.stream().filter(item -> | 
 |  |  |                         endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0); | 
 |  |  |                 node2DOM(productList, | 
 |  |  |                 node2DOM(simulatAssess, | 
 |  |  |                         taskId, | 
 |  |  |                         taskPhaseModel, | 
 |  |  |                         gkModel.getModelId(), | 
 |  |  |                         product.getId(), | 
 |  |  |                         product.getName(), | 
 |  |  |                         product.getNamePath(), | 
 |  |  |                         productList, | 
 |  |  |                         paramDataList, | 
 |  |  |                         gkModelsAssembled, | 
 |  |  |                         algorithmListSub, | 
 |  |  |                         modelNodeAndVnodeListSub, | 
 |  |  |                         binoParams, | 
 |  |  |                         taskRepairParams, | 
 |  |  |                         computerNode, parent, | 
 |  |  |                         failureModels, repairModels); | 
 |  |  |             } else if ("5".equals(product.getProductType())) { | 
 |  |  |                 // 设备 | 
 |  |  |                 ParamData paramData = paramDataList.stream().filter(item -> | 
 |  |  |                         dataId.equals(item.getProductId())).collect(Collectors.toList()).get(0); | 
 |  |  |                 Integer deviceNo = node.getDeviceNo(); | 
 |  |  |                 Element nodeTag = parent.addElement("node"); | 
 |  |  |                 nodeTag.addAttribute("name", dataId.toString()); | 
 |  |  |                 nodeTag.addAttribute("name", deviceNo == 0 ? dataId.toString() : dataId.toString() + "-" + deviceNo); | 
 |  |  |                 nodeTag.addAttribute("real_name", deviceNo == 0 ? product.getName() : product.getName() + "-" + deviceNo); | 
 |  |  |                 nodeTag.addAttribute("name_path", product.getNamePath()); | 
 |  |  |                 nodeTag.addAttribute("type", "node"); | 
 |  |  |  | 
 |  |  |                 FailureModel failureModel = new FailureModel(); | 
 |  |  |                 failureModel.setId(UUIDUtil.generateId()); | 
 |  |  |                 failureModel.setType(FailureModel.TYPE_EXP); | 
 |  |  |                 failureModel.setParam1(1.0 / paramData.getTaskMtbcfRegulate()); | 
 |  |  |                 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 = new RepairModel(); | 
 |  |  |                     repairModel.setId(UUIDUtil.generateId()); | 
 |  |  |                     repairModel.setType(RepairModel.TYPE_EXP); | 
 |  |  |                     repairModel.setParam1(1.0 / paramData.getRepairMttcr()); | 
 |  |  |                     // 可维修 | 
 |  |  |                     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()); | 
 |  |  | 
 |  |  |             Algorithm algo = algorithmList.stream().filter(item -> | 
 |  |  |                     node.getId().equals(item.getId())).collect(Collectors.toList()).get(0); | 
 |  |  |             Element element = parent.addElement("logic"); | 
 |  |  |             element.addAttribute("name", algo.getId().toString()); | 
 |  |  |             if (null == productId) { | 
 |  |  |                 element.addAttribute("name", algo.getId().toString()); | 
 |  |  |             } else { | 
 |  |  |                 element.addAttribute("name", productId.toString()); | 
 |  |  |                 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("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"); | 
 |  |  |             } | 
 |  |  | 
 |  |  |             for (String nodeStr : computerNodeListStr) { | 
 |  |  |                 ModelNode mn = modelNodeAndVnodeList.stream().filter(item -> | 
 |  |  |                         nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0); | 
 |  |  |                 node2DOM(productList, | 
 |  |  |                 node2DOM(simulatAssess, | 
 |  |  |                         taskId, | 
 |  |  |                         taskPhaseModel, | 
 |  |  |                         modelId, | 
 |  |  |                         null, | 
 |  |  |                         null, | 
 |  |  |                         null, | 
 |  |  |                         productList, | 
 |  |  |                         paramDataList, | 
 |  |  |                         gkModelsAssembled, | 
 |  |  |                         algorithmList, | 
 |  |  |                         modelNodeAndVnodeList, | 
 |  |  |                         binoParams, | 
 |  |  |                         taskRepairParams, | 
 |  |  |                         mn, element, | 
 |  |  |                         failureModels, repairModels); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private FailureModel createFailureModel(ParamData paramData) { | 
 |  |  |     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: | 
 |  |  |                 failureModel.setType(FailureModel.TYPE_BIN); | 
 |  |  |                 // 二项分布 | 
 |  |  |                 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<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++) { | 
 |  |  |             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<WeakDto> 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<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.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")) { | 
 |  |  |             Integer num = this.getNumById(simulatAssess.getProductId(), simulatAssess.getTaskModelId()); | 
 |  |  |             simulatAssess.setName("仿真记录" + (num + 1)); | 
 |  |  |             this.update(simulatAssess); | 
 |  |  |         } | 
 |  |  |         String filePath = path + "/" + simulatAssess.getId() + "/" + "result.xml"; | 
 |  |  |         String xml; | 
 |  |  |         InputStream in = null; | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  |             in = new FileInputStream(filePath); | 
 |  |  |             xml = IOUtils.toString(in); | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             throw new RenException("文件不存在或者文件打不开"); | 
 |  |  |         } finally { | 
 |  |  |             try { | 
 |  |  |                 if (in != null) { | 
 |  |  |                     in.close(); | 
 |  |  |                 } | 
 |  |  |             } catch (IOException e) { | 
 |  |  |                 e.printStackTrace(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         xmlJSONObj = XML.toJSONObject(xml); | 
 |  |  |         simulatAssess.setShowProductId(simulatAssess.getProductId().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(" "); | 
 |  |  |                 // 遍历子字符串数组,将每个元素转换为double并存储到double数组中 | 
 |  |  |                 Double j = 0.0; | 
 |  |  |                 for (int a = 0; a < arr.length; a++) { | 
 |  |  |                     j = samplPeriod + j; | 
 |  |  |                     doubleArray.add(Double.parseDouble(arr[a])); | 
 |  |  |                     xList.add(j); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 param.setXData(xList); | 
 |  |  |                 param.setYData(doubleArray); | 
 |  |  |                 Double mtbf = (Double) jsonArray.getJSONObject(i).get("mttf"); | 
 |  |  |                 Double mttr = (Double) jsonArray.getJSONObject(i).get("mttr"); | 
 |  |  |                 Double msr = (Double) jsonArray.getJSONObject(i).get("msr"); | 
 |  |  |                 data.setMtbf(mtbf); | 
 |  |  |                 data.setMttr(mttr); | 
 |  |  |                 data.setMsr(msr); | 
 |  |  |             } | 
 |  |  |             data.setCurveParam(param); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return data; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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.setSmooth(true); | 
 |  |  |             curve.setType("line"); | 
 |  |  |             curve.setData(resultData.getCurveParam().getYData()); | 
 |  |  |             curveList.add(curve); | 
 |  |  |         } | 
 |  |  |         dto.setXDataList(xData); | 
 |  |  |         dto.setDataList(dataDtoList); | 
 |  |  |         dto.setCurveList(curveList); | 
 |  |  |         return dto; | 
 |  |  |     } | 
 |  |  | } |