ソースを参照

完善计算链路

menglu 3 年 前
コミット
2d8ac1ca6b

+ 5 - 2
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/DownloadThread_config.java

@@ -80,13 +80,16 @@ public class DownloadThread_config extends Thread {
 	private boolean Process_config() throws Exception {
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
 		String validPath = Constant.getLatestPath(Constant.config, false);
-		File valid = new File(validPath);
 
 		String tmpPath = Constant.config + Constant.getSeperator() + "tmp" + ".json";
 		RWDDownloadUtil.LoadConfig(tmpPath);
 		File tmp = new File(tmpPath);
 
-		boolean compare_valid = FileUtil.compareRecursive(valid, tmp);
+		boolean compare_valid = false;
+		if (validPath != null) {
+			File valid = new File(validPath);
+			compare_valid = FileUtil.compareRecursive(valid, tmp);
+		}
 		boolean result;
 		if (!compare_valid) {
 			Date currTime = new Date();

+ 76 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/RealtimeComputeThread.java

@@ -0,0 +1,76 @@
+package com.persagy.ibms.data.sdk.service;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.stereotype.Component;
+
+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.data.sdk.util.RepositoryContainer;
+import com.persagy.ibms.data.sdk.util.RepositoryImpl;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Component
+public class RealtimeComputeThread extends Thread {
+	@PostConstruct
+	public void init() {
+		new Thread(this).start();
+	}
+
+	private volatile boolean stop = false;
+
+	public void requestStop() {
+		stop = true;
+		try {
+			this.join();
+		} catch (InterruptedException e) {
+			log.error(e.getMessage(), e);
+		}
+	}
+
+	public void run() {
+		while (true) {
+			try {
+				Thread.sleep(1000L);
+			} catch (InterruptedException e) {
+				log.error(e.getMessage(), e);
+			}
+
+			if (DaemonThread.initialized) {
+				break;
+			}
+		}
+
+		while (!stop) {
+			try {
+				Thread.sleep(1000L);
+			} catch (InterruptedException e) {
+				log.error(e.getMessage(), e);
+			}
+
+			RepositoryImpl Repository = RepositoryContainer.instance;
+			if (Repository.enable_factor) {
+				int WaitCompute_size = Repository.WaitCompute.size();
+				if (WaitCompute_size > 0) {
+					log.warn("WaitCompute: " + WaitCompute_size);
+				}
+				while (true) {
+					SceneDataValue sdv = Repository.WaitCompute.poll();
+					if (sdv == null) {
+						break;
+					}
+					try {
+						log.warn(PathUtil.getDataPath(sdv));
+						ComputeUtil.computeProperty(Repository, sdv);
+						Repository.addWaitCompute(sdv);
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+	}
+}

+ 11 - 4
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/rest/DependencyUtil.java

@@ -1,9 +1,13 @@
 package com.persagy.ibms.data.sdk.service.rest;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.ibms.core.data.SceneDataValue;
 import com.persagy.ibms.core.util.ComputeUtil;
+import com.persagy.ibms.data.sdk.util.ObjectInfo;
 import com.persagy.ibms.data.sdk.util.RepositoryContainer;
 import com.persagy.ibms.data.sdk.util.RepositoryImpl;
 
@@ -21,7 +25,7 @@ public class DependencyUtil {
 			Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
 			if (valueObject instanceof SceneDataValue) {
 				SceneDataValue sdv = (SceneDataValue) valueObject;
-				result = Repository.dependency.get_before(sdv);
+				result = Repository.dependency.get_before(Repository, sdv);
 			}
 		}
 		return result;
@@ -33,8 +37,11 @@ public class DependencyUtil {
 		String type = (String) param.get("type");
 		if (type.equals("point")) {
 			String point = (String) param.get("point");
-			SceneDataValue sdv = RepositoryContainer.RepositoryBase.point2sdv.get(point);
-			result = Repository.dependency.get_after(Repository, sdv);
+			result = new JSONObject();
+			List<ObjectInfo> ObjectInfoList = Repository.point2ObjectInfoList.get(point);
+			for (ObjectInfo ObjectInfo : ObjectInfoList) {
+				result.put(ObjectInfo.objId, ObjectInfo.infoCode);
+			}
 		} else if (type.equals("path")) {
 			JSONArray path = (JSONArray) param.get("path");
 			String[] valuePath = new String[path.size()];
@@ -44,7 +51,7 @@ public class DependencyUtil {
 			Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
 			if (valueObject instanceof SceneDataValue) {
 				SceneDataValue sdv = (SceneDataValue) valueObject;
-				result = Repository.dependency.get_after(Repository, sdv);
+				result = Repository.dependency.get_after(Repository, sdv, new ArrayList<SceneDataValue>());
 			}
 		}
 		return result;

+ 6 - 2
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/rest/RestUtil.java

@@ -227,7 +227,9 @@ public class RestUtil {
 		RepositoryImpl Repository = RepositoryContainer.instance;
 		try {
 			Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
-			RecursiveUtil.refreshObject(Repository, valueObject);
+			if (!Repository.enable_factor) {
+				RecursiveUtil.refreshObject(Repository, valueObject);
+			}
 			Object valueJSON = ComputeUtil.getValueJSON(valueObject, read_level, true);
 			return JSONObject.toJSONString(valueJSON, SerializerFeature.WriteMapNullValue);
 		} catch (Exception e) {
@@ -275,7 +277,9 @@ public class RestUtil {
 		}
 		try {
 			Object valueObject = ComputeUtil.getValueObject(Repository, valuePath);
-			RecursiveUtil.refreshObject(Repository, valueObject);
+			if (!Repository.enable_factor) {
+				RecursiveUtil.refreshObject(Repository, valueObject);
+			}
 			Object valueJSON = ComputeUtil.getValueJSON(valueObject);
 			return valueJSON;
 		} catch (Exception e) {

+ 5 - 1
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/ObjectInfo.java

@@ -1,10 +1,14 @@
 package com.persagy.ibms.data.sdk.util;
 
+import com.persagy.ibms.core.data.SceneDataObject;
+
 public class ObjectInfo {
+	public SceneDataObject obj;
 	public String objId;
 	public String infoCode;
 
-	public ObjectInfo(String id, String info) {
+	public ObjectInfo(SceneDataObject obj, String id, String info) {
+		this.obj = obj;
 		this.objId = id;
 		this.infoCode = info;
 	}

+ 35 - 23
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RWDLoadUtil.java

@@ -109,10 +109,9 @@ public class RWDLoadUtil {
 
 		String objectPath = validPath + Constant.getSeperator() + "object";
 		{
-			Repository.objectArrayAll = new SceneDataSet(false, "rwd/object/all");
 			File root = new File(objectPath);
 			File[] files = root.listFiles();
-			Map<String, SceneDataSet> objectArrayDic = new ConcurrentHashMap<String, SceneDataSet>();
+			Map<String, SceneDataValue> objectArrayDic = new ConcurrentHashMap<String, SceneDataValue>();
 			for (File file : files) {
 				int index_ = file.getName().indexOf('.');
 				String code = file.getName().substring(0, index_);
@@ -175,23 +174,30 @@ public class RWDLoadUtil {
 					}
 				}
 				SceneDataSet.set = RWDUtil.array2SDOList(array);
-				Repository.objectArrayAll.set.addAll(SceneDataSet.set);
+				SceneDataValue SceneDataValue = new SceneDataValue(null, null, null, null);
 				for (SceneDataObject sdv : SceneDataSet.set) {
 					String id = (String) sdv.value_object.get("id").value_prim.value;
 					Repository.id2sdv.put(id, sdv);
+					sdv.parentArrayData = SceneDataValue;
 				}
+				SceneDataValue.value_array = SceneDataSet;
+				SceneDataValue.finish = true;
 				// 一级对象
-				objectArrayDic.put(code, SceneDataSet);
+				objectArrayDic.put(code, SceneDataValue);
 				String objType = Repository.code2objTypeMap.get(code);
 				if (objType != null) {
 					if (!objectArrayDic.containsKey(objType)) {
-						objectArrayDic.put(objType, new SceneDataSet(false, "rwd/object/" + objType));
+						objectArrayDic.put(objType, new SceneDataValue(null, null, null, null));
 					}
-					objectArrayDic.get(objType).set.addAll(SceneDataSet.set);
+					objectArrayDic.get(objType).value_array = new SceneDataSet(false);
+					objectArrayDic.get(objType).value_array.set = new ArrayList<SceneDataObject>();
+					objectArrayDic.get(objType).value_array.set.addAll(SceneDataSet.set);
 					for (String col : SceneDataSet.getColChange().keySet()) {
-						objectArrayDic.get(objType).setColChange(col);
+						objectArrayDic.get(objType).value_array.setColChange(col);
 					}
 				}
+				// 全部对象
+				Repository.objectArrayAll.set.addAll(SceneDataSet.set);
 			}
 			Repository.objectArrayDic = objectArrayDic;
 		}
@@ -200,7 +206,7 @@ public class RWDLoadUtil {
 			Map<String, Map<String, SceneDataObject>> objType2id2Value = new ConcurrentHashMap<String, Map<String, SceneDataObject>>();
 			for (String objType : Constant.objType_hasRelation.keySet()) {
 				Map<String, SceneDataObject> id2Value = new ConcurrentHashMap<String, SceneDataObject>();
-				SceneDataSet sdvList = Repository.objectArrayDic.get(objType);
+				SceneDataSet sdvList = Repository.objectArrayDic.get(objType).value_array;
 				for (SceneDataObject sdv : sdvList.set) {
 					String id = (String) sdv.value_object.get("id").value_prim.value;
 					id2Value.put(id, sdv);
@@ -251,11 +257,12 @@ public class RWDLoadUtil {
 			}
 			String classCode = key;
 			SceneDataSet infoArray = Repository.infoArrayDic.get(classCode);
-			SceneDataSet objectArray = Repository.objectArrayDic.get(key);
+			SceneDataSet objectArray = Repository.objectArrayDic.get(key).value_array;
 			for (int index_object = 0; index_object < objectArray.set.size(); index_object++) {
 				SceneDataObject obj = objectArray.set.get(index_object);
 				String obj_id = (String) obj.get("id").value_prim.value;
 				for (String Key : obj.keySet()) {
+					SceneDataValue infoValue = obj.get(Key);
 					Object value_primitive = obj.get(Key).value_prim.value;
 					if (RWDUtil.isRunParam(infoArray.set, Key)) {
 						if (!(value_primitive instanceof String)) {
@@ -271,7 +278,7 @@ public class RWDLoadUtil {
 									Repository.point2ObjectInfoList.put(point, new CopyOnWriteArrayList<ObjectInfo>());
 								}
 								List<ObjectInfo> ObjectInfoList = Repository.point2ObjectInfoList.get(point);
-								ObjectInfoList.add(new ObjectInfo(obj_id, Key));
+								ObjectInfoList.add(new ObjectInfo(obj, obj_id, Key));
 								// 表号功能号改为null
 								{
 									SceneDataValue sdv = new SceneDataValue(null, null, null, null);
@@ -284,7 +291,7 @@ public class RWDLoadUtil {
 									}
 								}
 								SceneDataValue data = RepositoryContainer.RepositoryBase.point2sdv.get(point);
-								obj.put(Key, data);
+								infoValue.value_prim = data.value_prim;
 								{
 									SceneDataValue sdv = new SceneDataValue(null, null, null, null);
 									sdv.finish = true;
@@ -308,7 +315,7 @@ public class RWDLoadUtil {
 									Repository.set2ObjectInfoList.put(point, new CopyOnWriteArrayList<ObjectInfo>());
 								}
 								List<ObjectInfo> ObjectInfoList = Repository.set2ObjectInfoList.get(point);
-								ObjectInfoList.add(new ObjectInfo(obj_id, Key));
+								ObjectInfoList.add(new ObjectInfo(obj, obj_id, Key));
 								// 表号功能号改为null
 								{
 									SceneDataValue sdv = new SceneDataValue(null, null, null, null);
@@ -321,7 +328,7 @@ public class RWDLoadUtil {
 									}
 								}
 								SceneDataValue data = RepositoryContainer.RepositoryBase.set2sdv.get(point);
-								obj.put(Key, data);
+								infoValue.value_prim = data.value_prim;
 								{
 									SceneDataValue sdv = new SceneDataValue(null, null, null, null);
 									sdv.finish = true;
@@ -513,7 +520,7 @@ public class RWDLoadUtil {
 			if (!objType.equals("equipment") && !objType.equals("system") && !objType.equals("space")) {
 				continue;
 			}
-			SceneDataSet objectArray = Repository.objectArrayDic.get(classCode);
+			SceneDataSet objectArray = Repository.objectArrayDic.get(classCode).value_array;
 			for (int i = 0; i < objectArray.set.size(); i++) {
 				SceneDataObject objectItem = objectArray.set.get(i);
 				String objId = (String) objectItem.get("id").value_prim.value;
@@ -565,7 +572,7 @@ public class RWDLoadUtil {
 				SceneDataSet.set = RWDUtil.array2SDOList(classArray);
 				Repository.ZKTClassArray = SceneDataSet;
 			}
-			Map<String, Map<String, SceneDataSet>> objectArrayDicZKT = new ConcurrentHashMap<String, Map<String, SceneDataSet>>();
+			Map<String, Map<String, SceneDataValue>> objectArrayDicZKT = new ConcurrentHashMap<String, Map<String, SceneDataValue>>();
 			for (int i = 0; i < classArray.size(); i++) {
 				JSONObject classItem = (JSONObject) classArray.get(i);
 				String ibmsSceneCode = (String) classItem.get("ibmsSceneCode");
@@ -573,9 +580,9 @@ public class RWDLoadUtil {
 				String code = (String) classItem.get("code");
 				String flag = (String) classItem.get("flag");
 				if (!objectArrayDicZKT.containsKey(ibmsSceneCode)) {
-					objectArrayDicZKT.put(ibmsSceneCode, new ConcurrentHashMap<String, SceneDataSet>());
+					objectArrayDicZKT.put(ibmsSceneCode, new ConcurrentHashMap<String, SceneDataValue>());
 				}
-				Map<String, SceneDataSet> mapInner = objectArrayDicZKT.get(ibmsSceneCode);
+				Map<String, SceneDataValue> mapInner = objectArrayDicZKT.get(ibmsSceneCode);
 				log.info(objectPath + Constant.getSeperator() + ibmsSceneCode + " " + ibmsClassCode);
 				JSONArray array = FastJsonReaderUtil.Instance().ReadJSONArray(
 						new File(objectPath + Constant.getSeperator() + ibmsSceneCode + Constant.getSeperator() + ibmsClassCode + ".json"));
@@ -587,7 +594,7 @@ public class RWDLoadUtil {
 						SceneDataSet.setColChange(info_code);
 					}
 				}
-				// SceneDataSet.set = RWDUtil.array2SDOList(array);
+				SceneDataValue SceneDataValue = new SceneDataValue(null, null, null, null);
 				for (int ii = 0; ii < array.size(); ii++) {
 					JSONObject arrayItem = array.getJSONObject(ii);
 					String id = (String) arrayItem.get("id");
@@ -597,7 +604,7 @@ public class RWDLoadUtil {
 						continue;
 					}
 					if (flag != null && flag.equals("reference")) {
-
+						SceneDataSet.set.add(sdo);
 					} else {
 						{
 							SceneDataValue svInner = new SceneDataValue(null, null, null, null);
@@ -620,10 +627,13 @@ public class RWDLoadUtil {
 							svInner.value_prim.value = ibmsxianshimingcheng;
 							sdo.put("ibmsxianshimingcheng", svInner);
 						}
+						SceneDataObject sodChild = new SceneDataObject(Repository, null, null, SceneDataValue, null, null, sdo);
+						SceneDataSet.set.add(sodChild);
 					}
-					SceneDataSet.set.add(sdo);
 				}
-				mapInner.put(ibmsClassCode, SceneDataSet);
+				SceneDataValue.value_array = SceneDataSet;
+				SceneDataValue.finish = true;
+				mapInner.put(ibmsClassCode, SceneDataValue);
 			}
 			Repository.ZKTObjectArrayDic = objectArrayDicZKT;
 		}
@@ -807,7 +817,8 @@ public class RWDLoadUtil {
 						}
 						SceneDataObject SELTCC = Repository.id2sdv.get(objId);
 						SceneDataValue SELTCUArray = SELTCC.get("被设备控制");
-						if (SELTCUArray.value_array.set.size() > 0) {
+						if (SELTCUArray != null && SELTCUArray.value_array != null && SELTCUArray.value_array.set != null
+								&& SELTCUArray.value_array.set.size() > 0) {
 							SceneDataObject SELTCU = SELTCUArray.value_array.set.get(0);
 							String SELTCU_id = (String) SELTCU.get("id").value_prim.value;
 							String SELTCU_name = getValidName(SELTCU);
@@ -832,7 +843,8 @@ public class RWDLoadUtil {
 						}
 						if (product.equals("ggzm")) {
 							SceneDataValue floorArray = SELTCC.get("所在楼层");
-							if (floorArray.value_array.set.size() == 1) {
+							if (floorArray != null && floorArray.value_array != null && floorArray.value_array.set != null
+									&& floorArray.value_array.set.size() == 1) {
 								SceneDataObject floor = floorArray.value_array.set.get(0);
 								String floorId = (String) floor.get("id").value_prim.value;
 								String floorName = (String) floor.get("localName").value_prim.value;

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

@@ -77,7 +77,9 @@ public class RWDRepositoryUtil {
 			Repository.InfoPointRelationArray = RepositoryContainer.instance.InfoPointRelationArray;
 		}
 
+		Repository.clear_children();
 		Repository.dependency.clear();
+		Repository.refresh_children();
 		Repository.refresh_dependency();
 
 		log.warn("LoadConfig");

+ 64 - 16
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RepositoryImpl.java

@@ -1,8 +1,10 @@
 package com.persagy.ibms.data.sdk.util;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -31,7 +33,7 @@ public class RepositoryImpl extends RepositoryBase {
 	public Map<String, SceneDataSet> infoArrayDic = new ConcurrentHashMap<String, SceneDataSet>();
 	public Map<String, JSONArray> infoArrayJson = new ConcurrentHashMap<String, JSONArray>();
 	// 对象类型到对象实例清单
-	public Map<String, SceneDataSet> objectArrayDic = new ConcurrentHashMap<String, SceneDataSet>();
+	public Map<String, SceneDataValue> objectArrayDic = new ConcurrentHashMap<String, SceneDataValue>();
 	// 所有对象实例清单
 	public SceneDataSet objectArrayAll = new SceneDataSet(false);
 	public ConcurrentHashMap<String, ConcurrentHashMap<String, String>> object2info2point = new ConcurrentHashMap<String, ConcurrentHashMap<String, String>>();
@@ -51,7 +53,7 @@ public class RepositoryImpl extends RepositoryBase {
 
 	// 管理范围
 	public SceneDataSet ZKTClassArray = new SceneDataSet(false);
-	public Map<String, Map<String, SceneDataSet>> ZKTObjectArrayDic = new ConcurrentHashMap<String, Map<String, SceneDataSet>>();
+	public Map<String, Map<String, SceneDataValue>> ZKTObjectArrayDic = new ConcurrentHashMap<String, Map<String, SceneDataValue>>();
 	public SceneDataSet ZKTAlarmTypeArray = new SceneDataSet(false);
 
 	// 编组
@@ -70,6 +72,10 @@ public class RepositoryImpl extends RepositoryBase {
 		return RepositoryBase.sdv2point;
 	}
 
+	public ConcurrentHashMap<SceneDataValue, String> sdv2set() {
+		return RepositoryBase.sdv2set;
+	}
+
 	public SceneDataSet ParseSource(JSONObject descSet, String Source) {
 		SceneDataSet result = null;
 		if (Source.equals("class")) {
@@ -82,16 +88,16 @@ public class RepositoryImpl extends RepositoryBase {
 					if (objType.equals("equipment") || objType.equals("system") || objType.equals("space")) {
 						if (descSet.containsKey("classCode")) {
 							String classCode = (descSet.get("classCode")).toString();
-							result = this.objectArrayDic.get(classCode);
+							result = this.objectArrayDic.get(classCode).value_array;
 						} else {
-							result = this.objectArrayDic.get(objType);
+							result = this.objectArrayDic.get(objType).value_array;
 						}
 					} else {
-						result = this.objectArrayDic.get(objType);
+						result = this.objectArrayDic.get(objType).value_array;
 					}
 				} else if (descSet.containsKey("classCode")) {
 					String classCode = (descSet.get("classCode")).toString();
-					result = this.objectArrayDic.get(classCode);
+					result = this.objectArrayDic.get(classCode).value_array;
 				} else {
 					result = this.objectArrayAll;
 				}
@@ -119,15 +125,16 @@ public class RepositoryImpl extends RepositoryBase {
 				}
 			}
 			if (result == null) {
-				result = new SceneDataSet(false);
-				result.setRowChange(false);
+				// result = new SceneDataSet(false);
+				// result.setRowChange(false);
+				return null;
 			}
 		} else if (Source.equals("zkt-class")) {
 			result = this.ZKTClassArray;
 		} else if (Source.equals("zkt-object")) {
 			String ibmsSceneCode = (descSet.get("ibmsSceneCode")).toString();
 			String ibmsClassCode = (descSet.get("ibmsClassCode")).toString();
-			result = this.ZKTObjectArrayDic.get(ibmsSceneCode).get(ibmsClassCode);
+			result = this.ZKTObjectArrayDic.get(ibmsSceneCode).get(ibmsClassCode).value_array;
 		} else if (Source.equals("ibms")) {
 			String product = (descSet.get("product")).toString();
 			String type = (descSet.get("type")).toString();
@@ -170,6 +177,27 @@ public class RepositoryImpl extends RepositoryBase {
 		return result;
 	}
 
+	public void refresh_children() {
+		for (SceneDataObject classItem : this.ZKTClassArray.set) {
+			String ibmsSceneCode = (String) classItem.get("ibmsSceneCode").value_prim.value;
+			String ibmsClassCode = (String) classItem.get("ibmsClassCode").value_prim.value;
+			String flag = null;
+			if (classItem.containsKey("flag")) {
+				flag = (String) classItem.get("flag").value_prim.value;
+			}
+			if (flag != null && flag.equals("reference")) {
+				continue;
+			}
+			SceneDataValue sdv = this.ZKTObjectArrayDic.get(ibmsSceneCode).get(ibmsClassCode);
+			for (SceneDataObject obj : sdv.value_array.set) {
+				if (obj.father != null) {
+					this.sdv2Children.putIfAbsent(obj.father, new CopyOnWriteArrayList<SceneDataObject>());
+					this.sdv2Children.get(obj.father).add(obj);
+				}
+			}
+		}
+	}
+
 	public void refresh_dependency() {
 		for (String key : this.objectArrayDic.keySet()) {
 			if (this.objTypeMap.containsKey(key)) {
@@ -177,7 +205,7 @@ public class RepositoryImpl extends RepositoryBase {
 			}
 			String classCode = key;
 			SceneDataSet infoArray = this.infoArrayDic.get(classCode);
-			SceneDataSet objectArray = this.objectArrayDic.get(key);
+			SceneDataSet objectArray = this.objectArrayDic.get(key).value_array;
 			for (int index_info = 0; index_info < infoArray.set.size(); index_info++) {
 				SceneDataObject info = infoArray.set.get(index_info);
 				String infoCode = (String) info.get("code").value_prim.value;
@@ -187,9 +215,7 @@ public class RepositoryImpl extends RepositoryBase {
 						String Key = infoCode;
 						SceneDataValue sdv = obj.get(Key);
 						if (sdv != null) {
-							if (this.RepositoryBase.sdv2point.containsKey(sdv)) {
-								this.dependency.add_iot(sdv, objectArray, Key);
-							}
+							this.dependency.add_iot(sdv, objectArray, Key);
 						}
 					}
 				} else if (RWDUtil.getInfoType(info) == 2) {
@@ -198,13 +224,35 @@ public class RepositoryImpl extends RepositoryBase {
 						String Key = infoCode;
 						SceneDataValue sdv = obj.get(Key);
 						if (sdv != null) {
-							if (this.RepositoryBase.sdv2set.containsKey(sdv)) {
-								this.dependency.add_iot(sdv, objectArray, Key);
-							}
+							this.dependency.add_iot(sdv, objectArray, Key);
 						}
 					}
 				}
 			}
 		}
 	}
+
+	public void clear_children() {
+		this.sdv2Children.clear();
+	}
+
+	public void addWaitCompute(String point) {
+		List<ObjectInfo> ObjectInfoList = this.point2ObjectInfoList.get(point);
+		for (ObjectInfo ObjectInfo : ObjectInfoList) {
+			SceneDataValue sdv = ObjectInfo.obj.get(ObjectInfo.infoCode);
+			this.addWaitCompute(sdv);
+		}
+	}
+
+	public void addWaitCompute(SceneDataValue sdv) {
+		try {
+			List<SceneDataValue> sdvAffectList = new ArrayList<SceneDataValue>();
+			this.dependency.get_after(this, sdv, sdvAffectList);
+			for (SceneDataValue sdvAffect : sdvAffectList) {
+				this.WaitCompute.offer(sdvAffect);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
 }

+ 18 - 6
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/websocket/IOTWebSocketClient.java

@@ -12,6 +12,7 @@ import com.persagy.ibms.core.data.SceneDataPrimitive;
 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;
+import com.persagy.ibms.data.sdk.util.RepositoryImpl;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -51,6 +52,7 @@ public class IOTWebSocketClient extends WebSocketClient {
 	@Override
 	public void onMessage(String arg0) {
 		try {
+			RepositoryImpl Repository = RepositoryContainer.instance;
 			Date currTime = new Date();
 			if (currTime.getTime() / (1000L * 60) != lastTime.getTime() / (1000L * 60)) {
 				lastTime = currTime;
@@ -73,16 +75,17 @@ public class IOTWebSocketClient extends WebSocketClient {
 					String meter = splits[i + 1];
 					String funcid = splits[i + 2];
 					String value = splits[i + 3];
+					String point = meter + "-" + funcid;
 					try {
 						SceneDataValue sdvInner = new SceneDataValue(null, null, null, null);
 						sdvInner.finish = true;
 						sdvInner.value_prim = new SceneDataPrimitive();
 						sdvInner.value_prim.change = true;
-						SceneDataValue exist_sdv = RepositoryContainer.RepositoryBase.point2sdv.putIfAbsent(meter + "-" + funcid, sdvInner);
+						SceneDataValue exist_sdv = RepositoryContainer.RepositoryBase.point2sdv.putIfAbsent(point, sdvInner);
 						if (exist_sdv == null) {
-							RepositoryContainer.RepositoryBase.sdv2point.putIfAbsent(sdvInner, meter + "-" + funcid);
+							RepositoryContainer.RepositoryBase.sdv2point.putIfAbsent(sdvInner, point);
 						}
-						SceneDataValue data = RepositoryContainer.RepositoryBase.point2sdv.get(meter + "-" + funcid);
+						SceneDataValue data = RepositoryContainer.RepositoryBase.point2sdv.get(point);
 						if (type.equals("iot")) {
 							if (value.endsWith(".0")) {
 								value = value.substring(0, value.length() - ".0".length());
@@ -96,6 +99,10 @@ public class IOTWebSocketClient extends WebSocketClient {
 									data.value_prim.value = value;
 								}
 							}
+							// 加入计算队列
+							if (Repository.enable_factor) {
+								Repository.addWaitCompute(point);
+							}
 						} else if (type.equals("text")) {
 							data.value_prim.value = value;
 						}
@@ -113,13 +120,14 @@ public class IOTWebSocketClient extends WebSocketClient {
 					String meter = splits[i + 1];
 					String funcid = splits[i + 2];
 					String value = splits[i + 3];
+					String point = meter + "-" + funcid;
 					try {
 						SceneDataValue sdvInner = new SceneDataValue(null, null, null, null);
-						SceneDataValue exist_sdv = RepositoryContainer.RepositoryBase.set2sdv.putIfAbsent(meter + "-" + funcid, sdvInner);
+						SceneDataValue exist_sdv = RepositoryContainer.RepositoryBase.set2sdv.putIfAbsent(point, sdvInner);
 						if (exist_sdv == null) {
-							RepositoryContainer.RepositoryBase.sdv2set.putIfAbsent(sdvInner, meter + "-" + funcid);
+							RepositoryContainer.RepositoryBase.sdv2set.putIfAbsent(sdvInner, point);
 						}
-						SceneDataValue data = RepositoryContainer.RepositoryBase.set2sdv.get(meter + "-" + funcid);
+						SceneDataValue data = RepositoryContainer.RepositoryBase.set2sdv.get(point);
 						if (value.endsWith(".0")) {
 							value = value.substring(0, value.length() - ".0".length());
 						}
@@ -132,6 +140,10 @@ public class IOTWebSocketClient extends WebSocketClient {
 								data.value_prim.value = value;
 							}
 						}
+						// 加入计算队列
+						if (Repository.enable_factor) {
+							Repository.addWaitCompute(point);
+						}
 					} catch (Exception e) {
 						// log.info("onMessage" + "\t" + meter + "-" + funcid + "\t" + value);
 					}