package com.zt.life.modules.mainPart.taskReliability.service; import com.zt.common.service.BaseService; 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.TaskModelCheckResultDto; 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; /** * task * * @author zt generator * @since 1.0.0 2024-03-15 */ @Service public class TaskService extends BaseService { @Autowired private OperatConditModelDao operatConditModelDao; @Autowired private ModelNodeAlgorithmDao modelNodeAlgorithmDao; @Autowired private ModelRbdDao modelRbdDao; @Autowired private AlgorithmDao algorithmDao; @Autowired private XhProductModelDao xhProductModelDao; @Autowired private ParamDataDao paramDataDao; @Autowired private TaskBinoParamDao taskBinoParamDao; @Autowired private ReliabilityAssessDao reliabilityAssessDao; /** * 分页查询 * * @param queryFilter * @return */ public List page(QueryFilter queryFilter) { return baseDao.getList(queryFilter.getQueryParams()); } /** * 删除 * * @param ids */ public void delete(Long[] ids) { super.deleteLogic(ids); } public List getTaskList(Long productId) { return baseDao.getTaskList(productId); } /** * 可靠性仿真评估:对任务可靠性模型及其参数配置进行完整性检查,并指出以下6类错误: * 1)任务总时长未配置 * 2)阶段时长未配置 * 3)工况时长未配置 * 4)工况模型树不完整 * 5)建模未完成 * 6)设备参数未配置 * 可以对所有任务模型进行检查,也可以只检查入参指定的产品节点下的任务模型;前者适合在页面列表显示全体建模状态,后者适合对某任务进行仿真时的检查。 * * @param productId 产品节点ID(一般为总体) * @return 检查出的错误的List,长度为0表示没有错误,不会返回null */ public List checkTaskModel(Long productId, Long taskId) { List checkResult = new ArrayList<>(); List deviceUsedList = new ArrayList<>(); // 检查对象模型中使用到的所有设备 // 1. 获取数据 // 1.1 获取所有任务数据List List taskList = baseDao.getTasks(productId, taskId); // 1.2 获取所有任务阶段数据List List taskPhaseList = baseDao.getTaskPhases(productId, taskId); // 1.3 获取所有任务工况数据List List taskPhaseModelList = baseDao.getTaskPhaseModels(productId, taskId); // 1.4 获取产品结构树结构数据 List productTreeList = xhProductModelDao.getProductTree(productId); // 1.5 获取所有工况模型树数据List List gkModelList = operatConditModelDao.getGKModelTrees(productId); // 1.6 获取所有RBD数据List List modelRbdList = modelRbdDao.getListAll(); // 1.7 获取所有模型包含的节点数据 List rbdNodeList = modelNodeAlgorithmDao.getRbdNodes(); // 1.8 获取该船的所有设备参数List List paramDataList = paramDataDao.getDeviceParams(productId); // 1.8 获取该任务的二项分布参数List List binoParamList = taskBinoParamDao.getBinoParams(taskId); // 2. 检查每个任务模型的数据完整性 for (Task task : taskList) { if (null == task.getTaskDuration() || 0.0 == task.getTaskDuration()) { // 2.1 任务总时长未配置 setTaskModelCheckResult(task, null, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_TASK_TIME, checkResult); } List phases = taskPhaseList.stream().filter(item -> task.getId().equals(item.getTaskId())).collect(Collectors.toList()); for (TaskPhase phase : phases) { if (null == phase.getPhaseDurationRate() || 0.0 == phase.getPhaseDurationRate()) { // 2.2 阶段时长未配置 setTaskModelCheckResult(task, phase, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_PHASE_TIME, checkResult); } List phaseModels = taskPhaseModelList.stream().filter(item -> phase.getId().equals(item.getPhaseId()) && 0.0 != item.getOperatConditDurationRate()). collect(Collectors.toList()); if (phaseModels.size() <= 0) { // 2.3 工况时长未配置 setTaskModelCheckResult(task, phase, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_GK_TIME, checkResult); } else { // 有工况被选用,检查选用的工况 for (TaskPhaseModel taskPhaseModel : phaseModels) { List gkModelTree = gkModelList.stream().filter(item -> taskPhaseModel.getOperatConditId().equals(item.getOperatConditId())).collect(Collectors.toList()); if (gkModelTree.size() <= 0) { // 无工况模型树 XhProductModel node = (XhProductModel) productTreeList.stream().filter(item -> task.getProductId().equals(item.getId())).collect(Collectors.toList()).get(0); setTaskModelCheckResult(task, phase, taskPhaseModel, node, null, null, null, TaskModelCheckResultDto.CATEGORY_GK_MODEL, checkResult); } else { // 有工况模型树,检查其完整性 for (OperatConditModel gkModel : gkModelTree) { XhProductModel node = (XhProductModel) productTreeList.stream().filter(item -> gkModel.getProductId().equals(item.getId())).collect(Collectors.toList()).get(0); if (isNodeInRbdOfParent(node, gkModelTree, rbdNodeList)) { if (null == gkModel.getModelId()) { // 工况模型树不完整 setTaskModelCheckResult(task, phase, taskPhaseModel, node, null, null, null, TaskModelCheckResultDto.CATEGORY_GK_MODEL, checkResult); } else { List modelRbds = modelRbdList.stream().filter(item -> gkModel.getModelId().equals(item.getId())).collect(Collectors.toList()); if (modelRbds.size() == 0) { // 建模未完成 setTaskModelCheckResult(task, phase, taskPhaseModel, node, null, null, null, TaskModelCheckResultDto.CATEGORY_MODEL, checkResult); } else { if (!"已完成".equals(modelRbds.get(0).getModelState())) { // 建模未完成 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), null, null, TaskModelCheckResultDto.CATEGORY_MODEL, checkResult); } else { List deviceNodes = rbdNodeList.stream().filter(item -> gkModel.getModelId().equals(item.getModelId())).collect(Collectors.toList()); for (ModelNodeAlgorithm deviceNode : deviceNodes) { XhProductModel device = (XhProductModel) productTreeList.stream().filter(item -> deviceNode.getDataId().equals(item.getId())).collect(Collectors.toList()).get(0); if ("5".equals(device.getProductType())) { // 设备 List params = paramDataList.stream().filter(item -> deviceNode.getDataId().equals(item.getProductId())).collect(Collectors.toList()); if (params.size() == 0) { // 设备参数未配置 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, null, TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } else { ParamData param = params.get(0); if (param.getReliabDistribType() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "可靠性分布类型", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } else { if (param.getReliabDistribType() == 1) { // 指数分布 if (param.getTaskMtbcfRegulate() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTBCF", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } } if (param.getReliabDistribType() == 2) { // 威布尔分布 if (param.getTaskMtbcfRegulate() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTBCF", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } if (param.getTaskMtbcfOtherParams2() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTBCF参数2", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } if (param.getTaskMtbcfOtherParams3() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTBCF参数3", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } } if (param.getReliabDistribType() == 3) { // 二项分布 List binoParams = binoParamList.stream().filter(item -> phase.getId().equals(item.getPhaseId()) && taskPhaseModel.getOperatConditId().equals(item.getOperatConditId()) && // modelRbds.get(0).getId().equals(item.getModelId()) && device.getId().equals(item.getProductId())).collect(Collectors.toList()); if (binoParams.size() == 0) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "二项分布参数", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } else { TaskBinoParam binoParam = binoParams.get(0); if (binoParam.getSuccessRate() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "成功率", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } else { if (binoParam.getSuccessTimes() != null && binoParam.getSimulatTimes() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "总次数", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } if (binoParam.getSuccessTimes() == null && binoParam.getSimulatTimes() != null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "成功次数", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } } } } if (param.getRepairable() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "是否可维修", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } else { if (1 == param.getRepairable()) { // 可维修 if (param.getRepairDistribType() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "维修分布类型", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } if (param.getRepairDistribType() == 1) { // 指数分布 if (param.getRepairMttcr() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTTCR", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } } if (param.getRepairDistribType() == 2) { // 威布尔分布 if (param.getRepairMttcr() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTTCR", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } if (param.getRepairMttcrOtherParams2() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTTCR参数2", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } if (param.getRepairMttcrOtherParams3() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "MTTCR参数3", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } } } } } } } } } } } } } } } } } } // 3. 返回检查结果 return checkResult; } private boolean isNodeInRbdOfParent(XhProductModel node, List gkModelTree, List rbdNodeList) { boolean result = false; List parents = gkModelTree.stream().filter(item -> item.getProductId().equals(node.getPid())).collect(Collectors.toList()); if (parents.size() > 0) { OperatConditModel parent = parents.get(0); if (parent.getModelId() != null) { List nodes = rbdNodeList.stream().filter(item -> item.getModelId().equals(parent.getModelId()) && item.getDataId().equals(node.getId())).collect(Collectors.toList()); if (nodes.size() > 0) { result = true; } } } return result; } /** * 可靠性评定:对任务可靠性模型、参数配置、可靠性评定数据进行完整性检查,并指出以下11类错误: * 1)任务总时长未配置 * 2)目前不支持多阶段 * 3)阶段时长未配置 * 4)目前不支持多工况 * 5)工况时长未配置 * 6)工况模型树不完整 * 7)建模未完成 * 8)目前不支持串联、并联和表决以外的模型 * 9)设备参数未配置 * 10)目前不支持二项分布和指数分布以外的分布类型 * 11)评定数据未录入 * 可以对所有任务模型进行检查,也可以只检查入参指定的产品节点下的任务模型;前者适合在页面列表显示全体建模状态,后者适合对某任务进行仿真时的检查。 * * @param productId 产品节点ID(一般为总体) * @return 检查出的错误的List,长度为0表示没有错误,不会返回null */ public List checkTaskModelAssess(Long productId, Long taskId, Long itemId) { List checkResult = new ArrayList<>(); List deviceUsedList = new ArrayList<>(); // 检查对象模型中使用到的所有设备 // 1. 获取数据 // 1.1 获取所有任务数据List List taskList = baseDao.getTasks(productId, taskId); // 1.2 获取所有任务阶段数据List List taskPhaseList = baseDao.getTaskPhases(productId, taskId); // 1.3 获取所有任务工况数据List List taskPhaseModelList = baseDao.getTaskPhaseModels(productId, taskId); // 1.4 获取产品结构树结构数据 List productTreeList = xhProductModelDao.getProductTree(productId); // 1.5 获取所有工况模型树数据List List gkModelList = operatConditModelDao.getGKModelTrees(productId); // 1.6 获取所有RBD数据List List modelRbdList = modelRbdDao.getListAll(); // 1.7 获取所有模型包含的节点数据 List rbdNodeList = modelNodeAlgorithmDao.getRbdNodes(); // 1.8 获取该船的所有设备参数List List paramDataList = paramDataDao.getDeviceParams(productId); // 1.8 获取评定数据List List assessDataList = reliabilityAssessDao.getProductList(productId, itemId); // 2. 检查每个任务模型的数据完整性 for (Task task : taskList) { if (null == task.getTaskDuration() || 0.0 == task.getTaskDuration()) { // 2.1 任务总时长未配置 setTaskModelCheckResult(task, null, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_TASK_TIME, checkResult); } List phases = taskPhaseList.stream().filter(item -> task.getId().equals(item.getTaskId())).collect(Collectors.toList()); if (phases.size() > 1) { // 2.2 目前不支持多阶段 setTaskModelCheckResult(task, null, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_MULTI_PHASE, checkResult); } else if (phases.size() <= 0){ // 2.3 阶段时长未配置 setTaskModelCheckResult(task, null, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_PHASE_TIME, checkResult); } else { TaskPhase phase = phases.get(0); if (null == phase.getPhaseDurationRate() || 0.0 == phase.getPhaseDurationRate()) { // 2.3 阶段时长未配置 setTaskModelCheckResult(task, phase, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_PHASE_TIME, checkResult); } List phaseModels = taskPhaseModelList.stream().filter(item -> phase.getId().equals(item.getPhaseId()) && 0.0 != item.getOperatConditDurationRate()). collect(Collectors.toList()); if (phaseModels.size() > 1) { // 2.4 目前不支持多工况 setTaskModelCheckResult(task, phase, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_MULTI_GK, checkResult); } else if (phaseModels.size() <= 0) { // 2.5 工况时长未配置 setTaskModelCheckResult(task, phase, null, null, null, null, null, TaskModelCheckResultDto.CATEGORY_GK_TIME, checkResult); } else { // 有工况被选用,检查选用的工况 TaskPhaseModel taskPhaseModel = phaseModels.get(0); List gkModelTree = gkModelList.stream().filter(item -> taskPhaseModel.getOperatConditId().equals(item.getOperatConditId())).collect(Collectors.toList()); if (gkModelTree.size() <= 0) { // 无工况模型树 XhProductModel node = productTreeList.stream().filter(item -> task.getProductId().equals(item.getId())).collect(Collectors.toList()).get(0); // 2.6 工况模型树不完整 setTaskModelCheckResult(task, phase, taskPhaseModel, node, null, null, null, TaskModelCheckResultDto.CATEGORY_GK_MODEL, checkResult); } else { // 有工况模型树,检查其完整性 for (OperatConditModel gkModel : gkModelTree) { XhProductModel node = productTreeList.stream().filter(item -> gkModel.getProductId().equals(item.getId())).collect(Collectors.toList()).get(0); if (isNodeInRbdOfParent(node, gkModelTree, rbdNodeList)) { if (null == gkModel.getModelId()) { // 2.6 工况模型树不完整 setTaskModelCheckResult(task, phase, taskPhaseModel, node, null, null, null, TaskModelCheckResultDto.CATEGORY_GK_MODEL, checkResult); } else { List modelRbds = modelRbdList.stream().filter(item -> gkModel.getModelId().equals(item.getId())).collect(Collectors.toList()); if (modelRbds.size() == 0) { // 2.7 建模未完成 setTaskModelCheckResult(task, phase, taskPhaseModel, node, null, null, null, TaskModelCheckResultDto.CATEGORY_MODEL, checkResult); } else { if (!"已完成".equals(modelRbds.get(0).getModelState())) { // 2.7 建模未完成 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), null, null, TaskModelCheckResultDto.CATEGORY_MODEL, checkResult); } else { List algorithmList = algorithmDao.getListByModelId(gkModel.getModelId()); if (hasNotSupportModel(algorithmList)) { // 2.8 目前不支持串联、并联和表决以外的模型 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), null, null, TaskModelCheckResultDto.CATEGORY_MODEL_NOT_SUPPORT, checkResult); } else { List deviceNodes = rbdNodeList.stream().filter(item -> gkModel.getModelId().equals(item.getModelId())).collect(Collectors.toList()); for (ModelNodeAlgorithm deviceNode : deviceNodes) { XhProductModel device = (XhProductModel) productTreeList.stream().filter(item -> deviceNode.getDataId().equals(item.getId())).collect(Collectors.toList()).get(0); if ("5".equals(device.getProductType())) { // 设备 List params = paramDataList.stream().filter(item -> deviceNode.getDataId().equals(item.getProductId())).collect(Collectors.toList()); if (params.size() == 0) { // 2.9 设备参数未配置 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, null, TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } else { ParamData param = params.get(0); if (param.getReliabDistribType() == null) { setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "可靠性分布类型", TaskModelCheckResultDto.CATEGORY_PARAM, checkResult); } else { if (param.getReliabDistribType() != 1 && param.getReliabDistribType() != 3) { // 2.10 目前不支持二项分布和指数分布以外的分布类型 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "可靠性分布类型", TaskModelCheckResultDto.CATEGORY_DISTRIBUTION_NOT_SUPPORT, checkResult); } else { List assessDatas = assessDataList.stream().filter(item -> item.getId().equals(device.getId())).collect(Collectors.toList()); if (assessDatas.size() ==0) { // 2.11 评定数据未录入 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, null, TaskModelCheckResultDto.CATEGORY_NO_ASSESS_DATA, checkResult); } else { ReliabilityAssess assessData = assessDatas.get(0); if (assessData.getFailNum() == null || assessData.getFailNum() == 0) { // 2.11 评定数据未录入 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "故障次数", TaskModelCheckResultDto.CATEGORY_NO_ASSESS_DATA, checkResult); } if (param.getReliabDistribType() == 1 && (assessData.getRunTimes() == null || assessData.getRunTimes() == 0.0)) { // 2.11 评定数据未录入 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "试验时间", TaskModelCheckResultDto.CATEGORY_NO_ASSESS_DATA, checkResult); } if (param.getReliabDistribType() == 3 && (assessData.getRunNum() == null || assessData.getRunNum() == 0.0)) { // 2.11 评定数据未录入 setTaskModelCheckResult(task, phase, taskPhaseModel, node, modelRbds.get(0), device, "试验次数", TaskModelCheckResultDto.CATEGORY_NO_ASSESS_DATA, checkResult); } } } } } } } } } } } } } } } } } // 3. 返回检查结果 return checkResult; } private boolean hasNotSupportModel(List algorithmList) { boolean result = false; for (Algorithm algorithm : algorithmList) { if ("switch,bridge".contains(algorithm.getAlgorithmType())) { result = true; break; } } return result; } private void setTaskModelCheckResult(Task task, TaskPhase taskPhase, TaskPhaseModel taskPhaseModel, XhProductModel node, ModelRbd model, XhProductModel device, String paramName, String category, List checkResult) { TaskModelCheckResultDto result = new TaskModelCheckResultDto(); result.setCategory(category); result.setProductId(task.getProductId()); result.setTaskId(task.getId()); result.setTaskName(task.getTaskName()); if (taskPhase != null) { result.setTaskPhaseId(taskPhase.getId()); result.setTaskPhaseName(taskPhase.getPhaseName()); } if (taskPhaseModel != null) { result.setGkId(taskPhaseModel.getOperatConditId()); result.setGkName(taskPhaseModel.getOperatConditName()); } if (node != null) { result.setNodeId(node.getId()); result.setNodeName(node.getName()); } if (model != null) { result.setModelId(model.getId()); result.setModelName(model.getModelName()); } if (device != null) { result.setDeviceId(device.getId()); result.setDeviceName(device.getName()); } result.setParamName(paramName); checkResult.add(result); } }