xyc
2024-11-18 2d6c0d1cffe663b3b37ef7e0575cfe6e11d8fd85
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java
@@ -5,11 +5,13 @@
import cn.hutool.json.XML;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.spire.pdf.tables.table.convert.Convert;
import com.zt.common.db.query.QueryFilter;
import com.zt.common.exception.RenException;
import com.zt.common.service.BaseService;
import com.zt.common.servlet.Result;
import com.zt.common.utils.TreeUtils;
import com.zt.common.utils.UUIDUtil;
import com.zt.life.export.service.DownloadService;
import com.zt.life.modules.mainPart.basicInfo.dao.ParamDataDao;
import com.zt.life.modules.mainPart.basicInfo.dao.XhProductModelDao;
import com.zt.life.modules.mainPart.basicInfo.model.ParamData;
@@ -24,8 +26,10 @@
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;
@@ -43,6 +47,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.file.FileAlreadyExistsException;
import java.util.*;
@@ -114,7 +121,6 @@
    Map<Integer, String> templetsStrMap2 = new HashMap<>();
    private JSONObject xmlJSONObj;
    /**
     * 分页查询
@@ -332,7 +338,8 @@
        List<TimeDiagramStatusDto> statusDtoListNew = new ArrayList<>();
        while (statusDtoListOld.size() > 0) {
            statusDtoListOld.stream().sorted(Comparator.comparing(TimeDiagramStatusDto::getX1)).collect(Collectors.toList());
            //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);
@@ -352,12 +359,14 @@
                        currentStatusDto.setX2(nextStatusDto.getX1());
                        statusDtoListNew.add(new TimeDiagramStatusDto(nextStatusDto.getX1(), nextStatusDto.getX2(), nextStatusDto.getStatus()));
                    } else if (nextStatusDto.getX1() > currentStatusDto.getX1() && nextStatusDto.getX2() < currentStatusDto.getX2()) {
                        currentStatusDto.setX2(nextStatusDto.getX1());
                        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.getX2() > currentStatusDto.getX2()) {
                    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()));
                    }
                }
@@ -548,13 +557,36 @@
    }
    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;
    }
@@ -629,7 +661,6 @@
        return result;
    }
    @Transactional(rollbackFor = Exception.class)
    public Boolean simulate(SimulatAssess simulatAssess) {
        Boolean result = false;
        // 2. 组装供算法库仿真的模型xml
@@ -639,6 +670,11 @@
        result = callReliaSimLib(simulatAssess);
        return result;
    }
    public List<SimulatAssess> process(QueryFilter queryFilter) {
        List<SimulatAssess> page = baseDao.getProcessList(queryFilter.getParams());
        return queryFilter.getPageList(page);
    }
    private Boolean callReliaSimLib(SimulatAssess simulatAssess) {
@@ -664,6 +700,8 @@
            } 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"));
@@ -674,6 +712,8 @@
                ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class);
                if ("0".equals(rtn.getCode())) {
                    logger.info("启动可靠性仿真评估算法库成功。");
                    newProcess(simulatAssess, pid, command);
                    update(simulatAssess);
                    result = true;
                } else {
                    String errorMsg = rtn.getErrorMsg();
@@ -702,6 +742,14 @@
        }
        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) {
@@ -758,7 +806,8 @@
            Element root = document.addElement("des");
            root.addAttribute("name", "General system");
            addTasksTag(taskPhaseModelAll, root);
            addModelsTag(taskId,
            addModelsTag(simulatAssess,
                    taskId,
                    productId,
                    product.getName(),
                    product.getNamePath(),
@@ -895,6 +944,10 @@
                    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;
            }
@@ -937,7 +990,8 @@
        return taskPhases;
    }
    private void addModelsTag(Long taskId,
    private void addModelsTag(SimulatAssess simulatAssess,
                              Long taskId,
                              Long productId,
                              String productName,
                              String productNamePath,
@@ -963,7 +1017,8 @@
                    "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0);
            ModelNode computerNode = modelNodeAndVnodeList.stream().filter(item ->
                    endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0);
            node2DOM(taskId,
            node2DOM(simulatAssess,
                    taskId,
                    taskPhaseModel,
                    gkModelTop.getModelId(),
                    productId,
@@ -981,7 +1036,8 @@
    }
    // 递归函数
    private void node2DOM(Long taskId,
    private void node2DOM(SimulatAssess simulatAssess,
                          Long taskId,
                          TaskPhaseModel taskPhaseModel,
                          Long modelId,
                          Long productId,
@@ -1011,7 +1067,8 @@
                        "end".equals(item.getAlgorithmType())).collect(Collectors.toList()).get(0);
                ModelNode computerNode = modelNodeAndVnodeListSub.stream().filter(item ->
                        endAlgo.getComputerList().equals(item.getId().toString())).collect(Collectors.toList()).get(0);
                node2DOM(taskId,
                node2DOM(simulatAssess,
                        taskId,
                        taskPhaseModel,
                        gkModel.getModelId(),
                        product.getId(),
@@ -1029,8 +1086,8 @@
                // 设备
                Integer deviceNo = node.getDeviceNo();
                Element nodeTag = parent.addElement("node");
                nodeTag.addAttribute("name", deviceNo == 0 ? dataId.toString() : dataId.toString()+"-"+deviceNo);
                nodeTag.addAttribute("real_name", deviceNo == 0 ? product.getName() : product.getName()+"-"+deviceNo);
                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");
@@ -1062,7 +1119,12 @@
                if (1 == paramData.getRepairable()) {
                    // 可维修
                    RepairModel repairModel = createRepairModel(paramData);
                    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());
@@ -1097,7 +1159,8 @@
            for (String nodeStr : computerNodeListStr) {
                ModelNode mn = modelNodeAndVnodeList.stream().filter(item ->
                        nodeStr.equals(item.getId().toString())).collect(Collectors.toList()).get(0);
                node2DOM(taskId,
                node2DOM(simulatAssess,
                        taskId,
                        taskPhaseModel,
                        modelId,
                        null,
@@ -1152,23 +1215,46 @@
        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(FailureModel.TYPE_EXP);
                repairModel.setType(RepairModel.TYPE_EXP);
                repairModel.setParam1(1.0 / paramData.getRepairMttcr());
                break;
            case 2:
                // 威布尔分布
                repairModel.setType(FailureModel.TYPE_WBL);
                repairModel.setType(RepairModel.TYPE_WBL);
                repairModel.setParam2(paramData.getRepairMttcrOtherParams2());
                repairModel.setParam3(paramData.getRepairMttcrOtherParams3());
                break;
            case 3:
                // 二项分布(维修没有)
                break;
            default:
                break;
@@ -1179,8 +1265,7 @@
    public List<WeakDto> getReliabilityWeakness(Long fzId, Long taskId, Long productId) {
        String filePath = path + "/" + fzId + "/" + "result.xml";
        List<WeakDto> list = new ArrayList<>();
        Map<Long, WeakDto> map = new HashMap<>();
        String xml;
        InputStream in = null;
        try {
@@ -1200,50 +1285,46 @@
        }
        List<WeakDto> productList = baseDao.getProductList(taskId, productId);
        for (WeakDto dto : productList) {
            map.put(dto.getId(), dto);
        }
        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;
            Object nameValue = jsonArray.getJSONObject(i).get("name");
            if (nameValue instanceof Long) {
                productId1 = (Long) nameValue;
                if (map.get(productId1) != null) {
                    WeakDto weakDto = map.get(productId1);
                    Double mtbfTime = null;
            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");
                    data.setMtbf(mtbf);
                    data.setMttr(mttr);
                    data.setMsr(msr);
                    if (weakDto != null) {
                        data.setId(weakDto.getId());
                        data.setSort(weakDto.getSort());
                        data.setPid(weakDto.getPid());
                        data.setName(weakDto.getName());
                        data.setProductType(weakDto.getProductType());
                        data.setTimeRate(weakDto.getTimeRate());
                        mtbfTime = mtbf / weakDto.getTimeRate();
                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);
                    }
                    data.setMtbfTime(mtbfTime);
                    data.setIsWeak(0);
                    list.add(data);
                }
            }
        }
        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 (list.size() > 0) {
            treeList = TreeUtils.build(list);
        if (productList.size() > 0) {
            treeList = TreeUtils.build(productList);
            this.getIsweak(treeList.get(0).getChildren());
        }
@@ -1301,7 +1382,7 @@
            simulatAssessList.add(simulatAssess);
            result = simulateChecK(simulatAssess);
            if (result!=null){
            if (result != null) {
                simulatResult.setType("errorList");
                simulatResult.setErrList(result);
                return simulatResult;
@@ -1345,7 +1426,7 @@
            }
        }
        xmlJSONObj = XML.toJSONObject(xml);
        simulatAssess.setShowProductId(simulatAssess.getProductId());
        simulatAssess.setShowProductId(simulatAssess.getProductId().toString());
        SimulaDataDto data = this.getResultData(simulatAssess);
        return data;
    }
@@ -1357,50 +1438,47 @@
        samplPeriod = samplPeriod / 60;
        JSONArray jsonArray = xmlJSONObj.getJSONObject("ResultNodes").getJSONArray("ResultNode");
        for (int i = 0; i < jsonArray.size(); i++) {
            Long productId = null;
            Object nameValue = jsonArray.getJSONObject(i).get("name");
            if (nameValue instanceof Long) {
                productId = (Long) nameValue;
                if (productId.equals(simulatAssess.getShowProductId())) {
                    Object object = jsonArray.getJSONObject(i).get("phase");
                    List<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");
                            }
            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);
                } else {
                    JSONObject jsonObject2 = jsonArray.getJSONObject(i).getJSONObject("phase");
                    availability = (String) jsonObject2.get("availability");
                }
                data.setCurveParam(param);
                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;
    }
@@ -1533,4 +1611,84 @@
        dto.setCurveList(curveList);
        return dto;
    }
    public void downloadXml(HttpServletRequest request, HttpServletResponse response, String type, Long id, Integer xml) {
        if (type.equals("fz")) {
            if (xml == 1) {
                SimulatAssess simulatAssess = this.get(id);
                String xml1 = simulatAssess.getXml();
                writeToTxt(request, response, xml1, "仿真输入");
            } else {
                String filePath = path + "/" + id + "/" + "result.xml";
                String xml1;
                InputStream in = null;
                try {
                    in = new FileInputStream(filePath);
                    xml1 = IOUtils.toString(in);
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RenException("文件不存在或者文件打不开");
                } finally {
                    try {
                        if (in != null) {
                            in.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                writeToTxt(request, response, xml1, "仿真输出");
            }
        } else if (type.equals("sxt")) {
            if (xml == 1) {
                String filePath = path + "/" + id + "/" + "status.json";
                ObjectMapper mapper = new ObjectMapper();
                String jsonStr = null;
                try {
                    // 使用 ObjectMapper 的 readValue 方法,将文件中的 JSON 数据转换为一个 Java 对象
                    // 这里使用 Object 类作为泛型参数,表示任意类型的对象
                    Object obj = mapper.readValue(new File(filePath), Object.class);
                    // 使用 ObjectMapper 的 writeValueAsString 方法,将 Java 对象转换为 JSON 字符串
                    jsonStr = mapper.writeValueAsString(obj);
                } catch (IOException e) {
                    // 处理异常
                    e.printStackTrace();
                    throw new RenException("文件不存在或者文件打不开");
                }
                writeToTxt(request, response, jsonStr, "时序图输入");
            } else {
                SimulatAssess simulatAssess = this.get(id);
                TimeDiagramDto timeDiagram = getTimeDiagram(simulatAssess.getProductId(), simulatAssess.getTaskModelId(), simulatAssess.getId(), 1200, 5);
                String xml2 = timeDiagram.getDiagramJson();
                writeToTxt(request, response, xml2, "时序图输出");
            }
        }
    }
    public void writeToTxt(HttpServletRequest request, HttpServletResponse response, String jsonString, String name) {//设置响应的字符集
        //设置响应内容的类型
        BufferedOutputStream buff = null;
        ServletOutputStream outStr = null;
        try {
            response.setContentType("text/plain;charset=UTF-8");
            String encodedFilename = DownloadService.getNameEncoder(request, name + "xml.txt");
            response.addHeader("Content-Disposition", "attachment;filename=" + encodedFilename);
            outStr = response.getOutputStream();
            buff = new BufferedOutputStream(outStr);
            buff.write(jsonString.getBytes("UTF-8"));
            buff.flush();
            buff.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                buff.close();
                outStr.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}