| | |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | import java.time.LocalDate; |
| | | import java.time.ZoneId; |
| | | |
| | | /** |
| | | * 项目类别计算服务 |
| | |
| | | private final EvalResultMapper evalResultMapper; |
| | | private final ClientParamMapper clientParamMapper; |
| | | private final CheckMapper checkMapper; |
| | | private final TaskMapper taskMapper; |
| | | private final RecordMapper recordMapper; |
| | | |
| | | /** |
| | |
| | | return categoryMap; |
| | | } |
| | | |
| | | // 3. 查询项目关联的检查任务 |
| | | // 3. 查询项目关联的任务 |
| | | List<Integer> projectIds = projects.stream() |
| | | .map(Project::getId) |
| | | .collect(Collectors.toList()); |
| | | |
| | | LambdaQueryWrapper<Check> checkWrapper = new LambdaQueryWrapper<>(); |
| | | checkWrapper.in(Check::getProjectId, projectIds) |
| | | .ge(Check::getTime, startDate) |
| | | .le(Check::getTime, endDate); |
| | | List<Check> checks = checkMapper.selectList(checkWrapper); |
| | | // 将 Date 转换为 LocalDate |
| | | LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); |
| | | LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); |
| | | |
| | | if (checks.isEmpty()) { |
| | | log.info("项目没有检查记录,projectIds: {}", projectIds); |
| | | LambdaQueryWrapper<Task> taskWrapper = new LambdaQueryWrapper<>(); |
| | | taskWrapper.in(Task::getProjectId, projectIds) |
| | | .ge(Task::getDate, startLocalDate) |
| | | .le(Task::getDate, endLocalDate); |
| | | List<Task> tasks = taskMapper.selectList(taskWrapper); |
| | | |
| | | if (tasks.isEmpty()) { |
| | | log.info("项目没有任务记录,projectIds: {}", projectIds); |
| | | return categoryMap; |
| | | } |
| | | |
| | | List<Integer> checkTaskIds = checks.stream() |
| | | .map(Check::getId) |
| | | List<Integer> checkTaskIds = tasks.stream() |
| | | .map(Task::getId) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 4. 根据评价类型查询评估结果 |
| | |
| | | |
| | | // 5. 计算项目平均分 |
| | | Map<Integer, ProjectScoreData> projectScoreMap = calculateProjectScores( |
| | | checks, evalResults); |
| | | tasks, evalResults); |
| | | |
| | | // 6. 根据配置判断项目类别 |
| | | for (Map.Entry<Integer, ProjectScoreData> entry : projectScoreMap.entrySet()) { |
| | |
| | | return categoryMap; |
| | | } |
| | | |
| | | // 3. 查询项目关联的检查任务 |
| | | // 3. 查询项目关联的任务 |
| | | List<Integer> projectIds = projects.stream() |
| | | .map(Project::getId) |
| | | .collect(Collectors.toList()); |
| | | |
| | | LambdaQueryWrapper<Check> checkWrapper = new LambdaQueryWrapper<>(); |
| | | checkWrapper.in(Check::getProjectId, projectIds) |
| | | .ge(Check::getTime, startDate) |
| | | .le(Check::getTime, endDate); |
| | | List<Check> checks = checkMapper.selectList(checkWrapper); |
| | | // 将 Date 转换为 LocalDate |
| | | LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); |
| | | LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); |
| | | |
| | | if (checks.isEmpty()) { |
| | | log.info("项目没有检查记录,projectIds: {}", projectIds); |
| | | LambdaQueryWrapper<Task> taskWrapper = new LambdaQueryWrapper<>(); |
| | | taskWrapper.in(Task::getProjectId, projectIds) |
| | | .ge(Task::getDate, startLocalDate) |
| | | .le(Task::getDate, endLocalDate); |
| | | List<Task> tasks = taskMapper.selectList(taskWrapper); |
| | | |
| | | if (tasks.isEmpty()) { |
| | | log.info("项目没有任务记录,projectIds: {}", projectIds); |
| | | return categoryMap; |
| | | } |
| | | |
| | | List<Integer> checkTaskIds = checks.stream() |
| | | .map(Check::getId) |
| | | List<Integer> checkTaskIds = tasks.stream() |
| | | .map(Task::getId) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 4. 查询隐患记录(record_type='error') |
| | |
| | | } |
| | | |
| | | // 5. 按项目分组统计隐患等级数量 |
| | | Map<Integer, Integer> checkToProjectMap = checks.stream() |
| | | .collect(Collectors.toMap(Check::getId, Check::getProjectId)); |
| | | Map<Integer, Integer> taskToProjectMap = tasks.stream() |
| | | .collect(Collectors.toMap(Task::getId, Task::getProjectId)); |
| | | |
| | | Map<Integer, Map<Integer, Integer>> projectHazardMap = new HashMap<>(); |
| | | |
| | | for (Record record : hazardRecords) { |
| | | Integer projectId = checkToProjectMap.get(record.getCheckTaskId()); |
| | | Integer projectId = taskToProjectMap.get(record.getCheckTaskId()); |
| | | if (projectId == null) { |
| | | continue; |
| | | } |
| | |
| | | /** |
| | | * 计算项目评分数据 |
| | | * |
| | | * @param checks 检查任务列表 |
| | | * @param tasks 任务列表 |
| | | * @param evalResults 评估结果列表 |
| | | * @return 项目ID -> 评分数据的映射 |
| | | */ |
| | | private Map<Integer, ProjectScoreData> calculateProjectScores( |
| | | List<Check> checks, List<EvalResult> evalResults) { |
| | | List<Task> tasks, List<EvalResult> evalResults) { |
| | | |
| | | Map<Integer, ProjectScoreData> projectScoreMap = new HashMap<>(); |
| | | |
| | | // 按 check_task_id 关联到 project_id |
| | | Map<Integer, Integer> checkToProjectMap = checks.stream() |
| | | .collect(Collectors.toMap(Check::getId, Check::getProjectId)); |
| | | Map<Integer, Integer> checkToProjectMap = tasks.stream() |
| | | .collect(Collectors.toMap(Task::getId, Task::getProjectId)); |
| | | |
| | | // 按项目分组评估结果 |
| | | Map<Integer, List<EvalResult>> projectEvalMap = evalResults.stream() |
| | |
| | | .average() |
| | | .orElse(0.0); |
| | | |
| | | System.out.println("results"+results); |
| | | |
| | | // 计算设备检查平均分(需要解析 device_res_map) |
| | | List<Float> deviceScores = results.stream() |
| | | .filter(e -> StringUtils.hasText(e.getDeviceResMap())) |
| | | .map(e -> this.calculateDeviceScore(e.getDeviceResMap())) |
| | | .map(e -> calculateDeviceScore(e.getDeviceResMap())) |
| | | .filter(score -> score != null && score > 0) |
| | | .collect(Collectors.toList()); |
| | | .toList(); |
| | | |
| | | ProjectScoreData scoreData = new ProjectScoreData(); |
| | | scoreData.setProjectId(projectId); |
| | |
| | | } |
| | | |
| | | // 根据阈值判断类别(从高到低判断) |
| | | if (finalScore >= thresholdC) { |
| | | if (finalScore >= thresholdA) { |
| | | return "A"; |
| | | } else if (finalScore >= thresholdB) { |
| | | return "B"; |
| | | } else if (finalScore >= thresholdA) { |
| | | } else if (finalScore >= thresholdC) { |
| | | return "C"; |
| | | } else { |
| | | return null; // 不满足任何类别 |
| | | return "C"; // 不满足任何类别 |
| | | } |
| | | } |
| | | |
| | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (!matchesRule) { |
| | | break; |
| | | } |
| | | //短路或开关 |
| | | // if (!matchesRule) { |
| | | // break; |
| | | // } |
| | | } |
| | | |
| | | if (matchesRule) { |