|  |  | 
 |  |  | 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.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  | 
 |  |  |  * @author zt generator | 
 |  |  |  * @since 1.0.0 2024-03-15 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | public class TaskService  extends BaseService<TaskDao, Task> { | 
 |  |  | public class TaskService extends BaseService<TaskDao, Task> { | 
 |  |  |  | 
 |  |  |     @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; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 分页查询 | 
 |  |  | 
 |  |  |         super.deleteLogic(ids); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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<TaskModelCheckResultDto> checkTaskModel(Long productId, Long taskId) { | 
 |  |  |         List<TaskModelCheckResultDto> checkResult = new ArrayList<>(); | 
 |  |  |         List<XhProductModel> deviceUsedList = new ArrayList<>();    // 检查对象模型中使用到的所有设备 | 
 |  |  |  | 
 |  |  |         // 1. 获取数据 | 
 |  |  |         // 1.1 获取所有任务数据List | 
 |  |  |         List<Task> taskList = baseDao.getTasks(productId, taskId); | 
 |  |  |         // 1.2 获取所有任务阶段数据List | 
 |  |  |         List<TaskPhase> taskPhaseList = baseDao.getTaskPhases(productId, taskId); | 
 |  |  |         // 1.3 获取所有任务工况数据List | 
 |  |  |         List<TaskPhaseModel> taskPhaseModelList = baseDao.getTaskPhaseModels(productId, taskId); | 
 |  |  |         // 1.4 获取产品结构树结构数据 | 
 |  |  |         List<XhProductModel> productTreeList = xhProductModelDao.getProductTree(productId); | 
 |  |  |         // 1.5 获取所有工况模型树数据List | 
 |  |  |         List<OperatConditModel> gkModelList = operatConditModelDao.getGKModelTrees(productId); | 
 |  |  |         // 1.6 获取所有RBD数据List | 
 |  |  |         List<ModelRbd> modelRbdList = modelRbdDao.getListAll(); | 
 |  |  |         // 1.7 获取所有模型包含的节点数据 | 
 |  |  |         List<ModelNodeAlgorithm> rbdNodeList = modelNodeAlgorithmDao.getRbdNodes(); | 
 |  |  |         // 1.8 获取该船的所有设备参数List | 
 |  |  |         List<ParamData> paramDataList = paramDataDao.getDeviceParams(productId); | 
 |  |  |         // 1.8 获取该任务的二项分布参数)List | 
 |  |  |         List<TaskBinoParam> 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<TaskPhase> 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<TaskPhaseModel> 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<OperatConditModel> 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 (null == gkModel.getModelId()) { | 
 |  |  |                                     // 工况模型树不完整 | 
 |  |  |                                     setTaskModelCheckResult(task, phase, taskPhaseModel, | 
 |  |  |                                             node, null, null, null, | 
 |  |  |                                             TaskModelCheckResultDto.CATEGORY_GK_MODEL, checkResult); | 
 |  |  |                                 } else { | 
 |  |  |                                     List<ModelRbd> 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<ModelNodeAlgorithm> 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<ParamData> 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<TaskBinoParam> 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 (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 void setTaskModelCheckResult(Task task, | 
 |  |  |                                          TaskPhase taskPhase, | 
 |  |  |                                          TaskPhaseModel taskPhaseModel, | 
 |  |  |                                          XhProductModel node, | 
 |  |  |                                          ModelRbd model, | 
 |  |  |                                          XhProductModel device, | 
 |  |  |                                          String paramName, | 
 |  |  |                                          String category, | 
 |  |  |                                          List<TaskModelCheckResultDto> 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); | 
 |  |  |     } | 
 |  |  | } |