Browse Source

增加子系统连接状态

menglu 3 years ago
parent
commit
d6f4c60d21

+ 6 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/rest/RestApi.java

@@ -94,6 +94,12 @@ public class RestApi {
 		return result;
 	}
 
+	@PostMapping(path = { "/subsystem_connect_status", "/zkt-sdk/subsystem_connect_status" }, produces = "application/json;charset=UTF-8")
+	public String subsystem_connect_status(HttpServletRequest request) {
+		String result = RestUtil.subsystem_connect_status();
+		return result;
+	}
+
 	@PostMapping(path = { "/getEquipStaticInfo", "/zkt-sdk/getEquipStaticInfo" }, produces = "application/json;charset=UTF-8")
 	public String getEquipStaticInfo(@RequestBody String param, HttpServletRequest request) {
 		String result = RestUtil.getEquipStaticInfo(param).toJSONString();

+ 25 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/rest/RestUtil.java

@@ -1,6 +1,7 @@
 package com.persagy.ibms.data.sdk.service.rest;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -12,6 +13,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.persagy.ibms.core.data.SceneDataObject;
 import com.persagy.ibms.core.data.SceneDataPrimitive;
 import com.persagy.ibms.core.data.SceneDataSet;
 import com.persagy.ibms.core.data.SceneDataValue;
@@ -250,6 +252,29 @@ public class RestUtil {
 		return JSONObject.toJSONString(result, SerializerFeature.WriteMapNullValue);
 	}
 
+	public static String subsystem_connect_status() {
+		RepositoryImpl Repository = RepositoryContainer.instance;
+		Date currTime = new Date();
+		for (SceneDataObject sdo_connect : Repository.subsystem_connect_status.set) {
+			SceneDataValue sdv_connect = sdo_connect.get("连接状态");
+			if (sdv_connect.value_array != null) {
+				for (SceneDataObject connectInner : sdv_connect.value_array.set) {
+					SceneDataValue sdvInner = connectInner.get("连接状态");
+					if (currTime.getTime() - sdvInner.last_compute_time.getTime() > 1000L * 60 * 15) {
+						sdvInner.value_prim.value = 0;
+					}
+				}
+			}
+			if (sdv_connect.value_prim.value != null) {
+				if (currTime.getTime() - sdv_connect.last_compute_time.getTime() > 1000L * 60 * 15) {
+					sdv_connect.value_prim.value = 0;
+				}
+			}
+		}
+		Object result = Repository.subsystem_connect_status.toJSON(2);
+		return JSONObject.toJSONString(result, SerializerFeature.WriteMapNullValue);
+	}
+
 	public static String getIp(HttpServletRequest request) {
 		// 获取请求ip地址
 		String ip = request.getHeader("x-forwarded-for");

+ 20 - 7
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RWDDownloadUtil.java

@@ -298,6 +298,19 @@ public class RWDDownloadUtil {
 		}
 
 		log.debug("Download zkt physical world begin " + path);
+		JSONArray sceneArray;
+		{
+			JSONArray pathInner = new JSONArray();
+			pathInner.add("基础");
+			pathInner.add("产品模块");
+			JSONObject param = new JSONObject();
+			param.put("path", pathInner);
+			String post_result = HttpClientUtil.post(Constant.rwd_url + "/post?projectId=" + RepositoryContainer.RepositoryProject.projectId
+					+ "&groupCode=" + RepositoryContainer.RepositoryProject.groupCode, param.toJSONString());
+			sceneArray = JSON.parseArray(post_result);
+			sceneArray = sceneArray == null ? new JSONArray() : sceneArray;
+			FileUtil.Save(path + Constant.getSeperator() + "sceneArray.json", FastJsonUtil.toFormatString(sceneArray));
+		}
 		JSONArray classArray;
 		{
 			JSONObject param = new JSONObject();
@@ -344,9 +357,9 @@ public class RWDDownloadUtil {
 			if (Constant.alarm_service_name.equalsIgnoreCase("ibms-alarm")) {
 				boolean use_group = true;
 				if (use_group) {
-					String post_result = HttpClientUtil
-							.get(Constant.alarm_url + "/alarm-record/selectItemGroupCode" + "?appId=" + "0" + "&userId=" + "systemId" + "&projectId="
-									+ RepositoryContainer.RepositoryProject.projectId + "&groupCode=" + RepositoryContainer.RepositoryProject.groupCode);
+					String post_result = HttpClientUtil.get(Constant.alarm_url + "/alarm-record/selectItemGroupCode" + "?appId=" + "0" + "&userId="
+							+ "systemId" + "&projectId=" + RepositoryContainer.RepositoryProject.projectId + "&groupCode="
+							+ RepositoryContainer.RepositoryProject.groupCode);
 					JSONObject resultJSON = JSON.parseObject(post_result);
 					JSONArray Content = resultJSON.getJSONArray("Item");
 					for (int ii = 0; ii < Content.size(); ii++) {
@@ -416,10 +429,10 @@ public class RWDDownloadUtil {
 					for (int ii = 0; ii < itemListResultContent.size(); ii++) {
 						JSONObject itemAlarmType = itemListResultContent.getJSONObject(ii);
 						String itemId = itemAlarmType.getString("id");
-						String alarmDefineListString = HttpClientUtil
-								.get(Constant.alarm_url + "/alarm-config/configPage" + "?appId=" + "0" + "&userId=" + "systemId" + "&projectId="
-										+ RepositoryContainer.RepositoryProject.projectId + "&groupCode=" + RepositoryContainer.RepositoryProject.groupCode
-										+ "&ibmsSceneCode=" + ibmsSceneCode + "&ibmsClassCode=" + ibmsClassCode + "&itemId=" + itemId);
+						String alarmDefineListString = HttpClientUtil.get(Constant.alarm_url + "/alarm-config/configPage" + "?appId=" + "0"
+								+ "&userId=" + "systemId" + "&projectId=" + RepositoryContainer.RepositoryProject.projectId + "&groupCode="
+								+ RepositoryContainer.RepositoryProject.groupCode + "&ibmsSceneCode=" + ibmsSceneCode + "&ibmsClassCode="
+								+ ibmsClassCode + "&itemId=" + itemId);
 						JSONObject alarmDefineListJSON = JSON.parseObject(alarmDefineListString);
 						JSONArray alarmDefineListContent = alarmDefineListJSON.getJSONArray("Content");
 						for (int iii = 0; iii < alarmDefineListContent.size(); iii++) {

+ 37 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RWDLoadUtil.java

@@ -583,6 +583,43 @@ public class RWDLoadUtil {
 
 		String objectPath = validPath + Constant.getSeperator() + "object";
 		{
+			JSONArray sceneArray = FastJsonReaderUtil.Instance().ReadJSONArray(new File(validPath + Constant.getSeperator() + "sceneArray.json"));
+			{
+				SceneDataSet SceneDataSet = new SceneDataSet(false);
+				SceneDataSet.set = RWDUtil.array2SDOList(sceneArray);
+				Repository.ZKTSceneArray = SceneDataSet;
+			}
+			SceneDataSet subsystem_connect_status = new SceneDataSet(false);
+			Map<String, Boolean> subsystem_connect_statusMap = new ConcurrentHashMap<String, Boolean>();
+			for (int i = 0; i < sceneArray.size(); i++) {
+				JSONObject sceneItem = (JSONObject) sceneArray.get(i);
+				String ibmsSceneCode = (String) sceneItem.get("id");
+				String name = (String) sceneItem.get("名称");
+				if (!subsystem_connect_statusMap.containsKey(ibmsSceneCode)) {
+					SceneDataObject sdoInner = new SceneDataObject(null, null, null, null, null, null, null);
+					{
+						SceneDataValue sdvInner = new SceneDataValue(null, sdoInner, "ibmsSceneCode", null);
+						sdvInner.value_prim = new SceneDataPrimitive();
+						sdvInner.value_prim.value = ibmsSceneCode;
+						sdoInner.put("ibmsSceneCode", sdvInner);
+					}
+					{
+						SceneDataValue sdvInner = new SceneDataValue(null, sdoInner, "名称", null);
+						sdvInner.value_prim = new SceneDataPrimitive();
+						sdvInner.value_prim.value = name;
+						sdoInner.put("名称", sdvInner);
+					}
+					{
+						SceneDataValue sdvInner = new SceneDataValue(null, sdoInner, "连接状态", null);
+						sdvInner.value_prim = new SceneDataPrimitive();
+						sdoInner.put("连接状态", sdvInner);
+					}
+					subsystem_connect_status.set.add(sdoInner);
+					subsystem_connect_statusMap.put(ibmsSceneCode, true);
+				}
+			}
+			Repository.subsystem_connect_status = subsystem_connect_status;
+
 			JSONArray classArray = FastJsonReaderUtil.Instance().ReadJSONArray(new File(validPath + Constant.getSeperator() + "classArray.json"));
 			{
 				SceneDataSet SceneDataSet = new SceneDataSet(false, "zkt-class");

+ 2 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RWDRepositoryUtil.java

@@ -68,8 +68,10 @@ public class RWDRepositoryUtil {
 			Repository.id2object = RepositoryContainer.instance.id2object;
 			Repository.id2sdv = RepositoryContainer.instance.id2sdv;
 
+			Repository.ZKTSceneArray = RepositoryContainer.instance.ZKTSceneArray;
 			Repository.ZKTClassArray = RepositoryContainer.instance.ZKTClassArray;
 			Repository.ZKTObjectArrayDic = RepositoryContainer.instance.ZKTObjectArrayDic;
+			Repository.subsystem_connect_status = RepositoryContainer.instance.subsystem_connect_status;
 			Repository.ZKTAlarmTypeArray = RepositoryContainer.instance.ZKTAlarmTypeArray;
 
 			Repository.IBMSGroupArray = RepositoryContainer.instance.IBMSGroupArray;

+ 4 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RepositoryImpl.java

@@ -52,9 +52,11 @@ public class RepositoryImpl extends RepositoryBase {
 	public Map<String, SceneDataObject> id2sdv = new ConcurrentHashMap<String, SceneDataObject>();
 
 	// 管理范围
+	public SceneDataSet ZKTSceneArray = new SceneDataSet(false);
 	public SceneDataSet ZKTClassArray = new SceneDataSet(false);
 	public Map<String, Map<String, SceneDataValue>> ZKTObjectArrayDic = new ConcurrentHashMap<String, Map<String, SceneDataValue>>();
 	public SceneDataSet ZKTAlarmTypeArray = new SceneDataSet(false);
+	public SceneDataSet subsystem_connect_status = new SceneDataSet(false);
 
 	// 编组
 	public SceneDataSet IBMSGroupArray = new SceneDataSet(false);
@@ -179,6 +181,8 @@ public class RepositoryImpl extends RepositoryBase {
 			result = this.InfoPointListArray;
 		} else if (Source.equals("info-point-relation")) {
 			result = this.InfoPointRelationArray;
+		} else if (Source.equals("subsystem-connect-status")) {
+			result = this.subsystem_connect_status;
 		}
 		return result;
 	}

+ 59 - 1
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/websocket/IOTWebSocketClient.java

@@ -1,6 +1,7 @@
 package com.persagy.ibms.data.sdk.websocket;
 
 import java.net.URI;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 import org.java_websocket.client.WebSocketClient;
@@ -8,7 +9,9 @@ import org.java_websocket.handshake.ServerHandshake;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.persagy.ibms.core.data.SceneDataObject;
 import com.persagy.ibms.core.data.SceneDataPrimitive;
+import com.persagy.ibms.core.data.SceneDataSet;
 import com.persagy.ibms.core.data.SceneDataValue;
 import com.persagy.ibms.data.sdk.service.websocket.server.WebSocketUtil;
 import com.persagy.ibms.data.sdk.util.RepositoryContainer;
@@ -52,6 +55,7 @@ public class IOTWebSocketClient extends WebSocketClient {
 	@Override
 	public void onMessage(String arg0) {
 		try {
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
 			RepositoryImpl Repository = RepositoryContainer.instance;
 			Date currTime = new Date();
 			if (currTime.getTime() / (1000L * 60) != lastTime.getTime() / (1000L * 60)) {
@@ -71,7 +75,7 @@ public class IOTWebSocketClient extends WebSocketClient {
 				String[] splits = message.split(";");
 				recent_count += splits.length / 4;
 				for (int i = 0; i < splits.length; i += 4) {
-					// String time = splits[i + 0];
+					String time = splits[i + 0];
 					String meter = splits[i + 1];
 					String funcid = splits[i + 2];
 					String value = splits[i + 3];
@@ -86,6 +90,7 @@ public class IOTWebSocketClient extends WebSocketClient {
 							RepositoryContainer.RepositoryProject.sdv2point.putIfAbsent(sdvInner, point);
 						}
 						SceneDataValue data = RepositoryContainer.RepositoryProject.point2sdv.get(point);
+						data.value_prim.value = value;
 						if (type.equals("iot")) {
 							if (value.endsWith(".0")) {
 								value = value.substring(0, value.length() - ".0".length());
@@ -106,6 +111,59 @@ public class IOTWebSocketClient extends WebSocketClient {
 							if (!valueEqual) {
 								Repository.ProcessIOT(point);
 							}
+							// 检查是否子系统连接状态
+							if (meter.startsWith("subsystem_connect_status_")) {
+								String subsystem = meter.substring("subsystem_connect_status_".length());
+								int index_sub = subsystem.indexOf('_');
+								String product;
+								String tail = "";
+								if (index_sub == -1) {
+									product = subsystem;
+								} else {
+									product = subsystem.substring(0, index_sub);
+									tail = subsystem.substring(index_sub + 1);
+								}
+								for (SceneDataObject sdo_connect : Repository.subsystem_connect_status.set) {
+									String ibmsSceneCode = (String) sdo_connect.get("ibmsSceneCode").value_prim.value;
+									if (product.equals(ibmsSceneCode)) {
+										SceneDataValue sdv_connect = sdo_connect.get("连接状态");
+										if (tail != null && tail.length() > 0) {
+											if (sdv_connect.value_array == null) {
+												sdv_connect.value_array = new SceneDataSet(false);
+											}
+											SceneDataObject existItem = null;
+											for (SceneDataObject connectInner : sdv_connect.value_array.set) {
+												String nameInner = (String) connectInner.get("名称").value_prim.value;
+												if (nameInner.equals(tail)) {
+													existItem = connectInner;
+													break;
+												}
+											}
+											if (existItem == null) {
+												existItem = new SceneDataObject(null, null, null, sdv_connect, null, null, null);
+												{
+													SceneDataValue existItem_sdv = new SceneDataValue(null, existItem, "名称", null);
+													existItem_sdv.value_prim = new SceneDataPrimitive();
+													existItem_sdv.value_prim.value = tail;
+													existItem.put("名称", existItem_sdv);
+												}
+												{
+													SceneDataValue existItem_sdv = new SceneDataValue(null, existItem, "连接状态", null);
+													existItem_sdv.value_prim = new SceneDataPrimitive();
+													existItem.put("连接状态", sdvInner);
+												}
+												sdv_connect.value_array.set.add(existItem);
+											}
+											SceneDataValue connect_sdv_tmp = existItem.get("连接状态");
+											connect_sdv_tmp.value_prim.value = valueNew;
+											connect_sdv_tmp.last_compute_time = sdf.parse(time);
+										} else {
+											sdv_connect.value_prim.value = valueNew;
+											sdv_connect.last_compute_time = sdf.parse(time);
+										}
+									}
+								}
+							}
 						} else if (type.equals("text")) {
 							data.value_prim.value = value;
 						}