From e1e67b11a2628183a863a41113492bde8e2df611 Mon Sep 17 00:00:00 2001 From: fengyarnom Date: Thu, 16 Jan 2025 11:53:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8D=95=E6=AC=A1=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=97=A5=E5=BF=97=E6=98=BE=E7=A4=BA=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=201.=20=E5=8E=BB=E9=99=A4=20DeviceStatusChecker=20=E4=B8=AD?= =?UTF-8?q?=E6=9C=89=E5=85=B3=E5=91=8A=E8=AD=A6=E6=97=A5=E5=BF=97=E7=94=9F?= =?UTF-8?q?=E6=88=90=E7=9A=84=E6=AE=8B=E7=95=99=E4=BB=A3=E7=A0=81=202.=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20gnss=5Fsingle=5Fdata.html=20=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E9=A1=B5=E9=9D=A2=E6=98=BE=E7=A4=BA=203.=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=91=8A=E8=AD=A6=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=94=B6=E9=9B=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sideslope/service/WarningServiceImpl.java | 3 +- .../controller/GnssSingleDataController.java | 5 +- .../beidou/task/DeviceStatusChecker.java | 9 -- .../static/api/init_super_admin.json | 2 +- .../templates/page/gnss_single_data.html | 52 ++++++- .../common/util/WarningLogExecutor.java | 129 +++++++++--------- 6 files changed, 116 insertions(+), 84 deletions(-) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java index 215f7818..5530f374 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java @@ -268,7 +268,8 @@ public class WarningServiceImpl implements WarningService { } public void generate_warning_logs(String device_id,int warning_type,String warning_type_name){ - if (warning_type == WarningCfg.TYPE_LOW_VOLTAGE) { + // 连续无固定解 和 掉电 警告 + if (warning_type == WarningCfg.TYPE_NO_FIXED_RESULT || warning_type == WarningCfg.TYPE_LOW_VOLTAGE) { WarningLogExecutor warningLogExecutor = new WarningLogExecutor(logDirectory); warningLogExecutor.generateWarningLogs(device_id, warning_type_name); } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssSingleDataController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssSingleDataController.java index 2ddaa671..a6624d6f 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssSingleDataController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssSingleDataController.java @@ -43,15 +43,14 @@ public class GnssSingleDataController extends BasicController implements CommonE JSONObject search = null; if (searchParams != null) { search = (JSONObject) JSONObject.parse(searchParams); - System.out.println(search); - String deviceId = search.getString("deviceid"); + + String deviceId = search.getString("sl_deviceid"); // sql where like deviceid Integer freqency = search.getInteger("freqency"); String begin = search.getString("dgt_.createtime"); String end = search.getString("dlt_.createtime"); if(deviceId != null && !deviceId.isEmpty() && freqency!=0){ Page pageable = new Page<>(page == null ? 1 : page, limit == null ? 10 : limit); - // 缺省按1小时采样,如果时间跨度较大,则按最多300条记录的采样率采样 int sample = 6; diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java b/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java index 9119cc44..94039e52 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java @@ -4,7 +4,6 @@ import com.imdroid.beidou.service.NotificationService; import com.imdroid.secapi.dto.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -44,9 +43,6 @@ public class DeviceStatusChecker { @Autowired GnssDeviceMapper deviceMapper; - @Value("${warning.log.directory}") - private String logDirectory; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Scheduled(cron = "0 18,48 * * * ?") // 每半时执行一次 @@ -157,11 +153,6 @@ public class DeviceStatusChecker { status.setWarning(WarningCfg.LEVEL_2); deviceIds.add(status.getDeviceid()); - // 生成 Warning 日志 - WarningLogExecutor warningLogExecutor = new WarningLogExecutor(logDirectory); - warningLogExecutor.generateWarningLogs(status.getDeviceid(),WarningCfg.TYPE_NAME_NO_FIXED_RESULT); - - } gnssStatusMapper.updateById(status); } diff --git a/sec-beidou/src/main/resources/static/api/init_super_admin.json b/sec-beidou/src/main/resources/static/api/init_super_admin.json index 9835dffc..d9252f57 100644 --- a/sec-beidou/src/main/resources/static/api/init_super_admin.json +++ b/sec-beidou/src/main/resources/static/api/init_super_admin.json @@ -54,7 +54,7 @@ "target": "_self" }, { - "title": "Log", + "title": "日志", "href": "page/gnss_single_data", "icon": "fa fa-clipboard", "target": "_self" diff --git a/sec-beidou/src/main/resources/templates/page/gnss_single_data.html b/sec-beidou/src/main/resources/templates/page/gnss_single_data.html index 3def2e9f..15afadbe 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_single_data.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_single_data.html @@ -20,7 +20,7 @@
- + @@ -88,11 +88,12 @@ var echartsDevice = echarts.init(document.getElementById('echarts-gnss'), 'walden'); var data_cols = [ {field: 'deviceid', title: '设备号'}, + {field: 'model', title: '模块', templet: '#model'}, {field: 'createtime', title: '产生时间', width:'18%', templet: "
{{layui.util.toDateString(d.createtime, 'yyyy-MM-dd HH:mm:ss')}}
"}, {field: 'x', title: '东'}, {field: 'y', title: '北'}, {field: 'z', title: '天'}, - {field: 'status', title: '状态'} + {field: 'status', title: '状态', templet: '#status'} ]; /** * 初始化表单,要加上,不然刷新部分组件可能会不加载 @@ -122,7 +123,7 @@ skin: 'line', done: function (result, curr, count) { if(searchDeviceId){ - console.log(result.data); + // console.log(result.data); showChart(result.data) } } @@ -245,5 +246,50 @@ }); + + + + + + + \ No newline at end of file diff --git a/sec-common/src/main/java/com/imdroid/common/util/WarningLogExecutor.java b/sec-common/src/main/java/com/imdroid/common/util/WarningLogExecutor.java index f2e6e47b..dbbd2eac 100644 --- a/sec-common/src/main/java/com/imdroid/common/util/WarningLogExecutor.java +++ b/sec-common/src/main/java/com/imdroid/common/util/WarningLogExecutor.java @@ -1,21 +1,15 @@ package com.imdroid.common.util; -import java.io.*; -import java.nio.file.*; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; import java.util.concurrent.ExecutorService; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import java.util.stream.Stream; + +import java.io.*; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; public class WarningLogExecutor { - private final String logDirectory; private final ExecutorService executor; - // 记录已初始化的文件 - private final ConcurrentHashMap initializedFiles = new ConcurrentHashMap<>(); public WarningLogExecutor(String logDirectory) { this.logDirectory = logDirectory; @@ -23,68 +17,69 @@ public class WarningLogExecutor { } public void generateWarningLogs(String keyword, String warningTypeName) { + // 单线程处理,防止数据写入混乱 + executor.submit(() -> searchLogsForDeviceID(this.logDirectory, keyword, warningTypeName)); + } + + public static void searchLogsForDeviceID(String dirPath, String deviceId, String warningType) { try { - String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); - String warningFileName = "Warning-" + keyword + "-" + date + ".log"; - Path warningFile = Paths.get(logDirectory, warningFileName); - - // 如果是新文件,先写入初始化信息 - if (initializedFiles.putIfAbsent(warningFileName, true) == null) { - initializeWarningFile(warningFile, keyword, warningTypeName); + // 判断目录是否存在,一般写在 application.properties 中 + File dir = new File(dirPath); + if (!dir.exists() || !dir.isDirectory()) { + return; } - try (Stream logFilesStream = Files.list(Paths.get(logDirectory))) { - List logFiles = logFilesStream - .filter(Files::isRegularFile) - .filter(path -> path.getFileName().toString().matches("sideslopertcm(\\.\\d{4}-\\d{2}-\\d{2}\\.\\d+)?\\.log")) - .collect(Collectors.toList()); + // 只收集一小时内的日志,否则太影响性能 + long oneHourAgo = System.currentTimeMillis() - 3600000; + File[] files = dir.listFiles((d, name) -> name.startsWith("sideslopertcm")); - for (Path logFile : logFiles) { - executor.submit(() -> processFile(logFile, keyword, warningFile)); + + if (files != null && files.length > 0) { + Arrays.sort(files, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); + + StringBuilder processedFiles = new StringBuilder(); + for (File file : files) { + if (file.lastModified() >= oneHourAgo) { + processedFiles.append(String.format("%s\n", file.getName())); + } + } + + if (processedFiles.length() == 0) { + return; + } + + // 文件名的日期只保存年月日,当天重复触发会新的覆盖旧的 + String date = DateTimeFormatter.ofPattern("yyyyMMdd") + .format(LocalDateTime.now()); + String outputFileName = String.format("%s/Warning_%s_%s_%s.log", dirPath,deviceId,date, warningType); + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName))) { + writer.write("=== 搜索信息 ===\n"); + writer.write("处理时间: " + LocalDateTime.now() + "\n"); + writer.write("搜索目录: " + dirPath + "\n"); + writer.write("设备ID: " + deviceId + "\n"); + writer.write("警告类型: " + warningType + "\n\n"); + + writer.write("=== 处理文件列表 ===\n"); + writer.write(processedFiles.toString()); + writer.write("\n=== 匹配结果 ===\n"); + + for (File file : files) { + if (file.lastModified() >= oneHourAgo) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + String line; + while ((line = reader.readLine()) != null) { + if (line.contains(deviceId)) { + writer.write(String.format("[%s] %s\n", + file.getName(), line)); + } + } + } + } + } } } - } catch (IOException e) { - e.printStackTrace(); - } finally { - executor.shutdown(); - } - } - - private void initializeWarningFile(Path warningFile, String keyword, String warningTypeName) { - try (BufferedWriter writer = Files.newBufferedWriter(warningFile, - StandardOpenOption.CREATE, StandardOpenOption.APPEND)) { - writer.write("=== Warning Log File ==="); - writer.newLine(); - writer.write("Created Time: " + LocalDateTime.now()); - writer.newLine(); - writer.write("Warning Type Name: " + warningTypeName); - writer.newLine(); - writer.write("Keyword: " + keyword); - writer.newLine(); - writer.write("=============================="); - writer.newLine(); - writer.newLine(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void processFile(Path logFile, String keyword, Path warningFile) { - try (BufferedReader reader = Files.newBufferedReader(logFile); - BufferedWriter writer = Files.newBufferedWriter(warningFile, - StandardOpenOption.CREATE, StandardOpenOption.APPEND)) { - - writer.write("Processing source file: " + logFile.getFileName()); - writer.newLine(); - - String line; - while ((line = reader.readLine()) != null) { - if (line.contains(keyword)) { - writer.write(line); - writer.newLine(); - } - } - } catch (IOException e) { + } catch (Exception e) { e.printStackTrace(); } }