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 > 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