From 4b33796be3887c81fa40fba2f55dce4489cff041 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 01 四月 2026 14:55:32 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/estate_expert

---
 admin-server/src/main/java/com/estate/expert/admin/service/impl/ReportServiceImpl.java |  110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/admin-server/src/main/java/com/estate/expert/admin/service/impl/ReportServiceImpl.java b/admin-server/src/main/java/com/estate/expert/admin/service/impl/ReportServiceImpl.java
index 0ca1df7..19ac1cf 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/service/impl/ReportServiceImpl.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/service/impl/ReportServiceImpl.java
@@ -5,7 +5,12 @@
 import com.estate.expert.admin.domain.business.device.usage.DeviceUsage;
 import com.estate.expert.admin.domain.exam.eval.fuzzy.EvalFuzzyResult;
 import com.estate.expert.admin.domain.exam.eval.score.EvalScoreResult;
+import com.estate.expert.admin.domain.exam.record.error.ErrorRecord;
+import com.estate.expert.admin.domain.exam.record.error.ErrorRecordRepository;
+import com.estate.expert.admin.domain.exam.record.RecordRepository;
+import com.estate.expert.admin.domain.exam.task.check.CheckTaskRepository;
 import com.estate.expert.admin.domain.report.ReportTemplate;
+import com.estate.expert.admin.domain.plan.PlanState;
 import com.estate.expert.admin.enums.BizResultCode;
 import com.estate.expert.admin.service.*;
 import com.estate.expert.admin.service.eval.EvalFuzzyService;
@@ -13,6 +18,7 @@
 import com.estate.expert.admin.stat.report.builder.DeviceReportBuilder;
 import com.estate.expert.admin.stat.report.builder.ReportBuilderBase;
 import com.estate.expert.admin.stat.report.builder.SystemReportBuilder;
+import com.estate.expert.admin.stat.report.data.DeviceReportData;
 import com.estate.expert.admin.stat.report.data.impl.DeviceFuzzyReportData;
 import com.estate.expert.admin.stat.report.data.impl.DeviceScoreReportData;
 import com.estate.expert.admin.stat.report.data.impl.SystemFuzzyReportData;
@@ -27,6 +33,10 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 报告数据服务实现类
@@ -52,6 +62,15 @@
 
     @Resource
     private ErrorRecordService errorRecordService;
+
+    @Resource
+    private ErrorRecordRepository errorRecordRepository;
+
+    @Resource
+    private RecordRepository recordRepository;
+
+    @Resource
+    private CheckTaskRepository checkTaskRepository;
 
     @Resource
     private DeviceService deviceService;
@@ -188,6 +207,8 @@
         var devices= deviceUsages.stream().map(DeviceUsage::getDevice).toList();
         var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent();
 
+        var problemFrequency = buildSystemProblemFrequency(project.getId(), records);
+
         // 生成报告数据
         return SystemFuzzyReportData.builder()
                 .reportId(evalFuzzyResult.getId())
@@ -199,6 +220,8 @@
                 .projectInfo(projectInfo)
                 .devices(devices)
                 .records(records)
+                .problemHazardCounts(problemFrequency.problemHazardCounts())
+                .problemCheckCounts(problemFrequency.problemCheckCounts())
                 .build()
                 .generate();
     }
@@ -213,6 +236,8 @@
         var devices= deviceUsages.stream().map(DeviceUsage::getDevice).toList();
         var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent();
 
+        var problemFrequency = buildSystemProblemFrequency(project.getId(), records);
+
         // 生成报告数据
         return SystemScoreReportData.builder()
                 .reportId(evalFuzzyResult.getId())
@@ -224,8 +249,87 @@
                 .projectInfo(projectInfo)
                 .devices(devices)
                 .records(records)
+                .problemHazardCounts(problemFrequency.problemHazardCounts())
+                .problemCheckCounts(problemFrequency.problemCheckCounts())
                 .build()
                 .generate();
+    }
+
+    private record ProblemFrequency(Map<Integer, Long> problemHazardCounts, Map<Integer, Long> problemCheckCounts) {
+    }
+
+    private record DeviceProblemFrequency(Map<String, Long> problemHazardCounts, Map<String, Long> problemCheckCounts) {
+    }
+
+    private ProblemFrequency buildSystemProblemFrequency(Integer projectId, List<com.estate.expert.admin.domain.exam.record.error.ErrorRecord> currentTaskRecords) {
+        if (projectId == null || currentTaskRecords == null || currentTaskRecords.isEmpty()) {
+            return new ProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
+        }
+
+        var problemIds = currentTaskRecords.stream()
+                .map(r -> r.getProblem() != null ? r.getProblem().getId() : null)
+                .filter(java.util.Objects::nonNull)
+                .distinct()
+                .toList();
+        if (problemIds.isEmpty()) {
+            return new ProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
+        }
+
+        var taskIds = checkTaskRepository.listTaskIdsByProjectAndPlanState(projectId, PlanState.COMPLETE);
+        if (taskIds == null || taskIds.isEmpty()) {
+            return new ProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
+        }
+
+        Map<Integer, Long> hazardCounts = new HashMap<>();
+        for (var row : errorRecordRepository.countSystemHazardsByTaskIdsAndProblemIds(taskIds, problemIds)) {
+            if (row == null || row.length < 2 || row[0] == null || row[1] == null) {
+                continue;
+            }
+            hazardCounts.put(((Number) row[0]).intValue(), ((Number) row[1]).longValue());
+        }
+
+        Map<Integer, Long> checkCounts = new HashMap<>();
+        for (var row : recordRepository.countSystemChecksByTaskIdsAndProblemIds(taskIds, problemIds)) {
+            if (row == null || row.length < 2 || row[0] == null || row[1] == null) {
+                continue;
+            }
+            checkCounts.put(((Number) row[0]).intValue(), ((Number) row[1]).longValue());
+        }
+
+        return new ProblemFrequency(hazardCounts, checkCounts);
+    }
+
+    private DeviceProblemFrequency buildDeviceProblemFrequency(Integer projectId) {
+        if (projectId == null) {
+            return new DeviceProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
+        }
+
+        var taskIds = checkTaskRepository.listTaskIdsByProjectAndPlanState(projectId, PlanState.COMPLETE);
+        if (taskIds == null || taskIds.isEmpty()) {
+            return new DeviceProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
+        }
+
+        Map<String, Long> hazardCounts = new HashMap<>();
+        for (var row : errorRecordRepository.countDeviceHazardsByTaskIds(taskIds)) {
+            collectDeviceFrequency(row, hazardCounts);
+        }
+
+        Map<String, Long> checkCounts = new HashMap<>();
+        for (var row : recordRepository.countDeviceChecksByTaskIds(taskIds)) {
+            collectDeviceFrequency(row, checkCounts);
+        }
+
+        return new DeviceProblemFrequency(hazardCounts, checkCounts);
+    }
+
+    private void collectDeviceFrequency(Object[] row, Map<String, Long> target) {
+        if (row == null || row.length < 3 || row[0] == null || row[2] == null) {
+            return;
+        }
+        Integer deviceId = ((Number) row[0]).intValue();
+        Integer problemId = row[1] == null ? null : ((Number) row[1]).intValue();
+        Long count = ((Number) row[2]).longValue();
+        target.put(DeviceReportData.buildDeviceProblemKey(deviceId, problemId), count);
     }
 
     private JSONObject buildFuzzyDeviceReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult,  ReportTemplate reportTemplate) {
@@ -236,6 +340,7 @@
         var deviceIds = evalFuzzyResult.getDeviceResMap().keySet();
         var devices = deviceService.findAllById(deviceIds);
         var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent();
+        var problemFrequency = buildDeviceProblemFrequency(project.getId());
 
         // 生成报告数据
         return DeviceFuzzyReportData.builder()
@@ -247,6 +352,8 @@
                 .projectInfo(projectInfo)
                 .devices(devices)
                 .records(records)
+                .deviceProblemHazardCounts(problemFrequency.problemHazardCounts())
+                .deviceProblemCheckCounts(problemFrequency.problemCheckCounts())
                 .build()
                 .generate();
     }
@@ -259,6 +366,7 @@
         var deviceIds = evalFuzzyResult.getDeviceResMap().keySet();
         var devices = deviceService.findAllById(deviceIds);
         var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent();
+        var problemFrequency = buildDeviceProblemFrequency(project.getId());
 
         // 生成报告数据
         return DeviceScoreReportData.builder()
@@ -271,6 +379,8 @@
                 .projectInfo(projectInfo)
                 .devices(devices)
                 .records(records)
+                .deviceProblemHazardCounts(problemFrequency.problemHazardCounts())
+                .deviceProblemCheckCounts(problemFrequency.problemCheckCounts())
                 .build()
                 .generate();
     }

--
Gitblit v1.7.1