Prechádzať zdrojové kódy

路径推送解决一部分

menglu 3 rokov pred
rodič
commit
c7c77d0221

+ 2 - 10
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/rest/DependencyUtil.java

@@ -18,11 +18,7 @@ public class DependencyUtil {
 		String type = (String) param.get("type");
 		if (type.equals("path")) {
 			JSONArray path = (JSONArray) param.get("path");
-			String[] valuePath = new String[path.size()];
-			for (int i = 0; i < path.size(); i++) {
-				valuePath[i] = path.getString(i);
-			}
-			Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
+			Object valueObject = ComputeUtil.getValueObject(Repository, path);
 			if (valueObject instanceof SceneDataValue) {
 				SceneDataValue sdv = (SceneDataValue) valueObject;
 				result = Repository.dependency.get_before(Repository, sdv);
@@ -44,11 +40,7 @@ public class DependencyUtil {
 			}
 		} else if (type.equals("path")) {
 			JSONArray path = (JSONArray) param.get("path");
-			String[] valuePath = new String[path.size()];
-			for (int i = 0; i < path.size(); i++) {
-				valuePath[i] = path.getString(i);
-			}
-			Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
+			Object valueObject = ComputeUtil.getValueObject(Repository, path);
 			if (valueObject instanceof SceneDataValue) {
 				SceneDataValue sdv = (SceneDataValue) valueObject;
 				result = Repository.dependency.get_after(Repository, sdv, new ArrayList<SceneDataValue>());

+ 8 - 37
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/rest/RestUtil.java

@@ -145,12 +145,8 @@ public class RestUtil {
 
 	public static String desc(String param) {
 		JSONArray path = JSON.parseArray(param);
-		String[] valuePath = new String[path.size()];
-		for (int i = 0; i < path.size(); i++) {
-			valuePath[i] = path.getString(i);
-		}
 		RepositoryImpl Repository = RepositoryContainer.instance;
-		Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
+		Object valueObject = ComputeUtil.getValueObject(Repository, path);
 		String result;
 		if (valueObject instanceof SceneDataValue) {
 			SceneDataValue currData = (SceneDataValue) valueObject;
@@ -214,16 +210,12 @@ public class RestUtil {
 	public static String show(String param) {
 		JSONObject json = JSON.parseObject(param);
 		JSONArray path = json.getJSONArray("path");
-		String[] valuePath = new String[path.size()];
-		for (int i = 0; i < path.size(); i++) {
-			valuePath[i] = path.getString(i);
-		}
 		int read_level = json.getIntValue("read_level");
-		String result = RestUtil.show(valuePath, read_level);
+		String result = RestUtil.show(path, read_level);
 		return result;
 	}
 
-	public static String show(String[] valuePath, int read_level) {
+	public static String show(JSONArray valuePath, int read_level) {
 		RepositoryImpl Repository = RepositoryContainer.instance;
 		try {
 			Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
@@ -250,28 +242,15 @@ public class RestUtil {
 		return batchResult;
 	}
 
-	public static Object post(JSONArray path) {
-		String[] valuePath = new String[path.size()];
-		for (int i = 0; i < path.size(); i++) {
-			valuePath[i] = path.getString(i);
-		}
-		Object result = RestUtil.post(valuePath);
-		return result;
-	}
-
 	public static Object post(String param) {
 		JSONArray path = JSON.parseArray(param);
-		String[] valuePath = new String[path.size()];
-		for (int i = 0; i < path.size(); i++) {
-			valuePath[i] = path.getString(i);
-		}
-		Object result = RestUtil.post(valuePath);
+		Object result = RestUtil.post(path);
 		return result;
 	}
 
-	public static Object post(String[] valuePath) {
+	public static Object post(JSONArray valuePath) {
 		RepositoryImpl Repository = RepositoryContainer.instance;
-		if (valuePath.length == 0) {
+		if (valuePath.size() == 0) {
 			Object valueJSON = Repository.objectData.toJSON(1);
 			return valueJSON;
 		}
@@ -323,11 +302,7 @@ public class RestUtil {
 				}
 			}
 
-			String[] valuePath = new String[path.size()];
-			for (int i = 0; i < path.size(); i++) {
-				valuePath[i] = path.getString(i);
-			}
-			JSONArray points = ControlUtil.set(Repository, path, valuePath, infoValueSet);
+			JSONArray points = ControlUtil.set(Repository, path, infoValueSet);
 			JSONArray success_points = new JSONArray();
 			JSONArray failure_points = new JSONArray();
 			for (int i = 0; i < points.size(); i++) {
@@ -522,11 +497,7 @@ public class RestUtil {
 		for (int i = 0; i < Items.size(); i++) {
 			JSONObject item = (JSONObject) Items.get(i);
 			JSONArray path = (JSONArray) item.get("path");
-			String[] valuePath = new String[path.size()];
-			for (int ii = 0; ii < path.size(); ii++) {
-				valuePath[ii] = path.getString(ii);
-			}
-			Object valueObject = ComputeUtil.getValueObject(RepositoryContainer.instance, valuePath);
+			Object valueObject = ComputeUtil.getValueObject(RepositoryContainer.instance, path);
 			Object drawObject = DrawUtil.drawObject(RepositoryContainer.instance, valueObject, ObjInfo2Point);
 			drawObjectList.add(drawObject);
 		}

+ 97 - 35
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/websocket/server/WebSocketUtil.java

@@ -8,11 +8,14 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.ibms.core.data.SceneDataObject;
 import com.persagy.ibms.core.data.SceneDataSet;
 import com.persagy.ibms.core.data.SceneDataValue;
+import com.persagy.ibms.core.util.ComputeUtil;
+import com.persagy.ibms.core.util.PathUtil;
 import com.persagy.ibms.core.util.RWDUtil;
 import com.persagy.ibms.data.sdk.util.ObjectInfo;
 import com.persagy.ibms.data.sdk.util.RepositoryContainer;
@@ -35,6 +38,9 @@ public class WebSocketUtil {
 
 	public static Map<String, Map<String, Object>> id2objId2Tag = new ConcurrentHashMap<String, Map<String, Object>>();
 
+	public static Map<String, Map<String, Boolean>> path2idList = new ConcurrentHashMap<String, Map<String, Boolean>>();
+	public static Map<String, Map<String, Boolean>> id2pathList = new ConcurrentHashMap<String, Map<String, Boolean>>();
+
 	public static synchronized void ProcessReceive(String id, Object ContentJSON) {
 		ProcessDisconnected(id);
 
@@ -45,30 +51,37 @@ public class WebSocketUtil {
 		id2objInfoIdList.put(id, objInfoIdList);
 		Map<String, Object> objId2Tag = new ConcurrentHashMap<String, Object>();
 		id2objId2Tag.put(id, objId2Tag);
+		Map<String, Boolean> pathList = new ConcurrentHashMap<String, Boolean>();
+		id2pathList.put(id, pathList);
+
 		JSONArray objArray = (JSONArray) ContentJSON;
 		for (int i = 0; i < objArray.size(); i++) {
 			JSONObject objJSON = objArray.getJSONObject(i);
-			String objId = (String) objJSON.get("objId");
-			if (objJSON.containsKey("websocket_tag")) {
-				objId2Tag.put(objId, objJSON.get("websocket_tag"));
-			}
-			if (objJSON.containsKey("infoCodeArray")) {
-				JSONArray infoCodeArray = (JSONArray) objJSON.get("infoCodeArray");
-				for (int ii = 0; ii < infoCodeArray.size(); ii++) {
-					String infoCode = (String) infoCodeArray.get(ii);
-					String objInfoId = objId + "-" + infoCode;
-					if (!objInfoId2idList.containsKey(objInfoId)) {
-						objInfoId2idList.put(objInfoId, new ConcurrentHashMap<String, Boolean>());
-					}
-					objInfoId2idList.get(objInfoId).put(id, true);
-					objInfoIdList.put(objInfoId, true);
+			// 对象IOT订阅
+			if (objJSON.containsKey("objId")) {
+				String objId = (String) objJSON.get("objId");
+				if (objJSON.containsKey("websocket_tag")) {
+					objId2Tag.putIfAbsent(objId, objJSON.get("websocket_tag"));
 				}
-			} else {
-				if (!objId2idList.containsKey(objId)) {
-					objId2idList.put(objId, new ConcurrentHashMap<String, Boolean>());
+				if (objJSON.containsKey("infoCodeArray")) {
+					JSONArray infoCodeArray = (JSONArray) objJSON.get("infoCodeArray");
+					for (int ii = 0; ii < infoCodeArray.size(); ii++) {
+						String infoCode = (String) infoCodeArray.get(ii);
+						String objInfoId = objId + "-" + infoCode;
+						objInfoId2idList.putIfAbsent(objInfoId, new ConcurrentHashMap<String, Boolean>());
+						objInfoId2idList.get(objInfoId).putIfAbsent(id, true);
+						objInfoIdList.putIfAbsent(objInfoId, true);
+					}
+				} else {
+					objId2idList.putIfAbsent(objId, new ConcurrentHashMap<String, Boolean>());
+					objId2idList.get(objId).putIfAbsent(id, true);
+					objIdList.putIfAbsent(objId, true);
 				}
-				objId2idList.get(objId).put(id, true);
-				objIdList.put(objId, true);
+			} else if (objJSON.containsKey("path")) {
+				JSONArray pathArray = (JSONArray) objJSON.get("path");
+				pathList.putIfAbsent(pathArray.toJSONString(), true);
+				path2idList.putIfAbsent(pathArray.toJSONString(), new ConcurrentHashMap<String, Boolean>());
+				path2idList.get(pathArray.toJSONString()).putIfAbsent(id, true);
 			}
 		}
 
@@ -76,29 +89,29 @@ public class WebSocketUtil {
 	}
 
 	public static synchronized void ProcessDisconnected(String id) {
-		for (String key : id2objIdList.keySet()) {
-			Map<String, Boolean> objIdList = id2objIdList.get(key);
-			for (String objId : objIdList.keySet()) {
-				Map<String, Boolean> idList = objId2idList.get(objId);
-				if (idList.containsKey(id)) {
-					idList.remove(id);
-				}
-			}
+		for (String objId : objId2idList.keySet()) {
+			Map<String, Boolean> idList = objId2idList.get(objId);
+			idList.remove(id);
 		}
 		id2objIdList.remove(id);
 
-		for (String key : id2objInfoIdList.keySet()) {
-			Map<String, Boolean> objInfoIdList = id2objInfoIdList.get(key);
-			for (String objInfoId : objInfoIdList.keySet()) {
-				Map<String, Boolean> idList = objInfoId2idList.get(objInfoId);
-				if (idList.containsKey(id)) {
-					idList.remove(id);
-				}
-			}
+		for (String objInfoId : objInfoId2idList.keySet()) {
+			Map<String, Boolean> idList = objInfoId2idList.get(objInfoId);
+			idList.remove(id);
 		}
 		id2objInfoIdList.remove(id);
 
 		id2objId2Tag.remove(id);
+
+		for (String path : path2idList.keySet()) {
+			Map<String, Boolean> idList = path2idList.get(path);
+			idList.remove(id);
+			if (idList.size() == 0) {
+				path2idList.remove(path);
+			}
+		}
+		id2pathList.remove(id);
+
 		idMap.remove(id);
 	}
 
@@ -161,7 +174,32 @@ public class WebSocketUtil {
 							sendItem.put("websocket_tag", objId2Tag.get(objId));
 						}
 						sendArray.add(sendItem);
+						// 发送
+						WebSocketChannelPool.Send(id, sendArray);
+						sendArray.clear();
 					}
+
+					Map<String, Boolean> pathList = id2pathList.get(id);
+					for (String path : pathList.keySet()) {
+						JSONArray pathArray = JSON.parseArray(path);
+						Object valueObject = ComputeUtil.getValueObject(Repository, pathArray);
+						if (valueObject instanceof SceneDataValue) {
+							SceneDataValue currData = (SceneDataValue) valueObject;
+							int depth = 1;
+							if (currData.rel_property != null) {
+								depth = Integer.parseInt(currData.rel_property.read_level);
+							}
+							Object data = currData.toJSON(true, depth);
+							JSONObject sendItem = new JSONObject();
+							sendItem.put("path", pathArray);
+							sendItem.put("data", data);
+							sendArray.add(sendItem);
+							// 发送
+							WebSocketChannelPool.Send(id, sendArray);
+							sendArray.clear();
+						}
+					}
+
 					if (sendArray.size() > 0) {
 						WebSocketChannelPool.Send(id, sendArray);
 					}
@@ -173,6 +211,30 @@ public class WebSocketUtil {
 		}
 	}
 
+	public static void ProcessComputeOccur(SceneDataValue sdv) {
+		try {
+			JSONArray pathArray = new JSONArray();
+			PathUtil.getDataPath(sdv, pathArray);
+			if (path2idList.containsKey(pathArray.toString())) {
+				Map<String, Boolean> idList = path2idList.get(pathArray.toString());
+				JSONArray sendArray = new JSONArray();
+				JSONObject sendItem = new JSONObject();
+				sendItem.put("path", pathArray);
+				int depth = 1;
+				if (sdv.rel_property != null) {
+					depth = Integer.parseInt(sdv.rel_property.read_level);
+				}
+				Object data = sdv.toJSON(true, depth);
+				sendItem.put("data", data);
+				for (String id : idList.keySet()) {
+					WebSocketChannelPool.Send(id, sendArray);
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
 	public static void ProcessIOTReceived(JSONObject json) {
 		try {
 			Runnable runnable = new Runnable() {

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

@@ -31,10 +31,10 @@ public class ControlUtil {
 		return result;
 	}
 
-	public static JSONArray set(RepositoryImpl Repository, JSONArray path, String[] valuePath, JSONObject infoValueSet) throws Exception {
+	public static JSONArray set(RepositoryImpl Repository, JSONArray path, JSONObject infoValueSet) throws Exception {
 
 		JSONArray result;
-		Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
+		Object valueObject = ComputeUtil.getValueObject(Repository, path);
 		if (valueObject instanceof SceneDataValue) {
 			SceneDataValue currData = (SceneDataValue) valueObject;
 			if (currData.value_array != null) {

+ 10 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RWDAlarmUtil.java

@@ -17,6 +17,7 @@ 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.core.util.LogUtil;
+import com.persagy.ibms.core.util.PathUtil;
 import com.persagy.ibms.core.util.RWDUtil;
 
 import lombok.extern.slf4j.Slf4j;
@@ -538,6 +539,15 @@ public class RWDAlarmUtil {
 
 			RepositoryImpl Repository = RepositoryContainer.instance;
 			Repository.addWaitCompute(RepositoryContainer.RepositoryProject.alarmArray);
+			try {
+				String path_alarmList = PathUtil.getDataPath(alarmList);
+				String path_alarmCount = PathUtil.getDataPath(alarmCount);
+				log.warn(path_alarmList);
+				log.warn(path_alarmCount);
+			} catch (Exception e) {
+			}
+			Repository.ComputeOccur(alarmList);
+			Repository.ComputeOccur(alarmCount);
 			Repository.addWaitCompute(alarmList);
 			Repository.addWaitCompute(alarmCount);
 		}

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

@@ -12,6 +12,7 @@ import com.persagy.ibms.core.data.SceneDataSet;
 import com.persagy.ibms.core.data.SceneDataValue;
 import com.persagy.ibms.core.util.RWDUtil;
 import com.persagy.ibms.core.util.RepositoryBase;
+import com.persagy.ibms.data.sdk.service.websocket.server.WebSocketUtil;
 
 public class RepositoryImpl extends RepositoryBase {
 	public Map<String, JSONObject> general_queryMap;
@@ -299,4 +300,8 @@ public class RepositoryImpl extends RepositoryBase {
 		}
 		return add_count;
 	}
+
+	public void ComputeOccur(SceneDataValue sdv) {
+		WebSocketUtil.ProcessComputeOccur(sdv);
+	}
 }