Selaa lähdekoodia

首页接口补充

hanzhengyi 4 päivää sitten
vanhempi
commit
d93ea7eb1d

+ 36 - 2
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasHomepageController.java

@@ -1,17 +1,24 @@
 package com.usky.sas.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
 import com.usky.sas.service.SasHomepageService;
+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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
- * 首页信息接口
+ * 首页接口
  *
- * GET /prod-api/service-sas/homepage/info
+ * 对应 API 文档:/prod-api/service-sas/homepage/...
+ * 功能:左上角摄像头列表与直播、左下角服务器信息、中上事件列表与实时事件、中下预警历史
  */
 @RestController
 @RequestMapping("/homepage")
@@ -20,9 +27,36 @@ public class SasHomepageController {
     @Autowired
     private SasHomepageService sasHomepageService;
 
+    /**
+     * 1. 查询首页综合信息(摄像头列表、统计、服务器资源使用情况)
+     */
     @GetMapping("/info")
     public ApiResult<HomepageInfoResponse> getInfo() {
         return ApiResult.success(sasHomepageService.getHomepageInfo());
     }
+
+    /**
+     * 2. 事件列表:各模块所有事件分页(中上-事件列表区域)
+     */
+    @GetMapping("/events")
+    public ApiResult<CommonPage<IntelligentEventItem>> getEventList(IntelligentEventPageRequest request) {
+        return ApiResult.success(sasHomepageService.getEventList(request));
+    }
+
+    /**
+     * 3. 实时事件:开启通知的最近事件,用于弹窗(左边关联摄像头、右边事件信息,可提前关闭)
+     */
+    @GetMapping("/realtimeNotificationEvents")
+    public ApiResult<List<IntelligentEventItem>> getRealtimeNotificationEvents() {
+        return ApiResult.success(sasHomepageService.getRealtimeNotificationEvents());
+    }
+
+    /**
+     * 4. 预警历史:按分类显示开启通知的事件预警历史,可分页、点详情
+     */
+    @GetMapping("/alertHistory")
+    public ApiResult<CommonPage<IntelligentEventItem>> getAlertHistory(HomepageAlertHistoryRequest request) {
+        return ApiResult.success(sasHomepageService.getAlertHistory(request));
+    }
 }
 

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

@@ -1,9 +1,33 @@
 package com.usky.sas.service;
 
+import com.usky.common.core.bean.CommonPage;
+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 java.util.List;
 
 public interface SasHomepageService {
 
+    /**
+     * 首页综合信息:摄像头列表、统计、服务器信息
+     */
     HomepageInfoResponse getHomepageInfo();
+
+    /**
+     * 事件列表:各模块所有事件分页(实时监控/事件列表区域)
+     */
+    CommonPage<IntelligentEventItem> getEventList(IntelligentEventPageRequest request);
+
+    /**
+     * 实时事件:开启通知的最近事件,用于弹窗(左边播放关联摄像头,右边事件信息)
+     */
+    List<IntelligentEventItem> getRealtimeNotificationEvents();
+
+    /**
+     * 预警历史:按分类显示开启通知的事件预警历史,可分页、点详情
+     */
+    CommonPage<IntelligentEventItem> getAlertHistory(HomepageAlertHistoryRequest request);
 }
 

+ 84 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasHomepageServiceImpl.java

@@ -2,19 +2,27 @@ 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.SasDevice;
+import com.usky.sas.domain.SasSnapEvent;
 import com.usky.sas.mapper.SasCollectionEventMapper;
 import com.usky.sas.mapper.SasDeviceMapper;
+import com.usky.sas.mapper.SasSnapEventMapper;
 import com.usky.sas.service.SasHomepageService;
+import com.usky.sas.service.SasIntelligentService;
 import com.usky.sas.service.vo.HomepageInfoResponse;
+import com.usky.sas.service.vo.IntelligentEventItem;
+import com.usky.sas.service.vo.IntelligentEventPageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 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.stream.Collectors;
 
@@ -27,6 +35,12 @@ public class SasHomepageServiceImpl implements SasHomepageService {
     @Autowired
     private SasCollectionEventMapper sasCollectionEventMapper;
 
+    @Autowired
+    private SasSnapEventMapper sasSnapEventMapper;
+
+    @Autowired
+    private SasIntelligentService sasIntelligentService;
+
     @Override
     public HomepageInfoResponse getHomepageInfo() {
         List<SasDevice> devices = sasDeviceMapper.selectList(Wrappers.lambdaQuery());
@@ -49,9 +63,29 @@ public class SasHomepageServiceImpl implements SasHomepageService {
         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());
@@ -72,5 +106,55 @@ public class SasHomepageServiceImpl implements SasHomepageService {
         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 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.getPage().longValue(), request.getPageSize().longValue());
+        }
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<SasSnapEvent> page =
+                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<IntelligentEventItem> list = (page.getRecords() == null ? Collections.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;
+    }
 }
 

+ 19 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/vo/HomepageAlertHistoryRequest.java

@@ -0,0 +1,19 @@
+package com.usky.sas.service.vo;
+
+import lombok.Data;
+
+/**
+ * 首页预警历史分页请求
+ */
+@Data
+public class HomepageAlertHistoryRequest {
+
+    private Integer page = 1;
+
+    private Integer pageSize = 10;
+
+    /**
+     * 事件类型(当前仅 snap 支持开启通知的预警)
+     */
+    private String eventType = "snap";
+}

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

@@ -7,10 +7,15 @@ import java.util.List;
 @Data
 public class HomepageInfoResponse {
 
+    /** 左上角:已添加摄像头列表,可点击直播或回放 */
     private List<CameraItem> cameras;
 
+    /** 中上/统计:设备与事件统计 */
     private Statistics statistics;
 
+    /** 左下角:服务器信息与资源使用情况 */
+    private ServerInfo serverInfo;
+
     @Data
     public static class CameraItem {
         private String id;
@@ -28,5 +33,19 @@ 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;
+    }
 }