|
@@ -0,0 +1,204 @@
|
|
|
+package cn.sagacloud.server.algorithm.common.utils;
|
|
|
+
|
|
|
+import cn.sagacloud.server.algorithm.backstage.model.datacenter.DCFloor;
|
|
|
+import cn.sagacloud.server.algorithm.backstage.model.datacenter.DCISpace;
|
|
|
+import cn.sagacloud.server.algorithm.backstage.model.datacenter.QueryResponse;
|
|
|
+import cn.sagacloud.server.algorithm.backstage.model.datacenter.UpdateRequest;
|
|
|
+import cn.sagacloud.server.algorithm.models.entities.Space;
|
|
|
+import cn.sagacloud.server.algorithm.models.jsonAnalyzer.Point;
|
|
|
+import cn.sagacloud.server.algorithm.models.modelFile.ModelFile;
|
|
|
+import cn.sagacloud.server.algorithm.services.BaseDataService;
|
|
|
+import cn.sagacloud.server.algorithm.services.datacenter.DataCenterRequest;
|
|
|
+import com.sybotan.service.SObjectService;
|
|
|
+import com.sybotan.service.models.SCascadeQuery;
|
|
|
+import com.sybotan.service.models.requests.SQueryRequest;
|
|
|
+import com.sybotan.service.models.responses.SQueryResponse;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.awt.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class SpaceAffectUtil {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DataCenterRequest service;
|
|
|
+
|
|
|
+ public boolean affectedSpace(String projectId, String modelId) {
|
|
|
+ if(StringUtils.isBlank(projectId) || StringUtils.isBlank(modelId)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // 查楼层
|
|
|
+ List<DCISpace> spaceList = querySpaceByFloorModel(projectId, modelId);
|
|
|
+ if(CollectionUtils.isEmpty(spaceList)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // 查原模型
|
|
|
+ List<String> modelIds = queryModelFile(projectId, modelId);
|
|
|
+ if(CollectionUtils.size(modelIds) != 2) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // 查模型关联的元空间
|
|
|
+ Map<String, List<Space>> iSpaceMap = queryMetaSpaceByModel(modelIds);
|
|
|
+ if(CollectionUtils.isEmpty(iSpaceMap.get(modelIds.get(1)))) {
|
|
|
+ // 旧模型没有关联的元空间不需要处理
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // 获取有变化的空间列表
|
|
|
+ List<DCISpace> spaces = getAffectedSpaceIds(spaceList, iSpaceMap.get(modelIds.get(0)), iSpaceMap.get(modelIds.get(1)));
|
|
|
+ // 更新空间
|
|
|
+ updateSpaceList(projectId, spaces);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取有变化的空间ID列表
|
|
|
+ * @param spaces
|
|
|
+ * @param newMetaSpaces
|
|
|
+ * @param oldMetaSpaces
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<DCISpace> getAffectedSpaceIds(List<DCISpace> spaces, List<Space> newMetaSpaces, List<Space> oldMetaSpaces) {
|
|
|
+ // 准备修改后的元空间
|
|
|
+ Map<String, Space> newMetaSpaceMap = new HashMap<>();
|
|
|
+ for(int i = 0,j = CollectionUtils.size(newMetaSpaces);i < j;i++) {
|
|
|
+ Space space = newMetaSpaces.get(i);
|
|
|
+ newMetaSpaceMap.put(space.getId(), space);
|
|
|
+ }
|
|
|
+ // 截取有变化的元空间
|
|
|
+ List<Polygon> affectList = new ArrayList<>();
|
|
|
+ for(Space space:oldMetaSpaces) {
|
|
|
+ Polygon polygon = createPolygon(space.getOutline());
|
|
|
+ Space newSpace = newMetaSpaceMap.get(space.getId());
|
|
|
+ if(newSpace == null) {
|
|
|
+ affectList.add(polygon);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Polygon newPolygon = createPolygon(newSpace.getOutline());
|
|
|
+ // TODO 有交集则加入有变化的元空间列表
|
|
|
+ if(newPolygon == null) {
|
|
|
+ affectList.add(polygon);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(CollectionUtils.isEmpty(affectList)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ // 与有变化的元空间有交集的空间
|
|
|
+ List<DCISpace> rsList = new ArrayList<>();
|
|
|
+ for(DCISpace space:spaces) {
|
|
|
+ Polygon polygon = createPolygon(space.getOutline());
|
|
|
+ // TODO 有交集则加入有变化的空间列表
|
|
|
+ if(polygon == null) {
|
|
|
+ // TODO state设置为1
|
|
|
+ rsList.add(space);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return rsList;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Polygon createPolygon(ArrayList<ArrayList<Point>> list) {
|
|
|
+ return new Polygon();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新空间列表
|
|
|
+ * @param projectId
|
|
|
+ * @param spaces
|
|
|
+ */
|
|
|
+ private void updateSpaceList(String projectId, List<DCISpace> spaces) {
|
|
|
+ UpdateRequest<DCISpace> request = new UpdateRequest<>();
|
|
|
+ request.setContent((ArrayList<DCISpace>) spaces);
|
|
|
+ service.iSpaceUpdate(request, projectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询楼层关联的空间
|
|
|
+ * @param projectId
|
|
|
+ * @param modelId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<DCISpace> querySpaceByFloorModel(String projectId, String modelId) {
|
|
|
+ SQueryRequest request = new SQueryRequest();
|
|
|
+ request.setPageSize(500);
|
|
|
+ request.setFilters(" model_id = '" + modelId + "' ");
|
|
|
+ SCascadeQuery cascade = new SCascadeQuery();
|
|
|
+ cascade.setName("spaceList");
|
|
|
+ ArrayList<SCascadeQuery> cascades = new ArrayList<>();
|
|
|
+ cascades.add(cascade);
|
|
|
+ request.setCascade(cascades);
|
|
|
+ QueryResponse<DCFloor> response = service.floorQuery(request, projectId);
|
|
|
+ if(response == null || CollectionUtils.isEmpty(response.getContent())) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ ArrayList<DCFloor> floors = response.getContent();
|
|
|
+ List<DCISpace> spaceList = new ArrayList<>();
|
|
|
+ for(DCFloor floor:floors) {
|
|
|
+ List<DCISpace> spaces = floor.getSpaceList();
|
|
|
+ if(CollectionUtils.isEmpty(spaces)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ spaceList.addAll(spaces);
|
|
|
+ }
|
|
|
+ return spaceList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取模型
|
|
|
+ * @param projectId
|
|
|
+ * @param modelId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<String> queryModelFile(String projectId, String modelId) {
|
|
|
+ SObjectService modelFileService = BaseDataService.INSTANCE.getModelFileService();
|
|
|
+ SQueryRequest request = new SQueryRequest();
|
|
|
+ request.setFilters("model_floor_id = '"+modelId+"' and removed = false and status = 4 and version is not null");
|
|
|
+ request.setOrders("version desc");
|
|
|
+ ArrayList<String> projection = new ArrayList<>();
|
|
|
+ projection.add("id");
|
|
|
+ request.setProjection(projection);
|
|
|
+ SQueryResponse<ModelFile> response = modelFileService.pageQuery(request, null);
|
|
|
+ if(response == null || CollectionUtils.isEmpty(response.getContent())) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ List<ModelFile> floors = response.getContent();
|
|
|
+ return floors.stream().map(ModelFile::getId).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据模型查询关联的元空间
|
|
|
+ * @param modelIds
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Map<String, List<Space>> queryMetaSpaceByModel(List<String> modelIds) {
|
|
|
+ Map<String, List<Space>> spaceMap = new HashMap<>(2);
|
|
|
+ SObjectService spaceService = BaseDataService.INSTANCE.getSpaceService();
|
|
|
+ // 查询新模型的元空间
|
|
|
+ SQueryRequest request = new SQueryRequest();
|
|
|
+ request.setFilters("model_id = '"+modelIds.get(0)+"' ");
|
|
|
+ ArrayList<String> projection = new ArrayList<>();
|
|
|
+ projection.add("sourceId");
|
|
|
+ projection.add("outline");
|
|
|
+ request.setProjection(projection);
|
|
|
+ SQueryResponse<Space> response = spaceService.pageQuery(request, null);
|
|
|
+ if(CollectionUtils.isNotEmpty(response.getContent())) {
|
|
|
+ spaceMap.put(modelIds.get(0), response.getContent());
|
|
|
+ }
|
|
|
+ // 查询旧模型的元空间
|
|
|
+ request = new SQueryRequest();
|
|
|
+ request.setFilters("model_id = '"+modelIds.get(1)+"' ");
|
|
|
+ response = spaceService.pageQuery(request, null);
|
|
|
+ if(CollectionUtils.isNotEmpty(response.getContent())) {
|
|
|
+ spaceMap.put(modelIds.get(1), response.getContent());
|
|
|
+ }
|
|
|
+ return spaceMap;
|
|
|
+ }
|
|
|
+}
|