Parcourir la source

实现模型文件解析逻辑

lijie il y a 3 ans
Parent
commit
5c3bf378f5
26 fichiers modifiés avec 1473 ajouts et 142 suppressions
  1. 16 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/constant/AdmServerConstant.java
  2. 2 2
      adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/controller/AdmModelBackController.java
  3. 2 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/AdmModelFileService.java
  4. 19 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/AdmModelService.java
  5. 4 57
      adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/impl/AdmModelBackServiceImpl.java
  6. 66 13
      adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/impl/AdmModelServiceImpl.java
  7. 44 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/constant/DataHandlerEnum.java
  8. 51 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/AdmAnalysisModel.java
  9. 20 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Level.java
  10. 23 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Location.java
  11. 19 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Parameter.java
  12. 25 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Point.java
  13. 53 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/AdmAnalyseService.java
  14. 30 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/DataHandlerService.java
  15. 407 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AbstractDataHandler.java
  16. 41 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmAnalysisFacade.java
  17. 140 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmAnalysisServiceBase.java
  18. 130 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmDataHandleServiceImpl.java
  19. 40 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmPreFileServiceImpl.java
  20. 75 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmPreFloorServiceImpl.java
  21. 0 70
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmRevitAnalysisBase.java
  22. 98 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmUnzipFileServiceImpl.java
  23. 28 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/DefaultDataHandler.java
  24. 39 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/GridDataHandler.java
  25. 60 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/LevelDataHandler.java
  26. 41 0
      adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/SpaceDataHandler.java

+ 16 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/constant/AdmServerConstant.java

@@ -17,6 +17,22 @@ public interface AdmServerConstant {
     String DELIVERY_TYPE="deliveryType";
     /**是否交付 0-否 1-是*/
     String IS_DELIVERY="isDelivery";
+    /**bimId*/
+    String BIM_ID="bimId";
+    /**名称*/
+    String NAME="name";
+    /**localId*/
+    String LOCAL_ID="localId";
+    /**localName*/
+    String LOCAL_NAME="localName";
+    /**bimLocation*/
+    String BIM_LOCATION="bimLocation";
+    /**outline*/
+    String OUTLINE="outline";
+    /**cADID*/
+    String CAD_ID="cADID";
+    /**floorId*/
+    String FLOOR_ID="floorId";
 
 
 }

+ 2 - 2
adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/controller/AdmModelBackController.java

@@ -2,6 +2,7 @@ package com.persagy.adm.server.algorithm.controller;
 
 
 import com.persagy.adm.server.algorithm.service.AdmModelBackService;
+import com.persagy.adm.server.backstage.service.impl.AdmAnalysisFacade;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
 import lombok.RequiredArgsConstructor;
@@ -34,8 +35,7 @@ public class AdmModelBackController {
      */
     @PostMapping(value = "/analysisModelsBack")
     public CommonResult<List<Void>> analysisModelsBack() {
-        admModelBackService.analysisModelBack();
-
+        AdmAnalysisFacade.analysisAdmModelFile();
         return ResultHelper.multi(new ArrayList<>());
     }
 

+ 2 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/AdmModelFileService.java

@@ -2,8 +2,10 @@ package com.persagy.adm.server.algorithm.service;
 
 import com.persagy.adm.server.algorithm.entity.AdmModelFile;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.persagy.dmp.digital.entity.ObjectDigital;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 模型文件逻辑处理接口

+ 19 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/AdmModelService.java

@@ -1,5 +1,6 @@
 package com.persagy.adm.server.algorithm.service;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.adm.server.algorithm.domain.DeliverPlanVo;
 import com.persagy.adm.server.algorithm.entity.AdmModelFile;
 import com.persagy.dmp.delivery.dto.ObjectTypeCollectDTO;
@@ -47,4 +48,22 @@ public interface AdmModelService {
      * Update By 2022/1/20 18:26
      */
     List<ObjectTypeCollect> queryObjectTypeCollectByDeliveryWay(Integer deliveryWay);
+    /**
+     * 根据集团编码和楼层id列表查询楼层信息
+     * @param groupCode : 集团编码
+     * @param floorIds : 楼层id集合
+     * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>
+     * @author : lijie
+     * Update By 2022/1/21 17:22
+     */
+    List<ObjectDigital> queryFloorsByGroupCodeAndIds(String groupCode, Set<String> floorIds);
+    /**
+     * 根据bimIdPre查询物理世界对象
+     * @param bimIdPre : bimIdPre
+     * @param groupCode : 集团编码
+     * @return : java.util.Map<java.lang.String,com.fasterxml.jackson.databind.node.ObjectNode>
+     * @author : lijie
+     * Update By 2022/1/22 13:48
+     */
+    Map<String, ObjectNode> queryObjectDigitalsByBimIdPre(String groupCode,String bimIdPre);
 }

+ 4 - 57
adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/impl/AdmModelBackServiceImpl.java

@@ -11,6 +11,7 @@ import com.persagy.adm.server.algorithm.constant.AdmModelFileStatusEnum;
 import com.persagy.adm.server.algorithm.entity.AdmModelFile;
 import com.persagy.adm.server.algorithm.service.AdmModelBackService;
 import com.persagy.adm.server.algorithm.service.AdmModelFileService;
+import com.persagy.adm.server.backstage.service.impl.AdmAnalysisFacade;
 import com.persagy.dmp.file.utils.FileStorageHelper;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
@@ -49,70 +50,16 @@ public class AdmModelBackServiceImpl implements AdmModelBackService {
      */
     @Override
     public void analysisModelBack() {
+
+
         // 1.查询状态为3的文件
         List<AdmModelFile> admModelFiles = admModelFileService
                 .listByStatus(AdmModelFileStatusEnum.SYNC_DATA_COMPLETED.getValue());
         if (CollUtil.isEmpty(admModelFiles)){
             return;
         }
-        // 2.遍历文件
-        for (AdmModelFile admModelFile : admModelFiles) {
-            if (StrUtil.isBlank(admModelFile.getDataFileId())){
-                continue;
-            }
-            // 2.1 从文件服务下载jsonz文件
-            Map<String, JSONObject> gzipResultMap = unzipDataModelFile(FileStorageHelper.downloadStream(admModelFile.getDataFileId()));
-            if (MapUtil.isEmpty(gzipResultMap)){
-                admModelFile.setRemoved(Boolean.TRUE);
-                continue;
-            }
-
 
 
-
-        }
-
-    }
-    /**
-     * 解压数据文件流
-     * @param inputStream :数据文件流
-     * @return : java.util.Map<java.lang.String,com.alibaba.fastjson.JSONObject>
-     * @author : lijie
-     * Update By 2022/1/17 11:59
-     */
-    private Map<String, JSONObject> unzipDataModelFile(InputStream inputStream) {
-        Map<String, byte[]> byteMap = unzipDataModelFileToByteArray(inputStream);
-        Set<String> keySet = byteMap.keySet();
-        Map<String, JSONObject> resultMap = MapUtil.newHashMap(keySet.size());
-        for (String key : keySet) {
-            byte[] bytes = byteMap.get(key);
-            if (null==bytes || bytes.length<=0){
-                continue;
-            }
-            resultMap.put(key,JSONObject.parseObject(StrUtil.str(bytes, StandardCharsets.UTF_8)));
-        }
-        return resultMap;
-    }
-    /**
-     * 解压文件到字节流
-     * @param inputStream : 数据文件流
-     * @return : java.util.Map<java.lang.String,java.io.ByteArrayInputStream>  
-     * @author : lijie
-     * Update By 2022/1/17 12:02
-     */
-    @SneakyThrows
-    private Map<String, byte[]> unzipDataModelFileToByteArray(InputStream inputStream){
-        if (null==inputStream){
-            return new HashMap<>(0);
-        }
-        Map<String, byte[]> resultMap = MapUtil.newHashMap();
-        ZipInputStream zipInputStream = new ZipInputStream(inputStream,Charset.forName("GBK"));
-        ZipUtil.read(zipInputStream,zipEntry -> {
-            if (zipEntry.isDirectory()){
-                return;
-            }
-            resultMap.put(zipEntry.getName(),IoUtil.readBytes(zipInputStream,false));
-        });
-        return resultMap;
     }
+
 }

+ 66 - 13
adm-business/adm-server/src/main/java/com/persagy/adm/server/algorithm/service/impl/AdmModelServiceImpl.java

@@ -11,6 +11,7 @@ import com.persagy.adm.server.algorithm.dao.AdmModelFileMapper;
 import com.persagy.adm.server.algorithm.entity.AdmModelFile;
 import com.persagy.adm.server.algorithm.service.AdmModelService;
 import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.basic.model.QueryOperator;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.DigitalObjectType;
 import com.persagy.dmp.common.constant.GraphCodeEnum;
@@ -30,10 +31,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -64,17 +62,11 @@ public class AdmModelServiceImpl implements AdmModelService {
         objectNode.putPOJO(ObjectDigital.OBJ_TYPE_HUM, CollUtil.newArrayList(DigitalObjectType.FLOOR.getIndex(),
                 DigitalObjectType.BUILDING.getIndex()));
         queryCriteria.setCriteria(objectNode);
-        CommonResult<List<ObjectDigital>> commonResult = DigitalObjectFacade.queryObject(AppContext.getContext().getGroupCode(),
+        return DigitalObjectFacade.queryObject(AppContext.getContext().getGroupCode(),
                 AppContext.getContext().getProjectId(), AppContext.getContext().getAppId(),
-                AppContext.getContext().getAccountId(), queryCriteria);
-        if (!CommonConstant.QUERY_SUCCESS.equals(commonResult.getResult())){
-            throw new BusinessException(commonResult.getResult(),commonResult.getMessage());
-        }
-        if (CollUtil.isEmpty(commonResult.getData())){
-            return new ArrayList<>();
-        }
-        return commonResult.getData();
+                AppContext.getContext().getAccountId(), queryCriteria).getData();
     }
+
     /**
      * 根据楼层id集合查询当前的模型文件信息
      * @param floorIds : 楼层id集合
@@ -147,4 +139,65 @@ public class AdmModelServiceImpl implements AdmModelService {
         }
         return zeroCommonResult.getData();
     }
+    /**
+     * 根据集团编码和楼层id列表查询楼层信息
+     * @param groupCode : 集团编码
+     * @param floorIds : 楼层id集合
+     * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>
+     * @author : lijie
+     * Update By 2022/1/21 17:22
+     */
+    @Override
+    public List<ObjectDigital> queryFloorsByGroupCodeAndIds(String groupCode, Set<String> floorIds) {
+        // 构建查询参数,valid为true,并且是该建筑下的.且按floorSequenceID正序排序
+        QueryCriteria queryCriteria = new QueryCriteria();
+        ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+        ObjectNode objectNode = objectMapper.createObjectNode();
+        objectNode.put(ObjectDigital.PROP_VALID,Boolean.TRUE);
+        objectNode.putPOJO(ObjectDigital.OBJ_TYPE_HUM, CollUtil.newArrayList(DigitalObjectType.FLOOR.getIndex()));
+        objectNode.put(CommonConstant.QUERY_GROUPCODE,groupCode);
+        if (CollUtil.isNotEmpty(floorIds)){
+            objectNode.putPOJO(ObjectDigital.PROP_ID,floorIds);
+        }
+        queryCriteria.setCriteria(objectNode);
+        return DigitalObjectFacade.queryObject(groupCode, null, CommonConstant.DEFAULT_ID,
+                CommonConstant.DEFAULT_ID, queryCriteria).getData();
+    }
+    /**
+     * 根据bimIdPre查询物理世界对象
+     * @param bimIdPre : bimIdPre
+     * @param groupCode : 集团编码
+     * @return : java.util.Map<java.lang.String,com.fasterxml.jackson.databind.node.ObjectNode>
+     * @author : lijie
+     * Update By 2022/1/22 13:48
+     */
+    @Override
+    public Map<String, ObjectNode> queryObjectDigitalsByBimIdPre(String groupCode,String bimIdPre) {
+        if (StrUtil.isBlank(bimIdPre)){
+            return new HashMap<>();
+        }
+        // 构建查询参数,valid为true,并且是该建筑下的.且按floorSequenceID正序排序
+        QueryCriteria queryCriteria = new QueryCriteria();
+        ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+        ObjectNode objectNode = objectMapper.createObjectNode();
+        objectNode.put(ObjectDigital.PROP_VALID,Boolean.TRUE);
+        ObjectNode bimIdPreObj = objectMapper.createObjectNode();
+        bimIdPreObj.put(QueryOperator.LIKE_RIGHT.getIndex(),bimIdPre);
+        objectNode.put(AdmServerConstant.BIM_ID,bimIdPre);
+        objectNode.put(CommonConstant.QUERY_GROUPCODE,groupCode);
+        queryCriteria.setCriteria(objectNode);
+        queryCriteria.setSize(-1L);
+        queryCriteria.setPage(1L);
+        List<ObjectNode> objectNodes = DigitalObjectFacade.query(groupCode, null, CommonConstant.DEFAULT_ID,
+                CommonConstant.DEFAULT_ID, queryCriteria);
+        if (CollUtil.isEmpty(objectNodes)){
+            return new HashMap<>(0);
+        }
+        return objectNodes.stream()
+                .filter(node-> node.has(AdmServerConstant.BIM_ID) && node.get(AdmServerConstant.BIM_ID).isTextual())
+                .collect(Collectors
+                        .toMap(node->node
+                                .get(AdmServerConstant.BIM_ID).asText()+StrUtil.UNDERLINE
+                                +node.get(ObjectDigital.CLASS_CODE_HUM).asText(),node->node,(k1,k2)->k1));
+    }
 }

+ 44 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/constant/DataHandlerEnum.java

@@ -0,0 +1,44 @@
+package com.persagy.adm.server.backstage.constant;
+
+import lombok.Getter;
+/**
+ * 数据解析策略类枚举
+ * @author : lijie
+ * Update By 2022/1/21 15:54
+ */
+@Getter
+public enum DataHandlerEnum {
+
+    /** 空间-对应物理世界的空间 */
+    SPACES("Spaces", "spaceDataHandler"),
+    /** 房间-对应物理世界的空间 */
+    ROOMS("Rooms", "spaceDataHandler"),
+    /** 轴网 */
+    GRIDS("Grids", "gridDataHandler"),
+    /** 标高 */
+    LEVELS("Levels", "levelDataHandler"),
+    /** 默认解析 */
+    DEFAULT("Equipments", "defaultDataHandler");
+
+    private String index;
+    private String name;
+
+    DataHandlerEnum(String index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+
+    /**
+     * 获取Enum
+     * @param index:数据key
+     */
+    public static DataHandlerEnum load(String index) {
+        for (DataHandlerEnum value: values()) {
+            if (value.getIndex().equals(index)) {
+                return value;
+            }
+        }
+        // 没有匹配的,返回默认
+        return DataHandlerEnum.DEFAULT;
+    }
+}

+ 51 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/AdmAnalysisModel.java

@@ -0,0 +1,51 @@
+package com.persagy.adm.server.backstage.domain;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.server.algorithm.entity.AdmModelFile;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 用于模型解析之间传递数据的DTO类
+ * @author : lijie
+ * Update By 2022/1/21 13:59
+ */
+@Data
+public class AdmAnalysisModel {
+    /**需要解析的模型文件列表*/
+    private List<AdmModelFile> admModelFiles;
+
+    /**需要解析的模型文件涉及的楼层对象*/
+    private Map<String, ObjectDigital> floorMap;
+
+    /**解析到的模型文件json*/
+    private JSONObject currentAdmModelObj;
+
+    /**当前正在解析的模型文件*/
+    private AdmModelFile currentModelFile;
+
+    /**当前正在解析的模型文件对应的楼层*/
+    private ObjectDigital currentFloor;
+    /**需新增的对象数据*/
+    private List<ObjectNode> needAddObjects;
+    /**需更新的对象数据*/
+    private List<ObjectNode> needUpdateObjects;
+    /**需删除的对象Id集合*/
+    private Set<String> needDeleteObjectIds;
+    /**需删除关系的对象Id集合*/
+    private Set<String> needDeleteRelationObjIds;
+    /**需删除关系的图类型集合*/
+    private Set<String> needDeleteRelationGraphCodes;
+    /**需删除关系的边类型集合*/
+    private Set<String> needDeleteRelationRelCodes;
+    /**需增加的关系集合*/
+    private List<ObjectRelation> needAddRelations;
+
+
+}

+ 20 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Level.java

@@ -0,0 +1,20 @@
+package com.persagy.adm.server.backstage.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+/**
+ * 标高对象
+ * @author : lijie
+ * Update By 2022/1/22 17:36
+ */
+@Data
+public class Level {
+    @JSONField(alternateNames = {"Value"})
+    private Double value;
+    @JSONField(alternateNames = {"Id"})
+    private String id;
+    @JSONField(alternateNames = {"SourceId"})
+    private String sourceId;
+    @JSONField(alternateNames = {"Name"})
+    private String name;
+}

+ 23 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Location.java

@@ -0,0 +1,23 @@
+package com.persagy.adm.server.backstage.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+/**
+ * 位置
+ * @author : lijie
+ * Update By 2022/1/22 15:50
+ */
+@Data
+public class Location {
+    /**类型:0表示点,1表示线*/
+    @JSONField(alternateNames = {"Type"})
+    private Integer type;
+    /**位置坐标信息*/
+    @JSONField(alternateNames = {"Points"})
+    private List<Point> points;
+
+
+
+}

+ 19 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Parameter.java

@@ -0,0 +1,19 @@
+package com.persagy.adm.server.backstage.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 模型中的Parameter对象
+ * @author : lijie
+ * Update By 2022/1/22 15:31
+ */
+@Data
+public class Parameter {
+    /**名称*/
+    @JSONField(alternateNames = {"Name"})
+    private String name;
+    /**值*/
+    @JSONField(alternateNames = {"Value"})
+    private String value;
+}

+ 25 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/domain/Point.java

@@ -0,0 +1,25 @@
+package com.persagy.adm.server.backstage.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+/**
+ * 点
+ * @author : lijie
+ * Update By 2022/1/22 15:49
+ */
+@Data
+public class Point {
+    /**X坐标*/
+    @JSONField(name = "X")
+    private Double x;
+    /**Y坐标*/
+    @JSONField(name = "Y")
+    private Double y;
+    /**Z坐标*/
+    @JSONField(name = "Z")
+    private Double z;
+
+
+
+}

+ 53 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/AdmAnalyseService.java

@@ -0,0 +1,53 @@
+package com.persagy.adm.server.backstage.service;
+
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.dmp.common.exception.BusinessException;
+/**
+ * ADM模型解析逻辑处理类
+ * @author : lijie
+ * Update By 2022/1/21 14:11
+ */
+public interface AdmAnalyseService {
+
+    /**
+     * 获得下一个逻辑类
+     * @return : com.persagy.adm.server.backstage.service.AdmValve
+     * @author : lijie
+     * Update By 2022/1/21 15:24
+     */
+    AdmAnalyseService getNext();
+    /**
+     * 设置下一个逻辑类
+     * @param valve : 逻辑处理类
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 15:24
+     */
+    void setNext(AdmAnalyseService valve);
+
+    /**
+     * 初始化方法,用于准备环境
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 10:59
+     */
+    void init(AdmAnalysisModel model) throws BusinessException;
+
+    /**
+     * 解析模型文件方法
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 10:59
+     */
+    void analysis(AdmAnalysisModel model);
+
+
+    /**
+     * 销毁方法
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 10:50
+     */
+    void destroy(AdmAnalysisModel model) throws BusinessException;
+
+}

+ 30 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/DataHandlerService.java

@@ -0,0 +1,30 @@
+package com.persagy.adm.server.backstage.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+
+import java.util.Map;
+
+/**
+ * 模型数据解析逻辑处理接口
+ * @author : lijie
+ * Update By 2022/1/22 10:07
+ */
+public interface DataHandlerService {
+
+    /**
+     * 对模型数据进行解析
+     * @param objectNodeMap : bimId与对象的映射
+     * @param model : 模型数据
+     * @param objects : 对象数据
+     * @param classCode : 对象类型
+     * @param planName : 楼层名称
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/22 14:10
+     */
+    void handleData(Map<String, ObjectNode> objectNodeMap, AdmAnalysisModel model, JSONArray objects,String classCode,String planName);
+
+
+}

+ 407 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AbstractDataHandler.java

@@ -0,0 +1,407 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Pair;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.server.algorithm.constant.AdmServerConstant;
+import com.persagy.adm.server.algorithm.entity.AdmModelFile;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.adm.server.backstage.domain.Location;
+import com.persagy.adm.server.backstage.domain.Parameter;
+import com.persagy.adm.server.backstage.domain.Point;
+import com.persagy.adm.server.backstage.service.DataHandlerService;
+import com.persagy.dmp.common.constant.DigitalObjectType;
+import com.persagy.dmp.common.constant.DigitalObjectTypeShort;
+import com.persagy.dmp.common.constant.GraphCodeEnum;
+import com.persagy.dmp.common.constant.RelCodeEnum;
+import com.persagy.dmp.common.helper.SpringHelper;
+import com.persagy.dmp.common.model.entity.AuditableEntity;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.util.stream.Collectors.joining;
+
+@Slf4j
+public abstract class AbstractDataHandler implements DataHandlerService {
+
+    private static final String SOURCE_ID="SourceId";
+    private static final String ID="Id";
+    private static final String LOCATION="Location";
+    private static final String PARAMETERS="Parameters";
+    private static final String OUTLINE="OutLine";
+    private static final String NAME="Name";
+    private static final String NAME_VALUE="名称";
+    private static final String CODE_VALUE="编号";
+    protected static final Map<String,String> ID_MAP = MapUtil
+            .of(Pair.of(DigitalObjectType.PROJECT.getIndex(), DigitalObjectTypeShort.PROJECT.getIndex()),
+            Pair.of(DigitalObjectType.BUILDING.getIndex(), DigitalObjectTypeShort.BUILDING.getIndex()),
+            Pair.of(DigitalObjectType.FLOOR.getIndex(), DigitalObjectTypeShort.FLOOR.getIndex()),
+            Pair.of(DigitalObjectType.SPACE.getIndex(), DigitalObjectTypeShort.SPACE.getIndex()),
+            Pair.of(DigitalObjectType.SHAFT.getIndex(), DigitalObjectTypeShort.SHAFT.getIndex()),
+            Pair.of(DigitalObjectType.SYSTEM.getIndex(), DigitalObjectTypeShort.SYSTEM.getIndex()),
+            Pair.of(DigitalObjectType.PARTITION.getIndex(), DigitalObjectTypeShort.PARTITION.getIndex()),
+            Pair.of(DigitalObjectType.EQUIPMENT.getIndex(), DigitalObjectTypeShort.EQUIPMENT.getIndex()),
+            Pair.of(DigitalObjectType.COMPONENT.getIndex(), DigitalObjectTypeShort.COMPONENT.getIndex()));
+
+    /**
+     * 对模型数据进行解析
+     * @param objectNodeMap : bimId与对象的映射
+     * @param model : 模型数据
+     * @param objects : 对象数据
+     * @param classCode : 对象类型
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/22 14:10
+     */
+    @Override
+    public void handleData(Map<String, ObjectNode> objectNodeMap, AdmAnalysisModel model, JSONArray objects,String classCode,String planName) {
+        if (null==objects || objects.size()<=0){
+            return;
+        }
+        int size = objects.size();
+        List<ObjectNode> needAddObjects = model.getNeedAddObjects();
+        if (CollUtil.isEmpty(needAddObjects)){
+            needAddObjects = CollUtil.newArrayList();
+            model.setNeedAddObjects(needAddObjects);
+        }
+        List<ObjectNode> needUpdateObjects = model.getNeedUpdateObjects();
+        if (CollUtil.isEmpty(needUpdateObjects)){
+            needUpdateObjects = CollUtil.newArrayList();
+            model.setNeedUpdateObjects(needUpdateObjects);
+        }
+        Set<String> needDeleteObjectIds = model.getNeedDeleteObjectIds();
+        if (CollUtil.isEmpty(needDeleteObjectIds)){
+            needDeleteObjectIds = CollUtil.newHashSet();
+            model.setNeedDeleteObjectIds(needDeleteObjectIds);
+        }
+        List<ObjectRelation> needAddRelations = model.getNeedAddRelations();
+        if (CollUtil.isEmpty(needAddRelations)){
+            needAddRelations = CollUtil.newArrayList();
+            model.setNeedAddRelations(needAddRelations);
+        }
+        Set<String> needDeleteRelationObjIds = model.getNeedDeleteRelationObjIds();
+        if (CollUtil.isEmpty(needAddRelations)){
+            needDeleteRelationObjIds = CollUtil.newHashSet();
+            model.setNeedDeleteRelationObjIds(needDeleteRelationObjIds);
+        }
+        model.setNeedDeleteRelationGraphCodes(CollUtil.newHashSet(GraphCodeEnum.MechInArch.name(),GraphCodeEnum.ArchSubset.name()));
+        model.setNeedDeleteRelationRelCodes(CollUtil.newHashSet(RelCodeEnum.Sy2Bd.name(),RelCodeEnum.Sy2Fl.name(),
+                RelCodeEnum.Eq2Bd.name(),RelCodeEnum.Eq2Fl.name(),RelCodeEnum.Sp2Bd.name(),RelCodeEnum.Sp2Fl.name()));
+        AdmModelFile currentModelFile = model.getCurrentModelFile();
+        ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+        String relClassCode = getClassCode(classCode);
+        String relObjectType = getObjectType(relClassCode);
+        // 获得历史所有的对象id
+        Set<String> oldObjectIds = getOldObjectIdsByClassCode(objectNodeMap,relClassCode);
+        Set<String> updateObjectIds = new HashSet<>();
+        for (int i = 0; i < size; i++) {
+            JSONObject element = objects.getJSONObject(i);
+            if (StrUtil.isBlank(element.getString(SOURCE_ID))){
+                continue;
+            }
+            // 1.特殊字段特殊处理
+            ObjectNode objectNode = handleSpecificField(element,objectNodeMap,currentModelFile,objectMapper);
+            // 2.移除不需要的字段
+            removeUnnecessaryField(element);
+            // 3.剩余字段的处理
+            Set<String> keySet = element.keySet();
+            for (String key : keySet) {
+                objectNode.putPOJO(StrUtil.lowerFirst(key),element.get(key));
+            }
+            // 4.放入数组中
+            if (!objectNode.has(AuditableEntity.PROP_ID)){
+                String generateId = generateId(relObjectType, currentModelFile.getProjectId());
+                objectNode.put(AuditableEntity.PROP_ID,generateId);
+                needAddObjects.add(objectNode);
+                // 创建关系对象
+                createNeedAddRelation(generateId,currentModelFile,needAddRelations,relObjectType,relClassCode);
+                continue;
+            }
+            needUpdateObjects.add(objectNode);
+            updateObjectIds.add(objectNode.get(AuditableEntity.PROP_ID).asText());
+            needDeleteRelationObjIds.add(objectNode.get(AuditableEntity.PROP_ID).asText());
+            // 创建关系对象
+            createNeedAddRelation(objectNode.get(AuditableEntity.PROP_ID).asText(),currentModelFile,needAddRelations,relObjectType,relClassCode);
+        }
+        // 获得需删除的对象id
+        oldObjectIds.removeAll(updateObjectIds);
+        needDeleteObjectIds.addAll(oldObjectIds);
+    }
+
+    /**
+     * 获得对象分类
+     * @param classCode :对象类型编码
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 16:33
+     */
+    protected abstract String getObjectType(String classCode);
+    /**
+     * 生成对象id
+     * @param objType : 对象类型
+     * @param projectId : 项目id
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 16:33
+     */
+    protected String generateId(String objType,String projectId){
+        return Stream.of(ID_MAP.get(objType),
+                StrUtil.replace(projectId,DigitalObjectTypeShort.PROJECT.getIndex(),StrUtil.EMPTY),
+                IdWorker.getIdStr()).filter(ObjectUtil::isNotNull).collect(Collectors.joining(StrUtil.EMPTY));
+    }
+
+    /**
+     * 获得对象类型
+     * @param classCode :对象类型编码
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 16:16
+     */
+    protected String getClassCode(String classCode){
+        return classCode;
+    }
+
+    /**
+     * 生成cADID
+     * @param localId : 本地编码
+     * @param localName : 本地名称
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 15:56
+     */
+    protected String generateCadid(String localId, String localName){
+        return Stream.of(localId,localName).filter(ObjectUtil::isNotNull).collect(joining(StrUtil.COLON));
+    }
+
+    /**
+     * 获得outline
+     * @param srcOutline : 原有的轮廓
+     * @return : com.alibaba.fastjson.JSONArray
+     * @author : lijie
+     * Update By 2022/1/22 15:55
+     */
+    protected JSONArray generateOutline(JSONArray srcOutline){
+        return srcOutline;
+    }
+
+    /**
+     * 获得bimLocation
+     * @param location : 位置信息
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 15:54
+     */
+    protected String generateBimLocation(Location location){
+        if (CollUtil.isEmpty(location.getPoints())){
+            return null;
+        }
+        Point point = location.getPoints().get(0);
+        return Stream.of(point.getX(), point.getY(), point.getZ())
+                .filter(ObjectUtil::isNotNull)
+                .map(ObjectUtil::toString)
+                .collect(joining(StrUtil.COMMA));
+    }
+
+    /**
+     * 生成本地编码
+     * @param sourceId : 模型唯一标识
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 15:38
+     */
+    protected String generateLocalId(String sourceId,JsonNode localId){
+        if (null!=localId && localId.isTextual()){
+            return localId.asText();
+        }
+        return sourceId;
+    }
+
+    /**
+     * 生成bimId
+     * @param projectId : 项目id
+     * @param floorId : 楼层id
+     * @param sourceId : 模型文件中的唯一id
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 15:20
+     */
+    protected String generateBimId(String projectId, String floorId, String sourceId){
+        return StrUtil.join(StrUtil.COLON,StrUtil.join(StrUtil.EMPTY,projectId,floorId),sourceId);
+    }
+
+    /**
+     * 根据参数生成本地名称
+     * @param parameters : 参数[{"Name":"名称","Value":"KT-17"},{"Name":"编号","Value":"13"}]
+     * @param name : 对象名称
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 15:14
+     */
+    protected String generateLocalName(JSONArray parameters, String name, JsonNode localName){
+        if (null!=localName && localName.isTextual()){
+            return localName.asText();
+        }
+        List<Parameter> list = parameters.toJavaList(Parameter.class);
+        Optional<Parameter> nameParam = list.stream().filter(parameter -> NAME_VALUE.equals(parameter.getName())).findFirst();
+        Optional<Parameter> codeParam = list.stream().filter(parameter -> CODE_VALUE.equals(parameter.getName())).findFirst();
+        return StrUtil.join(StrUtil.EMPTY,nameParam.isPresent()?nameParam.get():name,codeParam.isPresent()?codeParam.get():StrUtil.EMPTY);
+    }
+    /**
+     * 根据对象类型获取旧对象id数组
+     * @param objectNodeMap : 旧对象映射
+     * @param classCode : 对象类型
+     * @return : java.util.Set<java.lang.String>
+     * @author : lijie
+     * Update By 2022/1/22 17:17
+     */
+    private Set<String> getOldObjectIdsByClassCode(Map<String, ObjectNode> objectNodeMap, String classCode){
+        Set<String> result = new HashSet<>();
+        Set<String> keySet = objectNodeMap.keySet();
+        for (String key : keySet) {
+            if (!key.endsWith(classCode)){
+                continue;
+            }
+            ObjectNode objectNode = objectNodeMap.get(key);
+            if (null==objectNode
+                    ||!objectNode.has(AuditableEntity.PROP_ID)
+                    ||!objectNode.get(AuditableEntity.PROP_ID).isTextual()){
+               continue;
+            }
+            result.add(objectNode.get(AuditableEntity.PROP_ID).asText());
+        }
+        return result;
+    }
+    /**
+     * 处理特殊字段
+     * @param element : 模型对象
+     * @param objectNodeMap : 旧模型对象映射
+     * @param currentModelFile : 当前模型文件信息
+     * @param objectMapper : ...
+     * @return : com.fasterxml.jackson.databind.node.ObjectNode
+     * @author : lijie
+     * Update By 2022/1/22 18:29
+     */
+    private ObjectNode handleSpecificField(JSONObject element, Map<String, ObjectNode> objectNodeMap,
+                                           AdmModelFile currentModelFile, ObjectMapper objectMapper){
+        String sourceId = element.getString(SOURCE_ID);
+        String bimId = generateBimId(currentModelFile.getProjectId(),currentModelFile.getFloorId(),sourceId);
+        ObjectNode objectNode = objectNodeMap.getOrDefault(bimId, objectMapper.createObjectNode());
+        JSONArray parameters = element.getJSONArray(PARAMETERS);
+        Location location = element.getObject(LOCATION, Location.class);
+        JSONArray srcOutline = element.getJSONArray(OUTLINE);
+        String objName = element.getString(NAME);
+        String localName = generateLocalName(parameters,objName,objectNode.get(AdmServerConstant.LOCAL_NAME));
+        String localId = generateLocalId(sourceId,objectNode.get(AdmServerConstant.LOCAL_ID));
+        String bimLocation = generateBimLocation(location);
+        JSONArray outline = generateOutline(srcOutline);
+        String cadId = generateCadid(localId,localName);
+        objectNode.put(AdmServerConstant.BIM_ID,bimId);
+        objectNode.put(AdmServerConstant.NAME,objName);
+        objectNode.put(AdmServerConstant.LOCAL_ID,localId);
+        objectNode.put(AdmServerConstant.LOCAL_NAME,localName);
+        objectNode.put(AdmServerConstant.BIM_LOCATION,bimLocation);
+        objectNode.putPOJO(AdmServerConstant.OUTLINE,outline);
+        objectNode.put(AdmServerConstant.CAD_ID,cadId);
+        objectNode.put(AdmServerConstant.FLOOR_ID,currentModelFile.getFloorId());
+        objectNode.put(AdmServerConstant.BUILDING_ID,currentModelFile.getBuildingId());
+        return objectNode;
+    }
+    /**
+     * 移除不需要的字段
+     * @param element : 模型对象
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/22 18:32
+     */
+    private void removeUnnecessaryField(JSONObject element){
+        element.remove(ID);
+        element.remove(PARAMETERS);
+        element.remove(LOCATION);
+        element.remove(OUTLINE);
+    }
+
+    /**
+     * 创建建筑下的设备/系统/空间,楼层下的设备/系统/空间关系
+     * @param id : 主键id
+     * @param currentModelFile : 当前模型文件
+     * @param needAddRelations : 需添加的关系集合
+     * @param objType : 对象类型编码
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/22 18:19
+     */
+    protected void createNeedAddRelation(String id, AdmModelFile currentModelFile,
+                                         List<ObjectRelation> needAddRelations,
+                                         String objType,String classCode){
+        if (!CollUtil.newHashSet(DigitalObjectType.SPACE.getIndex(),
+                DigitalObjectType.EQUIPMENT.getIndex(),
+                DigitalObjectType.SYSTEM.getIndex()).contains(objType)){
+            return;
+        }
+        if (DigitalObjectType.SPACE.getIndex().equals(objType)){
+            needAddRelations.add(createObjectRelation(currentModelFile.getBuildingId(),id,
+                    GraphCodeEnum.ArchSubset.name(), RelCodeEnum.Bd2Sp.name(),classCode,
+                    currentModelFile.getGroupCode(),currentModelFile.getProjectId()));
+            needAddRelations.add(createObjectRelation(currentModelFile.getFloorId(),id,
+                    GraphCodeEnum.ArchSubset.name(), RelCodeEnum.Fl2Sp.name(),classCode,
+                    currentModelFile.getGroupCode(),currentModelFile.getProjectId()));
+            return;
+        }
+        if (DigitalObjectType.SYSTEM.getIndex().equals(objType)){
+            needAddRelations.add(createObjectRelation(id,currentModelFile.getBuildingId(),
+                    GraphCodeEnum.MechInArch.name(), RelCodeEnum.Sy2Bd.name(),classCode,
+                    currentModelFile.getGroupCode(),currentModelFile.getProjectId()));
+            needAddRelations.add(createObjectRelation(currentModelFile.getFloorId(),id,
+                    GraphCodeEnum.MechInArch.name(), RelCodeEnum.Sy2Fl.name(),classCode,
+                    currentModelFile.getGroupCode(),currentModelFile.getProjectId()));
+            return;
+        }
+        if (DigitalObjectType.EQUIPMENT.getIndex().equals(objType)){
+            needAddRelations.add(createObjectRelation(id,currentModelFile.getBuildingId(),
+                    GraphCodeEnum.MechInArch.name(), RelCodeEnum.Eq2Bd.name(),classCode,
+                    currentModelFile.getGroupCode(),currentModelFile.getProjectId()));
+            needAddRelations.add(createObjectRelation(id,currentModelFile.getFloorId(),
+                    GraphCodeEnum.MechInArch.name(), RelCodeEnum.Eq2Fl.name(),classCode,
+                    currentModelFile.getGroupCode(),currentModelFile.getProjectId()));
+        }
+    }
+    /**
+     * 创建关系对象
+     * @param objFrom : 关系左侧对象id
+     * @param objTo : 关系右侧对象id
+     * @param graphCode : 集团编码
+     * @param relCode : 边关系
+     * @param relValue : 边内容
+     * @param groupCode : 集团编码
+     * @param projectId : 项目id
+     * @return : com.persagy.dmp.digital.entity.ObjectRelation
+     * @author : lijie
+     * Update By 2022/1/22 18:42
+     */
+    private ObjectRelation createObjectRelation(String objFrom, String objTo, String graphCode,
+                                                String relCode, String relValue,String groupCode,String projectId){
+        ObjectRelation objectRelation = new ObjectRelation();
+        objectRelation.setObjFrom(objFrom);
+        objectRelation.setObjTo(objTo);
+        objectRelation.setGraphId(StrUtil.format("Gt{}001",graphCode));
+        objectRelation.setGroupCode(groupCode);
+        objectRelation.setProjectId(projectId);
+        objectRelation.setRelCode(relCode);
+        objectRelation.setRelValue(relValue);
+        return objectRelation;
+    }
+
+}

+ 41 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmAnalysisFacade.java

@@ -0,0 +1,41 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.adm.server.backstage.service.AdmAnalyseService;
+import com.persagy.dmp.common.helper.SpringHelper;
+
+import javax.swing.*;
+import java.util.List;
+
+/**
+ * ADM模型解析门面
+ * @author : lijie
+ * Update By 2022/1/21 15:07
+ */
+public class AdmAnalysisFacade {
+
+    private static AdmAnalyseService firstAdmAnalyseService;
+
+    static {
+        firstAdmAnalyseService = SpringHelper.getBean(AdmPreFileServiceImpl.class);
+        AdmAnalyseService admPreFloorService = SpringHelper.getBean(AdmPreFloorServiceImpl.class);
+        firstAdmAnalyseService.setNext(admPreFloorService);
+        AdmAnalyseService admUnzipFileService = SpringHelper.getBean(AdmUnzipFileServiceImpl.class);
+        admPreFloorService.setNext(admUnzipFileService);
+        AdmAnalyseService dataHandleService = SpringHelper.getBean(AdmDataHandleServiceImpl.class);
+        admUnzipFileService.setNext(dataHandleService);
+
+    }
+
+    /**
+     * 解析模型文件
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 15:09
+     */
+    public static void analysisAdmModelFile(){
+        AdmAnalysisModel model = new AdmAnalysisModel();
+        firstAdmAnalyseService.analysis(model);
+    }
+}

+ 140 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmAnalysisServiceBase.java

@@ -0,0 +1,140 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.adm.server.backstage.service.AdmAnalyseService;
+import com.persagy.dmp.common.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+/**
+ * revit模型解析基类
+ * @author : lijie
+ * Update By 2022/1/21 10:48
+ */
+@Slf4j
+public abstract class AdmAnalysisServiceBase implements AdmAnalyseService {
+
+    protected AdmAnalyseService next = null;
+
+    /**
+     * 初始化方法,用于准备环境
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 10:59
+     */
+    @PostConstruct
+    @Override
+    public final synchronized void init(AdmAnalysisModel model) throws BusinessException {
+        // 1.是否需要打印日志
+        if (log.isDebugEnabled()) {
+            log.debug("AdmAnalysisModelBase.init方法开始:{}", this);
+        }
+        // 调具体实现类的方法,完成自身的初始化
+        initInternal(model);
+    }
+
+    /**
+     * 销毁方法
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 10:50
+     */
+    @PreDestroy
+    @Override
+    public final synchronized void destroy(AdmAnalysisModel model) throws BusinessException {
+        // 1.是否需要打印日志
+        if (log.isDebugEnabled()) {
+            log.debug("AdmAnalysisModelBase.destroy() :{}", this);
+        }
+        // 调具体实现类的方法,完成自身的销毁逻辑
+        destroyInternal(model);
+        if (log.isDebugEnabled()) {
+            log.debug("AdmAnalysisModelBase.destroy() end:{}", this);
+        }
+    }
+    /**
+     * 解析模型文件方法
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 10:59
+     */
+    @Override
+    public final void analysis(AdmAnalysisModel model) {
+        try {
+            // 调具体实现类的方法,完成自身的初始化
+            analysisInternal(model);
+        }catch (Exception e){
+            log.warn("解析模型数据失败:{},错误信息:{}", JSONObject.toJSONString(model.getCurrentModelFile()),e.getMessage());
+            afterAnalysisException(model,e.getMessage());
+        }finally {
+            afterAnalysis(model);
+        }
+    }
+    /**
+     * 解析完成后执行的逻辑
+     * @param model : 模型文件
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/22 17:43
+     */
+    protected void afterAnalysis(AdmAnalysisModel model){};
+
+    /**
+     * 出现异常的处理逻辑
+     * @param model : 模型文件
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/22 17:43
+     */
+    protected void afterAnalysisException(AdmAnalysisModel model,String errorMessage){};
+
+    /**
+     * 获取下一个链
+     * @return : com.persagy.adm.server.backstage.service.AdmValve
+     * @author : lijie
+     * Update By 2022/1/21 15:26
+     */
+    @Override
+    public AdmAnalyseService getNext() {
+        return next;
+    }
+    /**
+     * 设置下一个链的逻辑类
+     * @param next : 下一个链的逻辑类
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 15:26
+     */
+    @Override
+    public void setNext(AdmAnalyseService next) {
+        this.next = next;
+    }
+
+    /**
+     * 内部解析方法逻辑
+     * @param model : 模型数据DTO
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 14:36
+     */
+    protected abstract void analysisInternal(AdmAnalysisModel model);
+
+    /**
+     * 内部初始化方法,子类覆写即可
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 12:03
+     */
+    protected void initInternal(AdmAnalysisModel model){};
+
+    /**
+     * 内部销毁方法,子类覆写即可
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 12:03
+     */
+    protected void destroyInternal(AdmAnalysisModel model){};
+}

+ 130 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmDataHandleServiceImpl.java

@@ -0,0 +1,130 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.server.algorithm.entity.AdmModelFile;
+import com.persagy.adm.server.algorithm.service.AdmModelService;
+import com.persagy.adm.server.backstage.constant.DataHandlerEnum;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.adm.server.backstage.service.DataHandlerService;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.constant.CommonConstant;
+import com.persagy.dmp.common.helper.SpringHelper;
+import com.persagy.dmp.digital.client.DigitalObjectFacade;
+import com.persagy.dmp.digital.client.DigitalRelationFacade;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 数据处理类
+ * @author : lijie
+ * Update By 2022/1/21 16:24
+ */
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class AdmDataHandleServiceImpl extends AdmAnalysisServiceBase {
+    /**元素集合key*/
+    private final static String ELEMENTS="Elements";
+    /**项目id的key*/
+    private final static String PROJECT_ID="ProjectId";
+    /**楼层名称的key*/
+    private final static String PLAN_NAME="PlanName";
+
+    private final AdmModelService admModelService;
+
+    @Override
+    protected void analysisInternal(AdmAnalysisModel model) {
+        JSONObject currentAdmModelObj = model.getCurrentAdmModelObj();
+        if (null==currentAdmModelObj){
+            return;
+        }
+        // 1.根据当前楼层id查询bimId的对象:bimId生成规则:项目id+楼层id+:+sourceId
+        AdmModelFile currentModelFile = model.getCurrentModelFile();
+        if (null==currentModelFile){
+            return;
+        }
+        String bimIdPre = StrUtil.join(StrUtil.EMPTY, currentModelFile.getProjectId(), currentModelFile.getFloorId());
+        Map<String, ObjectNode> objectNodeMap = admModelService
+                .queryObjectDigitalsByBimIdPre(currentModelFile.getGroupCode(), bimIdPre);
+        // 2.解析数据为物理世界对象
+        JSONObject elements = currentAdmModelObj.getJSONObject(ELEMENTS);
+        String planName = currentAdmModelObj.getString(PLAN_NAME);
+        Set<String> keySet = elements.keySet();
+        for (String key : keySet) {
+            JSONArray objects = elements.getJSONArray(key);
+            DataHandlerEnum load = DataHandlerEnum.load(key);
+            DataHandlerService handlerService = SpringHelper.getBean(load.getName(), DataHandlerService.class);
+            handlerService.handleData(objectNodeMap,model,objects,key,planName);
+        }
+        List<ObjectNode> needAddObjects = model.getNeedAddObjects();
+        List<ObjectNode> needUpdateObjects = model.getNeedUpdateObjects();
+        Set<String> needDeleteObjectIds = model.getNeedDeleteObjectIds();
+        Set<String> needDeleteRelationObjIds = model.getNeedDeleteRelationObjIds();
+        List<ObjectRelation> needAddRelations = model.getNeedAddRelations();
+        if (CollUtil.isNotEmpty(needAddObjects)){
+            DigitalObjectFacade.create(currentModelFile.getGroupCode(),currentModelFile.getProjectId(),
+                    CommonConstant.DEFAULT_ID,CommonConstant.DEFAULT_ID,needAddObjects);
+        }
+        if (CollUtil.isNotEmpty(needUpdateObjects)){
+            DigitalObjectFacade.update(currentModelFile.getGroupCode(),currentModelFile.getProjectId(),
+                    CommonConstant.DEFAULT_ID,CommonConstant.DEFAULT_ID,needUpdateObjects);
+        }
+        if (CollUtil.isNotEmpty(needDeleteObjectIds)){
+            DigitalObjectFacade.delete(currentModelFile.getGroupCode(),currentModelFile.getProjectId(),
+                    CommonConstant.DEFAULT_ID,CommonConstant.DEFAULT_ID,CollUtil.newArrayList(needDeleteObjectIds));
+        }
+        if (CollUtil.isNotEmpty(needDeleteRelationObjIds)){
+            QueryCriteria criteria = new QueryCriteria();
+            ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+            ObjectNode objectNode = objectMapper.createObjectNode();
+            objectNode.putPOJO(ObjectRelation.OBJ_FROM_HUM,needDeleteObjectIds);
+            objectNode.putPOJO(ObjectRelation.GRAPH_CODE_HUM,model.getNeedDeleteRelationGraphCodes());
+            objectNode.putPOJO(ObjectRelation.REL_CODE_HUM,model.getNeedDeleteRelationRelCodes());
+            criteria.setCriteria(objectNode);
+            DigitalRelationFacade.deleteByCriteria(currentModelFile.getGroupCode(),currentModelFile.getProjectId(),
+                    CommonConstant.DEFAULT_ID,CommonConstant.DEFAULT_ID,criteria);
+            objectNode.remove(ObjectRelation.OBJ_FROM_HUM);
+            objectNode.putPOJO(ObjectRelation.OBJ_TO_HUM,needDeleteObjectIds);
+            DigitalRelationFacade.deleteByCriteria(currentModelFile.getGroupCode(),currentModelFile.getProjectId(),
+                    CommonConstant.DEFAULT_ID,CommonConstant.DEFAULT_ID,criteria);
+        }
+        if (CollUtil.isNotEmpty(needAddRelations)){
+            DigitalRelationFacade.create(currentModelFile.getGroupCode(),currentModelFile.getProjectId(),
+                    CommonConstant.DEFAULT_ID,CommonConstant.DEFAULT_ID,needAddRelations);
+        }
+    }
+
+    @Override
+    protected void afterAnalysis(AdmAnalysisModel model) {
+        model.setNeedDeleteRelationRelCodes(null);
+        model.setNeedDeleteRelationGraphCodes(null);
+        model.setNeedDeleteRelationObjIds(null);
+        model.setNeedAddRelations(null);
+        model.setNeedUpdateObjects(null);
+        model.setNeedDeleteObjectIds(null);
+        model.setNeedAddObjects(null);
+        model.setCurrentAdmModelObj(null);
+        model.setCurrentModelFile(null);
+        model.setCurrentFloor(null);
+    }
+
+    @Override
+    protected void afterAnalysisException(AdmAnalysisModel model,String errorMessage) {
+        AdmModelFile currentModelFile = model.getCurrentModelFile();
+        currentModelFile.setSyncErrorMsg(errorMessage);
+        currentModelFile.setSyncRetryTimes(ObjectUtil
+                .isNull(currentModelFile.getSyncRetryTimes())?1:currentModelFile.getSyncRetryTimes()+1);
+    }
+}

+ 40 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmPreFileServiceImpl.java

@@ -0,0 +1,40 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.persagy.adm.server.algorithm.constant.AdmModelFileStatusEnum;
+import com.persagy.adm.server.algorithm.entity.AdmModelFile;
+import com.persagy.adm.server.algorithm.service.AdmModelFileService;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 查询需要解析的模型文件数据
+ * @author : lijie
+ * Update By 2022/1/21 14:25
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AdmPreFileServiceImpl extends AdmAnalysisServiceBase {
+
+    private final AdmModelFileService admModelFileService;
+
+    @Override
+    protected void analysisInternal(AdmAnalysisModel model) {
+        // 1.查询状态为3的文件
+        List<AdmModelFile> admModelFiles = admModelFileService
+                .listByStatus(AdmModelFileStatusEnum.SYNC_DATA_COMPLETED.getValue());
+        if (CollUtil.isEmpty(admModelFiles)){
+            return;
+        }
+        model.setAdmModelFiles(admModelFiles);
+        this.getNext().analysis(model);
+    }
+
+
+
+}

+ 75 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmPreFloorServiceImpl.java

@@ -0,0 +1,75 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.adm.server.algorithm.constant.AdmModelFileStatusEnum;
+import com.persagy.adm.server.algorithm.entity.AdmModelFile;
+import com.persagy.adm.server.algorithm.service.AdmModelFileService;
+import com.persagy.adm.server.algorithm.service.AdmModelService;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 查询需要解析的模型文件数据
+ * @author : lijie
+ * Update By 2022/1/21 14:25
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AdmPreFloorServiceImpl extends AdmAnalysisServiceBase {
+
+    private final AdmModelService admModelService;
+
+    @Override
+    protected void analysisInternal(AdmAnalysisModel model) {
+        List<AdmModelFile> admModelFiles = model.getAdmModelFiles();
+        if (CollUtil.isEmpty(admModelFiles)){
+            return;
+        }
+        queryFloors(model);
+        this.getNext().analysis(model);
+    }
+    /**
+     * 填充楼层信息
+     * @param model :模型数据
+     * return : void
+     * @author : lijie
+     * Update By 2022/1/21 16:57
+     */
+    private void queryFloors(AdmAnalysisModel model) {
+        List<AdmModelFile> admModelFiles = model.getAdmModelFiles();
+        Map<String, List<AdmModelFile>> listMap = admModelFiles.stream()
+                .collect(Collectors.groupingBy(AdmModelFile::getGroupCode, Collectors.toList()));
+        Map<String, ObjectDigital> floorMap = MapUtil.newHashMap();
+        Set<Map.Entry<String, List<AdmModelFile>>> entries = listMap.entrySet();
+        for (Map.Entry<String, List<AdmModelFile>> entry : entries) {
+            if (CollUtil.isEmpty(entry.getValue())){
+                continue;
+            }
+            Set<String> floorIds = entry.getValue()
+                    .stream()
+                    .map(AdmModelFile::getFloorId).collect(Collectors.toSet());
+            List<ObjectDigital> floors = new ArrayList<>();
+            try{
+                floors = admModelService.queryFloorsByGroupCodeAndIds(entry.getKey(),floorIds);
+            }catch (Exception e){
+                log.warn("查询楼层信息失败:{},集团编码:{},楼层id数组:{}",e.getMessage(),entry.getKey(), JSONObject.toJSONString(floorIds));
+            }
+            if (CollUtil.isEmpty(floors)){
+                continue;
+            }
+            for (ObjectDigital floor : floors) {
+                floorMap.put(floor.getId(),floor);
+            }
+        }
+        model.setFloorMap(floorMap);
+    }
+}

+ 0 - 70
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmRevitAnalysisBase.java

@@ -1,70 +0,0 @@
-package com.persagy.adm.server.backstage.service.impl;
-
-import com.persagy.dmp.common.exception.BusinessException;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-
-/**
- * revit模型解析基类
- * @author : lijie
- * Update By 2022/1/21 10:48
- */
-@Slf4j
-public abstract class AdmRevitAnalysisBase {
-
-    /**
-     * 初始化方法,用于准备环境
-     * return : void
-     * @author : lijie
-     * Update By 2022/1/21 10:59
-     */
-    @PostConstruct
-    public final synchronized void init() throws BusinessException {
-        // 1.是否需要打印日志
-        if (log.isDebugEnabled()) {
-            log.debug("AdmRevitAnalysisBase.init方法开始:{}", this);
-        }
-        // 调具体实现类的方法,完成自身的初始化
-        initInternal();
-    }
-
-    /**
-     * 销毁方法
-     * return : void
-     * @author : lijie
-     * Update By 2022/1/21 10:50
-     */
-    @PreDestroy
-    public final synchronized void destroy() throws BusinessException {
-        // 1.是否需要打印日志
-        if (log.isDebugEnabled()) {
-            log.debug("AdmRevitAnalysisBase.destroy() :{}", this);
-        }
-        // 调具体实现类的方法,完成自身的初始化
-        destroyInternal();
-        if (log.isDebugEnabled()) {
-            log.debug("AdmRevitAnalysisBase.destroy() end:{}", this);
-        }
-    }
-
-
-
-
-
-    /**
-     * 内部初始化方法,子类覆写即可
-     * return : void
-     * @author : lijie
-     * Update By 2022/1/21 12:03
-     */
-    protected void initInternal(){};
-    /**
-     * 内部销毁方法,子类覆写即可
-     * return : void
-     * @author : lijie
-     * Update By 2022/1/21 12:03
-     */
-    protected void destroyInternal(){};
-}

+ 98 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/AdmUnzipFileServiceImpl.java

@@ -0,0 +1,98 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.adm.server.algorithm.entity.AdmModelFile;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.dmp.file.utils.FileStorageHelper;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipInputStream;
+
+/**
+ * 解压模型文件
+ * @author : lijie
+ * Update By 2022/1/21 15:36
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AdmUnzipFileServiceImpl extends AdmAnalysisServiceBase {
+
+    @Override
+    protected void analysisInternal(AdmAnalysisModel model) {
+        // 遍历模型文件
+        for (AdmModelFile admModelFile : model.getAdmModelFiles()) {
+            if (StrUtil.isBlank(admModelFile.getDataFileId())){
+                continue;
+            }
+            // 2.1 从文件服务下载jsonz文件
+            JSONObject dataObj = unzipDataModelFile(FileStorageHelper.downloadStream(admModelFile.getDataFileId()));
+            if (ObjectUtil.isNull(dataObj)){
+                admModelFile.setRemoved(Boolean.TRUE);
+                continue;
+            }
+            model.setCurrentAdmModelObj(dataObj);
+            model.setCurrentModelFile(admModelFile);
+            model.setCurrentFloor(model.getFloorMap().get(admModelFile.getFloorId()));
+            getNext().analysis(model);
+        }
+    }
+
+    /**
+     * 解压数据文件流
+     * @param inputStream :数据文件流
+     * @return : java.util.Map<java.lang.String,com.alibaba.fastjson.JSONObject>
+     * @author : lijie
+     * Update By 2022/1/17 11:59
+     */
+    private JSONObject unzipDataModelFile(InputStream inputStream) {
+        Map<String, byte[]> byteMap = unzipDataModelFileToByteArray(inputStream);
+        Set<String> keySet = byteMap.keySet();
+        Map<String, JSONObject> resultMap = MapUtil.newHashMap(keySet.size());
+        for (String key : keySet) {
+            byte[] bytes = byteMap.get(key);
+            if (null==bytes || bytes.length<=0){
+                continue;
+            }
+            return JSONObject.parseObject(StrUtil.str(bytes, StandardCharsets.UTF_8));
+        }
+        return null;
+    }
+    /**
+     * 解压文件到字节流
+     * @param inputStream : 数据文件流
+     * @return : java.util.Map<java.lang.String,java.io.ByteArrayInputStream>
+     * @author : lijie
+     * Update By 2022/1/17 12:02
+     */
+    @SneakyThrows
+    private Map<String, byte[]> unzipDataModelFileToByteArray(InputStream inputStream){
+        if (null==inputStream){
+            return new HashMap<>(0);
+        }
+        Map<String, byte[]> resultMap = MapUtil.newHashMap();
+        ZipInputStream zipInputStream = new ZipInputStream(inputStream, Charset.forName("GBK"));
+        ZipUtil.read(zipInputStream, zipEntry -> {
+            if (zipEntry.isDirectory()){
+                return;
+            }
+            resultMap.put(zipEntry.getName(), IoUtil.readBytes(zipInputStream,false));
+        });
+        return resultMap;
+    }
+
+}

+ 28 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/DefaultDataHandler.java

@@ -0,0 +1,28 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import com.persagy.dmp.common.constant.DigitalObjectType;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * 默认的数据处理类
+ * @author : lijie
+ * Update By 2022/1/22 17:20
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class DefaultDataHandler extends AbstractDataHandler {
+    /**
+     * 获得对象分类
+     * @param classCode :对象类型编码
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 17:21
+     */
+    @Override
+    protected String getObjectType(String classCode) {
+        return classCode.length()==4? DigitalObjectType.SYSTEM.getIndex():DigitalObjectType.EQUIPMENT.getIndex();
+    }
+}

+ 39 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/GridDataHandler.java

@@ -0,0 +1,39 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.dmp.common.constant.DigitalObjectType;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 解析Grids的数据处理类
+ * @author : lijie
+ * Update By 2022/1/22 17:20
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class GridDataHandler extends AbstractDataHandler {
+    /**
+     * 获得对象分类
+     * @param classCode :对象类型编码
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 17:21
+     */
+    @Override
+    protected String getObjectType(String classCode) {
+        return null;
+    }
+
+
+    @Override
+    public void handleData(Map<String, ObjectNode> objectNodeMap, AdmAnalysisModel model, JSONArray objects, String classCode,String planName) {
+        // 啥都不做
+    }
+}

+ 60 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/LevelDataHandler.java

@@ -0,0 +1,60 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.server.algorithm.entity.AdmModelFile;
+import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
+import com.persagy.adm.server.backstage.domain.Level;
+import com.persagy.dmp.common.constant.DigitalObjectType;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 处理Levels的数据处理类
+ * @author : lijie
+ * Update By 2022/1/22 17:20
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class LevelDataHandler extends AbstractDataHandler {
+    /**
+     * 获得对象分类
+     * @param classCode :对象类型编码
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 17:21
+     */
+    @Override
+    protected String getObjectType(String classCode) {
+        return DigitalObjectType.FLOOR.getIndex();
+    }
+
+    @Override
+    public void handleData(Map<String, ObjectNode> objectNodeMap, AdmAnalysisModel model, JSONArray objects,
+                           String classCode,String planName) {
+        AdmModelFile currentModelFile = model.getCurrentModelFile();
+        if (null==currentModelFile|| StrUtil.isBlank(planName)){
+            return;
+        }
+        List<Level> levels = objects.toJavaList(Level.class);
+        if (CollUtil.isEmpty(levels)){
+            return;
+        }
+        Optional<Level> first = levels.stream()
+                .filter(level -> planName.equals(level.getName()))
+                .findFirst();
+        if(!first.isPresent()){
+            return;
+        }
+        Level level = first.get();
+        currentModelFile.setLevel(level.getValue());
+    }
+}

+ 41 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/backstage/service/impl/SpaceDataHandler.java

@@ -0,0 +1,41 @@
+package com.persagy.adm.server.backstage.service.impl;
+
+import com.persagy.dmp.common.constant.DigitalObjectType;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * 处理Spaces,Rooms的数据处理类
+ * @author : lijie
+ * Update By 2022/1/22 17:20
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class SpaceDataHandler extends AbstractDataHandler {
+    /**
+     * 获得对象分类
+     * @param classCode :对象类型编码
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 17:21
+     */
+    @Override
+    protected String getObjectType(String classCode) {
+        return DigitalObjectType.SPACE.getIndex();
+    }
+    /**
+     * 获取对象类型
+     * @param classCode : 对象类型
+     * @return : java.lang.String
+     * @author : lijie
+     * Update By 2022/1/22 18:26
+     */
+    @Override
+    protected String getClassCode(String classCode) {
+        // 物业分区类型
+        return "GeneralZone";
+    }
+}