From a37ca40125f0882a21672baa0e2b12e0d460623b Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 21 五月 2025 14:41:03 +0800
Subject: [PATCH] 新增公交的接口对接

---
 ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionViewRequest.java           |   13 ++
 ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/SubscriptionEvent.java                      |   77 ++++++++++++
 ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPWarnMsgAdptInfoController.java                    |   21 ++
 ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventUnSubscriptionByEventTypesRequest.java |   24 ++++
 ruoyi-service/ruoyi-dataInterchange/pom.xml                                                                                                |   16 ++
 ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/Artemis.java                                      |  130 +++++++++++++++++++++
 ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionByEventTypesRequest.java   |   51 ++++++++
 7 files changed, 326 insertions(+), 6 deletions(-)

diff --git a/ruoyi-service/ruoyi-dataInterchange/pom.xml b/ruoyi-service/ruoyi-dataInterchange/pom.xml
index 68c6176..5c181c5 100644
--- a/ruoyi-service/ruoyi-dataInterchange/pom.xml
+++ b/ruoyi-service/ruoyi-dataInterchange/pom.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<parent>
 		<groupId>com.ruoyi</groupId>
@@ -118,6 +118,12 @@
 			<groupId>com.ruoyi</groupId>
 			<artifactId>ruoyi-api-dataInterchange</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>com.hikvision.ga</groupId>
+			<artifactId>artemis-http-client</artifactId>
+			<version>1.1.13.RELEASE</version>
+			<systemPath>${project.basedir}/lib/artemis-http-client-1.1.13.RELEASE.jar</systemPath>
+		</dependency>
 	</dependencies>
 	
 	<build>
@@ -137,6 +143,13 @@
 		</plugins>
 		<resources>
 			<resource>
+				<directory>lib</directory>
+				<targetPath>/BOOT-INF/lib/</targetPath>
+				<includes>
+					<include>**/*.jar</include>
+				</includes>
+			</resource>
+			<resource>
 				<directory>src/main/resources</directory>
 			</resource>
 			<resource>
@@ -148,5 +161,4 @@
 			</resource>
 		</resources>
 	</build>
-
 </project>
diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPWarnMsgAdptInfoController.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPWarnMsgAdptInfoController.java
index a7aca3c..084fecf 100644
--- a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPWarnMsgAdptInfoController.java
+++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPWarnMsgAdptInfoController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.dataInterchange.controller;
 
+import com.alibaba.fastjson2.JSON;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.bean.BeanUtils;
 import com.ruoyi.dataInterchange.api.vo.UPWarnMsgAdptInfoVo;
@@ -7,10 +8,9 @@
 import com.ruoyi.dataInterchange.dao.UPWarnMsgUrgeTodoAckDao;
 import com.ruoyi.dataInterchange.model.UPWarnMsgAdptInfo;
 import com.ruoyi.dataInterchange.model.UPWarnMsgUrgeTodoAck;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.dataInterchange.util.haikang.model.SubscriptionEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
@@ -23,6 +23,7 @@
  * @author zhibing.pu
  * @Date 2025/4/2 10:08
  */
+@Slf4j
 @RestController
 @RequestMapping("/warnMsgAdptInfo")
 public class UPWarnMsgAdptInfoController {
@@ -89,4 +90,16 @@
 		}
 		return R.ok();
 	}
+	
+	
+	/**
+	 * 海康威视报警信息推送
+	 * @return
+	 */
+	@ResponseBody
+	@PostMapping("/alarmNotice")
+	public void alarmNotice(@RequestBody SubscriptionEvent event) {
+		log.error("收到危海康的事件回调");
+		log.error(JSON.toJSONString(event));
+	}
 }
diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/Artemis.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/Artemis.java
new file mode 100644
index 0000000..ee4df37
--- /dev/null
+++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/Artemis.java
@@ -0,0 +1,130 @@
+package com.ruoyi.dataInterchange.util.haikang;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import com.ruoyi.dataInterchange.util.haikang.model.EventSubscriptionByEventTypesRequest;
+import com.ruoyi.dataInterchange.util.haikang.model.EventSubscriptionViewRequest;
+import com.ruoyi.dataInterchange.util.haikang.model.EventUnSubscriptionByEventTypesRequest;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 事件订阅工具类
+ * @author zhibing.pu
+ * @Date 2025/5/20 16:17
+ */
+@Slf4j
+@WebListener
+public class Artemis implements ServletContextListener {
+	
+	/**
+	 * STEP2:设置OpenAPI接口的上下文
+	 */
+	private static final String ARTEMIS_PATH = "/artemis";
+	/**
+	 * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数.
+	 *
+	 * ip:port : 平台门户/nginx的IP和端口(必须使用https协议,https端口默认为443)
+	 * appKey : 请填入appKey
+	 * appSecret : 请填入appSecret
+	 */
+	private static ArtemisConfig artemisConfig = new ArtemisConfig("112.18.106.230:443", "27273246", "vjvZA7X4hHUc0SbONht9");
+	
+	//按事件类型取消订阅
+	public static String eventUnSubscriptionByEventTypes(EventUnSubscriptionByEventTypesRequest eventUnSubscriptionByEventTypesRequest) throws Exception {
+		String eventUnSubscriptionByEventTypesDataApi = ARTEMIS_PATH +"/api/eventService/v1/eventUnSubscriptionByEventTypes";
+		Map<String,String> path = new HashMap<String,String>(2){
+			{
+				put("https://",eventUnSubscriptionByEventTypesDataApi);
+			}
+		};
+		String body= JSON.toJSONString(eventUnSubscriptionByEventTypesRequest);
+		String result =ArtemisHttpUtil.doPostStringArtemis(artemisConfig,path,body,null,null,"application/json");
+		return result;
+	}
+	
+	@Override
+	public void contextInitialized(ServletContextEvent sce) {
+		try {
+			//先查询是否订阅事件
+			EventSubscriptionViewRequest eventSubscriptionViewRequest = new EventSubscriptionViewRequest();
+			eventSubscriptionViewRequest.setSubWay(1);
+			String eventSubscriptionView = Artemis.eventSubscriptionView(eventSubscriptionViewRequest);
+			JSONObject jsonObject = JSON.parseObject(eventSubscriptionView);
+			String code = jsonObject.getString("code");
+			if("200".equals(code)){
+				JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("detail");
+				List<String> list = new ArrayList<>();
+				for (int i = 0; i < jsonArray.size(); i++) {
+					JSONArray eventTypes = jsonArray.getJSONObject(i).getJSONArray("eventTypes");
+					eventTypes.forEach(eventType -> {
+						list.add(eventType.toString());
+					});
+				}
+				//告警事件类型
+				if(!list.contains("5201154049")){
+					//订阅事件
+					EventSubscriptionByEventTypesRequest eventSubscriptionByEventTypesRequest = new EventSubscriptionByEventTypesRequest();
+					eventSubscriptionByEventTypesRequest.setSubWay(1);
+					eventSubscriptionByEventTypesRequest.setEventDest("http://221.182.45.100:1000/dataInterchange/warnMsgAdptInfo/alarmNotice");
+					eventSubscriptionByEventTypesRequest.setEventTypes(new ArrayList<String>(){{
+						add("5201154049");
+					}});
+					String subscription = Artemis.eventSubscriptionByEventTypes(eventSubscriptionByEventTypesRequest);
+					jsonObject = JSON.parseObject(subscription);
+					code = jsonObject.getString("code");
+					if(!"200".equals(code)){
+						log.error("告警事件订阅失败");
+					}else {
+						log.info("告警事件订阅成功");
+					}
+				}
+			}else{
+				log.error("查询事件订阅信息失败");
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	//查询事件订阅信息
+	public static String eventSubscriptionView(EventSubscriptionViewRequest eventSubscriptionViewRequest) throws Exception {
+		String eventSubscriptionViewDataApi = ARTEMIS_PATH +"/api/eventService/v1/eventSubscriptionView";
+		Map<String,String> path = new HashMap<String,String>(2){
+			{
+				put("https://",eventSubscriptionViewDataApi);
+			}
+		};
+		String body=JSON.toJSONString(eventSubscriptionViewRequest);
+		String result =ArtemisHttpUtil.doPostStringArtemis(artemisConfig,path,body,null,null,"application/json");
+		return result;
+	}
+	
+	//按事件类型订阅事件
+	public static String eventSubscriptionByEventTypes(EventSubscriptionByEventTypesRequest eventSubscriptionByEventTypesRequest) throws Exception {
+		String eventSubscriptionByEventTypesDataApi = ARTEMIS_PATH +"/api/eventService/v1/eventSubscriptionByEventTypes";
+		Map<String,String> path = new HashMap<String,String>(2){
+			{
+				put("https://",eventSubscriptionByEventTypesDataApi);
+			}
+		};
+		String body=JSON.toJSONString(eventSubscriptionByEventTypesRequest);
+		String result = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,path,body,null,null,"application/json");
+		return result;
+	}
+	
+	@Override
+	public void contextDestroyed(ServletContextEvent sce) {
+	
+	}
+}
diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionByEventTypesRequest.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionByEventTypesRequest.java
new file mode 100644
index 0000000..05d0c8d
--- /dev/null
+++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionByEventTypesRequest.java
@@ -0,0 +1,51 @@
+package com.ruoyi.dataInterchange.util.haikang.model;
+
+import java.util.ArrayList;
+
+public class EventSubscriptionByEventTypesRequest {
+	private ArrayList<String> eventTypes;
+	private Integer subWay;
+	private String eventDest;
+	private Integer subType;
+	private ArrayList<Integer> eventLvl;
+
+	public ArrayList<String> getEventTypes() {
+		return eventTypes;
+	}
+
+	public void setEventTypes(ArrayList<String> eventTypes) {
+		this.eventTypes = eventTypes;
+	}
+
+	public Integer getSubWay() {
+		return subWay;
+	}
+
+	public void setSubWay(Integer subWay) {
+		this.subWay = subWay;
+	}
+
+	public String getEventDest() {
+		return eventDest;
+	}
+
+	public void setEventDest(String eventDest) {
+		this.eventDest = eventDest;
+	}
+
+	public Integer getSubType() {
+		return subType;
+	}
+
+	public void setSubType(Integer subType) {
+		this.subType = subType;
+	}
+
+	public ArrayList<Integer> getEventLvl() {
+		return eventLvl;
+	}
+
+	public void setEventLvl(ArrayList<Integer> eventLvl) {
+		this.eventLvl = eventLvl;
+	}
+}
diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionViewRequest.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionViewRequest.java
new file mode 100644
index 0000000..671f1af
--- /dev/null
+++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventSubscriptionViewRequest.java
@@ -0,0 +1,13 @@
+package com.ruoyi.dataInterchange.util.haikang.model;
+
+public class EventSubscriptionViewRequest {
+	private Integer subWay;
+
+	public Integer getSubWay() {
+		return subWay;
+	}
+
+	public void setSubWay(Integer subWay) {
+		this.subWay = subWay;
+	}
+}
diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventUnSubscriptionByEventTypesRequest.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventUnSubscriptionByEventTypesRequest.java
new file mode 100644
index 0000000..789d342
--- /dev/null
+++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/EventUnSubscriptionByEventTypesRequest.java
@@ -0,0 +1,24 @@
+package com.ruoyi.dataInterchange.util.haikang.model;
+
+import java.util.ArrayList;
+
+public class EventUnSubscriptionByEventTypesRequest {
+	private ArrayList<Integer> eventTypes;
+	private ArrayList<String> clientIds;
+
+	public ArrayList<Integer> getEventTypes() {
+		return eventTypes;
+	}
+
+	public void setEventTypes(ArrayList<Integer> eventTypes) {
+		this.eventTypes = eventTypes;
+	}
+
+	public ArrayList<String> getClientIds() {
+		return clientIds;
+	}
+
+	public void setClientIds(ArrayList<String> clientIds) {
+		this.clientIds = clientIds;
+	}
+}
diff --git a/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/SubscriptionEvent.java b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/SubscriptionEvent.java
new file mode 100644
index 0000000..90e76a7
--- /dev/null
+++ b/ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/haikang/model/SubscriptionEvent.java
@@ -0,0 +1,77 @@
+package com.ruoyi.dataInterchange.util.haikang.model;
+
+import lombok.Data;
+
+/**
+ * 订阅事件统一格式
+ * @author zhibing.pu
+ * @Date 2025/5/21 14:08
+ */
+@Data
+public class SubscriptionEvent {
+	/**
+	 * 方法名
+	 */
+	private String method;
+	/**
+	 * 事件参数信息
+	 */
+	private String params;
+	/**
+	 * 事件从接收者发出的时间
+	 */
+	private String sendTime;
+	/**
+	 * 事件类别,如视频事件、门禁事件
+	 */
+	private String ability;
+	/**
+	 * 事件信息
+	 */
+	private String events;
+	/**
+	 * 事件Id,标识事件的一次发生,同一
+	 * 事件发送多次需要ID相同
+	 */
+	private String eventId;
+	/**
+	 * 事件源编号,物理设备是资源编号
+	 */
+	private String srcIndex;
+	/**
+	 * 事件源类型
+	 */
+	private String srcType;
+	/**
+	 * 事件源名称,utf8
+	 */
+	private String srcName;
+	/**
+	 * 事件类型
+	 */
+	private String eventType;
+	/**
+	 * 事件状态, 0-瞬时 1-开始 2-停止 3-事件脉冲 4-事件联动结果更新
+	 */
+	private Integer status;
+	/**
+	 * 事件等级:0-未配置, 非0-配置登记的事件,注意,此处事件等级是指在事件联动中配置的等级
+	 */
+	private Integer eventLvl;
+	/**
+	 * 脉冲超时时间,一个持续性的事件,上报的间隔
+	 */
+	private Integer timeout;
+	/**
+	 * 事件发生时间
+	 */
+	private String happenTime;
+	/**
+	 * 事件发生的事件源父设备,无-空字符串
+	 */
+	private String srcParentIdex;
+	/**
+	 * 事件其它扩展信息
+	 */
+	private String data;
+}

--
Gitblit v1.7.1