Selaa lähdekoodia

优化查询首页综合信息(摄像头列表、统计)和系统资源信息:CPU、内存、磁盘、Agbox/MetaBus状态(左下角系统信息模块)接口

james 4 päivää sitten
vanhempi
commit
7f6bcb6f27

+ 1 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasEventGroupController.java

@@ -54,6 +54,7 @@ public class SasEventGroupController {
 
     /**
      * 编辑事件组
+     *
      */
     @PutMapping("/{id}")
     public ApiResult<Void> update(@PathVariable("id") String id, @RequestBody EventGroupSaveRequest request) {

+ 10 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasHomepageController.java

@@ -7,6 +7,7 @@ import com.usky.sas.service.vo.HomepageAlertHistoryRequest;
 import com.usky.sas.service.vo.HomepageInfoResponse;
 import com.usky.sas.service.vo.IntelligentEventItem;
 import com.usky.sas.service.vo.IntelligentEventPageRequest;
+import com.usky.sas.service.vo.SystemResourceResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -28,7 +29,7 @@ public class SasHomepageController {
     private SasHomepageService sasHomepageService;
 
     /**
-     * 1. 查询首页综合信息(摄像头列表、统计、服务器资源使用情况
+     * 1. 查询首页综合信息(摄像头列表、统计)
      */
     @GetMapping("/info")
     public ApiResult<HomepageInfoResponse> getInfo() {
@@ -58,5 +59,13 @@ public class SasHomepageController {
     public ApiResult<CommonPage<IntelligentEventItem>> getAlertHistory(HomepageAlertHistoryRequest request) {
         return ApiResult.success(sasHomepageService.getAlertHistory(request));
     }
+
+    /**
+     * 5. 系统资源信息:CPU、内存、磁盘、Agbox/MetaBus状态(左下角系统信息模块)
+     */
+    @GetMapping("/systemResource")
+    public ApiResult<SystemResourceResponse> getSystemResource() {
+        return ApiResult.success(sasHomepageService.getSystemResource());
+    }
 }
 

+ 6 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasHomepageService.java

@@ -5,6 +5,7 @@ import com.usky.sas.service.vo.HomepageAlertHistoryRequest;
 import com.usky.sas.service.vo.HomepageInfoResponse;
 import com.usky.sas.service.vo.IntelligentEventItem;
 import com.usky.sas.service.vo.IntelligentEventPageRequest;
+import com.usky.sas.service.vo.SystemResourceResponse;
 
 import java.util.List;
 
@@ -29,5 +30,10 @@ public interface SasHomepageService {
      * 预警历史:按分类显示开启通知的事件预警历史,可分页、点详情
      */
     CommonPage<IntelligentEventItem> getAlertHistory(HomepageAlertHistoryRequest request);
+
+    /**
+     * 系统资源信息:CPU、内存、磁盘、Agbox/MetaBus状态
+     */
+    SystemResourceResponse getSystemResource();
 }
 

+ 714 - 30
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasHomepageServiceImpl.java

@@ -1,12 +1,14 @@
 package com.usky.sas.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.usky.common.core.bean.CommonPage;
+
+
+
 import com.usky.sas.domain.SasCollectionEvent;
+import com.usky.sas.domain.SasConfig;
 import com.usky.sas.domain.SasDevice;
 import com.usky.sas.domain.SasSnapEvent;
 import com.usky.sas.mapper.SasCollectionEventMapper;
+import com.usky.sas.mapper.SasConfigMapper;
 import com.usky.sas.mapper.SasDeviceMapper;
 import com.usky.sas.mapper.SasSnapEventMapper;
 import com.usky.sas.service.SasHomepageService;
@@ -18,144 +20,826 @@ import com.usky.sas.service.vo.IntelligentEventPageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+
+
+import com.usky.common.core.bean.CommonPage;
+
+
+
+import com.usky.sas.domain.*;
+import java.util.Collections;
+import java.util.List;
+
+
+import com.usky.sas.mapper.*;
+
+
+
+import com.usky.sas.service.SasHomepageService;
+
+
+
+import com.usky.sas.service.SasIntelligentService;
+
+
+
+import com.usky.sas.service.converter.EventConverter;
+
+
+
+import com.usky.sas.service.vo.*;
+
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.stereotype.Service;
+
+
+
+import java.io.File;
+
+import java.text.DecimalFormat;
+
 import java.time.LocalDate;
+
 import java.time.LocalDateTime;
+
 import java.time.LocalTime;
+
 import java.time.format.DateTimeFormatter;
+
 import java.time.temporal.ChronoUnit;
-import java.util.Collections;
-import java.util.List;
+
+import java.util.*;
+
 import java.util.stream.Collectors;
 
+
+
+
+
+
+
 @Service
+
+
+
 public class SasHomepageServiceImpl implements SasHomepageService {
 
+
+
+
+
+
+
     @Autowired
+
+
+
     private SasDeviceMapper sasDeviceMapper;
 
+
+
+
+
+
+
     @Autowired
+
+
+
     private SasCollectionEventMapper sasCollectionEventMapper;
 
+
+
+
+
+
+
     @Autowired
+
+
+
     private SasSnapEventMapper sasSnapEventMapper;
 
+
+
+
+
+
+
     @Autowired
+
+
+
     private SasIntelligentService sasIntelligentService;
 
+
+
+
+
+
+
+    @Autowired
+
+
+
+    private SasConfigMapper sasConfigMapper;
+
+
+
+
+
+
+
     @Override
+
+
+
     public HomepageInfoResponse getHomepageInfo() {
+
+
+
         List<SasDevice> devices = sasDeviceMapper.selectList(Wrappers.lambdaQuery());
 
+
+
+
+
+
+
         HomepageInfoResponse resp = new HomepageInfoResponse();
+
+
+
         resp.setCameras(devices.stream().map(this::toCameraItem).collect(Collectors.toList()));
 
+
+
+
+
+
+
         HomepageInfoResponse.Statistics stat = new HomepageInfoResponse.Statistics();
+
+
+
         stat.setTotalDevices((long) devices.size());
+
+
+
         stat.setOnlineDevices(devices.stream().filter(this::isOnline).count());
 
+
+
+
+
+
+
         LocalDateTime startOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+
+
+
         LocalDateTime endOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+
+
+
         LambdaQueryWrapper<SasCollectionEvent> wrapper = Wrappers.lambdaQuery();
+
+
+
         wrapper.between(SasCollectionEvent::getTriggerTime, startOfDay, endOfDay);
+
+
+
         long todayEvents = sasCollectionEventMapper.selectCount(wrapper);
+
+
+
         stat.setTodayEvents(todayEvents);
 
+
+
+
+
+
+
         // 暂无单独报警事件表,这里先与今日事件数保持一致
+
+
+
         stat.setAlarmEvents(todayEvents);
 
+
+
+
+
+
+
         resp.setStatistics(stat);
 
-        // 左下角:服务器信息与资源使用情况
-        resp.setServerInfo(buildServerInfo());
+
+
+
+
+
 
         return resp;
-    }
 
-    private HomepageInfoResponse.ServerInfo buildServerInfo() {
-        Runtime runtime = Runtime.getRuntime();
-        long maxMemory = runtime.maxMemory();
-        long totalMemory = runtime.totalMemory();
-        long freeMemory = runtime.freeMemory();
-        long usedMemory = totalMemory - freeMemory;
 
-        HomepageInfoResponse.ServerInfo serverInfo = new HomepageInfoResponse.ServerInfo();
-        serverInfo.setMemoryMaxMb(maxMemory == Long.MAX_VALUE ? null : maxMemory / (1024 * 1024));
-        serverInfo.setMemoryUsedMb(usedMemory / (1024 * 1024));
-        serverInfo.setMemoryFreeMb(freeMemory / (1024 * 1024));
-        serverInfo.setAvailableProcessors(runtime.availableProcessors());
-        serverInfo.setServerTime(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
-        return serverInfo;
+
     }
 
+
+
+
+
+
+
     private HomepageInfoResponse.CameraItem toCameraItem(SasDevice d) {
+
+
+
         HomepageInfoResponse.CameraItem c = new HomepageInfoResponse.CameraItem();
+
+
+
         c.setId(d.getId());
+
+
+
         c.setName(d.getDeviceId());
+
+
+
         c.setIpAddr(d.getIpAddr());
+
+
+
         c.setStatus(isOnline(d) ? "online" : "offline");
+
+
+
         if (d.getIpAddr() != null) {
+
+
+
             c.setLiveUrl("rtsp://" + d.getIpAddr() + ":554/stream");
+
+
+
         }
+
+
+
         c.setPlaybackUrl("http://192.168.10.151/playback");
+
+
+
         return c;
+
+
+
     }
 
+
+
+
+
+
+
     private boolean isOnline(SasDevice d) {
+
+
+
         if (d.getTriggerTime() == null) {
+
+
+
             return false;
+
+
+
         }
+
+
+
         long seconds = ChronoUnit.SECONDS.between(d.getTriggerTime(), LocalDateTime.now());
+
+
+
         return seconds <= 60;
-    }
 
-    @Override
-    public CommonPage<IntelligentEventItem> getEventList(IntelligentEventPageRequest request) {
-        return sasIntelligentService.queryEvents(request);
-    }
+
+
+    }
+
+
+
+
+
+
+
+    @Override
+
+
+
+    public CommonPage<IntelligentEventItem> getEventList(IntelligentEventPageRequest request) {
+
+
+
+        return sasIntelligentService.queryEvents(request);
+
+
+
+    }
+
+
+
+
+
+
 
     @Override
+
+
+
     public List<IntelligentEventItem> getRealtimeNotificationEvents() {
+
+
+
         LambdaQueryWrapper<SasSnapEvent> wrapper = new LambdaQueryWrapper<>();
+
+
+
         wrapper.eq(SasSnapEvent::getNotify, true);
+
+
+
         wrapper.orderByDesc(SasSnapEvent::getTriggerTime);
+
+
+
         wrapper.last("LIMIT 20");
+
+
+
         List<SasSnapEvent> list = sasSnapEventMapper.selectList(wrapper);
+
+
+
         if (list == null) {
+
+
+
             return Collections.emptyList();
+
+
+
         }
+
+
+
         return list.stream().map(this::snapToEventItem).collect(Collectors.toList());
+
+
+
     }
 
+
+
+
+
+
+
     @Override
+
+
+
     public CommonPage<IntelligentEventItem> getAlertHistory(HomepageAlertHistoryRequest request) {
+
+
+
         if (!"snap".equals(request.getEventType())) {
-            return new CommonPage<>(Collections.emptyList(), 0L, request.getCurrent().longValue(), request.getSize().longValue());
+
+
+
+            return new CommonPage<>(Collections.emptyList(), 0L, request.getPage().longValue(), request.getPageSize().longValue());
+
+
         }
+
+
+
         com.baomidou.mybatisplus.extension.plugins.pagination.Page<SasSnapEvent> page =
-                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(request.getCurrent(), request.getSize());
+
+
+
+
+                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(request.getPage(), request.getPageSize());
+
+
         LambdaQueryWrapper<SasSnapEvent> wrapper = new LambdaQueryWrapper<>();
+
+
+
         wrapper.eq(SasSnapEvent::getNotify, true);
+
+
+
         wrapper.orderByDesc(SasSnapEvent::getTriggerTime);
+
+
+
         page = sasSnapEventMapper.selectPage(page, wrapper);
-        List<SasSnapEvent> records = page.getRecords() == null ? Collections.emptyList() : page.getRecords();
-        List<IntelligentEventItem> list = records.stream().map(this::snapToEventItem).collect(Collectors.toList());
+
+        List<IntelligentEventItem> list = (page.getRecords() == null ? Collections.<SasSnapEvent>emptyList() : page.getRecords())
+                .stream().map(this::snapToEventItem).collect(Collectors.toList());
+
+
         return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+
+
+
     }
 
+
+
+
+
+
+
     private IntelligentEventItem snapToEventItem(SasSnapEvent e) {
+
+
+
         IntelligentEventItem item = new IntelligentEventItem();
+
+
+
         item.setEventId(e.getEventId());
+
+
+
         item.setDeviceId(e.getDeviceId());
+
+
+
         item.setChannel(e.getChannel());
+
+
+
         item.setTriggerTime(e.getTriggerTime());
+
+
+
         item.setEventCode(e.getEventCode());
+
+
+
         item.setScenePicId(e.getScenePicId());
+
+
+
         item.setEventPicId(e.getEventPicId());
+
+
+
         item.setSimilarity(e.getSimilarity());
+
+
+
         item.setPersonCode(e.getPersonCode());
+
+
+
         item.setNotify(e.getNotify());
+
+
+
         item.setScene(e.getScene());
+
+
+
         return item;
+
+
+
     }
+
+
+
+
+
+
+
+    @Override
+
+
+
+    public SystemResourceResponse getSystemResource() {
+
+
+
+        SystemResourceResponse response = new SystemResourceResponse();
+
+
+
+        DecimalFormat df = new DecimalFormat("#0.00");
+
+
+
+
+
+
+
+        // CPU信息
+
+
+
+        SystemResourceResponse.CpuInfo cpu = new SystemResourceResponse.CpuInfo();
+
+
+
+        Runtime runtime = Runtime.getRuntime();
+
+
+
+        cpu.setCoreCount(runtime.availableProcessors());
+
+
+
+        
+
+
+
+        // 获取CPU使用率
+
+
+
+        com.sun.management.OperatingSystemMXBean osBean = 
+
+
+
+            (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean();
+
+
+
+        double cpuUsage = osBean.getSystemCpuLoad() * 100;
+
+
+
+        cpu.setUsageRate(df.format(cpuUsage) + "%");
+
+
+
+        response.setCpu(cpu);
+
+
+
+
+
+
+
+        // 内存信息
+
+
+
+        SystemResourceResponse.MemoryInfo memory = new SystemResourceResponse.MemoryInfo();
+
+
+
+        long maxMemory = runtime.maxMemory();
+
+
+
+        long totalMemory = runtime.totalMemory();
+
+
+
+        long freeMemory = runtime.freeMemory();
+
+
+
+        long usedMemory = totalMemory - freeMemory;
+
+
+
+        
+
+
+
+        double totalMemoryGB = maxMemory / (1024.0 * 1024.0 * 1024.0);
+
+
+
+        double usedMemoryGB = usedMemory / (1024.0 * 1024.0 * 1024.0);
+
+
+
+        double freeMemoryGB = (maxMemory - usedMemory) / (1024.0 * 1024.0 * 1024.0);
+
+
+
+        double memoryUsageRate = (usedMemory * 100.0) / maxMemory;
+
+
+
+        
+
+
+
+        memory.setTotalSize(df.format(totalMemoryGB) + " GB");
+
+
+
+        memory.setUsedSize(df.format(usedMemoryGB) + " GB");
+
+
+
+        memory.setFreeSize(df.format(freeMemoryGB) + " GB");
+
+
+
+        memory.setUsageRate(df.format(memoryUsageRate) + "%");
+
+
+
+        response.setMemory(memory);
+
+
+
+
+
+
+
+        // 磁盘信息
+
+
+
+        SystemResourceResponse.DiskInfo disk = new SystemResourceResponse.DiskInfo();
+
+
+
+        File[] roots = File.listRoots();
+
+
+
+        long totalSpace = 0;
+
+
+
+        long usableSpace = 0;
+
+
+
+        for (File root : roots) {
+
+
+
+            totalSpace += root.getTotalSpace();
+
+
+
+            usableSpace += root.getUsableSpace();
+
+
+
+        }
+
+
+
+        long usedSpace = totalSpace - usableSpace;
+
+
+
+        
+
+
+
+        double totalSpaceGB = totalSpace / (1024.0 * 1024.0 * 1024.0);
+
+
+
+        double usedSpaceGB = usedSpace / (1024.0 * 1024.0 * 1024.0);
+
+
+
+        double usableSpaceGB = usableSpace / (1024.0 * 1024.0 * 1024.0);
+
+
+
+        double diskUsageRate = totalSpace > 0 ? (usedSpace * 100.0) / totalSpace : 0;
+
+
+
+        
+
+
+
+        disk.setTotalSize(df.format(totalSpaceGB) + " GB");
+
+
+
+        disk.setUsedSize(df.format(usedSpaceGB) + " GB");
+
+
+
+        disk.setFreeSize(df.format(usableSpaceGB) + " GB");
+
+
+
+        disk.setUsageRate(df.format(diskUsageRate) + "%");
+
+
+
+        response.setDisk(disk);
+
+
+
+
+
+
+
+        // Agbox/MetaBus信息
+
+
+
+        SystemResourceResponse.AgboxInfo agbox = new SystemResourceResponse.AgboxInfo();
+
+
+
+        SasConfig config = sasConfigMapper.selectById(1);
+
+
+
+        if (config != null) {
+
+
+
+            agbox.setHost(config.getHost());
+
+
+
+            agbox.setPort(config.getPort());
+
+
+
+            agbox.setStatus("正常");
+
+
+
+            agbox.setEventListenStatus("监听中");
+
+
+
+        } else {
+
+
+
+            agbox.setHost("192.168.10.159");
+
+
+
+            agbox.setPort("1883");
+
+
+
+            agbox.setStatus("正常");
+
+
+
+            agbox.setEventListenStatus("监听中");
+
+
+
+        }
+
+
+
+        response.setAgboxMetaBus(agbox);
+
+
+
+
+
+
+
+        return response;
+
+
+
+    }
+
+
+
 }
 
+
+

+ 0 - 17
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/vo/HomepageInfoResponse.java

@@ -13,9 +13,6 @@ public class HomepageInfoResponse {
     /** 中上/统计:设备与事件统计 */
     private Statistics statistics;
 
-    /** 左下角:服务器信息与资源使用情况 */
-    private ServerInfo serverInfo;
-
     @Data
     public static class CameraItem {
         private String id;
@@ -33,19 +30,5 @@ public class HomepageInfoResponse {
         private Long todayEvents;
         private Long alarmEvents;
     }
-
-    @Data
-    public static class ServerInfo {
-        /** JVM 最大内存(MB) */
-        private Long memoryMaxMb;
-        /** JVM 已用内存(MB) */
-        private Long memoryUsedMb;
-        /** JVM 可用内存(MB) */
-        private Long memoryFreeMb;
-        /** 可用处理器数 */
-        private Integer availableProcessors;
-        /** 服务器时间 */
-        private String serverTime;
-    }
 }