From b6e36cdf53b2688f0a0b339b14a33609ac051005 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期四, 02 四月 2026 18:34:59 +0800
Subject: [PATCH] 修改bug

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceUsageServiceImpl.java |  112 ++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 77 insertions(+), 35 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceUsageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceUsageServiceImpl.java
index 0f9045e..4598804 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceUsageServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DeviceUsageServiceImpl.java
@@ -84,7 +84,6 @@
         String startTime = query.getStartTime();
         String endTime = query.getEndTime();
 
-        // 查询在建工程项目(usage_type 表示项目用途类型,假设 0 表示在建工程)
         LambdaQueryWrapper<Project> projectWrapper = new LambdaQueryWrapper<>();
         if (query.getClientId() != null) {
             projectWrapper.eq(Project::getClientId, query.getClientId());
@@ -94,28 +93,22 @@
         }
         switch (query.getCategory()) {
             case 1:
-                // 查询在建资产项目
                 projectWrapper.eq(Project::getDeleted, false)
-                        .ne(Project::getType, 2) // 在建工程
+                        .ne(Project::getType, 2)
                         .and(wrapper -> wrapper
-                                .eq(Project::getStatus, 1)  // 在建项目
-                                .or(w -> w
-                                        .eq(Project::getStatus, 2)  // 已完成项目
-                                        .between(Project::getSuccessTime, startTime, endTime)  // 完成时间 >= 开始日期// 完成时间 <= 结束日期
-                                )
+                                .eq(Project::getStatus, 1)
+                                .or(w -> w.eq(Project::getStatus, 2))
                         );
                 break;
             case 2:
-                // 查询固定资产项目
                 projectWrapper.eq(Project::getDeleted, false)
-                        .eq(Project::getType, 2) // 在建工程
+                        .eq(Project::getType, 2)
                         .and(wrapper -> wrapper
-                                .eq(Project::getStatus, 1)  // 在建项目
-                                .or(w -> w
-                                        .eq(Project::getStatus, 2)  // 已完成项目
-                                        .between(Project::getSuccessTime, startTime, endTime)  // 完成时间 >= 开始日期// 完成时间 <= 结束日期
-                                )
+                                .eq(Project::getStatus, 1)
+                                .or(w -> w.eq(Project::getStatus, 2))
                         );
+                break;
+            default:
                 break;
         }
 
@@ -127,31 +120,34 @@
         query.setProjectIds(projectIds);
 
         Map<Integer, String> categoryMap = calculateProjectCategoryMap(projects, query);
-        // 查询检查任务
         LambdaQueryWrapper<Task> taskWrapper = new LambdaQueryWrapper<>();
         taskWrapper.in(Task::getProjectId, projectIds)
                 .eq(Task::getDeleted, false);
         List<Task> taskList = taskMapper.selectList(taskWrapper);
+        Map<Integer, Task> latestCheckedTaskMap = taskList.stream()
+                .filter(task -> task.getProjectId() != null)
+                .collect(Collectors.groupingBy(Task::getProjectId))
+                .entrySet()
+                .stream()
+                .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(),
+                        findLatestCheckedTask(entry.getValue(), startTime, endTime)))
+                .filter(entry -> entry.getValue() != null)
+                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+        if (StringUtils.hasLength(startTime) || StringUtils.hasLength(endTime)) {
+            List<Integer> checkedProjectIds = new ArrayList<>(latestCheckedTaskMap.keySet());
+            if (checkedProjectIds.isEmpty()) {
+                checkedProjectIds.add(-1);
+            }
+            query.setProjectIds(checkedProjectIds);
+        }
+
         List<EntrustProjectVo> deviceList = this.baseMapper.projectList(page, query);
         for (EntrustProjectVo deviceListVo : deviceList) {
             deviceListVo.setRisk(formatProjectCategory(categoryMap.get(deviceListVo.getId())));
-            List<Task> tasks = taskList.stream().filter(e -> e.getProjectId().equals(deviceListVo.getId())).toList();
-//            List<Task> tasks = taskMap.get(deviceListVo.getId());
-            if (tasks != null && !tasks.isEmpty()) {
-
-                Task task1 = tasks.stream().filter(e -> e.getDate().getYear() == LocalDateTime.now().getYear() && e.getDate().getMonth().getValue() == LocalDateTime.now().getMonth().getValue()).findFirst().orElse(null);
-
-//                List<Record> recordList = records.stream().filter(e -> taskIds.contains(e.getCheckTaskId())).toList();
-//                Record record = recordList.stream().max(Comparator.comparing(Record::getCreateTime)).orElse(null);
-                if (task1 != null && (task1.getState() == 3 || Integer.valueOf(5).equals(task1.getState()) ||
-                        Integer.valueOf(6).equals(task1.getState()) || Integer.valueOf(7).equals(task1.getState()))) {
-                    deviceListVo.setCheckTime(task1.getDate().atStartOfDay());
-                    deviceListVo.setCheckResult("已检查");
-                } else {
-                    deviceListVo.setCheckTime(null);
-                    deviceListVo.setCheckResult("未检查");
-                    deviceListVo.setRisk(null);
-                }
+            Task checkedTask = latestCheckedTaskMap.get(deviceListVo.getId());
+            if (checkedTask != null) {
+                deviceListVo.setCheckTime(checkedTask.getDate().atStartOfDay());
+                deviceListVo.setCheckResult("已检查");
             } else {
                 deviceListVo.setCheckTime(null);
                 deviceListVo.setCheckResult("未检查");
@@ -160,7 +156,6 @@
         }
         return deviceList;
     }
-
     private Map<Integer, String> calculateProjectCategoryMap(List<Project> projects, EntrustListQuery query) {
         if (projects.isEmpty() || query.getClientId() == null || query.getCategory() == null) {
             return Collections.emptyMap();
@@ -213,6 +208,54 @@
         return category + "类";
     }
 
+    private Task findLatestCheckedTask(List<Task> tasks, String startTime, String endTime) {
+        LocalDate startDate = parseQueryDate(startTime);
+        LocalDate endDate = parseQueryDate(endTime);
+        return tasks.stream()
+                .filter(this::isCheckedTask)
+                .filter(task -> matchesCheckDate(task.getDate(), startDate, endDate))
+                .max(Comparator.comparing(Task::getDate))
+                .orElse(null);
+    }
+
+    private boolean isCheckedTask(Task task) {
+        if (task == null || task.getDate() == null) {
+            return false;
+        }
+        Integer state = task.getState();
+        return Integer.valueOf(3).equals(state)
+                || Integer.valueOf(5).equals(state)
+                || Integer.valueOf(6).equals(state)
+                || Integer.valueOf(7).equals(state);
+    }
+
+    private boolean matchesCheckDate(LocalDate taskDate, LocalDate startDate, LocalDate endDate) {
+        if (taskDate == null) {
+            return false;
+        }
+        if (startDate == null && endDate == null) {
+            LocalDate currentDate = LocalDate.now();
+            return taskDate.getYear() == currentDate.getYear()
+                    && taskDate.getMonthValue() == currentDate.getMonthValue();
+        }
+        return (startDate == null || !taskDate.isBefore(startDate))
+                && (endDate == null || !taskDate.isAfter(endDate));
+    }
+
+    private LocalDate parseQueryDate(String dateText) {
+        if (!StringUtils.hasLength(dateText)) {
+            return null;
+        }
+        String normalizedDateText = normalizeDateText(dateText);
+        int separatorIndex = normalizedDateText.indexOf(' ');
+        if (separatorIndex < 0) {
+            separatorIndex = normalizedDateText.indexOf('T');
+        }
+        if (separatorIndex > 0) {
+            normalizedDateText = normalizedDateText.substring(0, separatorIndex);
+        }
+        return LocalDate.parse(normalizedDateText);
+    }
     @Override
     public List<EntrustProjectReportVo> projectReport(Page<EntrustProjectReportVo> page, ProjectReportListQuery query) {
         List<EntrustProjectReportVo> entrustProjectReportVoList = this.baseMapper.projectReport(page, query);
@@ -271,7 +314,6 @@
         }
         return deviceList;
     }
-
     @Override
     public List<ErrorListVo> errorList(Page<ErrorListVo> page, ErrorListQuery query) throws ParseException {
         String startTime=query.getStartTime();

--
Gitblit v1.7.1