xyc
2024-07-24 413eae5cb4d5fe78fc25258bf7b5e3b53740b1f9
1)新增仿真时模型及参数完整性检查
2)增加调用算法库后端接口
19个文件已修改
1个文件已添加
614 ■■■■■ 已修改文件
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/dao/ParamDataDao.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/dao/XhProductModelDao.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ModelLineController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/TaskController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/ModelNodeAlgorithmDao.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/OperatConditModelDao.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskBinoParamDao.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskDao.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dto/TaskModelCheckResult.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/SimulatAssess.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/TaskService.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/basicInfo/ParamDataDao.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/basicInfo/XhProductModelDao.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/taskReliability/ModelNodeAlgorithmDao.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/taskReliability/OperatConditModelDao.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/taskReliability/TaskBinoParamDao.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/taskReliability/TaskDao.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
starter/src/main/resources/application.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.zt.common.servlet.Result;
import com.zt.life.modules.mainPart.taskReliability.model.PythonResult;
import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -23,22 +24,31 @@
    private String redisHost;
    @Value("${spring.redis.port}")
    private String redisPort;
    @Value("${data.reliaSimLib.mainPy}")
    private String reliaSimMain;
    @Value("${data.reliaSimLib.resultHome}")
    private String resultHome;
    private Long taskId = 123L;
    private String taskFlag = "relia";
//    private Long taskId = 123L;
//    private Long taskId = 124L;
//    private Long taskId = 100L;     // =》 model1.xml1
    private String taskType = "calcreq";
    @Autowired
    private RedisTemplate redisTemplate;
    public Result callPython() {
    public Result callPython(SimulatAssess simulatAssess) {
        Result result = null;
        InputStream is = null;
        BufferedReader br = null;
        try {
            setParamToRedis(simulatAssess);
            Process process = null;
            String command = "python D:\\work\\python\\relia_calc.py";
            command += " " + redisHost + " " + redisPort;
            command += " " + taskFlag + " " + taskId.toString();
//            String command = "python D:\\work\\python\\relia_calc.py";
            String command = "python " + reliaSimMain;
            command += " -ip " + redisHost + " -port " + redisPort;
            command += " -taskType " + taskType + " -taskId " + simulatAssess.getId().toString();
            logger.info("cmd命令为:" + command);
            if(System.getProperty("os.name").toLowerCase().indexOf("windows") > -1){
                process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", command});
@@ -48,12 +58,12 @@
                throw new Exception("暂不支持该操作系统,进行启动python计算!");
            }
            is = process.getInputStream();
            // 以命令行方式调用python时,返回的结果是GBK编码的,而非utf-8
            br = new BufferedReader(new InputStreamReader(is,"gb2312"));
            // 以命令行方式调用python时,返回的结果是utf-8编码
            br = new BufferedReader(new InputStreamReader(is,"utf-8"));
            String line = br.readLine();
            logger.info("python返回结果:" + line);
            int exitCode = process.waitFor();
            if (exitCode == 0) {
//            int exitCode = process.waitFor();
//            if (exitCode == 0) {
                logger.info("启动python计算成功");
                if (line != null) {
                    PythonResult rtn = JSONObject.parseObject(line, PythonResult.class);
@@ -64,23 +74,23 @@
                        throw new RuntimeException("启动python计算失败: errorMsg=" + errorMsg);
                    }
                }
            } else {
                logger.error("启动python计算失败: exitCode=" + exitCode);
                throw new RuntimeException("启动python计算失败: exitCode=" + exitCode);
            }
//            } else {
//                logger.error("启动python计算失败: exitCode=" + exitCode);
//                throw new RuntimeException("启动python计算失败: exitCode=" + exitCode);
//            }
        } catch (Exception e) {
            logger.error("启动python计算时发生Exception:", e);
            e.printStackTrace();
            result = Result.error(e.getMessage());
        } finally {
            if (is == null) {
            if (is != null) {
                try {
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (br == null) {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
@@ -92,11 +102,163 @@
        return result;
    }
/*
    public String getPythonCalcResult() {
        String key = taskFlag + taskId.toString();
        String key = taskId.toString() + "calcprog";
        logger.info("redis key:" + key);
        String progress = (String)redisTemplate.opsForValue().get(key);
        if (progress==null) progress = "0";
        return progress;
    }
*/
    private void setParamToRedis(SimulatAssess simulatAssess) {
        String key = simulatAssess.getId().toString() + taskType;
        logger.info("redis key:" + key);
        String xmlfile = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<des name=\"General system\">\n" +
                "    <tasks>\n" +
                "        <task duration=\"200\" model=\"model1\"/>\n" +
                "        <task duration=\"100\" model=\"model2\"/>\n" +
                "    </tasks>\n" +
                "    <models>\n" +
                "        <model name =\"model1\">\n" +
                "            <logic name=\"总体\" type=\"series\">                \n" +
                "\t\t\t\t<logic name=\"系统1\" type=\"series\">                \n" +
                "\t\t\t\t\t<logic name=\"p1\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"X1\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X2\" type=\"node\" cycon=\"15\" cycdown=\"5\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
                "\t\t\t\t\t\t<node name=\"X3\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm2\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X4\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X5\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"s1\" type=\"parallel\">\n" +
                "\t\t\t\t\t\t<node name=\"X6\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X7\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X8\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t</logic>\n" +
                "\t\t\t\t<logic name=\"系统2\" type=\"series\">                \n" +
                "\t\t\t\t\t<node name =\"X14\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t<node name=\"X15\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t<node name=\"X16\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm3\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t</logic>\n" +
                "            </logic>\n" +
                "        </model>\n" +
                "        <model name =\"model2\">\n" +
                "            <logic name=\"总体\" type=\"series\">                \n" +
                "\t\t\t\t<logic name=\"系统1\" type=\"series\">\n" +
                "\t\t\t\t\t<logic name=\"p1\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"X1\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X2\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
                "\t\t\t\t\t\t<node name=\"X3\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X4\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X5\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"s1\" type=\"parallel\">\n" +
                "\t\t\t\t\t\t<node name=\"X6\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X7\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X8\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t</logic>\n" +
                "\t\t\t\t<logic name=\"系统2\" type=\"series\">                \n" +
                "\t\t\t\t\t<logic name=\"p2\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"X14\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X15\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t\t<node name=\"X17\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t</logic>\n" +
                "            </logic>\n" +
                "        </model>\n" +
                "    </models>\n" +
                "    <failure_models>\n" +
                "        <failure_model name=\"fm1\" type=\"exponential\">\n" +
                "            <failure-rate value=\"0.004\"/>\n" +
                "        </failure_model>\n" +
                "        <failure_model name=\"fm2\" type=\"fixed\">\n" +
                "            <unreliability value=\"0.04\"/>\n" +
                "        </failure_model>\n" +
                "        <failure_model name=\"fm3\" type=\"weibull\">\n" +
                "            <scale value=\"100\"/>\n" +
                "            <shape value=\"2\"/>\n" +
                "        </failure_model>\n" +
                "    </failure_models>\n" +
                "    <repair_models>\n" +
                "        <repair_model name=\"rm1\" type=\"exponential\">\n" +
                "            <repair-rate value=\"0.1\"/>\n" +
                "        </repair_model>\n" +
                "        <repair_model name=\"rm2\" type=\"weibull\">\n" +
                "            <scale value=\"13\"/>\n" +
                "            <shape value=\"2\"/>\n" +
                "        </repair_model>\n" +
                "    </repair_models>\n" +
                "</des>";
        JSONObject jsonObject = new JSONObject();
/*
        Long simulate_times = 10000L;
        Long timeslice = 10L;
        jsonObject.put("xmlfile", xmlfile);
        jsonObject.put("simulate_times", simulate_times);
        jsonObject.put("seed", 1000);
        jsonObject.put("timeslice", 1);
//        jsonObject.put("timeslice", timeslice/60.0);
//        jsonObject.put("timeslice", timeslice);
*/
        jsonObject.put("xmlfile", xmlfile);
        jsonObject.put("simulate_times", simulatAssess.getSimulatFrequency());
        jsonObject.put("seed", 1000);
        jsonObject.put("timeslice", simulatAssess.getSamplPeriod()/60.0);
        jsonObject.put("result_home", resultHome);
        redisTemplate.opsForValue().set(key, jsonObject.toJSONString());
    }
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/dao/ParamDataDao.java
@@ -22,6 +22,7 @@
    ParamData getParamData(Long productId, String pageCode);
    List<ParamData> getByShipId(Long shipId);
    List<ParamData> getDeviceParams(Long shipId);
    void deleteByShipId(Long shipId);
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/dao/XhProductModelDao.java
@@ -33,5 +33,7 @@
    List<XhProductModel> getByShipId(Long shipId);
    List<XhProductModel> getProductTree(Long shipId);
    void deleteByShipId(Long shipId);
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ModelLineController.java
@@ -50,6 +50,7 @@
    @Autowired
    private PythonLib pythonLib;
/*
    @GetMapping("callPythonCalc")
    @ApiOperation("信息")
    public Result callPythonCalc() {
@@ -57,7 +58,9 @@
        return result;
    }
*/
/*
    @GetMapping("getPythonCalcResult")
    @ApiOperation("信息")
    public Result<String> getPythonCalcResult() {
@@ -65,6 +68,7 @@
        return Result.ok(result);
    }
*/
    @GetMapping("page")
    @ApiOperation("分页")
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java
@@ -1,32 +1,29 @@
package com.zt.life.modules.mainPart.taskReliability.controller;
import cn.hutool.http.HttpUtil;
import com.zt.common.annotation.LogOperation;
import com.zt.common.constant.Constant;
import com.zt.common.annotation.QueryParam;
import com.zt.common.db.query.QueryFilter;
import com.zt.common.servlet.Result;
import com.zt.common.servlet.PageResult;
import com.zt.common.utils.UUIDUtil;
import com.zt.common.validator.AssertUtils;
import com.zt.common.validator.ValidatorUtils;
import com.zt.common.validator.group.AddGroup;
import com.zt.common.validator.group.DefaultGroup;
import com.zt.common.validator.group.UpdateGroup;
import com.zt.life.modules.mainPart.async.PythonLib;
import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess;
import com.zt.life.modules.mainPart.taskReliability.service.SimulatAssessService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
/**
@@ -39,6 +36,15 @@
@RequestMapping("/taskReliability/SimulatAssess/")
@Api(tags = "simulat_assess")
public class SimulatAssessController {
    private static final Logger logger = LoggerFactory.getLogger(SimulatAssessController.class);
    private static final String taskTypeProgress = "calcreq";
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private PythonLib pythonLib;
    @Autowired
    private SimulatAssessService simulatAssessService;
@@ -66,6 +72,7 @@
    @PostMapping("analyze")
    public Result<Long> analyze(@RequestBody SimulatAssess simulatAssess) {
        //效验数据
/*
        ValidatorUtils.validateEntity(simulatAssess, AddGroup.class, DefaultGroup.class);
        Long taskId = UUIDUtil.generateId();
        Integer time = simulatAssess.getSamplPeriod();
@@ -76,8 +83,10 @@
        paramMap.put("Frequency", Frequency);
        paramMap.put("url", "http://localhost:8050/test-project//taskReliability/SimulatAssess/calculate");
        String result1 = HttpUtil.get("http://localhost:8080/system/user/get", paramMap);
*/
        Result result = pythonLib.callPython(simulatAssess);
        return Result.ok(taskId);
        return result;
    }
    @GetMapping("calculate")
@@ -92,6 +101,14 @@
        return Result.ok();
    }
    @GetMapping("getCalcProgress")
    public String getCalcProgress(Long taskId) {
        String key = taskId.toString() + taskTypeProgress;
        String progress = (String)redisTemplate.opsForValue().get(key);
        if (progress==null) progress = "0";
        return progress;
    }
    @PutMapping
    @ApiOperation("修改")
    @LogOperation("修改")
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/TaskController.java
@@ -11,6 +11,7 @@
import com.zt.common.validator.group.AddGroup;
import com.zt.common.validator.group.DefaultGroup;
import com.zt.common.validator.group.UpdateGroup;
import com.zt.life.modules.mainPart.taskReliability.dto.TaskModelCheckResult;
import com.zt.life.modules.mainPart.taskReliability.model.Task;
import com.zt.life.modules.mainPart.taskReliability.service.TaskService;
import io.swagger.annotations.Api;
@@ -62,6 +63,13 @@
        return Result.ok(taskService.getTaskList(productId));
    }
    @GetMapping("checkTaskModel")
    @ApiOperation("任务模型完整性检查")
    public Result<List<TaskModelCheckResult>> checkTaskModel(Long productId){
        List<TaskModelCheckResult> checkResult = taskService.checkTaskModel(productId);
        return Result.ok(checkResult);
    }
    @PostMapping
    @ApiOperation("新增")
    @LogOperation("新增")
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/ModelNodeAlgorithmDao.java
@@ -22,4 +22,5 @@
    List<ModelNode> getListByModelId(Long modelId);
    void deleteByModelId(Long modelId);
    List<ModelNodeAlgorithm> getRbdNodes();
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/OperatConditModelDao.java
@@ -28,4 +28,6 @@
    List<ModelNodes> getModelNodes(Long shipId);
    void deleteByOperatConditId(Long operatConditId);
    List<OperatConditModel> getGKModelTrees(Long productId);
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskBinoParamDao.java
@@ -19,5 +19,6 @@
public interface TaskBinoParamDao extends BaseDao<TaskBinoParam> {
    List<TaskBinoParam> getList(Map<String, Object> params);
    List<TaskBinoParam> getBinoParams(Long taskModelId);
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/TaskDao.java
@@ -2,6 +2,8 @@
import com.zt.common.dao.BaseDao;
import com.zt.life.modules.mainPart.taskReliability.model.Task;
import com.zt.life.modules.mainPart.taskReliability.model.TaskPhase;
import com.zt.life.modules.mainPart.taskReliability.model.TaskPhaseModel;
import org.apache.ibatis.annotations.Mapper;
@@ -21,4 +23,8 @@
    List<Task> getList(Map<String, Object> params);
    List<Task> getTaskList(Long productId);
    List<Task> getTaskModels(Long productId, Long taskModelId);
    List<TaskPhase> getTaskModelPhases(Long productId, Long taskModelId);
    List<TaskPhaseModel> getTaskModelPhaseModels(Long productId, Long taskModelId);
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dto/TaskModelCheckResult.java
New file
@@ -0,0 +1,29 @@
package com.zt.life.modules.mainPart.taskReliability.dto;
import lombok.Data;
@Data
public class TaskModelCheckResult {
    public final static String CATEGORY_TASK_TIME = "任务总时长未配置";
    public final static String CATEGORY_PHASE_TIME = "阶段时长未配置";
    public final static String CATEGORY_GK_TIME = "工况时长未配置";
    public final static String CATEGORY_GK_MODEL = "工况模型树不完整";
    public final static String CATEGORY_MODEL = "建模未完成";
    public final static String CATEGORY_PARAM = "设备参数未配置";
    private String category; // 检查结果分类
    private Long productId; // 产品结构树节点ID(为任务可靠性建模对象节点,一般为总体)
    private Long taskModelId; // 任务模型ID
    private String taskModelName; // 任务模型名称
    private Long taskModelPhaseId; // 任务阶段ID
    private String taskModelPhaseName; // 任务阶段名称
    private Long gkId; // 工况ID
    private String gkName; // 工况名称
    private Long nodeId; // 节点ID
    private String nodeName; // 节点名称
    private Long modelId; // 节点选择的模型ID
    private String modelName; // 节点选择的模型名称
    private Long deviceId; // 设备ID
    private String deviceName; // 设备名称
    private Long paramId; // 设备参数ID
    private String paramName; // 设备参数名称
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/SimulatAssess.java
@@ -31,9 +31,6 @@
    @ApiModelProperty(value = "总体任务模型ID")
    private Long taskModelId;
    @ApiModelProperty(value = "仿真ID")
    private Long taskId;
    @ApiModelProperty(value = "数据类型")
    private Integer dataType;
@@ -54,4 +51,7 @@
    private String errorMsg;
    private String curveData;
    @ApiModelProperty(value = "传给算法库的xml")
    private String xml;
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/TaskService.java
@@ -1,12 +1,22 @@
package com.zt.life.modules.mainPart.taskReliability.service;
import com.zt.common.service.BaseService;
import com.zt.life.modules.mainPart.taskReliability.dao.TaskDao;
import com.zt.life.modules.mainPart.taskReliability.model.Task;
import com.zt.life.modules.mainPart.basicInfo.dao.ParamDataDao;
import com.zt.life.modules.mainPart.basicInfo.dao.XhProductModelDao;
import com.zt.life.modules.mainPart.basicInfo.model.ParamData;
import com.zt.life.modules.mainPart.basicInfo.model.XhProductModel;
import com.zt.life.modules.mainPart.taskReliability.dao.*;
import com.zt.life.modules.mainPart.taskReliability.dto.TaskModelCheckResult;
import com.zt.life.modules.mainPart.taskReliability.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zt.common.db.query.QueryFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -17,6 +27,19 @@
 */
@Service
public class TaskService  extends BaseService<TaskDao, Task> {
    @Autowired
    private OperatConditModelDao operatConditModelDao;
    @Autowired
    private ModelNodeAlgorithmDao modelNodeAlgorithmDao;
    @Autowired
    private ModelRbdDao modelRbdDao;
    @Autowired
    private XhProductModelDao xhProductModelDao;
    @Autowired
    private ParamDataDao paramDataDao;
    @Autowired
    private TaskBinoParamDao taskBinoParamDao;
    /**
     * 分页查询
@@ -40,4 +63,188 @@
    public List<Task> getTaskList(Long productId) {
        return  baseDao.getTaskList(productId);
    }
    /**
     * 对任务可靠性模型及其参数配置进行完整性检查,并指出以下5类错误:
     * 0)任务总时长未配置
     * 1)阶段时长未配置
     * 2)工况时长未配置
     * 3)工况模型树不完整
     * 4)建模未完成
     * 5)设备参数未配置
     * 可以对所有任务模型进行检查,也可以只检查入参指定的产品节点下的任务模型;前者适合在页面列表显示全体建模状态,后者适合对某任务进行仿真时的检查。
     * @param productId 产品节点ID(一般为总体)
     * @return 检查出的错误的List,长度为0表示没有错误,不会返回null
     */
    public List<TaskModelCheckResult> checkTaskModel(Long productId) {
        List<TaskModelCheckResult> result = new ArrayList<>();
        result = doCheckTaskModel(productId, null);
        return result;
    }
    private List<TaskModelCheckResult> doCheckTaskModel(Long productId, Long taskModelId) {
        List<TaskModelCheckResult> checkResult = new ArrayList<>();
        List<XhProductModel> deviceUsedList = new ArrayList<>();    // 检查对象模型中使用到的所有设备
        // 1. 获取数据
        // 1.1 获取所有任务模型数据List
        List<Task> taskModelList = baseDao.getTaskModels(productId, taskModelId);
        // 1.2 获取所有任务模型阶段数据List
        List<TaskPhase> taskModelPhaseList = baseDao.getTaskModelPhases(productId, taskModelId);
        // 1.3 获取所有任务模型工况数据List
        List<TaskPhaseModel> taskModelPhaseModelList = baseDao.getTaskModelPhaseModels(productId, taskModelId);
        // 1.4 获取产品结构树结构数据
        List<XhProductModel> productTreeList = xhProductModelDao.getProductTree(productId);
        // 1.5 获取所有模型包含的节点数据
        List<ModelNodeAlgorithm> rbdNodeList = modelNodeAlgorithmDao.getRbdNodes();
        // 1.6 获取所有工况模型树数据List
        List<OperatConditModel> gkModelList = operatConditModelDao.getGKModelTrees(productId);
        // 1.7 获取所有RBD数据List
        Map<String, Object> mapFilter = new HashMap<>();
        mapFilter.put("productId", productId);
        List<ModelRbd> modelRbdList = modelRbdDao.getList(mapFilter);
        // 1.8 获取所有设备参数(含任务模型的二项分布参数)List
        List<ParamData> paramDataList = paramDataDao.getDeviceParams(productId);
        List<TaskBinoParam> binoParamList = taskBinoParamDao.getBinoParams(taskModelId);
        // 2. 检查每个任务模型的数据完整性(递归)
        for (Task taskModel : taskModelList) {
            if (null == taskModel.getTaskDuration() || 0.0 == taskModel.getTaskDuration()) {
                // 2.1 任务总时长未配置
                setTaskModelCheckResult(taskModel,
                        null,
                        null, null, null,
                        TaskModelCheckResult.CATEGORY_TASK_TIME, checkResult);
            }
            List<TaskPhase> phases = taskModelPhaseList.stream().filter(item ->
                    taskModel.getId().equals(item.getTaskId())).collect(Collectors.toList());
            for (TaskPhase phase : phases) {
                if (null == phase.getPhaseDurationRate() || 0.0 == phase.getPhaseDurationRate()) {
                    // 2.2 阶段时长未配置
                    setTaskModelCheckResult(taskModel,
                            phase,
                            null, null, null,
                            TaskModelCheckResult.CATEGORY_PHASE_TIME, checkResult);
                }
                List<TaskPhaseModel> phaseModels = taskModelPhaseModelList.stream().filter(item ->
                        phase.getId().equals(item.getPhaseId())).collect(Collectors.toList());
                if (phaseModels.size() <= 0) {
                    // 无工况模型数据
                    // 2.3 工况时长未配置
                    setTaskModelCheckResult(taskModel,
                            phase,
                            null, null, null,
                            TaskModelCheckResult.CATEGORY_GK_TIME, checkResult);
                } else {
                    // 有工况模型数据
                    List<TaskPhaseModel> phaseModelWithDurations = taskModelPhaseModelList.stream().filter(item ->
                            0.0 != item.getOperatConditDurationRate()).collect(Collectors.toList());
                    if (phaseModelWithDurations.size() <= 0) {
                        // 无工况模型被选用
                        // 2.3 工况时长未配置
                        for (TaskPhaseModel taskPhaseModel : phaseModels) {
                            setTaskModelCheckResult(taskModel,
                                    phase,
                                    taskPhaseModel,
                                    null, null,
                                    TaskModelCheckResult.CATEGORY_GK_TIME, checkResult);
                        }
                    } else {
                        // 有工况模型被选用,检查选用的工况模型
                        for (TaskPhaseModel taskPhaseModel : phaseModelWithDurations) {
                            // 首先找到顶层模型
                            List<OperatConditModel> gkModelTops = gkModelList.stream().filter(item ->
                                    taskPhaseModel.getOperatConditId().equals(item.getOperatConditId())
                                            && taskModel.getProductId().equals(item.getProductId())).collect(Collectors.toList());
                            if (gkModelTops.size() <= 0) {
                                // 无工况模型树根节点,即意味着无工况模型树
                                XhProductModel node = (XhProductModel) productTreeList.stream().filter(item ->
                                        taskModel.getProductId().equals(item.getId())).collect(Collectors.toList()).get(0);
                                setTaskModelCheckResult(taskModel,
                                        phase,
                                        taskPhaseModel,
                                        null,
                                        node,
                                        TaskModelCheckResult.CATEGORY_GK_MODEL, checkResult);
                            } else {
                                // 有工况模型树,检查其完整性
//                                checkGkModel(taskModel, phase, taskPhaseModel, gkModelTops.get(0),
//                                        deviceUsedList, checkResult);
                            }
                        }
                    }
                }
            }
        }
        // 3. 返回检查结果
        return checkResult;
    }
    // 递归函数
    private void checkGkModel(Task taskModel,
                              TaskPhase phase,
                              TaskPhaseModel taskPhaseModel,
                              OperatConditModel gkModelTreeTop,
                              List<OperatConditModel> gkModelList,
                              List<ModelNodeAlgorithm> rbdNodeList,
                              List<XhProductModel> productTreeList,
                              List<XhProductModel> deviceUsedList,
                              List<TaskModelCheckResult> checkResult) {
        // 首先找到顶层模型
        List<OperatConditModel> gkModelTops = gkModelList.stream().filter(item ->
                taskPhaseModel.getOperatConditId().equals(item.getOperatConditId())
                        && taskModel.getProductId().equals(item.getProductId())).collect(Collectors.toList());
        if (gkModelTops.size() <= 0) {
            // 工况模型树不完整(顶层节点未配置模型)
            XhProductModel node = (XhProductModel) productTreeList.stream().filter(item ->
                    taskModel.getProductId().equals(item.getId())).collect(Collectors.toList()).get(0);
            setTaskModelCheckResult(taskModel,
                    phase,
                    taskPhaseModel,
                    null,
                    node,
                    TaskModelCheckResult.CATEGORY_GK_MODEL, checkResult);
        }
    }
    private void setTaskModelCheckResult(Task taskModel,
                                         TaskPhase taskModelPhase,
                                         TaskPhaseModel taskModelPhaseModel,
                                         OperatConditModel gkModel,
                                         XhProductModel node,
                                         String category,
                                         List<TaskModelCheckResult> checkResult) {
        TaskModelCheckResult result = new TaskModelCheckResult();
        result.setCategory(category);
        result.setProductId(taskModel.getProductId());
        result.setTaskModelId(taskModel.getId());
        result.setTaskModelName(taskModel.getTaskName());
        switch(category) {
            case TaskModelCheckResult.CATEGORY_TASK_TIME:
                break;
            case TaskModelCheckResult.CATEGORY_PHASE_TIME:
                result.setTaskModelPhaseId(taskModelPhase.getId());
                result.setTaskModelPhaseName(taskModelPhase.getPhaseName());
                break;
            case TaskModelCheckResult.CATEGORY_GK_TIME:
                result.setTaskModelPhaseId(taskModelPhase.getId());
                result.setTaskModelPhaseName(taskModelPhase.getPhaseName());
                if (null != taskModelPhaseModel) {
                    result.setGkId(taskModelPhaseModel.getOperatConditId());
                    result.setGkName(taskModelPhaseModel.getOperatConditName());
                }
                break;
            case TaskModelCheckResult.CATEGORY_GK_MODEL:
                result.setTaskModelPhaseId(taskModelPhase.getId());
                result.setTaskModelPhaseName(taskModelPhase.getPhaseName());
                result.setGkId(taskModelPhaseModel.getOperatConditId());
                result.setGkName(taskModelPhaseModel.getOperatConditName());
                result.setNodeId(node.getId());
                result.setNodeName(node.getName());
                break;
        }
        checkResult.add(result);
    }
}
modules/mainPart/src/main/resources/mapper/basicInfo/ParamDataDao.xml
@@ -51,4 +51,15 @@
          and a.ship_id = #{shipId}
    </select>
    <select id="getDeviceParams" resultType="com.zt.life.modules.mainPart.basicInfo.model.ParamData">
        SELECT a.*
        FROM param_data a
        inner join product_model b on b.id=a.product_id
        where a.is_delete = 0
          and b.is_delete = 0
          and b.product_type = '5'
        <if test="shipId!=null">
            and a.ship_id = #{shipId}
        </if>
    </select>
</mapper>
modules/mainPart/src/main/resources/mapper/basicInfo/XhProductModelDao.xml
@@ -121,4 +121,12 @@
          and a.product_type &gt; 2
    </select>
    <select id="getProductTree" resultType="com.zt.life.modules.mainPart.basicInfo.model.XhProductModel">
        select a.*
        from product_model a
        where a.is_delete = 0
        <if test="shipId!=null">
            and a.ship_id = #{shipId}
        </if>
    </select>
</mapper>
modules/mainPart/src/main/resources/mapper/taskReliability/ModelNodeAlgorithmDao.xml
@@ -24,6 +24,15 @@
            and model_id=#{modelId}
    </select>
    <select id="getRbdNodes" resultType="com.zt.life.modules.mainPart.taskReliability.model.ModelNodeAlgorithm">
        select a.*
        from model_node_algorithm a
        where
            a.is_delete = 0
          and a.node_type = 'node'
        order by a.model_id, a.data_id
    </select>
    <update id="deleteByModelId">
        delete from model_node_algorithm where model_id=#{modelId}
    </update>
modules/mainPart/src/main/resources/mapper/taskReliability/OperatConditModelDao.xml
@@ -53,4 +53,18 @@
        group by model_id
    </select>
    <select id="getGKModelTrees" resultType="com.zt.life.modules.mainPart.taskReliability.model.OperatConditModel">
        select
        a.*
        FROM
        operat_condit_model a
        inner join operat_condit b on b.id=a.operat_condit_id
        where
        a.is_delete = 0
        and b.is_delete = 0
        <if test="productId!=null">
            and b.product_id=${productId}
        </if>
        ORDER BY a.operat_condit_id, a.product_id
    </select>
</mapper>
modules/mainPart/src/main/resources/mapper/taskReliability/TaskBinoParamDao.xml
@@ -62,4 +62,14 @@
        order by a.phase_id, a.operat_condit_id, a.product_id
    </select>
    <select id="getBinoParams" resultType="com.zt.life.modules.mainPart.taskReliability.model.TaskBinoParam">
        select a.*
        from
            task_bino_param a
        where
            a.IS_DELETE=0
        <if test="shipId!=null">
            and a.task_id = #{taskModelId}
        </if>
    </select>
</mapper>
modules/mainPart/src/main/resources/mapper/taskReliability/TaskDao.xml
@@ -26,4 +26,58 @@
        and a.product_id=${productId}
    </select>
    <select id="getTaskModels" resultType="com.zt.life.modules.mainPart.taskReliability.model.Task">
        select
            a.*
        FROM
            task a
        where
            a.is_delete = 0
        <if test="productId!=null">
            and a.product_id=${productId}
        </if>
        <if test="taskModelId!=null">
            and a.id=${taskModelId}
        </if>
        ORDER BY a.task_sort
    </select>
    <select id="getTaskModelPhases" resultType="com.zt.life.modules.mainPart.taskReliability.model.TaskPhase">
        select
            b.*
        FROM
            task a
            inner join task_phase b on b.task_id=a.id
        where
            a.is_delete = 0
            and b.is_delete = 0
        <if test="productId!=null">
            and a.product_id=${productId}
        </if>
        <if test="taskModelId!=null">
            and a.id=${taskModelId}
        </if>
        ORDER BY a.task_sort, b.phase_sort
    </select>
    <select id="getTaskModelPhaseModels" resultType="com.zt.life.modules.mainPart.taskReliability.model.TaskPhaseModel">
        select
            c.*
        FROM
            task a
            inner join task_phase b on b.task_id=a.id
            inner join task_phase_model c on c.phase_id=b.id
            inner join operat_condit d on d.id=c.operat_condit_id
        where
            a.is_delete = 0
            and b.is_delete = 0
            and c.is_delete = 0
            and d.is_delete = 0
        <if test="productId!=null">
            and a.product_id=${productId}
            and d.product_id=${productId}
        </if>
        <if test="taskModelId!=null">
            and a.id=${taskModelId}
        </if>
        ORDER BY a.task_sort, b.phase_sort
    </select>
</mapper>
starter/src/main/resources/application.yml
@@ -4,7 +4,7 @@
    uri-encoding: UTF-8
    max-threads: 1000
    min-spare-threads: 30
  port: 8050
  port: 8066
  servlet:
    context-path: /test-project
    session:
@@ -145,4 +145,8 @@
  tokenTimeout: 60
  # 单位分钟
  reliaSimLib:
    # 算法库启动脚本(全路径)
    mainPy: D:/relia_sim/main.py
    # 算法库仿真结果存放根目录
    resultHome: d:/relia_sim/sim_result