Переглянути джерело

解决自定义函数使用问题。改为代码中写表名

yucheng 3 роки тому
батько
коміт
43f7482891

+ 4 - 0
revit-algorithm/src/main/kotlin/cn/sagacloud/server/algorithm/backstage/model/datacenter/DCFloor.kt

@@ -37,4 +37,8 @@ class DCFloor {
     /** 建筑id */
     @JSONField(name = "buildingId")
     var buildingId: String? = null
+
+    // 空间
+    @JSONField(name = "spaceList")
+    var spaceList : ArrayList<DCISpace>? = null
 }

+ 6 - 1
revit-algorithm/src/main/kotlin/cn/sagacloud/server/algorithm/backstage/state/FinishState_4.kt

@@ -1,5 +1,6 @@
 package cn.sagacloud.server.algorithm.backstage.state
 
+import cn.sagacloud.server.algorithm.common.utils.SpaceAffectUtil
 import cn.sagacloud.server.algorithm.dao.mapper.FloorMapper
 import cn.sagacloud.server.algorithm.models.modelFile.ModelFile
 import cn.sagacloud.server.algorithm.models.modelFile.StatusInfo
@@ -40,6 +41,9 @@ class FinishState_4 : ModelState {
     @Autowired
     lateinit var floorMapper : FloorMapper
 
+    @Autowired
+    lateinit var spaceAffectUtil: SpaceAffectUtil
+
     /**
      * 获取所有状态是4的模型
      */
@@ -71,7 +75,8 @@ class FinishState_4 : ModelState {
                     val floors = dataCenterService.getFloorWithModelId(it.floorModelId!!, it.projectId!!)
                     // 如果有绑定, 则执行受影响的业务空间函数
                     if (!floors.isNullOrEmpty()) {
-                        val calcAffected = floorMapper.calcAffected(it.floorModelId!!)
+                        val calcAffected = spaceAffectUtil.affectedSpace(it.projectId!!, it.floorModelId!!)
+//                                floorMapper.calcAffected(it.floorModelId!!)
                         // 如果返回true, 更新模型的statusInfo信息点
                         if (calcAffected == true) {
                             it.statusInfo = StatusInfo()

+ 204 - 0
revit-algorithm/src/main/kotlin/cn/sagacloud/server/algorithm/common/utils/SpaceAffectUtil.java

@@ -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;
+    }
+}

+ 14 - 0
revit-algorithm/src/main/kotlin/cn/sagacloud/server/algorithm/services/datacenter/DataCenterRequest.kt

@@ -8,6 +8,7 @@ import cn.sagacloud.server.algorithm.services.http.HttpService
 import com.alibaba.fastjson.JSON
 import com.alibaba.fastjson.JSONObject
 import com.alibaba.fastjson.TypeReference
+import com.sybotan.service.models.requests.SQueryRequest
 import com.sybotan.service.models.responses.SBaseResponse
 import org.slf4j.LoggerFactory
 import org.springframework.beans.factory.annotation.Autowired
@@ -210,6 +211,19 @@ class DataCenterRequest{
     }
 
     /**
+     * 楼层查询
+     */
+    fun floorQuery(request : SQueryRequest, projectId : String) : QueryResponse<DCFloor>?{
+        try {
+            val postBody = JSON.toJSONString(request)
+            val resultStr = HttpService.sendPostDataCenter(properties.datacenter.floorQuery, postBody, projectId)
+            return JSON.parseObject(resultStr, object : TypeReference<QueryResponse<DCFloor>>() { })
+        } catch (e: Exception) {
+        }
+        return null
+    }
+
+    /**
      * 建筑查询
      */
     fun buildingQuery(request : QueryRequest, projectId : String) : QueryResponse<DCBuilding>?{