From 549223100aa6f2ffe6cbf7955de36a8a0155a8cd Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 13 四月 2026 20:03:23 +0800
Subject: [PATCH] #算法耗时优化

---
 src/main/java/com/zy/asrs/controller/DeviceLogController.java |   98 +++++++++++++++++++++++++++---------------------
 1 files changed, 55 insertions(+), 43 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/DeviceLogController.java b/src/main/java/com/zy/asrs/controller/DeviceLogController.java
index f531469..79cd046 100644
--- a/src/main/java/com/zy/asrs/controller/DeviceLogController.java
+++ b/src/main/java/com/zy/asrs/controller/DeviceLogController.java
@@ -18,8 +18,6 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import jakarta.servlet.http.HttpServletResponse;
-import java.io.ByteArrayOutputStream;
-import java.io.RandomAccessFile;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -226,11 +224,11 @@
             }
             for (DeviceAggregate aggregate : aggregateMap.values()) {
                 if (aggregate.firstFile != null) {
-                    FileTimeRange firstRange = readFileTimeRange(aggregate.firstFile);
+                    FileTimeRange firstRange = readFileTimeRange(aggregate.firstFile, aggregate.stationId);
                     aggregate.firstTime = firstRange.startTime != null ? firstRange.startTime : firstRange.endTime;
                 }
                 if (aggregate.lastFile != null) {
-                    FileTimeRange lastRange = readFileTimeRange(aggregate.lastFile);
+                    FileTimeRange lastRange = readFileTimeRange(aggregate.lastFile, aggregate.stationId);
                     aggregate.lastTime = lastRange.endTime != null ? lastRange.endTime : lastRange.startTime;
                 }
             }
@@ -274,7 +272,7 @@
             List<Map<String, Object>> segments = new ArrayList<>();
             Long startTime = null;
             for (int i = 0; i < files.size(); i++) {
-                Long segmentStart = getFileStartTime(files.get(i));
+                Long segmentStart = getFileStartTime(files.get(i), stationId);
                 if (segmentStart != null && (startTime == null || segmentStart < startTime)) {
                     startTime = segmentStart;
                 }
@@ -284,7 +282,7 @@
                 segment.put("endTime", null);
                 segments.add(segment);
             }
-            Long endTime = getFileEndTime(files.get(files.size() - 1));
+            Long endTime = getFileEndTime(files.get(files.size() - 1), stationId);
             if (endTime == null) {
                 for (int i = segments.size() - 1; i >= 0; i--) {
                     Long segmentStart = (Long) segments.get(i).get("startTime");
@@ -370,7 +368,9 @@
                         if (line != null && !line.trim().isEmpty()) {
                             try {
                                 DeviceDataLog logItem = JSON.parseObject(line, DeviceDataLog.class);
-                                resultLogs.add(logItem);
+                                if (matchesRequestedStation(logItem, stationId)) {
+                                    resultLogs.add(logItem);
+                                }
                             } catch (Exception e) {
                             }
                         }
@@ -427,7 +427,7 @@
             while (low <= high) {
                 int mid = (low + high) >>> 1;
                 Path midFile = files.get(mid);
-                Long midStart = getFileStartTime(midFile);
+                Long midStart = getFileStartTime(midFile, stationId);
                 if (midStart == null) {
                     low = mid + 1;
                     continue;
@@ -455,9 +455,9 @@
         }
     }
     
-    private Long getFileStartTime(Path file) {
+    private Long getFileStartTime(Path file, String stationId) {
         try {
-            String firstLine = readFirstNonBlankLine(file);
+            String firstLine = readFirstMatchingLine(file, stationId);
             if (firstLine == null) return null;
             DeviceDataLog firstLog = JSON.parseObject(firstLine, DeviceDataLog.class);
             return firstLog.getCreateTime().getTime();
@@ -466,9 +466,9 @@
         }
     }
 
-    private Long getFileEndTime(Path file) {
+    private Long getFileEndTime(Path file, String stationId) {
         try {
-            String lastLine = readLastNonBlankLine(file);
+            String lastLine = readLastMatchingLine(file, stationId);
             if (lastLine == null) return null;
             DeviceDataLog lastLog = JSON.parseObject(lastLine, DeviceDataLog.class);
             return lastLog.getCreateTime().getTime();
@@ -943,65 +943,77 @@
         }
     }
 
-    private FileTimeRange readFileTimeRange(Path file) {
+    private FileTimeRange readFileTimeRange(Path file, String stationId) {
         FileTimeRange range = new FileTimeRange();
         try {
-            String firstLine = readFirstNonBlankLine(file);
-            String lastLine = readLastNonBlankLine(file);
-            range.startTime = parseLogTime(firstLine);
-            range.endTime = parseLogTime(lastLine);
+            String firstLine = readFirstMatchingLine(file, stationId);
+            String lastLine = readLastMatchingLine(file, stationId);
+            range.startTime = parseLogTime(firstLine, stationId);
+            range.endTime = parseLogTime(lastLine, stationId);
             return range;
         } catch (Exception e) {
             return range;
         }
     }
 
-    private Long parseLogTime(String line) {
+    private Long parseLogTime(String line, String stationId) {
         try {
             if (line == null || line.trim().isEmpty()) {
                 return null;
             }
             DeviceDataLog logItem = JSON.parseObject(line, DeviceDataLog.class);
+            if (!matchesRequestedStation(logItem, stationId)) {
+                return null;
+            }
             return logItem != null && logItem.getCreateTime() != null ? logItem.getCreateTime().getTime() : null;
         } catch (Exception e) {
             return null;
         }
     }
 
-    private String readFirstNonBlankLine(Path file) {
+    private boolean matchesRequestedStation(DeviceDataLog logItem, String stationId) {
+        if (Cools.isEmpty(stationId)) {
+            return true;
+        }
+        if (logItem == null || logItem.getStationId() == null) {
+            return false;
+        }
+        return Objects.equals(String.valueOf(logItem.getStationId()), stationId);
+    }
+
+    private String readFirstMatchingLine(Path file, String stationId) {
         try (Stream<String> lines = Files.lines(file, StandardCharsets.UTF_8)) {
-            return lines.filter(line -> line != null && !line.trim().isEmpty()).findFirst().orElse(null);
+            return lines
+                    .filter(line -> line != null && !line.trim().isEmpty())
+                    .filter(line -> matchesRequestedStation(parseLogLine(line), stationId))
+                    .findFirst()
+                    .orElse(null);
         } catch (Exception e) {
             return null;
         }
     }
 
-    private String readLastNonBlankLine(Path file) {
-        try (RandomAccessFile randomAccessFile = new RandomAccessFile(file.toFile(), "r")) {
-            long length = randomAccessFile.length();
-            if (length <= 0) {
+    private String readLastMatchingLine(Path file, String stationId) {
+        try (Stream<String> lines = Files.lines(file, StandardCharsets.UTF_8)) {
+            List<String> matched = lines
+                    .filter(line -> line != null && !line.trim().isEmpty())
+                    .filter(line -> matchesRequestedStation(parseLogLine(line), stationId))
+                    .collect(Collectors.toList());
+            if (matched.isEmpty()) {
                 return null;
             }
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            for (long pointer = length - 1; pointer >= 0; pointer--) {
-                randomAccessFile.seek(pointer);
-                int read = randomAccessFile.read();
-                if (read == '\n' || read == '\r') {
-                    if (baos.size() > 0) {
-                        break;
-                    }
-                    continue;
-                }
-                baos.write(read);
+            return matched.get(matched.size() - 1);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private DeviceDataLog parseLogLine(String line) {
+        try {
+            if (line == null || line.trim().isEmpty()) {
+                return null;
             }
-            byte[] bytes = baos.toByteArray();
-            for (int i = 0, j = bytes.length - 1; i < j; i++, j--) {
-                byte tmp = bytes[i];
-                bytes[i] = bytes[j];
-                bytes[j] = tmp;
-            }
-            String line = new String(bytes, StandardCharsets.UTF_8).trim();
-            return line.isEmpty() ? null : line;
+            return JSON.parseObject(line, DeviceDataLog.class);
         } catch (Exception e) {
             return null;
         }

--
Gitblit v1.9.1