From 25999c575dd42b4715e49d3fe57e73c2c3204ccb Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期日, 20 九月 2026 11:45:05 +0800
Subject: [PATCH] update

---
 admin-server/src/main/java/com/estate/expert/admin/service/impl/ReportServiceImpl.java |  192 ++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 153 insertions(+), 39 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 19ac1cf..4b6d333 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,9 +5,8 @@
 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.CheckTask;
 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;
@@ -16,9 +15,12 @@
 import com.estate.expert.admin.service.eval.EvalFuzzyService;
 import com.estate.expert.admin.service.eval.EvalScoreService;
 import com.estate.expert.admin.stat.report.builder.DeviceReportBuilder;
+import com.estate.expert.admin.stat.report.builder.ChengduHengtaiSystemReportBuilder;
 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.DaiguanDeviceFuzzyReportData;
+import com.estate.expert.admin.stat.report.data.impl.DaiguanDeviceScoreReportData;
 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;
@@ -34,9 +36,11 @@
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 报告数据服务实现类
@@ -44,6 +48,12 @@
 @Slf4j
 @Service
 public class ReportServiceImpl implements ReportService {
+
+    private static final String DAIGUAN_TECH_REMARK = "岱观科技";
+    private static final String DAIGUAN_SYSTEM_TEMPLATE_FILE = "第三方评估报告new.docx";
+    private static final String DAIGUAN_REMARK = "岱观科技";
+    private static final String DAIGUAN_DEVICE_TEMPLATE_FILE = "设备风险评估报告new.docx";
+    private static final String CHENGDU_HENGTAI_REMARK = "成都衡泰";
 
     @Resource
     private ReportTemplateService reportTemplateService;
@@ -65,9 +75,6 @@
 
     @Resource
     private ErrorRecordRepository errorRecordRepository;
-
-    @Resource
-    private RecordRepository recordRepository;
 
     @Resource
     private CheckTaskRepository checkTaskRepository;
@@ -189,8 +196,17 @@
         BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null);
         switch (reportTemplate.getType()) {
             case ThirdPartyReport:
+                if (isChengduHengtaiTemplate(reportTemplate)) {
+                    return new ChengduHengtaiSystemReportBuilder(userFileService);
+                }
+                if (isDaiguanTechTemplate(reportTemplate)) {
+                    return new SystemReportBuilder(userFileService, DAIGUAN_SYSTEM_TEMPLATE_FILE);
+                }
                 return new SystemReportBuilder(userFileService);
             case DeviceReport:
+                if (DAIGUAN_REMARK.equals(reportTemplate.getRemark())) {
+                    return new DeviceReportBuilder(userFileService, DAIGUAN_DEVICE_TEMPLATE_FILE);
+                }
                 return new DeviceReportBuilder(userFileService);
             default:
                 throw new BizException(BizResultCode.BIZ_REPORT_TEMPLATE_TYPE_NOT_EXIST);
@@ -208,6 +224,7 @@
         var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent();
 
         var problemFrequency = buildSystemProblemFrequency(project.getId(), records);
+        var projectCheckCount = countProjectChecks(project.getId());
 
         // 生成报告数据
         return SystemFuzzyReportData.builder()
@@ -221,7 +238,7 @@
                 .devices(devices)
                 .records(records)
                 .problemHazardCounts(problemFrequency.problemHazardCounts())
-                .problemCheckCounts(problemFrequency.problemCheckCounts())
+                .projectCheckCount(projectCheckCount)
                 .build()
                 .generate();
     }
@@ -237,6 +254,7 @@
         var hierarchy = evalFuzzyResult.getPlan().getSystemScoreExpert().getModel().getHierarchy().getContent();
 
         var problemFrequency = buildSystemProblemFrequency(project.getId(), records);
+        var projectCheckCount = countProjectChecks(project.getId());
 
         // 生成报告数据
         return SystemScoreReportData.builder()
@@ -250,20 +268,20 @@
                 .devices(devices)
                 .records(records)
                 .problemHazardCounts(problemFrequency.problemHazardCounts())
-                .problemCheckCounts(problemFrequency.problemCheckCounts())
+                .projectCheckCount(projectCheckCount)
                 .build()
                 .generate();
     }
 
-    private record ProblemFrequency(Map<Integer, Long> problemHazardCounts, Map<Integer, Long> problemCheckCounts) {
+    private record ProblemFrequency(Map<Integer, Long> problemHazardCounts) {
     }
 
-    private record DeviceProblemFrequency(Map<String, Long> problemHazardCounts, Map<String, Long> problemCheckCounts) {
+    private record DeviceProblemFrequency(Map<String, Long> problemHazardCounts, Map<Integer, Long> deviceCheckCounts) {
     }
 
     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());
+            return new ProblemFrequency(Collections.emptyMap());
         }
 
         var problemIds = currentTaskRecords.stream()
@@ -272,12 +290,12 @@
                 .distinct()
                 .toList();
         if (problemIds.isEmpty()) {
-            return new ProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
+            return new ProblemFrequency(Collections.emptyMap());
         }
 
         var taskIds = checkTaskRepository.listTaskIdsByProjectAndPlanState(projectId, PlanState.COMPLETE);
         if (taskIds == null || taskIds.isEmpty()) {
-            return new ProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
+            return new ProblemFrequency(Collections.emptyMap());
         }
 
         Map<Integer, Long> hazardCounts = new HashMap<>();
@@ -288,41 +306,26 @@
             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);
+        return new ProblemFrequency(hazardCounts);
     }
 
-    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()) {
+    private DeviceProblemFrequency buildDeviceProblemFrequency(Integer projectId, Integer clientId) {
+        var taskIds = listTaskIdsByProjectAndClient(projectId, clientId);
+        if (taskIds.isEmpty()) {
             return new DeviceProblemFrequency(Collections.emptyMap(), Collections.emptyMap());
         }
 
         Map<String, Long> hazardCounts = new HashMap<>();
         for (var row : errorRecordRepository.countDeviceHazardsByTaskIds(taskIds)) {
-            collectDeviceFrequency(row, hazardCounts);
+            collectDeviceProblemFrequency(row, hazardCounts);
         }
 
-        Map<String, Long> checkCounts = new HashMap<>();
-        for (var row : recordRepository.countDeviceChecksByTaskIds(taskIds)) {
-            collectDeviceFrequency(row, checkCounts);
-        }
+        Map<Integer, Long> deviceCheckCounts = buildDeviceCheckFrequencyByCompletedTasks(projectId, clientId);
 
-        return new DeviceProblemFrequency(hazardCounts, checkCounts);
+        return new DeviceProblemFrequency(hazardCounts, deviceCheckCounts);
     }
 
-    private void collectDeviceFrequency(Object[] row, Map<String, Long> target) {
+    private void collectDeviceProblemFrequency(Object[] row, Map<String, Long> target) {
         if (row == null || row.length < 3 || row[0] == null || row[2] == null) {
             return;
         }
@@ -330,6 +333,45 @@
         Integer problemId = row[1] == null ? null : ((Number) row[1]).intValue();
         Long count = ((Number) row[2]).longValue();
         target.put(DeviceReportData.buildDeviceProblemKey(deviceId, problemId), count);
+    }
+
+    private Map<Integer, Long> buildDeviceCheckFrequencyByCompletedTasks(Integer projectId, Integer clientId) {
+        if (projectId == null || clientId == null) {
+            return Collections.emptyMap();
+        }
+        var tasks = checkTaskRepository.listClosedByProjectAndClient(projectId, clientId);
+        if (tasks == null || tasks.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        Map<Integer, Long> deviceCheckCounts = new HashMap<>();
+        for (CheckTask task : tasks) {
+            for (Integer deviceId : collectTaskCheckedDeviceIds(task)) {
+                deviceCheckCounts.merge(deviceId, 1L, Long::sum);
+            }
+        }
+        return deviceCheckCounts;
+    }
+
+    private Set<Integer> collectTaskCheckedDeviceIds(CheckTask task) {
+        Set<Integer> deviceIds = new HashSet<>();
+        if (task == null) {
+            return deviceIds;
+        }
+        addDeviceIds(task.getDeviceFuzzyMap(), deviceIds);
+        addDeviceIds(task.getDeviceScoreMap(), deviceIds);
+        return deviceIds;
+    }
+
+    private void addDeviceIds(Map<Integer, Float> deviceMap, Set<Integer> target) {
+        if (deviceMap == null || deviceMap.isEmpty()) {
+            return;
+        }
+        for (Integer deviceId : deviceMap.keySet()) {
+            if (deviceId == null) {
+                continue;
+            }
+            target.add(deviceId);
+        }
     }
 
     private JSONObject buildFuzzyDeviceReportData(EvalFuzzyResult evalFuzzyResult, EvalScoreResult scoreResult,  ReportTemplate reportTemplate) {
@@ -340,7 +382,24 @@
         var deviceIds = evalFuzzyResult.getDeviceResMap().keySet();
         var devices = deviceService.findAllById(deviceIds);
         var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent();
-        var problemFrequency = buildDeviceProblemFrequency(project.getId());
+        var clientId = project.getClient() != null ? project.getClient().getId() : null;
+        var problemFrequency = buildDeviceProblemFrequency(project.getId(), clientId);
+
+        if (isDaiguanTemplate(reportTemplate)) {
+            return DaiguanDeviceFuzzyReportData.builder()
+                    .reportId(evalFuzzyResult.getId())
+                    .deviceResMap(evalFuzzyResult.getDeviceResMap())
+                    .deviceHierarchy(hierarchy)
+                    .template(reportTemplate)
+                    .project(project)
+                    .projectInfo(projectInfo)
+                    .devices(devices)
+                    .records(records)
+                    .deviceProblemHazardCounts(problemFrequency.problemHazardCounts())
+                    .deviceCheckCounts(problemFrequency.deviceCheckCounts())
+                    .build()
+                    .generate();
+        }
 
         // 生成报告数据
         return DeviceFuzzyReportData.builder()
@@ -353,7 +412,7 @@
                 .devices(devices)
                 .records(records)
                 .deviceProblemHazardCounts(problemFrequency.problemHazardCounts())
-                .deviceProblemCheckCounts(problemFrequency.problemCheckCounts())
+                .deviceCheckCounts(problemFrequency.deviceCheckCounts())
                 .build()
                 .generate();
     }
@@ -366,7 +425,25 @@
         var deviceIds = evalFuzzyResult.getDeviceResMap().keySet();
         var devices = deviceService.findAllById(deviceIds);
         var hierarchy = evalFuzzyResult.getPlan().getDeviceScoreExpert().getModel().getHierarchy().getContent();
-        var problemFrequency = buildDeviceProblemFrequency(project.getId());
+        var clientId = project.getClient() != null ? project.getClient().getId() : null;
+        var problemFrequency = buildDeviceProblemFrequency(project.getId(), clientId);
+
+        if (isDaiguanTemplate(reportTemplate)) {
+            return DaiguanDeviceScoreReportData.builder()
+                    .reportId(evalFuzzyResult.getId())
+                    .deviceResMap(evalFuzzyResult.getDeviceResMap())
+                    .deviceScoreResMap(evalScoreResult.getDeviceResMap())
+                    .deviceHierarchy(hierarchy)
+                    .template(reportTemplate)
+                    .project(project)
+                    .projectInfo(projectInfo)
+                    .devices(devices)
+                    .records(records)
+                    .deviceProblemHazardCounts(problemFrequency.problemHazardCounts())
+                    .deviceCheckCounts(problemFrequency.deviceCheckCounts())
+                    .build()
+                    .generate();
+        }
 
         // 生成报告数据
         return DeviceScoreReportData.builder()
@@ -380,11 +457,48 @@
                 .devices(devices)
                 .records(records)
                 .deviceProblemHazardCounts(problemFrequency.problemHazardCounts())
-                .deviceProblemCheckCounts(problemFrequency.problemCheckCounts())
+                .deviceCheckCounts(problemFrequency.deviceCheckCounts())
                 .build()
                 .generate();
     }
 
+    private List<Integer> listTaskIdsByProjectAndClient(Integer projectId, Integer clientId) {
+        if (projectId == null || clientId == null) {
+            return Collections.emptyList();
+        }
+        var taskIds = checkTaskRepository.listTaskIdsByProjectAndClient(projectId, clientId);
+        if (taskIds == null) {
+            return Collections.emptyList();
+        }
+        return taskIds;
+    }
 
+    private boolean isDaiguanTemplate(ReportTemplate reportTemplate) {
+        return reportTemplate != null && DAIGUAN_REMARK.equals(reportTemplate.getRemark());
+    }
+
+    private boolean isDaiguanTechTemplate(ReportTemplate reportTemplate) {
+        if (reportTemplate == null || reportTemplate.getRemark() == null) {
+            return false;
+        }
+        return DAIGUAN_TECH_REMARK.equals(reportTemplate.getRemark().trim());
+    }
+
+    private boolean isChengduHengtaiTemplate(ReportTemplate reportTemplate) {
+        return reportTemplate != null
+                && reportTemplate.getRemark() != null
+                && CHENGDU_HENGTAI_REMARK.equals(reportTemplate.getRemark().trim());
+    }
+
+    private long countProjectChecks(Integer projectId) {
+        if (projectId == null) {
+            return 0L;
+        }
+        var taskIds = checkTaskRepository.listTaskIdsByProjectAndPlanState(projectId, PlanState.COMPLETE);
+        if (taskIds == null) {
+            return 0L;
+        }
+        return taskIds.size();
+    }
 
 }

--
Gitblit v1.7.1