package com.estate.expert.admin.service.eval; import com.estate.expert.admin.domain.business.device.Device; import com.estate.expert.admin.domain.business.device.DeviceType; import com.estate.expert.admin.domain.common.IDtoBase; import com.estate.expert.admin.domain.exam.eval.EvalResult; import com.estate.expert.admin.domain.exam.record.error.ErrorRecord; import com.estate.expert.admin.domain.exam.task.check.CheckTask; import com.estate.expert.admin.domain.standard.expert.Expert; import com.estate.expert.admin.service.DeviceService; import com.estate.expert.admin.service.ErrorRecordService; import com.estate.expert.admin.service.common.CrudServiceBaseImpl; import com.estate.expert.admin.service.expert.DeviceExpertService; import com.estate.expert.admin.service.expert.SysExpertService; import javax.annotation.Resource; import java.util.*; /** * 评价服务的基础实现 * 包含了评价的基本操作 * 避免重复编写基础的评价代码以及不必要的测试 */ public abstract class EvalServiceImpl extends CrudServiceBaseImpl implements EvalService { @Resource private ErrorRecordService errorRecordService; @Resource private DeviceExpertService deviceExpertService; @Resource private DeviceService deviceService; @Resource private SysExpertService sysExpertService; @Override public T eval(CheckTask checkTask) { V sysRes = null; Map devResMap = new TreeMap<>(); // 综合打分 var systemExpert = checkTask.getPlan().getSystemScoreExpert(); if(systemExpert != null) { var systemErrorRecords = errorRecordService.listSystemErrors(checkTask.getId()); // 轮空项,如果设置了,则需要参与计算 var byPassPaths = (enableByPass() && checkTask.getByPassInfo() != null) ? checkTask.getByPassInfo().getSystemHierarchyPaths() : null; sysRes = evaluate(systemExpert, sysExpertService, systemErrorRecords, byPassPaths); } // 设备打分 var deviceExpert = checkTask.getPlan().getDeviceScoreExpert(); var devices = new ArrayList(); if(deviceExpert != null) { var deviceErrorRecords = errorRecordService.listDeviceErrors(checkTask.getId()); var deviceIds = deviceErrorRecords.stream().map(r -> r.getDevice().getId()).distinct().toList(); for(var deviceId : deviceIds) { var device = deviceService.get(deviceId); if(device == null) continue; // 轮空项,如果设置了,则需要参与计算 List byPassPaths = null; if(enableByPass() && checkTask.getByPassInfo() != null) { byPassPaths = checkTask.getByPassInfo().filterHierarchyPaths(deviceId); } // 设备打分 var errorRecords = deviceErrorRecords.stream().filter(r -> Objects.equals(r.getDevice().getId(), deviceId)).toList(); var devRes = evaluate(deviceExpert, device.getType(), deviceExpertService, errorRecords, byPassPaths); if(devRes != null) { devResMap.put(deviceId, devRes); devices.add(device); } } } // 保存评估结果 return saveResult(checkTask, sysRes, devResMap, devices); } @Override public void evalOnce(CheckTask checkTask) { var res = getByCheckTaskId(checkTask.getId()); if(res != null) { // 删除原有的评分结果,彻底删除 deletePhysical(res.getId()); } eval(checkTask); } /** * 初始化问题映射表 * * @param scoreExpert 评分专家 * @param expertService 专家服务 * @return 问题映射表 */ protected TreeMap initProblemMap(Expert scoreExpert, SysExpertService expertService) { // 根据模型,构建问题map var problemMap = new TreeMap(); expertService.listModelProblemIds(scoreExpert.getModel()) .forEach(id -> problemMap.put(id, false)); return problemMap; } /** * 初始化设备问题映射表 * * @param deviceType 设备类型 * @param scoreExpert 评分专家 * @param expertService 专家服务 * @return 问题映射表 */ protected TreeMap initDeviceProblemMap(DeviceType deviceType, Expert scoreExpert, DeviceExpertService expertService) { // 根据模型,构建问题map var problemMap = new TreeMap(); expertService.listModelProblemIds(scoreExpert.getModel(), deviceType) .forEach(id -> problemMap.put((Integer) id, false)); return problemMap; } protected abstract V evaluate(Expert expert, SysExpertService expertService, List errorRecords, List byPassPaths); protected abstract V evaluate(Expert expert, DeviceType deviceType, DeviceExpertService expertService, List errorRecords, List byPassPaths); protected abstract T saveResult(CheckTask checkTask, V sysRes, Map devResMap, List devices); protected abstract boolean enableByPass(); }