“mitao”
2026-01-22 481834bc79cf62cd1c4daef21a71b837d78f9855
ruoyi-system/src/main/java/com/ruoyi/system/service/ProjectCategoryCalculator.java
@@ -15,6 +15,8 @@
import java.util.*;
import java.util.stream.Collectors;
import java.time.LocalDate;
import java.time.ZoneId;
/**
 * 项目类别计算服务
@@ -30,6 +32,7 @@
    private final EvalResultMapper evalResultMapper;
    private final ClientParamMapper clientParamMapper;
    private final CheckMapper checkMapper;
    private final TaskMapper taskMapper;
    private final RecordMapper recordMapper;
    /**
@@ -65,24 +68,28 @@
                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. 根据评价类型查询评估结果
@@ -102,7 +109,7 @@
            // 5. 计算项目平均分
            Map<Integer, ProjectScoreData> projectScoreMap = calculateProjectScores(
                    checks, evalResults);
                    tasks, evalResults);
            // 6. 根据配置判断项目类别
            for (Map.Entry<Integer, ProjectScoreData> entry : projectScoreMap.entrySet()) {
@@ -159,24 +166,28 @@
                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')
@@ -192,13 +203,13 @@
            }
            // 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;
                }
@@ -275,18 +286,18 @@
    /**
     * 计算项目评分数据
     *
     * @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()
@@ -308,9 +319,9 @@
            // 计算设备检查平均分(需要解析 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);