lipenghui hace 1 día
padre
commit
a865cfab49

+ 65 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/hik/HikAlarmController.java

@@ -0,0 +1,65 @@
+package cn.iocoder.yudao.module.pms.hik;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 海康ISAPI JSON格式告警事件接收控制器
+ */
+@Slf4j
+@RestController
+@RequestMapping("/hikvision/alarm")
+public class HikAlarmController {
+
+    /**
+     * 接收海康巡检融合超脑推送的JSON格式告警事件
+     * 接口地址需配置到海康平台:http://你的服务器IP:端口/hikvision/alarm/receive-json
+     */
+    @PostMapping(value = "/receive-json", 
+                consumes = MediaType.APPLICATION_JSON_VALUE,
+                produces = MediaType.APPLICATION_JSON_VALUE)
+    public HikAlarmResponse receiveJsonAlarm(@RequestBody HikAlarmEvent alarmEvent) {
+        try {
+            // 1. 打印告警日志,便于调试和排查问题
+            log.info("接收到海康JSON格式告警事件:{}", alarmEvent);
+
+            // 2. 核心业务处理(可抽离到Service层,异步处理)
+            processAlarmEvent(alarmEvent);
+
+            // 3. 快速返回成功响应(必须立即返回,避免设备超时重试)
+            return HikAlarmResponse.success();
+        } catch (Exception e) {
+            // 异常时记录日志,返回失败响应
+            log.error("处理海康JSON告警事件失败", e);
+            return HikAlarmResponse.fail();
+        }
+    }
+
+    /**
+     * 告警事件业务处理逻辑(示例)
+     * 可扩展:入库、消息队列推送、前端通知等
+     */
+    private void processAlarmEvent(HikAlarmEvent alarmEvent) {
+        // 示例1:根据告警类型区分处理
+        switch (alarmEvent.getEventType()) {
+            case "VMD":
+                log.info("【移动侦测告警】设备:{},时间:{}", alarmEvent.getDeviceName(), alarmEvent.getDateTime());
+                break;
+            case "LINEDETECT":
+                log.info("【越界告警】设备:{},通道:{}", alarmEvent.getDeviceID(), alarmEvent.getChannelID());
+                break;
+            default:
+                log.info("【未知类型告警】类型:{},描述:{}", alarmEvent.getEventType(), alarmEvent.getDescription());
+        }
+
+        // 示例2:告警入库(实际项目中可调用Service层操作数据库)
+        // alarmService.saveAlarm(alarmEvent);
+
+        // 示例3:异步推送至消息队列(避免阻塞响应)
+        // rabbitTemplate.convertAndSend("hik-alarm-queue", alarmEvent);
+    }
+}

+ 34 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/hik/HikAlarmEvent.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.pms.hik;
+
+import lombok.Data;
+
+/**
+ * 海康ISAPI JSON格式告警事件实体(核心字段,按需扩展)
+ * 字段名需与海康设备推送的JSON字段完全一致
+ */
+@Data
+public class HikAlarmEvent {
+    /** 设备序列号 */
+    private String deviceID;
+
+    /** 告警事件类型(如VMD:移动侦测、LINEDETECT:越界等) */
+    private String eventType;
+
+    /** 告警状态(0:结束 1:开始) */
+    private Integer eventState;
+
+    /** 告警发生时间(格式:yyyy-MM-dd'T'HH:mm:ss+08:00) */
+    private String dateTime;
+
+    /** 设备通道号 */
+    private String channelID;
+
+    /** 告警描述信息 */
+    private String description;
+
+    /** 设备名称(可选) */
+    private String deviceName;
+
+    /** 告警等级(可选,1-5级) */
+    private Integer alarmLevel;
+}

+ 31 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/hik/HikAlarmResponse.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.pms.hik;
+
+import lombok.Data;
+
+/**
+ * 海康ISAPI JSON格式告警响应实体
+ */
+@Data
+public class HikAlarmResponse {
+    /** 响应码(0:成功 非0:失败,海康标准) */
+    private Integer statusCode;
+
+    /** 响应描述 */
+    private String statusString;
+
+    // 快速创建成功响应
+    public static HikAlarmResponse success() {
+        HikAlarmResponse response = new HikAlarmResponse();
+        response.setStatusCode(0);
+        response.setStatusString("Success");
+        return response;
+    }
+
+    // 快速创建失败响应
+    public static HikAlarmResponse fail() {
+        HikAlarmResponse response = new HikAlarmResponse();
+        response.setStatusCode(1);
+        response.setStatusString("Failed");
+        return response;
+    }
+}