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<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; 
 | 
  
 | 
    /** 
 | 
     * 分页查询 
 | 
     * 
 | 
     * @param queryFilter 
 | 
     * @return 
 | 
     */ 
 | 
    public List<Task> page(QueryFilter queryFilter) { 
 | 
        return baseDao.getList(queryFilter.getQueryParams()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除 
 | 
     * 
 | 
     * @param ids 
 | 
     */ 
 | 
    public void delete(Long[] ids) { 
 | 
        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); 
 | 
    } 
 | 
} 
 |