Преглед на файлове

实现物理世界对象上传逻辑

lijie преди 3 години
родител
ревизия
c8ff31fe01
променени са 16 файла, в които са добавени 1242 реда и са изтрити 338 реда
  1. 2 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/CommonConstant.java
  2. 30 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/GraphCodeEnum.java
  3. 36 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/RelCodeEnum.java
  4. 2 1
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/entity/ObjectInstance.java
  5. 24 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/init/InitRunner.java
  6. 23 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/model/rwd/RelCodeDTO.java
  7. 87 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/model/rwd/UploadDTO.java
  8. 1 1
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/BaseService.java
  9. 100 317
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/impl/BatchHandleObjectServiceImpl.java
  10. 21 2
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/FileCheckService.java
  11. 306 8
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractFileCheckService.java
  12. 286 4
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/CommonFileCheckServiceImpl.java
  13. 147 2
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/EquipFileCheckServiceImpl.java
  14. 151 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/SystemFileCheckServiceImpl.java
  15. 26 3
      dmp-rwd/src/main/resources/mapper/ProjectDao.xml
  16. BIN
      dmp-rwd/src/main/resources/template/ObjectInfoTemplate.xlsx

+ 2 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/CommonConstant.java

@@ -59,6 +59,8 @@ public class CommonConstant {
     public static final String REL_COL_FORMAT="{}Sheet表中第{}行,";
     /**第几行第几列模板*/
     public static final String REL_ROW_COL_FORMAT="{}Sheet表中第{}行第{}列,";
+    /**第几行第几列模板*/
+    public static final String GRAPH_ID_FORMAT="Gt{}001";
     /**基础对象录入*/
     public static final String COMMON_SHEET_NAME="基础对象录入";
     /**设备对象录入*/

+ 30 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/GraphCodeEnum.java

@@ -0,0 +1,30 @@
+package com.persagy.dmp.rwd.constants;
+
+import lombok.Getter;
+
+/**
+ * 对象类型
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Getter
+public enum GraphCodeEnum {
+    /** 建筑从属关系 */
+    ARCH_SUBSET("ArchSubset", "建筑从属关系"),
+    /** 区域服务关系 */
+    ARCH_FOR_ARCH("ArchForArch", "区域服务关系"),
+    /** 机电类所在区域关系 */
+    MECH_IN_ARCH("MechInArch", "机电类所在区域关系"),
+    /** 机电类服务区域关系 */
+    MECH_FOR_ARCH("MechForArch", "机电类服务区域关系"),
+    /** 机电从属关系 */
+    MECH_SUBSET("MechSubset", "机电从属关系");
+
+    private String index;
+    private String name;
+
+    GraphCodeEnum(String index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+}

+ 36 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/RelCodeEnum.java

@@ -0,0 +1,36 @@
+package com.persagy.dmp.rwd.constants;
+
+import lombok.Getter;
+
+/**
+ * 对象类型
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Getter
+public enum RelCodeEnum {
+    /** 对象类型 */
+    BD_2_FL("Bd2Fl", "建筑下的楼层"),
+    BD_2_SH("Bd2Sh", "建筑下的竖井"),
+    BD_2_SP("Bd2Sp", "建筑下的业务空间"),
+    FL_2_SP("Fl2Sp", "楼层下的业务空间"),
+    SH_2_SP("Sh2Sp", "竖井下的业务空间"),
+    SY_2_BD("Sy2Bd", "系统所在建筑"),
+    SY_2_FL("Sy2Fl", "系统所在楼层"),
+    SY_2_SH("Sy2Sh", "系统所在竖井"),
+    SY_2_SP("Sy2Sp", "系统所在空间"),
+    EQ_2_BD("Eq2Bd", "设备所在建筑"),
+    EQ_2_FL("Eq2Fl", "设备所在楼层"),
+    EQ_2_SH("Eq2Sh", "设备所在竖井"),
+    EQ_2_SP("Eq2Sp", "设备所在空间"),
+    SY_2_EQ("Sy2Eq", "系统下的设备"),
+    EQ_2_EC("Eq2Ec", "设备下的部件");
+
+    private String index;
+    private String name;
+
+    RelCodeEnum(String index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+}

+ 2 - 1
dmp-rwd/src/main/java/com/persagy/dmp/rwd/entity/ObjectInstance.java

@@ -45,7 +45,8 @@ public class ObjectInstance {
 	private Integer grouping;
 
 	@Type(type = "json")
-	@TableField(value = "infos",typeHandler = JsonTypeHandlerFactory.ObjectNodeHandler.class)
+	//@TableField(value = "infos",typeHandler = JsonTypeHandlerFactory.ObjectNodeHandler.class)
+	@TableField(value = "infos",typeHandler = JacksonTypeHandler.class)
 	private ObjectNode infos;
 
 	@Type(type = "json")

+ 24 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/init/InitRunner.java

@@ -0,0 +1,24 @@
+package com.persagy.dmp.rwd.init;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+@Component
+public class InitRunner implements CommandLineRunner {
+
+    @Autowired
+    private Environment environment;
+
+    @Override
+    public void run(String... args) throws Exception {
+        System.out.println("spring.datasource.druid.filter.wall.config.multi-statement-allow:"
+                +environment.getProperty("spring.datasource.druid.filter.wall.config.multi-statement-allow"));
+        System.out.println("spring.datasource.druid.filter.wall.config.none-base-statement-allow:"
+                +environment.getProperty("spring.datasource.druid.filter.wall.config.none-base-statement-allow"));
+        System.out.println("spring.datasource.druid.filters:"+environment.getProperty("spring.datasource.druid.filters"));
+        System.out.println("spring.datasource.druid.filter.wall.enabled:"+environment.getProperty("spring.datasource.druid.filter.wall.enabled"));
+    }
+}

+ 23 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/model/rwd/RelCodeDTO.java

@@ -0,0 +1,23 @@
+package com.persagy.dmp.rwd.model.rwd;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RelCodeDTO {
+    /**边类型名称*/
+    private String relCodeName;
+    /**边类型编码*/
+    private String relCode;
+    /**图类型编码*/
+    private String graphCode;
+    /**图类型名称*/
+    private String graphName;
+
+
+}

+ 87 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/model/rwd/UploadDTO.java

@@ -0,0 +1,87 @@
+package com.persagy.dmp.rwd.model.rwd;
+
+import com.persagy.dmp.rwd.entity.ObjectInstance;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/***
+ * Description: 存储上传物理世界对象的数据
+ * @author : lijie
+ * date :2021/9/26 12:06
+ * Update By lijie 2021/9/26 12:06
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UploadDTO {
+
+    /**基础对象录入列表*/
+    private List<List<Object>> commonObjectUploadData;
+    /**设备对象录入列表*/
+    private List<List<Object>> equipObjectUploadData;
+    /**系统对象录入列表*/
+    private List<List<Object>> systemObjectUploadData;
+    /**系统对象信息点列表*/
+    private List<List<Object>> systemObjectInfosListList;
+    /**设备对象信息点列表*/
+    private List<List<Object>> equipObjectInfosListList;
+    /**建筑功能类型列表*/
+    private List<List<Object>> buildingFuncTypesListList;
+    /**楼层编码列表*/
+    private List<List<Object>> floorIdentitiesListList;
+    /**空间分区列表*/
+    private List<List<Object>> spaceZonesListList;
+    /**空间功能类型列表*/
+    private List<List<Object>> spaceFuncTypesListList;
+    /**专业系统设备类型列表*/
+    private List<List<Object>> objectClazzListList;
+    /**关系类型列表*/
+    private List<List<Object>> relCodesListList;
+    /**{系统信息点名称:系统信息点code}映射*/
+    private Map<String,String> systemObjectInfosMap;
+    /**{设备信息点名称:设备信息点code}映射*/
+    private Map<String,String> equipObjectInfosMap;
+    /**{建筑功能类型名称:建筑功能类型code}映射*/
+    private Map<String,String> buildingFuncTypesMap;
+    /**{楼层编码名称:楼层编码code}映射*/
+    private Map<String,String> floorIdentitiesMap;
+    /**{空间分区名称:空间分区code}映射*/
+    private Map<String,String> spaceZonesMap;
+    /**{空间功能类型名称:空间功能类型code}映射*/
+    private Map<String,String> spaceFuncTypesMap;
+    /**{专业系统设备类型名称:专业系统设备类型code}映射*/
+    private Map<String,String> objectClazzMap;
+    /**{关系类型名称:关系类型DTO}映射*/
+    private Map<String,RelCodeDTO> relCodesMap;
+    /**集团编码*/
+    private String groupCode;
+    /**账号id*/
+    private String userId;
+    /**应用id*/
+    private String appId;
+    /**{项目id:项目对象}映射*/
+    private Map<String, ObjectInstance> projectMap;
+    /**{建筑本地编码:{项目id:[建筑对象A,建筑对象B]}}映射*/
+    private Map<String, Map<String,List<ObjectInstance>>> buildMap;
+    /**{楼层本地编码:{项目id:[楼层对象A,楼层对象B]}}映射*/
+    private Map<String, Map<String,List<ObjectInstance>>> floorMap;
+    /**{空间本地编码:{项目id:[空间对象A,空间对象B]}}映射*/
+    private Map<String, Map<String,List<ObjectInstance>>> spaceMap;
+    /**{设备本地编码:{项目id:[设备对象A,设备对象B]}}映射*/
+    private Map<String, Map<String,List<ObjectInstance>>> equipMap;
+    /**{系统本地编码:{项目id:[系统对象A,系统对象B]}}映射*/
+    private Map<String, Map<String,List<ObjectInstance>>> systemMap;
+
+
+
+
+
+
+}

+ 1 - 1
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/BaseService.java

@@ -70,7 +70,7 @@ public class BaseService {
     @Autowired
     protected SchemaProjectRepository schemaProjectRepository;
 
-    protected void setSharding(String groupCode, String projectId){
+    public void setSharding(String groupCode, String projectId){
         JpaSqlExecuteContext.init(groupCode, projectId);
     }
 

+ 100 - 317
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/impl/BatchHandleObjectServiceImpl.java

@@ -13,6 +13,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.persagy.common.criteria.JacksonCriteria;
 import com.persagy.common.web.ListResponse;
 import com.persagy.common.web.PagedResponse;
+import com.persagy.dmp.config.DmpParameterStorage;
 import com.persagy.dmp.rwd.constants.*;
 import com.persagy.dmp.rwd.entity.ObjectInstance;
 import com.persagy.dmp.rwd.enums.ObjType;
@@ -22,6 +23,8 @@ import com.persagy.dmp.rwd.handler.ResponseCode;
 import com.persagy.dmp.rwd.handler.SpringHelper;
 import com.persagy.dmp.rwd.model.ClassDefModel;
 import com.persagy.dmp.rwd.model.FuncidDefModel;
+import com.persagy.dmp.rwd.model.rwd.RelCodeDTO;
+import com.persagy.dmp.rwd.model.rwd.UploadDTO;
 import com.persagy.dmp.rwd.repository.ObjectInstanceRepository;
 import com.persagy.dmp.rwd.repository.ProjectDao;
 import com.persagy.dmp.rwd.service.*;
@@ -82,6 +85,8 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     private static final String EQUIPMENT_OBJECT_INFOS_SHEET_NAME="equipmentObjectInfos";
     /**专业系统设备类sheet*/
     private static final String OBJECT_CLAZZ_SHEET_NAME="objectClazz";
+    /**关系类sheet*/
+    private static final String REL_CODES_SHEET_NAME="relCodes";
     /**楼层定义sheet*/
     private static final String FLOOR_IDENTITIES_SHEET_NAME="floorIdentities";
 
@@ -133,7 +138,6 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     @Override
     public void uploadObjectTemplateFile(MultipartFile file, HttpServletRequest request,
                                          HttpServletResponse response,String groupCode) throws IOException {
-        Workbook workbook = WorkbookUtil.createBook(file.getInputStream());
         // 1.获得各个sheet的列表数据
         ExcelReader commonObjectSheet = ExcelUtil.getReader(file.getInputStream(),0);
         ExcelReader equipObjectSheet = ExcelUtil.getReader(file.getInputStream(),1);
@@ -145,52 +149,65 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         ExcelReader spaceZonesSheet = ExcelUtil.getReader(file.getInputStream(), SPACE_ZONES_SHEET_NAME);
         ExcelReader spaceFuncTypesSheet = ExcelUtil.getReader(file.getInputStream(), SPACE_FUNC_TYPES_SHEET_NAME);
         ExcelReader objectClazzSheet = ExcelUtil.getReader(file.getInputStream(), OBJECT_CLAZZ_SHEET_NAME);
-        // 1.1 基础对象录入列表
-        List<List<Object>> commonObjectUploadData = commonObjectSheet.read();
-        // 1.2 设备对象录入列表
-        List<List<Object>> equipObjectUploadData = equipObjectSheet.read();
-        // 1.3 系统对象录入列表
-        List<List<Object>> systemObjectUploadData = systemObjectSheet.read();
-        // 1.4 系统对象信息点列表
-        List<List<Object>> systemObjectInfosListList = systemObjectInfosSheet.read();
-        // 1.5 设备对象信息点列表
-        List<List<Object>> equipObjectInfosListList = equipObjectInfosSheet.read();
-        // 1.6 建筑功能类型列表
-        List<List<Object>> buildingFuncTypesListList = buildingFuncTypesSheet.read();
-        // 1.7 楼层编码列表
-        List<List<Object>> floorIdentitiesListList = floorIdentitiesSheet.read();
-        // 1.8 空间分区列表
-        List<List<Object>> spaceZonesListList = spaceZonesSheet.read();
-        // 1.9 空间功能类型列表
-        List<List<Object>> spaceFuncTypesListList = spaceFuncTypesSheet.read();
-        // 1.10 专业系统设备类型列表
-        List<List<Object>> objectClazzListList = objectClazzSheet.read();
+        ExcelReader relCodesSheet = ExcelUtil.getReader(file.getInputStream(), REL_CODES_SHEET_NAME);
+        // 解析数据
+        UploadDTO uploadDTO = UploadDTO.builder()
+                // 1.1 基础对象录入列表
+                .commonObjectUploadData(commonObjectSheet.read())
+                // 1.2 设备对象录入列表
+                .equipObjectUploadData(equipObjectSheet.read())
+                // 1.3 系统对象录入列表
+                .systemObjectUploadData(systemObjectSheet.read())
+                // 1.4 系统对象信息点列表
+                .systemObjectInfosListList(systemObjectInfosSheet.read())
+                // 1.5 设备对象信息点列表
+                .equipObjectInfosListList(equipObjectInfosSheet.read())
+                // 1.6 建筑功能类型列表
+                .buildingFuncTypesListList(buildingFuncTypesSheet.read())
+                // 1.7 楼层编码列表
+                .floorIdentitiesListList(floorIdentitiesSheet.read())
+                // 1.8 空间分区列表
+                .spaceZonesListList(spaceZonesSheet.read())
+                // 1.9 空间功能类型列表
+                .spaceFuncTypesListList(spaceFuncTypesSheet.read())
+                // 1.10 专业系统设备类型列表
+                .objectClazzListList(objectClazzSheet.read())
+                // 1.11 集团编码
+                .groupCode(groupCode)
+                // 1.12 账号id
+                .userId(DmpParameterStorage.getUserId())
+                // 1.13 应用id
+                .appId(DmpParameterStorage.getAppId())
+                // 1.14 关系类型列表
+                .relCodesListList(relCodesSheet.read())
+                .build();
         // 2.获得名称与信息点的映射
         // 2.1 {系统信息点名称:系统信息点code}映射
-        Map<String,String> systemObjectInfosMap = createDataMap(systemObjectInfosListList,0,1);
+        uploadDTO.setSystemObjectInfosMap(createDataMap(uploadDTO.getSystemObjectInfosListList(),0,1));
         // 2.2 {设备信息点名称:设备信息点code}映射
-        Map<String,String> equipObjectInfosMap = createDataMap(equipObjectInfosListList,0,1);
+        uploadDTO.setEquipObjectInfosMap(createDataMap(uploadDTO.getEquipObjectInfosListList(),0,1));
         // 2.3 {建筑功能类型名称:建筑功能类型code}映射
-        Map<String,String> buildingFuncTypesMap = createDataMap(buildingFuncTypesListList,0,1);
+        uploadDTO.setBuildingFuncTypesMap(createDataMap(uploadDTO.getBuildingFuncTypesListList(),0,1));
         // 2.4 {楼层编码名称:楼层编码code}映射
-        Map<String,String> floorIdentitiesMap = createDataMap(floorIdentitiesListList,0,1);
+        uploadDTO.setFloorIdentitiesMap(createDataMap(uploadDTO.getFloorIdentitiesListList(),0,1));
         // 2.5 {空间分区名称:空间分区code}映射
-        Map<String,String> spaceZonesMap = createDataMap(spaceZonesListList,0,1);
+        uploadDTO.setSpaceZonesMap(createDataMap(uploadDTO.getSpaceZonesListList(),0,1));
         // 2.6 {空间功能类型名称:空间功能类型code}映射
-        Map<String,String> spaceFuncTypesMap = createDataMap(spaceFuncTypesListList,0,1);
+        uploadDTO.setSpaceFuncTypesMap(createDataMap(uploadDTO.getSpaceFuncTypesListList(),0,1));
         // 2.7 {专业系统设备类型名称:专业系统设备类型code}映射
-        Map<String,String> objectClazzMap = createDataMap(objectClazzListList,0,1);
+        uploadDTO.setObjectClazzMap(createDataMap(uploadDTO.getObjectClazzListList(),0,1));
+        uploadDTO.setRelCodesMap(createRelCodeDataMap(uploadDTO.getRelCodesListList()));
         List<String> errorList = new ArrayList<>();
         // 3.文件及文件表头校验
         // 3.1 校验基础对象录入
         FileCheckService commonFileCheckService = SpringHelper.getBean(CommonFileCheckServiceImpl.class);
-        commonFileCheckService.checkFileIsValid(errorList,commonObjectUploadData,new HashMap<>());
+        commonFileCheckService.checkFileIsValid(errorList,uploadDTO.getCommonObjectUploadData(),new HashMap<>());
         // 3.2 校验设备对象录入
         FileCheckService equipFileCheckService = SpringHelper.getBean(EquipFileCheckServiceImpl.class);
-        equipFileCheckService.checkFileIsValid(errorList,equipObjectUploadData,equipObjectInfosMap);
+        equipFileCheckService.checkFileIsValid(errorList,uploadDTO.getEquipObjectUploadData(),uploadDTO.getEquipObjectInfosMap());
         // 3.3 校验系统对象录入
         FileCheckService systemFileCheckService = SpringHelper.getBean(SystemFileCheckServiceImpl.class);
-        systemFileCheckService.checkFileIsValid(errorList,systemObjectUploadData,systemObjectInfosMap);
+        systemFileCheckService.checkFileIsValid(errorList,uploadDTO.getSystemObjectUploadData(),uploadDTO.getSystemObjectInfosMap());
         if (CollUtil.isNotEmpty(errorList)){
             FileUtil.writeErrorContentToResponse(errorList,response,request, CommonConstant.UPLOAD_ERR_FILE_NAME);
             return;
@@ -204,330 +221,90 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         Map<String, Map<String,List<ObjectInstance>>> spaceMap = new HashMap<>();
         Map<String, Map<String,List<ObjectInstance>>> equipMap = new HashMap<>();
         Map<String, Map<String,List<ObjectInstance>>> systemMap = new HashMap<>();
-        queryExistDatas(commonObjectUploadData, equipObjectUploadData, systemObjectUploadData,
-                projectMap, buildMap, floorMap, spaceMap, equipMap, systemMap, groupCode);
+        queryExistDatas(uploadDTO);
         // 4.1 校验基础对象录入
-        checkCommonDataIsValid(errorList,commonObjectUploadData,buildingFuncTypesMap,
-                floorIdentitiesMap,spaceZonesMap,spaceFuncTypesMap,projectMap,buildMap,floorMap,spaceMap);
+        commonFileCheckService.checkDataIsValid(errorList,uploadDTO);
         // 4.2 校验设备对象录入
-        checkEquipDataIsValid(errorList,equipObjectUploadData,equipObjectInfosMap,objectClazzMap,projectMap,equipMap);
+        equipFileCheckService.checkDataIsValid(errorList,uploadDTO);
         // 4.3 校验系统对象录入
-        checkSystemDataIsValid(errorList,systemObjectUploadData,systemObjectInfosMap,objectClazzMap,projectMap,systemMap);
+        systemFileCheckService.checkDataIsValid(errorList,uploadDTO);
         if (CollUtil.isNotEmpty(errorList)){
             FileUtil.writeErrorContentToResponse(errorList,response,request, CommonConstant.UPLOAD_ERR_FILE_NAME);
             return;
         }
-//        batchHandleUploadDatas(userId, uploadData,firstSheet, deptMap, positionMap, domainMap,
-//                sexMap,projectMap,deptTypeMap,positionAuthoMap);
-        response.addHeader(CommonConstant.UPLOAD_FLAG,CommonConstant.SUCCESS_FLAG_ONE);
-    }
+        // 5.生成物理世界对象及其关系
+        // 5.1 处理基础对象录入
+        commonFileCheckService.batchHandleUploadDatas(uploadDTO);
+        // 5.2 处理设备对象录入
 
-    /***
-     * Description: 校验系统数据
-     * @param errorList : 错误提示列表
-     * @param systemObjectUploadData : 系统对象数据
-     * @param systemObjectInfosMap : 系统信息点映射
-     * @param objectClazzMap : 专业系统设备类型映射
-     * @param projectMap : 项目映射
-     * @param systemMap: 已存在的系统映射
-     * @return : void
-     * @author : lijie
-     * @date :2021/9/25 0:49
-     * Update By lijie 2021/9/25 0:49
-     */
-    private void checkSystemDataIsValid(List<String> errorList, List<List<Object>> systemObjectUploadData,
-                                       Map<String, String> systemObjectInfosMap,
-                                       Map<String, String> objectClazzMap,
-                                       Map<String, ObjectInstance> projectMap,
-                                       Map<String, Map<String, List<ObjectInstance>>> systemMap) {
-        int startRowIndex = 7;
-        if (systemObjectUploadData.size()<=startRowIndex){
-            return;
-        }
-        // 1.校验设备类型必填
-        List<Object> clazzRow = systemObjectUploadData.get(2);
-        String relClazzCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.SYSTEM_SHEET_NAME,3);
-        // 1.1 专业名称
-        String domainName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(1)));
-        checkContentBlank(errorList,domainName,relClazzCol, "专业");
-        if (StrUtil.isNotBlank(domainName) && !objectClazzMap.containsKey(domainName)){
-            errorList.add(StrUtil.appendIfMissing(relClazzCol, "专业",ErrorEnum.NO_EXIST_ERROR.getDesc()));
-        }
-        // 1.2 系统类型名称
-        String systemName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(2)));
-        checkContentBlank(errorList,systemName,relClazzCol, "系统类");
-        if (StrUtil.isNotBlank(systemName) && !objectClazzMap.containsKey(systemName)){
-            errorList.add(StrUtil.appendIfMissing(relClazzCol, "系统类",ErrorEnum.NO_EXIST_ERROR.getDesc()));
-        }
-        // 2.校验信息点code是否正确
-        checkObjectInfoValid(errorList,systemObjectUploadData.get(6),systemObjectUploadData.get(4),7,
-                systemObjectInfosMap,CommonConstant.SYSTEM_SHEET_NAME,6,4);
-        // 3.校验必填项
-        int equipSize = systemObjectUploadData.size();
-        for (int i = startRowIndex; i < equipSize; i++) {
-            String relCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.SYSTEM_SHEET_NAME,i+1);
-            List<Object> datas = systemObjectUploadData.get(i);
-            // 1.项目id:必填,是否存在
-            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
-            checkProjectValid(errorList,projectId,projectMap,relCol);
-            // 2.建筑本地编码:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,
-                    SystemObjectColumnEnum.BUILD_LOCAL_ID.getRelName());
-            // 3.建筑与系统关系:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
-                    SystemObjectColumnEnum.BUILD_EQUIP_REL.getRelName());
-            // 4.系统本地编码:必填,唯一
-            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4))),projectId,
-                    systemMap,relCol,SystemObjectColumnEnum.SYSTEM_LOCAL_ID.getRelName());
-            // 5.系统名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
-                    SystemObjectColumnEnum.SYSTEM_LOCAL_NAME.getRelName());
-            // 6.系统状态:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
-                    SystemObjectColumnEnum.VALID.getRelName());
-        }
-    }
+        // 5.3 处理系统对象录入
 
-    /***
-     * Description: 校验设备数据
-     * @param errorList : 错误提示列表
-     * @param equipObjectUploadData : 设备对象数据
-     * @param equipObjectInfosMap : 设备信息点映射
-     * @param objectClazzMap : 专业系统设备类型映射
-     * @param projectMap : 项目映射
-     * @param equipMap: 已存在的设备映射
-     * @return : void
-     * @author : lijie
-     * @date :2021/9/25 0:49
-     * Update By lijie 2021/9/25 0:49
-     */
-    private void checkEquipDataIsValid(List<String> errorList, List<List<Object>> equipObjectUploadData,
-                                       Map<String, String> equipObjectInfosMap,
-                                       Map<String, String> objectClazzMap,
-                                       Map<String, ObjectInstance> projectMap,
-                                       Map<String, Map<String, List<ObjectInstance>>> equipMap) {
-        int startRowIndex = 7;
-        if (equipObjectUploadData.size()<=startRowIndex){
-            return;
-        }
-        // 1.校验设备类型必填
-        List<Object> clazzRow = equipObjectUploadData.get(2);
-        String relClazzCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.EQUIP_SHEET_NAME,3);
-        // 1.1 专业名称
-        String domainName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(1)));
-        checkContentBlank(errorList,domainName,relClazzCol, "专业");
-        if (StrUtil.isNotBlank(domainName) && !objectClazzMap.containsKey(domainName.substring(0,domainName.lastIndexOf(StrUtil.UNDERLINE)))){
-            errorList.add(StrUtil.appendIfMissing(relClazzCol, "专业",ErrorEnum.NO_EXIST_ERROR.getDesc()));
-        }
-        // 1.2 系统类型名称
-        String systemName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(2)));
-        checkContentBlank(errorList,systemName,relClazzCol, "系统类");
-        if (StrUtil.isNotBlank(systemName) && !objectClazzMap.containsKey(systemName.substring(0,systemName.lastIndexOf(StrUtil.UNDERLINE)))){
-            errorList.add(StrUtil.appendIfMissing(relClazzCol, "系统类",ErrorEnum.NO_EXIST_ERROR.getDesc()));
-        }
-        // 1.3 设备类型名称
-        String equipName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(3)));
-        checkContentBlank(errorList,equipName,relClazzCol, "设备类型");
-        if (StrUtil.isNotBlank(equipName) && !objectClazzMap.containsKey(equipName.substring(0,equipName.lastIndexOf(StrUtil.UNDERLINE)))){
-            errorList.add(StrUtil.appendIfMissing(relClazzCol, "设备类型",ErrorEnum.NO_EXIST_ERROR.getDesc()));
-        }
-        // 2.校验信息点code是否正确
-        checkObjectInfoValid(errorList,equipObjectUploadData.get(6),equipObjectUploadData.get(4),7,
-                equipObjectInfosMap,CommonConstant.EQUIP_SHEET_NAME,6,4);
-        // 3.校验必填项
-        int equipSize = equipObjectUploadData.size();
-        for (int i = startRowIndex; i < equipSize; i++) {
-            String relCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.EQUIP_SHEET_NAME,i+1);
-            List<Object> datas = equipObjectUploadData.get(i);
-            // 1.项目id:必填,是否存在
-            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
-            checkProjectValid(errorList,projectId,projectMap,relCol);
-            // 2.空间本地编码:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,
-                    EquipObjectColumnEnum.SPACE_LOCAL_ID.getRelName());
-            // 3.空间与设备关系:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
-                    EquipObjectColumnEnum.SPACE_EQUIP_REL.getRelName());
-            // 4.设备本地编码:必填,唯一
-            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4))),projectId,
-                    equipMap,relCol,EquipObjectColumnEnum.EQUIP_LOCAL_ID.getRelName());
-            // 5.设备名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
-                    EquipObjectColumnEnum.EQUIP_LOCAL_NAME.getRelName());
-            // 6.有效状态:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
-                    EquipObjectColumnEnum.VALID.getRelName());
-        }
-    }
-    /***
-     * Description: 校验信息点code是否正确
-     * @param errorList : 错误列表
-     * @param infosNameList : 信息点名称列表
-     * @param infosCodeList : 信息点code列表
-     * @param colStartIndex : 列起始索引
-     * @param objectInfosMap : 对象信息点映射
-     * @return : void
-     * @author : lijie
-     * @date :2021/9/25 1:20
-     * Update By lijie 2021/9/25 1:20
-     */
-    private void checkObjectInfoValid(List<String> errorList, List<Object> infosNameList, List<Object> infosCodeList,
-                                      Integer colStartIndex, Map<String, String> objectInfosMap,String sheetName,
-                                      Integer nameIndex,Integer codeIndex) {
-        if (CollUtil.isEmpty(infosNameList) || infosNameList.size()<=colStartIndex){
-            return;
-        }
-        for (int i = colStartIndex; i < infosNameList.size(); i++) {
-            String nameRelCol = StrUtil.format(CommonConstant.REL_ROW_COL_FORMAT,sheetName,nameIndex+1,i+1);
-            String codeRelCol = StrUtil.format(CommonConstant.REL_ROW_COL_FORMAT,sheetName,codeIndex+1,i+1);
-            String name = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infosNameList.get(i)));
-            String code = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infosCodeList.get(i)));
-            checkContentBlank(errorList,name,nameRelCol,"信息点名称");
-            checkContentBlank(errorList,code,codeRelCol,"信息点code");
-            if (StrUtil.isNotBlank(name) && !objectInfosMap.containsKey(name)){
-                errorList.add(StrUtil.appendIfMissing(nameRelCol, "信息点名称",ErrorEnum.NO_EXIST_ERROR.getDesc()));
-            }
-            if (StrUtil.isNotBlank(name) && StrUtil.isNotBlank(code) && !objectInfosMap.containsValue(code)){
-                errorList.add(StrUtil.appendIfMissing(codeRelCol, "信息点code",ErrorEnum.NO_EXIST_ERROR.getDesc()));
-            }
-        }
+        response.addHeader(CommonConstant.UPLOAD_FLAG,CommonConstant.SUCCESS_FLAG_ONE);
     }
-
     /***
-     * Description: 校验基础对象录入的数据
-     * @param errorList : 错误提示列表
-     * @param commonObjectUploadData : 基础对象录入数据
-     * @param buildingFuncTypesMap : 建筑功能类型名称和建筑功能类型code的映射
-     * @param floorIdentitiesMap : 楼层编码名称和楼层编码code的映射
-     * @param spaceZonesMap : 空间分区名称和空间分区code的映射
-     * @param spaceFuncTypesMap : 空间功能类型名称和空间功能类型code的映射
-     * @param projectMap: 项目id与项目对象的映射
-     * @param buildMap:建筑本地编码与建筑对象的映射
-     * @param floorMap:楼层本地编码与楼层对象的映射
-     * @param spaceMap:空间本地编码与空间对象的映射
-     * @return : void
+     * Description: 解析关系类型的对象
+     * @param relCodesListList : 关系类型对象列表
+     * @return : java.util.Map<java.lang.String,com.persagy.dmp.rwd.model.rwd.RelCodeDTO>
      * @author : lijie
-     * @date :2021/9/24 17:30
-     * Update By lijie 2021/9/24 17:30
+     * @date :2021/9/27 0:07
+     * Update By lijie 2021/9/27 0:07
      */
-    private void checkCommonDataIsValid(List<String> errorList, List<List<Object>> commonObjectUploadData,
-                                        Map<String, String> buildingFuncTypesMap, Map<String, String> floorIdentitiesMap,
-                                        Map<String, String> spaceZonesMap, Map<String, String> spaceFuncTypesMap,
-                                        Map<String, ObjectInstance> projectMap,
-                                        Map<String, Map<String, List<ObjectInstance>>> buildMap,
-                                        Map<String, Map<String, List<ObjectInstance>>> floorMap,
-                                        Map<String, Map<String, List<ObjectInstance>>> spaceMap) {
-        int startRowIndex=2;
-        if (commonObjectUploadData.size()<=startRowIndex){
-            return;
+    private Map<String, RelCodeDTO> createRelCodeDataMap(List<List<Object>> relCodesListList) {
+        if (CollUtil.isEmpty(relCodesListList)){
+            return new HashMap<>();
         }
-        int objSize = commonObjectUploadData.size();
-        for (int i = startRowIndex; i < objSize; i++) {
-            String relCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.COMMON_SHEET_NAME,i+1);
-            List<Object> datas = commonObjectUploadData.get(i);
-            // 1.项目id:必填,是否存在
-            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(0)));
-            checkProjectValid(errorList,projectId,projectMap,relCol);
-            // 2.建筑本地编码:必填,是否在项目下有重复
-            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
-            checkLocalIdExists(errorList,buildLocalId,projectId,buildMap,relCol,CommonObjectColumnEnum.BUILD_LOCAL_ID.getRealName());
-            // 3.建筑本地名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,CommonObjectColumnEnum.BUILD_LOCAL_NAME.getRealName());
-            // 4.建筑功能类型:必填,是否存在
-            String buildFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
-            checkContentBlank(errorList,buildFuncType,relCol,CommonObjectColumnEnum.BUILD_FUNC_TYPE.getRealName());
-            if (StrUtil.isNotBlank(buildFuncType) && !buildingFuncTypesMap.containsKey(buildFuncType)){
-                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.BUILD_FUNC_TYPE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
-            }
-            // 5.楼层本地编码:必填,是否在项目下有重复
-            String floorLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
-            checkLocalIdExists(errorList,floorLocalId,projectId,floorMap,relCol,CommonObjectColumnEnum.FLOOR_LOCAL_ID.getRealName());
-            // 6.楼层本地名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5))),relCol,CommonObjectColumnEnum.FLOOR_LOCAL_NAME.getRealName());
-            // 7.楼层编码:必填,是否存在
-            String floorIdentity = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
-            checkContentBlank(errorList,floorIdentity,relCol,CommonObjectColumnEnum.FLOOR_IDENTITY.getRealName());
-            if (StrUtil.isNotBlank(floorIdentity) && !floorIdentitiesMap.containsKey(floorIdentity)){
-                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.FLOOR_IDENTITY.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
-            }
-            // 8.空间本地编码:必填,是否在项目下有重复
-            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(7))),
-                    projectId,spaceMap,relCol,CommonObjectColumnEnum.SPACE_LOCAL_ID.getRealName());
-            // 9.空间名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(8))),
-                    relCol,CommonObjectColumnEnum.SPACE_LOCAL_NAME.getRealName());
-            // 10.空间分区:必填,是否存在
-            String spaceZone = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(9)));
-            checkContentBlank(errorList,spaceZone,relCol,CommonObjectColumnEnum.SPACE_ZONE.getRealName());
-            if (StrUtil.isNotBlank(spaceZone) && !spaceZonesMap.containsKey(spaceZone)){
-                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.SPACE_ZONE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
-            }
-            // 11.空间功能类型:必填,是否存在
-            String spaceFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(10)));
-            checkContentBlank(errorList,spaceFuncType,relCol,CommonObjectColumnEnum.SPACE_FUNC_TYPE.getRealName());
-            if (StrUtil.isNotBlank(spaceFuncType) && !spaceFuncTypesMap.containsKey(spaceFuncType)){
-                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.SPACE_FUNC_TYPE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
-            }
-        }
-    }
-    /***
-     * Description: 校验项目是否为空且存在
-     * @param errorList : 错误列表
-     * @param projectId : 项目id
-     * @param projectMap : 项目映射
-     * @param relCol : 真实行
-     * @return : void
-     * @author : lijie
-     * @date :2021/9/25 1:37
-     * Update By lijie 2021/9/25 1:37
-     */
-    private void checkProjectValid(List<String> errorList, String projectId, Map<String, ObjectInstance> projectMap,String relCol) {
-        checkContentBlank(errorList,projectId,relCol,CommonObjectColumnEnum.PROJECT_ID.getRealName());
-        if (StrUtil.isNotBlank(projectId) && !projectMap.containsKey(projectId)){
-            errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.PROJECT_ID.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
+        Map<String,RelCodeDTO> dataMap = new HashMap<>();
+        for (List<Object> objects : relCodesListList) {
+            String relName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(objects.get(0)));
+            String relCode = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(objects.get(1)));
+            String graphName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(objects.get(2)));
+            String graphCode = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(objects.get(3)));
+            dataMap.put(relName, RelCodeDTO.builder()
+                    .relCodeName(relName)
+                    .relCode(relCode)
+                    .graphName(graphName)
+                    .graphCode(graphCode)
+                    .build());
         }
+        return dataMap;
     }
 
     /***
      * Description: 获取已存在的项目id,建筑本地编码,楼层本地编码,空间本地编码
-     * @param commonObjectUploadData : 基本对象录入数据
-     * @param equipObjectUploadData : 设备对象录入数据
-     * @param systemObjectUploadData : 系统对象录入数据
-     * @param projectMap : 项目本地编码与项目信息的映射
-     * @param buildMap : 建筑本地编码与建筑信息的映射
-     * @param floorMap : 楼层本地编码与楼层信息的映射
-     * @param spaceMap : 空间本地编码与空间信息的映射
-     * @param equipMap : 设备本地编码与设备信息的映射
-     * @param systemMap : 系统本地编码与系统信息的映射
-     * @param groupCode : 集团编码
+     * @param uploadDTO : 存储数据的DTO对象
      * @return : java.util.Set<java.lang.String>
      * @author : lijie
      * @date :2021/9/24 20:43
      * Update By lijie 2021/9/24 20:43
      */
-    private Set<String> queryExistDatas(List<List<Object>> commonObjectUploadData, List<List<Object>> equipObjectUploadData,
-                                 List<List<Object>> systemObjectUploadData, Map<String, ObjectInstance> projectMap,
-                                 Map<String, Map<String,List<ObjectInstance>>> buildMap, Map<String, Map<String,List<ObjectInstance>>> floorMap,
-                                 Map<String, Map<String,List<ObjectInstance>>> spaceMap, Map<String, Map<String,List<ObjectInstance>>> equipMap,
-                                 Map<String, Map<String,List<ObjectInstance>>> systemMap,String groupCode) {
+    private Set<String> queryExistDatas(UploadDTO uploadDTO) {
         // 1.获得有效的项目id
         Set<String> transferProjectIds = new HashSet<>();
-        Set<String> validTableNames = queryValidTableNames(commonObjectUploadData,equipObjectUploadData,
-                systemObjectUploadData,groupCode,transferProjectIds);
+        Set<String> validTableNames = queryValidTableNames(uploadDTO.getCommonObjectUploadData(),
+                uploadDTO.getEquipObjectUploadData(), uploadDTO.getSystemObjectUploadData(),
+                uploadDTO.getGroupCode(),transferProjectIds);
         if (CollUtil.isEmpty(validTableNames)){
             return new HashSet<>();
         }
         // 2.获得所有的本地编码
-        Set<String> localIds = queryLocalIdsFromExcel(commonObjectUploadData,equipObjectUploadData,systemObjectUploadData);
+        Set<String> localIds = queryLocalIdsFromExcel(uploadDTO.getCommonObjectUploadData(),
+                uploadDTO.getEquipObjectUploadData(),uploadDTO.getSystemObjectUploadData());
         if (CollUtil.isEmpty(localIds) && CollUtil.isEmpty(transferProjectIds)){
             return new HashSet<>();
         }
         // 3.根据表名称,项目id列表,本地编码列表查询物理世界对象集合
-        List<ObjectInstance> objectInstances = projectDao.queryRwdObjectsMultiTablesAndLocalIds(validTableNames,transferProjectIds,localIds);
+        List<ObjectInstance> objectInstances = projectDao
+                .queryRwdObjectsMultiTablesAndLocalIds(validTableNames,transferProjectIds,localIds);
         if (CollUtil.isEmpty(objectInstances)){
             return new HashSet<>();
         }
         // 4.解析查询的对象
+        Map<String,ObjectInstance> projectMap = new HashMap<>();
+        Map<String, Map<String,List<ObjectInstance>>> buildMap = new HashMap<>();
+        Map<String, Map<String,List<ObjectInstance>>> floorMap = new HashMap<>();
+        Map<String, Map<String,List<ObjectInstance>>> spaceMap = new HashMap<>();
+        Map<String, Map<String,List<ObjectInstance>>> equipMap = new HashMap<>();
+        Map<String, Map<String,List<ObjectInstance>>> systemMap = new HashMap<>();
         for (ObjectInstance objectInstance : objectInstances) {
             if (ObjType.project.name().equals(objectInstance.getObjType())){
                 projectMap.put(objectInstance.getId(),objectInstance);
@@ -548,6 +325,12 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
                 fillObjectInstanceMap(systemMap,objectInstance);
             }
         }
+        uploadDTO.setProjectMap(projectMap);
+        uploadDTO.setBuildMap(buildMap);
+        uploadDTO.setFloorMap(floorMap);
+        uploadDTO.setSpaceMap(spaceMap);
+        uploadDTO.setEquipMap(equipMap);
+        uploadDTO.setSystemMap(systemMap);
         return new HashSet<>();
     }
     /***

+ 21 - 2
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/FileCheckService.java

@@ -1,5 +1,7 @@
 package com.persagy.dmp.rwd.validators.service;
 
+import com.persagy.dmp.rwd.model.rwd.UploadDTO;
+
 import java.util.List;
 import java.util.Map;
 
@@ -21,6 +23,23 @@ public interface FileCheckService {
      */
     void checkFileIsValid(List<String> errorList, List<List<Object>> lists, Map<String,String> dynamicMap);
 
-
-
+    /***
+     * Description: 校验数据的正确性
+     * @param errorList : 错误列表
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:01
+     * Update By lijie 2021/9/26 15:01
+     */
+    void checkDataIsValid(List<String> errorList, UploadDTO uploadDTO);
+    /***
+     * Description: 批量处理物理世界对象数据
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:22
+     * Update By lijie 2021/9/26 15:22
+     */
+    void batchHandleUploadDatas(UploadDTO uploadDTO);
 }

+ 306 - 8
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractFileCheckService.java

@@ -2,22 +2,42 @@ package com.persagy.dmp.rwd.validators.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.EnumUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.poi.excel.cell.CellUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.rwd.constants.CommonConstant;
+import com.persagy.dmp.rwd.constants.CommonObjectColumnEnum;
 import com.persagy.dmp.rwd.constants.ErrorEnum;
+import com.persagy.dmp.rwd.entity.ObjectInstance;
+import com.persagy.dmp.rwd.entity.RelationInstance;
+import com.persagy.dmp.rwd.handler.SpringHelper;
+import com.persagy.dmp.rwd.model.rwd.UploadDTO;
+import com.persagy.dmp.rwd.repository.ObjectInstanceRepository;
+import com.persagy.dmp.rwd.repository.RelationInstanceRepository;
+import com.persagy.dmp.rwd.service.BaseService;
 import com.persagy.dmp.rwd.validators.service.FileCheckService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /***
  * Description: 文件检测抽象逻辑类(模板模式)
+ * 该抽象类一共处理三个上传的业务功能:
+ * 1.校验文件的合法性,见{@link AbstractFileCheckService#checkFileIsValid(List, List, Map)}
+ * 2.校验文件数据的合法性,见{@link AbstractFileCheckService#checkDataIsValid(List, UploadDTO)}
+ * 3.批量保存物理世界数据,见{@link AbstractFileCheckService#batchHandleUploadDatas(UploadDTO)}
  * @author : lijie
  * @date :2021/9/24 15:51
  * Update By lijie 2021/9/24 15:51
  */
+@Component
+@RequiredArgsConstructor
 public abstract class AbstractFileCheckService implements FileCheckService {
 
     /***
@@ -74,9 +94,30 @@ public abstract class AbstractFileCheckService implements FileCheckService {
                 errorList.add(realCol+ErrorEnum.INFO_NAME_NOT_EXIST_ERROR);
             }
         }
-        specialCheckFileIsValid(errorList,rows);
     }
     /***
+     * Description: 校验数据的正确性
+     * @param errorList : 错误列表
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:01
+     * Update By lijie 2021/9/26 15:01
+     */
+    @Override
+    public void checkDataIsValid(List<String> errorList, UploadDTO uploadDTO) {}
+    /***
+     * Description: 批量处理物理世界对象数据
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:22
+     * Update By lijie 2021/9/26 15:22
+     */
+    @Override
+    public void batchHandleUploadDatas(UploadDTO uploadDTO) {}
+
+    /***
      * Description: 获得所在excel名称
      * @return : java.lang.String
      * @author : lijie
@@ -104,15 +145,272 @@ public abstract class AbstractFileCheckService implements FileCheckService {
     protected abstract Integer getExcelHeadIndex();
 
     /***
-     * Description: 特有的文件校验逻辑
+     * Description: 校验本地编码是否存在
+     * @param errorList : 错误列表
+     * @param localId : 本地编码
+     * @param projectId : 项目id
+     * @param objectMap : 对象映射
+     * @param relCol : 真实行前缀
+     * @param realName : 真实名称
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/25 0:35
+     * Update By lijie 2021/9/25 0:35
+     */
+    protected final void checkLocalIdExists(List<String> errorList, String localId, String projectId,
+                                            Map<String, Map<String, List<ObjectInstance>>> objectMap, String relCol,
+                                            String realName) {
+        // 1.校验是否为空
+        checkContentBlank(errorList,localId,relCol,realName);
+        // 2.校验是否重复
+        if (StrUtil.isNotBlank(localId) && StrUtil.isNotBlank(projectId)){
+            Map<String, List<ObjectInstance>> projectMap = objectMap.getOrDefault(localId, new HashMap<>());
+            List<ObjectInstance> instances = projectMap.getOrDefault(projectId, new ArrayList<>());
+            if (instances.size()>1){
+                errorList.add(StrUtil.appendIfMissing(relCol, realName,ErrorEnum.REPEAT_ERROR.getDesc()));
+            }
+        }
+    }
+    /***
+     * Description: 校验内容为空
      * @param errorList : 错误列表
-     * @param rows : 行数
+     * @param content : 校验内容
+     * @param relCol : 真实列名称
+     * @param realName : 真实名称
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/25 0:38
+     * Update By lijie 2021/9/25 0:38
+     */
+    protected final void checkContentBlank(List<String> errorList, String content, String relCol, String realName) {
+        if (StrUtil.isNotBlank(content)){
+            return;
+        }
+        errorList.add(StrUtil.appendIfMissing(relCol, realName,ErrorEnum.CONTENT_BLANK_ERROR.getDesc()));
+    }
+
+    /***
+     * Description: 校验项目是否为空且存在
+     * @param errorList : 错误列表
+     * @param projectId : 项目id
+     * @param projectMap : 项目映射
+     * @param relCol : 真实行
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/25 1:37
+     * Update By lijie 2021/9/25 1:37
+     */
+    protected final void checkProjectValid(List<String> errorList, String projectId, Map<String, ObjectInstance> projectMap,String relCol) {
+        checkContentBlank(errorList,projectId,relCol, CommonObjectColumnEnum.PROJECT_ID.getRealName());
+        if (StrUtil.isNotBlank(projectId) && !projectMap.containsKey(projectId)){
+            errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.PROJECT_ID.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
+        }
+    }
+
+    /***
+     * Description: 校验信息点code是否正确
+     * @param errorList : 错误列表
+     * @param infosNameList : 信息点名称列表
+     * @param infosCodeList : 信息点code列表
+     * @param objectInfosMap : 对象信息点映射
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/25 1:20
+     * Update By lijie 2021/9/25 1:20
+     */
+    protected final void checkObjectInfoValid(List<String> errorList, List<Object> infosNameList, List<Object> infosCodeList,
+                                              Map<String, String> objectInfosMap,String sheetName) {
+        int colStartIndex=7;
+        if (CollUtil.isEmpty(infosNameList) || infosNameList.size()<=colStartIndex){
+            return;
+        }
+        int nameIndex=6;
+        int codeIndex=3;
+        for (int i = colStartIndex; i < infosNameList.size(); i++) {
+            String nameRelCol = StrUtil.format(CommonConstant.REL_ROW_COL_FORMAT,sheetName,nameIndex+1,i+1);
+            String codeRelCol = StrUtil.format(CommonConstant.REL_ROW_COL_FORMAT,sheetName,codeIndex+1,i+1);
+            String name = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infosNameList.get(i)));
+            String code = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infosCodeList.get(i)));
+            checkContentBlank(errorList,name,nameRelCol,"信息点名称");
+            checkContentBlank(errorList,code,codeRelCol,"信息点code");
+            if (StrUtil.isNotBlank(name) && !objectInfosMap.containsKey(name)){
+                errorList.add(StrUtil.appendIfMissing(nameRelCol, "信息点名称",ErrorEnum.NO_EXIST_ERROR.getDesc()));
+            }
+            if (StrUtil.isNotBlank(name) && StrUtil.isNotBlank(code) && !objectInfosMap.containsValue(code)){
+                errorList.add(StrUtil.appendIfMissing(codeRelCol, "信息点code",ErrorEnum.NO_EXIST_ERROR.getDesc()));
+            }
+        }
+    }
+
+    /***
+     * Description: 通用更新对象实例
+     * @param localName : 本地名称
+     * @param uploadDTO : 上传数据对象
+     * @param projectId : 项目id
+     * @param existInsMap : 已存在对象实例映射
+     * @param instanceMap : 更新对象映射
      * @return : void
      * @author : lijie
-     * @date :2021/9/24 15:56
-     * Update By lijie 2021/9/24 15:56
+     * @date :2021/9/26 22:43
+     * Update By lijie 2021/9/26 22:43
      */
-    protected void specialCheckFileIsValid(List<String> errorList, List<Object> rows){};
+    protected final void commonUpdateObjectInstance(String localName, UploadDTO uploadDTO, String projectId,
+                                            Map<String, Map<String, List<ObjectInstance>>> existInsMap,
+                                            Map<String, List<ObjectInstance>> instanceMap, ObjectNode infos,Boolean valid) {
+        ObjectInstance objectInstance = existInsMap.getOrDefault(projectId, new HashMap<>())
+                .getOrDefault(projectId,new ArrayList<>()).get(0);
+        ObjectNode srcInfos = objectInstance.getInfos();
+        if (null==srcInfos){
+            objectInstance.setInfos(infos);
+        }else {
+            srcInfos.setAll(infos);
+            objectInstance.setInfos(srcInfos);
+        }
+        objectInstance.setUpdateApp(uploadDTO.getAppId());
+        objectInstance.setUpdateUser(uploadDTO.getUserId());
+        objectInstance.setLocalName(localName);
+        objectInstance.setInfos(infos);
+        if (null!=valid){
+            objectInstance.setValid(BooleanUtil.toInt(valid));
+        }
+        List<ObjectInstance> instances = instanceMap.getOrDefault(projectId, new ArrayList<>());
+        instances.add(objectInstance);
+        instanceMap.put(projectId,instances);
+    }
 
+    /***
+     * Description: 通用更新数据
+     * @param instanceMap : 实例映射
+     * @param relationMap : 关系映射
+     * @param uploadDTO : 上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 23:27
+     * Update By lijie 2021/9/26 23:27
+     */
+    protected final void commonUpdateInstances(Map<String, List<ObjectInstance>> instanceMap,
+                                       Map<String, List<RelationInstance>> relationMap, UploadDTO uploadDTO) {
+        Set<Map.Entry<String, List<ObjectInstance>>> entries = instanceMap.entrySet();
+        for (Map.Entry<String, List<ObjectInstance>> entry : entries) {
+            String projectId = entry.getKey();
+            SpringHelper.getBean(BaseService.class).setSharding(uploadDTO.getGroupCode(),projectId);
+            if (CollUtil.isNotEmpty(entry.getValue())){
+                SpringHelper.getBean(ObjectInstanceRepository.class).saveAll(entry.getValue());
+            }
+            List<RelationInstance> relationInstances = relationMap.get(entry.getKey());
+            if (CollUtil.isNotEmpty(relationInstances)){
+                SpringHelper.getBean(RelationInstanceRepository.class).saveAll(relationInstances);
+            }
+        }
+    }
+
+    /***
+     * Description: 通用的创建对象实例的方法
+     * @param idPrefix : id的前缀
+     * @param localId : 本地编码
+     * @param localName : 本地名称
+     * @param projectId : 项目id
+     * @param uploadDTO : 上传数据对象
+     * @param objType : 对象分类
+     * @param classCode : 对象类型
+     * @param infos : 信息点
+     * @param instanceMap : 实例映射
+     * @param existInstanceMap : 已经存在的实例映射
+     * @return : com.persagy.dmp.rwd.entity.ObjectInstance
+     * @author : lijie
+     * @date :2021/9/26 22:34
+     * Update By lijie 2021/9/26 22:34
+     */
+    protected final ObjectInstance commonCreateObjectInstance(String idPrefix, String localId, String localName,
+                                                      String projectId, UploadDTO uploadDTO, String objType,
+                                                      String classCode, ObjectNode infos,
+                                                      Map<String, List<ObjectInstance>> instanceMap,
+                                                      Map<String, Map<String, List<ObjectInstance>>> existInstanceMap,
+                                                              Boolean valid) {
+        ObjectInstance objectInstance = new ObjectInstance();
+        objectInstance.setId(StrUtil.appendIfMissing(idPrefix, projectId.substring(2), IdWorker.getIdStr()));
+        objectInstance.setName(localName);
+        objectInstance.setLocalId(localId);
+        objectInstance.setLocalName(localName);
+        objectInstance.setGroupCode(uploadDTO.getGroupCode());
+        objectInstance.setProjectId(projectId);
+        objectInstance.setObjType(objType);
+        objectInstance.setClassCode(classCode);
+        objectInstance.setGrouping(1);
+        objectInstance.setValid(BooleanUtil.toInt(valid));
+        objectInstance.setInfos(infos);
+        objectInstance.setVirtualInfoCodes(new ArrayList<>());
+        objectInstance.setCreateApp(uploadDTO.getAppId());
+        objectInstance.setUpdateApp(uploadDTO.getAppId());
+        objectInstance.setCreateUser(uploadDTO.getUserId());
+        objectInstance.setUpdateUser(uploadDTO.getUserId());
+        List<ObjectInstance> instances = instanceMap.getOrDefault(projectId, new ArrayList<>());
+        instances.add(objectInstance);
+        instanceMap.put(projectId,instances);
+        Map<String, List<ObjectInstance>> projectInsMap = existInstanceMap.getOrDefault(localId, new HashMap<>());
+        List<ObjectInstance> insList = projectInsMap.getOrDefault(projectId, new ArrayList<>());
+        insList.add(objectInstance);
+        projectInsMap.put(projectId,insList);
+        existInstanceMap.put(localId,projectInsMap);
+        return objectInstance;
+    }
+
+    /***
+     * Description: 通用的创建关系实例的方法
+     * @param projectId : 项目id
+     * @param uploadDTO : 上传的数据
+     * @return : com.persagy.dmp.rwd.entity.RelationInstance
+     * @author : lijie
+     * @date :2021/9/26 22:24
+     * Update By lijie 2021/9/26 22:24
+     */
+    protected final RelationInstance commmonCreateRelationInstance(String projectId, UploadDTO uploadDTO,String graphCode,
+                                                           String relCode,String fromId,String toId,String relVal) {
+        RelationInstance relationInstance = new RelationInstance();
+        relationInstance.setId(IdWorker.getIdStr());
+        relationInstance.setGroupCode(uploadDTO.getGroupCode());
+        relationInstance.setProjectId(projectId);
+        relationInstance.setGraphId(StrUtil.format(CommonConstant.GRAPH_ID_FORMAT, graphCode));
+        relationInstance.setGroupCode(graphCode);
+        relationInstance.setRelCode(relCode);
+        relationInstance.setObjFrom(fromId);
+        relationInstance.setRelValue(relVal);
+        relationInstance.setObjTo(toId);
+        relationInstance.setStatus(1);
+        relationInstance.setCreateUser(uploadDTO.getUserId());
+        relationInstance.setUpdateUser(uploadDTO.getUserId());
+        relationInstance.setCreateApp(uploadDTO.getAppId());
+        relationInstance.setUpdateApp(uploadDTO.getAppId());
+        return relationInstance;
+    }
+
+    /***
+     * Description: 通用创建对象
+     * @param infoCodeList : 信息点列表
+     * @param datas : 数据列表
+     * @return : com.fasterxml.jackson.databind.node.ObjectNode
+     * @author : lijie
+     * @date :2021/9/26 23:31
+     * Update By lijie 2021/9/26 23:31
+     */
+    protected final ObjectNode commonCreateInfos(List<Object> infoCodeList, List<Object> datas) {
+        int startIndex=7;
+        ObjectNode infos = SpringHelper.getBean(ObjectMapper.class).createObjectNode();
+        if (infoCodeList.size()<=startIndex || datas.size()<=startIndex){
+            return infos;
+        }
+        for (int i = startIndex; i < infoCodeList.size(); i++) {
+            String infoCode = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infoCodeList.get(i)));
+            if (StrUtil.isBlank(infoCode)){
+                continue;
+            }
+            if (infos.has(infoCode) && StrUtil.isNotBlank(infos.get(infoCode).asText())){
+                continue;
+            }
+            String dataStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(i)));
+            infos.put(infoCode,dataStr);
+        }
+        return infos;
+    }
 
 }

+ 286 - 4
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/CommonFileCheckServiceImpl.java

@@ -1,20 +1,165 @@
 package com.persagy.dmp.rwd.validators.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.EnumUtil;
-import com.persagy.dmp.rwd.constants.CommonObjectColumnEnum;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.constants.*;
+import com.persagy.dmp.rwd.entity.ObjectInstance;
+import com.persagy.dmp.rwd.entity.RelationInstance;
+import com.persagy.dmp.rwd.enums.ObjType;
+import com.persagy.dmp.rwd.handler.SpringHelper;
+import com.persagy.dmp.rwd.model.rwd.UploadDTO;
+import com.persagy.dmp.rwd.repository.ObjectInstanceRepository;
+import com.persagy.dmp.rwd.repository.RelationInstanceRepository;
+import com.persagy.dmp.rwd.service.BaseService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
 @Component
 @RequiredArgsConstructor
 public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
+
+    /***
+     * Description: 校验数据的正确性
+     * @param errorList : 错误列表
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:01
+     * Update By lijie 2021/9/26 15:01
+     */
+    @Override
+    public void checkDataIsValid(List<String> errorList, UploadDTO uploadDTO) {
+        int startRowIndex=3;
+        List<List<Object>> commonObjectUploadData = uploadDTO.getCommonObjectUploadData();
+        if (commonObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        Map<String, ObjectInstance> projectMap = uploadDTO.getProjectMap();
+        Map<String, Map<String, List<ObjectInstance>>> buildMap = uploadDTO.getBuildMap();
+        Map<String, String> buildingFuncTypesMap = uploadDTO.getBuildingFuncTypesMap();
+        Map<String, Map<String, List<ObjectInstance>>> floorMap = uploadDTO.getFloorMap();
+        Map<String, String> floorIdentitiesMap = uploadDTO.getFloorIdentitiesMap();
+        Map<String, String> spaceZonesMap = uploadDTO.getSpaceZonesMap();
+        Map<String, String> spaceFuncTypesMap = uploadDTO.getSpaceFuncTypesMap();
+        Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        int objSize = commonObjectUploadData.size();
+        for (int i = startRowIndex; i < objSize; i++) {
+            String relCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.COMMON_SHEET_NAME,i+1);
+            List<Object> datas = commonObjectUploadData.get(i);
+            // 1.项目id:必填,是否存在
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(0)));
+            checkProjectValid(errorList,projectId,projectMap,relCol);
+            // 2.建筑本地编码:必填,是否在项目下有重复
+            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            checkLocalIdExists(errorList,buildLocalId,projectId,buildMap,relCol,CommonObjectColumnEnum.BUILD_LOCAL_ID.getRealName());
+            // 3.建筑本地名称:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,CommonObjectColumnEnum.BUILD_LOCAL_NAME.getRealName());
+            // 4.建筑功能类型:必填,是否存在
+            String buildFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
+            checkContentBlank(errorList,buildFuncType,relCol,CommonObjectColumnEnum.BUILD_FUNC_TYPE.getRealName());
+            if (StrUtil.isNotBlank(buildFuncType) && !buildingFuncTypesMap.containsKey(buildFuncType)){
+                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.BUILD_FUNC_TYPE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
+            }
+            // 5.楼层本地编码:必填,是否在项目下有重复
+            String floorLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
+            checkLocalIdExists(errorList,floorLocalId,projectId,floorMap,relCol,CommonObjectColumnEnum.FLOOR_LOCAL_ID.getRealName());
+            // 6.楼层本地名称:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5))),relCol,CommonObjectColumnEnum.FLOOR_LOCAL_NAME.getRealName());
+            // 7.楼层编码:必填,是否存在
+            String floorIdentity = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
+            checkContentBlank(errorList,floorIdentity,relCol,CommonObjectColumnEnum.FLOOR_IDENTITY.getRealName());
+            if (StrUtil.isNotBlank(floorIdentity) && !floorIdentitiesMap.containsKey(floorIdentity)){
+                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.FLOOR_IDENTITY.getRealName(), ErrorEnum.NO_EXIST_ERROR.getDesc()));
+            }
+            // 8.空间本地编码:必填,是否在项目下有重复
+            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(7))),
+                    projectId,spaceMap,relCol,CommonObjectColumnEnum.SPACE_LOCAL_ID.getRealName());
+            // 9.空间名称:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(8))),
+                    relCol,CommonObjectColumnEnum.SPACE_LOCAL_NAME.getRealName());
+            // 10.空间分区:必填,是否存在
+            String spaceZone = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(9)));
+            checkContentBlank(errorList,spaceZone,relCol,CommonObjectColumnEnum.SPACE_ZONE.getRealName());
+            if (StrUtil.isNotBlank(spaceZone) && !spaceZonesMap.containsKey(spaceZone)){
+                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.SPACE_ZONE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
+            }
+            // 11.空间功能类型:必填,是否存在
+            String spaceFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(10)));
+            checkContentBlank(errorList,spaceFuncType,relCol,CommonObjectColumnEnum.SPACE_FUNC_TYPE.getRealName());
+            if (StrUtil.isNotBlank(spaceFuncType) && !spaceFuncTypesMap.containsKey(spaceFuncType)){
+                errorList.add(StrUtil.appendIfMissing(relCol, CommonObjectColumnEnum.SPACE_FUNC_TYPE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
+            }
+        }
+    }
+    /***
+     * Description: 批量处理物理世界对象数据
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:22
+     * Update By lijie 2021/9/26 15:22
+     */
+    @Override
+    public void batchHandleUploadDatas(UploadDTO uploadDTO) {
+        int startRowIndex=3;
+        List<List<Object>> commonObjectUploadData = uploadDTO.getCommonObjectUploadData();
+        if (commonObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        List<Object> infosData = commonObjectUploadData.get(2);
+        int objSize = commonObjectUploadData.size();
+        Map<String,List<ObjectInstance>> instanceMap = new HashMap<>();
+        Map<String,List<RelationInstance>> relationMap = new HashMap<>();
+        for (int i = startRowIndex; i < objSize; i++) {
+            List<Object> datas = commonObjectUploadData.get(i);
+            // 1.项目id:必填,是否存在
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(0)));
+            // 2.建筑本地编码:必填,是否在项目下有重复
+            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            // 3.建筑本地名称:必填
+            String buildLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2)));
+            // 4.建筑功能类型:必填,是否存在
+            String buildFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
+            String buildFuncTypeInfo = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infosData.get(3)));
+            String buildingId = handleBuildObject(projectId, buildLocalId, buildLocalName, buildFuncType,
+                    instanceMap, relationMap, buildFuncTypeInfo, uploadDTO);
+            // 5.楼层本地编码:必填,是否在项目下有重复
+            String floorLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
+            // 6.楼层本地名称:必填
+            String floorLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5)));
+            // 7.楼层编码:必填,是否存在
+            String floorIdentity = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
+            String floorIdentityInfoCode = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infosData.get(6)));
+            String floorId = handleFloorObject(projectId,floorLocalId,floorLocalName,floorIdentity,floorIdentityInfoCode,
+                    buildingId,instanceMap,relationMap,uploadDTO);
+            // 8.空间本地编码:必填,是否在项目下有重复
+            String spaceLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(7)));
+            // 9.空间名称:必填
+            String spaceLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(8)));
+            // 10.空间分区:必填,是否存在
+            String spaceZone = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(9)));
+            // 11.空间功能类型:必填,是否存在
+            String spaceFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(10)));
+            String spaceFuncTypeInfo = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(infosData.get(10)));
+            handleSpaceObject(projectId,spaceLocalId,spaceLocalName,spaceZone,spaceFuncType,buildingId,floorId,
+                    instanceMap,relationMap,uploadDTO,spaceFuncTypeInfo);
+        }
+        commonUpdateInstances(instanceMap,relationMap,uploadDTO);
+    }
+
+
     /***
      * Description: 获得excel的sheet名称
      * @return : java.lang.String
@@ -50,6 +195,143 @@ public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
      */
     @Override
     protected Integer getExcelHeadIndex() {
-        return 1;
+        return 2;
+    }
+
+    /***
+     * Description: 处理空间对象
+     * @param projectId : 项目id
+     * @param spaceLocalId : 空间本地编码
+     * @param spaceLocalName : 空间本地名称
+     * @param spaceZone : 空间分区
+     * @param spaceFuncType : 空间功能类型
+     * @param buildingId : 建筑id
+     * @param floorId : 楼层id
+     * @param instanceMap : 实例映射
+     * @param relationMap : 关系映射
+     * @param uploadDTO : 上传数据
+     * @param spaceFuncTypeInfo : 空间功能类型信息点code
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 22:53
+     * Update By lijie 2021/9/26 22:53
+     */
+    private void handleSpaceObject(String projectId, String spaceLocalId, String spaceLocalName, String spaceZone,
+                                   String spaceFuncType, String buildingId, String floorId,
+                                   Map<String, List<ObjectInstance>> instanceMap,
+                                   Map<String, List<RelationInstance>> relationMap,
+                                   UploadDTO uploadDTO,
+                                   String spaceFuncTypeInfo) {
+        Map<String, String> spaceZonesMap = uploadDTO.getSpaceZonesMap();
+        Map<String, String> spaceFuncTypesMap = uploadDTO.getSpaceFuncTypesMap();
+        Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        if (spaceMap.containsKey(spaceLocalId)
+                && spaceMap.getOrDefault(spaceLocalId,new HashMap<>()).containsKey(projectId)){
+            // 更新对象
+            ObjectNode infos = SpringHelper.getBean(ObjectMapper.class)
+                    .createObjectNode()
+                    .put(spaceFuncTypeInfo, spaceFuncTypesMap.get(spaceFuncType));
+            commonUpdateObjectInstance(spaceLocalName,uploadDTO,projectId, spaceMap,instanceMap, infos,null);
+            return;
+        }
+        // 新增对象
+        ObjectNode infos = SpringHelper.getBean(ObjectMapper.class).createObjectNode();
+        infos.put(spaceFuncTypeInfo,spaceFuncTypesMap.get(spaceFuncType));
+        ObjectInstance objectInstance = commonCreateObjectInstance("Sp",spaceLocalId,
+                spaceLocalName,projectId,uploadDTO,ObjType.space.name(),spaceZonesMap.get(spaceZone),
+                infos,instanceMap,spaceMap,Boolean.TRUE);
+        // 新增关系
+        List<RelationInstance> rels = relationMap.getOrDefault(projectId, new ArrayList<>());
+        rels.add(commmonCreateRelationInstance(projectId,uploadDTO,GraphCodeEnum.ARCH_SUBSET.getIndex(),
+                RelCodeEnum.BD_2_SP.getIndex(),buildingId,objectInstance.getId(),spaceZonesMap.get(spaceZone)));
+        rels.add(commmonCreateRelationInstance(projectId,uploadDTO,GraphCodeEnum.ARCH_SUBSET.getIndex(),
+                RelCodeEnum.FL_2_SP.getIndex(),floorId,objectInstance.getId(),spaceZonesMap.get(spaceZone)));
+        relationMap.put(projectId,rels);
     }
+
+    /***
+     * Description: 处理楼层对象
+     * @param projectId : 项目id
+     * @param floorLocalId : 楼层本地编码
+     * @param floorLocalName : 楼层本地名称
+     * @param floorIdentity : 楼层编码
+     * @param floorIdentityInfoCode : 楼层编码信息点
+     * @param buildingId : 建筑id
+     * @param instanceMap : 实例映射
+     * @param relationMap : 关系映射
+     * @param uploadDTO : 上传数据对象
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/26 22:10
+     * Update By lijie 2021/9/26 22:10
+     */
+    private String handleFloorObject(String projectId, String floorLocalId, String floorLocalName,
+                                     String floorIdentity, String floorIdentityInfoCode, String buildingId,
+                                     Map<String, List<ObjectInstance>> instanceMap,
+                                     Map<String, List<RelationInstance>> relationMap,
+                                     UploadDTO uploadDTO) {
+        Map<String, String> floorIdentitiesMap = uploadDTO.getFloorIdentitiesMap();
+        Map<String, Map<String, List<ObjectInstance>>> floorMap = uploadDTO.getFloorMap();
+        if (floorMap.containsKey(floorLocalId)
+                && floorMap.getOrDefault(floorLocalId,new HashMap<>()).containsKey(projectId)){
+            // 更新对象
+            ObjectInstance floor = floorMap.getOrDefault(projectId, new HashMap<>())
+                    .getOrDefault(projectId,new ArrayList<>()).get(0);
+            ObjectNode infos = SpringHelper.getBean(ObjectMapper.class)
+                    .createObjectNode()
+                    .put(floorIdentityInfoCode,floorIdentitiesMap.get(floorIdentity));
+            commonUpdateObjectInstance(floorLocalName,uploadDTO,projectId, floorMap,instanceMap,infos,null);
+            return floor.getId();
+        }
+        // 新增对象
+        ObjectNode infos = SpringHelper.getBean(ObjectMapper.class).createObjectNode();
+        infos.put(floorIdentityInfoCode,floorIdentitiesMap.get(floorIdentity));
+        ObjectInstance objectInstance = commonCreateObjectInstance("Fl",floorLocalId,floorLocalName,projectId,
+                uploadDTO,ObjType.floor.name(),ObjType.floor.name(),infos,instanceMap,floorMap,Boolean.TRUE);
+        // 新增关系
+        List<RelationInstance> rels = relationMap.getOrDefault(projectId, new ArrayList<>());
+        rels.add(commmonCreateRelationInstance(projectId,uploadDTO,GraphCodeEnum.ARCH_SUBSET.getIndex(),
+                RelCodeEnum.BD_2_FL.getIndex(),buildingId,objectInstance.getId(),null));
+        relationMap.put(projectId,rels);
+        return objectInstance.getId();
+    }
+
+    /***
+     * Description: 处理建筑对象
+     * @param projectId : 项目id
+     * @param buildLocalId : 建筑本地编码
+     * @param buildLocalName : 建筑本地名称
+     * @param buildFuncType : 建筑功能类型
+     * @param instanceMap : 更新实例映射
+     * @param relationMap : 关系实例映射
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 18:52
+     * Update By lijie 2021/9/26 18:52
+     */
+    private String handleBuildObject(String projectId, String buildLocalId, String buildLocalName, String buildFuncType,
+                                     Map<String, List<ObjectInstance>> instanceMap,
+                                     Map<String, List<RelationInstance>> relationMap,
+                                     String buildFuncTypeInfo,UploadDTO uploadDTO) {
+        Map<String, Map<String, List<ObjectInstance>>> buildMap = uploadDTO.getBuildMap();
+        Map<String, String> buildingFuncTypesMap = uploadDTO.getBuildingFuncTypesMap();
+        if (buildMap.containsKey(buildLocalId)
+                && buildMap.getOrDefault(buildLocalId,new HashMap<>()).containsKey(projectId)){
+            // 更新建筑
+            ObjectInstance building = buildMap.getOrDefault(projectId, new HashMap<>())
+                    .getOrDefault(projectId,new ArrayList<>()).get(0);
+            ObjectNode infos = SpringHelper.getBean(ObjectMapper.class)
+                    .createObjectNode()
+                    .put(buildFuncTypeInfo,buildingFuncTypesMap.get(buildFuncType));
+            commonUpdateObjectInstance(buildLocalName,uploadDTO,projectId, buildMap,instanceMap,infos,null);
+            return building.getId();
+        }
+        // 新增建筑
+        ObjectNode infos = SpringHelper.getBean(ObjectMapper.class).createObjectNode();
+        infos.put(buildFuncTypeInfo,buildingFuncTypesMap.get(buildFuncType));
+        ObjectInstance objectInstance = commonCreateObjectInstance("Bd",buildLocalId,buildLocalName,projectId,
+                uploadDTO,ObjType.building.name(),ObjType.building.name(),infos,instanceMap,buildMap,Boolean.TRUE);
+        return objectInstance.getId();
+    }
+
 }

+ 147 - 2
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/EquipFileCheckServiceImpl.java

@@ -1,13 +1,25 @@
 package com.persagy.dmp.rwd.validators.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.EnumUtil;
-import com.persagy.dmp.rwd.constants.CommonObjectColumnEnum;
-import com.persagy.dmp.rwd.constants.EquipObjectColumnEnum;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.rwd.constants.*;
+import com.persagy.dmp.rwd.entity.ObjectInstance;
+import com.persagy.dmp.rwd.entity.RelationInstance;
+import com.persagy.dmp.rwd.enums.ObjType;
+import com.persagy.dmp.rwd.handler.SpringHelper;
+import com.persagy.dmp.rwd.model.rwd.RelCodeDTO;
+import com.persagy.dmp.rwd.model.rwd.UploadDTO;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -16,6 +28,139 @@ import java.util.stream.Collectors;
 @Component
 @RequiredArgsConstructor
 public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
+
+    @Override
+    public void checkDataIsValid(List<String> errorList, UploadDTO uploadDTO) {
+        int startRowIndex = 7;
+        List<List<Object>> equipObjectUploadData = uploadDTO.getEquipObjectUploadData();
+        if (equipObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        Map<String, String> objectClazzMap = uploadDTO.getObjectClazzMap();
+        Map<String, String> equipObjectInfosMap = uploadDTO.getEquipObjectInfosMap();
+        Map<String, Map<String, List<ObjectInstance>>> equipMap = uploadDTO.getEquipMap();
+        Map<String, ObjectInstance> projectMap = uploadDTO.getProjectMap();
+        // 1.校验设备类型必填
+        List<Object> clazzRow = equipObjectUploadData.get(2);
+        String relClazzCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.EQUIP_SHEET_NAME,3);
+        // 1.1 专业名称
+        String domainName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(1)));
+        checkContentBlank(errorList,domainName,relClazzCol, "专业");
+        if (StrUtil.isNotBlank(domainName) && !objectClazzMap.containsKey(domainName.substring(0,domainName.lastIndexOf(StrUtil.UNDERLINE)))){
+            errorList.add(StrUtil.appendIfMissing(relClazzCol, "专业",ErrorEnum.NO_EXIST_ERROR.getDesc()));
+        }
+        // 1.2 系统类型名称
+        String systemName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(2)));
+        checkContentBlank(errorList,systemName,relClazzCol, "系统类");
+        if (StrUtil.isNotBlank(systemName) && !objectClazzMap.containsKey(systemName.substring(0,systemName.lastIndexOf(StrUtil.UNDERLINE)))){
+            errorList.add(StrUtil.appendIfMissing(relClazzCol, "系统类",ErrorEnum.NO_EXIST_ERROR.getDesc()));
+        }
+        // 1.3 设备类型名称
+        String equipName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(3)));
+        checkContentBlank(errorList,equipName,relClazzCol, "设备类型");
+        if (StrUtil.isNotBlank(equipName) && !objectClazzMap.containsKey(equipName.substring(0,equipName.lastIndexOf(StrUtil.UNDERLINE)))){
+            errorList.add(StrUtil.appendIfMissing(relClazzCol, "设备类型", ErrorEnum.NO_EXIST_ERROR.getDesc()));
+        }
+        // 2.校验信息点code是否正确
+        checkObjectInfoValid(errorList,equipObjectUploadData.get(6),equipObjectUploadData.get(3),
+                equipObjectInfosMap,CommonConstant.EQUIP_SHEET_NAME);
+        // 3.校验必填项
+        int equipSize = equipObjectUploadData.size();
+        for (int i = startRowIndex; i < equipSize; i++) {
+            String relCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.EQUIP_SHEET_NAME,i+1);
+            List<Object> datas = equipObjectUploadData.get(i);
+            // 1.项目id:必填,是否存在
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            checkProjectValid(errorList,projectId,projectMap,relCol);
+            // 2.空间本地编码:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,
+                    EquipObjectColumnEnum.SPACE_LOCAL_ID.getRelName());
+            // 3.空间与设备关系:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+                    EquipObjectColumnEnum.SPACE_EQUIP_REL.getRelName());
+            // 4.设备本地编码:必填,唯一
+            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4))),projectId,
+                    equipMap,relCol,EquipObjectColumnEnum.EQUIP_LOCAL_ID.getRelName());
+            // 5.设备名称:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5))),relCol,
+                    EquipObjectColumnEnum.EQUIP_LOCAL_NAME.getRelName());
+            // 6.有效状态:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6))),relCol,
+                    EquipObjectColumnEnum.VALID.getRelName());
+        }
+    }
+
+    /***
+     * Description: 批量处理物理世界对象数据
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:22
+     * Update By lijie 2021/9/26 15:22
+     */
+    @Override
+    public void batchHandleUploadDatas(UploadDTO uploadDTO) {
+        int startRowIndex = 7;
+        List<List<Object>> equipObjectUploadData = uploadDTO.getEquipObjectUploadData();
+        if (equipObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        Map<String, String> objectClazzMap = uploadDTO.getObjectClazzMap();
+        Map<String, Map<String, List<ObjectInstance>>> equipMap = uploadDTO.getEquipMap();
+        // 1.校验设备类型必填
+        List<Object> clazzRow = equipObjectUploadData.get(2);
+        // 1.1 设备类型名称
+        String equipTypeName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(3)));
+        // 1.2 获得设备类型code
+        String classCode = objectClazzMap.get(equipTypeName);
+        Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        Map<String, RelCodeDTO> relCodesMap = uploadDTO.getRelCodesMap();
+        int equipSize = equipObjectUploadData.size();
+        Map<String,List<ObjectInstance>> instanceMap = new HashMap<>();
+        Map<String,List<RelationInstance>> relationMap = new HashMap<>();
+        List<Object> infoCodeList = equipObjectUploadData.get(3);
+        for (int i = startRowIndex; i < equipSize; i++) {
+            List<Object> datas = equipObjectUploadData.get(i);
+            // 1.项目id
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            // 2.空间本地编码
+            String spaceLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2)));
+            // 3.空间与设备关系:必填
+            String relCodeStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
+            // 4.设备本地编码
+            String equipLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
+            // 5.设备本地名称
+            String equipLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5)));
+            // 6.有效状态
+            String validStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
+            Boolean valid = StrUtil.isBlank(validStr)?null:BooleanUtil.toBoolean(validStr);
+            // 7.判断设备是否存在
+            ObjectNode infos = commonCreateInfos(infoCodeList,datas);
+            if (equipMap.containsKey(equipLocalId)
+                    && equipMap.getOrDefault(equipLocalId,new HashMap<>()).containsKey(projectId)){
+                // 更新设备
+                commonUpdateObjectInstance(equipLocalName,uploadDTO,projectId, equipMap,instanceMap,infos, valid);
+                continue;
+            }
+            // 新增设备
+            ObjectInstance objectInstance = commonCreateObjectInstance("Eq", equipLocalId, equipLocalName,
+                    projectId, uploadDTO, ObjType.equipment.name(), classCode, infos, instanceMap, equipMap, valid);
+            // 新增空间关系
+            List<ObjectInstance> spaces = spaceMap.getOrDefault(spaceLocalId, new HashMap<>()).getOrDefault(projectId, new ArrayList<>());
+            RelCodeDTO relCodeDTO = relCodesMap.get(relCodeStr);
+            if (CollUtil.isEmpty(spaces) || null==relCodeDTO){
+                continue;
+            }
+            for (ObjectInstance space : spaces) {
+                List<RelationInstance> rels = relationMap.getOrDefault(projectId, new ArrayList<>());
+                rels.add(commmonCreateRelationInstance(projectId,uploadDTO, relCodeDTO.getGraphCode(),
+                        relCodeDTO.getRelCode(),space.getId(),objectInstance.getId(),space.getClassCode()));
+                relationMap.put(projectId,rels);
+            }
+        }
+        commonUpdateInstances(instanceMap,relationMap,uploadDTO);
+    }
+
     /***
      * Description: 获得excel的sheet名称
      * @return : java.lang.String

+ 151 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/SystemFileCheckServiceImpl.java

@@ -1,13 +1,26 @@
 package com.persagy.dmp.rwd.validators.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.EnumUtil;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.rwd.constants.CommonConstant;
 import com.persagy.dmp.rwd.constants.EquipObjectColumnEnum;
+import com.persagy.dmp.rwd.constants.ErrorEnum;
 import com.persagy.dmp.rwd.constants.SystemObjectColumnEnum;
+import com.persagy.dmp.rwd.entity.ObjectInstance;
+import com.persagy.dmp.rwd.entity.RelationInstance;
+import com.persagy.dmp.rwd.enums.ObjType;
+import com.persagy.dmp.rwd.model.rwd.RelCodeDTO;
+import com.persagy.dmp.rwd.model.rwd.UploadDTO;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -16,6 +29,142 @@ import java.util.stream.Collectors;
 @Component
 @RequiredArgsConstructor
 public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
+
+    /***
+     * Description: 校验数据的正确性
+     * @param errorList : 错误列表
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:01
+     * Update By lijie 2021/9/26 15:01
+     */
+    @Override
+    public void checkDataIsValid(List<String> errorList, UploadDTO uploadDTO) {
+        int startRowIndex = 7;
+        List<List<Object>> systemObjectUploadData = uploadDTO.getSystemObjectUploadData();
+        if (systemObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        Map<String, String> objectClazzMap = uploadDTO.getObjectClazzMap();
+        Map<String, String> systemObjectInfosMap = uploadDTO.getSystemObjectInfosMap();
+        Map<String, Map<String, List<ObjectInstance>>> systemMap = uploadDTO.getSystemMap();
+        Map<String, ObjectInstance> projectMap = uploadDTO.getProjectMap();
+        // 1.校验设备类型必填
+        List<Object> clazzRow = systemObjectUploadData.get(2);
+        String relClazzCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.SYSTEM_SHEET_NAME,3);
+        // 1.1 专业名称
+        String domainName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(1)));
+        checkContentBlank(errorList,domainName,relClazzCol, "专业");
+        if (StrUtil.isNotBlank(domainName) && !objectClazzMap.containsKey(domainName)){
+            errorList.add(StrUtil.appendIfMissing(relClazzCol, "专业",ErrorEnum.NO_EXIST_ERROR.getDesc()));
+        }
+        // 1.2 系统类型名称
+        String systemName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(2)));
+        checkContentBlank(errorList,systemName,relClazzCol, "系统类");
+        if (StrUtil.isNotBlank(systemName) && !objectClazzMap.containsKey(systemName)){
+            errorList.add(StrUtil.appendIfMissing(relClazzCol, "系统类", ErrorEnum.NO_EXIST_ERROR.getDesc()));
+        }
+        // 2.校验信息点code是否正确
+        checkObjectInfoValid(errorList,systemObjectUploadData.get(6),systemObjectUploadData.get(3),
+                systemObjectInfosMap, CommonConstant.SYSTEM_SHEET_NAME);
+        // 3.校验必填项
+        int equipSize = systemObjectUploadData.size();
+        for (int i = startRowIndex; i < equipSize; i++) {
+            String relCol = StrUtil.format(CommonConstant.REL_COL_FORMAT,CommonConstant.SYSTEM_SHEET_NAME,i+1);
+            List<Object> datas = systemObjectUploadData.get(i);
+            // 1.项目id:必填,是否存在
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            checkProjectValid(errorList,projectId,projectMap,relCol);
+            // 2.建筑本地编码:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,
+                    SystemObjectColumnEnum.BUILD_LOCAL_ID.getRelName());
+            // 3.建筑与系统关系:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+                    SystemObjectColumnEnum.BUILD_EQUIP_REL.getRelName());
+            // 4.系统本地编码:必填,唯一
+            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4))),projectId,
+                    systemMap,relCol,SystemObjectColumnEnum.SYSTEM_LOCAL_ID.getRelName());
+            // 5.系统名称:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+                    SystemObjectColumnEnum.SYSTEM_LOCAL_NAME.getRelName());
+            // 6.系统状态:必填
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+                    SystemObjectColumnEnum.VALID.getRelName());
+        }
+    }
+
+    /***
+     * Description: 批量处理物理世界对象数据
+     * @param uploadDTO : 整体上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/26 15:22
+     * Update By lijie 2021/9/26 15:22
+     */
+    @Override
+    public void batchHandleUploadDatas(UploadDTO uploadDTO) {
+        int startRowIndex = 7;
+        List<List<Object>> systemObjectUploadData = uploadDTO.getSystemObjectUploadData();
+        if (systemObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        Map<String, String> objectClazzMap = uploadDTO.getObjectClazzMap();
+        Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        // 1.校验设备类型必填
+        List<Object> clazzRow = systemObjectUploadData.get(2);
+        // 1.1 系统类型名称
+        String systemName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(clazzRow.get(2)));
+        // 1.2 获得系统类型code
+        String classCode = objectClazzMap.get(systemName);
+        Map<String, Map<String, List<ObjectInstance>>> buildMap = uploadDTO.getBuildMap();
+        Map<String, RelCodeDTO> relCodesMap = uploadDTO.getRelCodesMap();
+        int equipSize = systemObjectUploadData.size();
+        Map<String,List<ObjectInstance>> instanceMap = new HashMap<>();
+        Map<String,List<RelationInstance>> relationMap = new HashMap<>();
+        List<Object> infoCodeList = systemObjectUploadData.get(3);
+        for (int i = startRowIndex; i < equipSize; i++) {
+            List<Object> datas = systemObjectUploadData.get(i);
+            // 1.项目id
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            // 2.建筑本地编码
+            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2)));
+            // 3.建筑与系统关系
+            String relCodeStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
+            // 4.系统本地编码
+            String systemLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
+            // 5.系统本地名称
+            String systemLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5)));
+            // 6.有效状态
+            String validStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
+            Boolean valid = StrUtil.isBlank(validStr)?null: BooleanUtil.toBoolean(validStr);
+            // 7.判断设备是否存在
+            ObjectNode infos = commonCreateInfos(infoCodeList,datas);
+            if (spaceMap.containsKey(systemLocalId)
+                    && spaceMap.getOrDefault(systemLocalId,new HashMap<>()).containsKey(projectId)){
+                // 更新系统
+                commonUpdateObjectInstance(systemLocalName,uploadDTO,projectId, spaceMap,instanceMap,infos, valid);
+                continue;
+            }
+            // 新增系统
+            ObjectInstance objectInstance = commonCreateObjectInstance("Sy", systemLocalId, systemLocalName,
+                    projectId, uploadDTO, ObjType.system.name(), classCode, infos, instanceMap, spaceMap, valid);
+            // 新增建筑与系统关系
+            List<ObjectInstance> buildings = buildMap.getOrDefault(buildLocalId, new HashMap<>()).getOrDefault(projectId, new ArrayList<>());
+            RelCodeDTO relCodeDTO = relCodesMap.get(relCodeStr);
+            if (CollUtil.isEmpty(buildings) || null==relCodeDTO){
+                continue;
+            }
+            for (ObjectInstance building : buildings) {
+                List<RelationInstance> rels = relationMap.getOrDefault(projectId, new ArrayList<>());
+                rels.add(commmonCreateRelationInstance(projectId,uploadDTO, relCodeDTO.getGraphCode(),
+                        relCodeDTO.getRelCode(),building.getId(),objectInstance.getId(),null));
+                relationMap.put(projectId,rels);
+            }
+        }
+        commonUpdateInstances(instanceMap,relationMap,uploadDTO);
+    }
+
     /***
      * Description: 获得excel的sheet名称
      * @return : java.lang.String
@@ -53,4 +202,6 @@ public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
     protected Integer getExcelHeadIndex() {
         return 6;
     }
+
+
 }

+ 26 - 3
dmp-rwd/src/main/resources/mapper/ProjectDao.xml

@@ -1,8 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
 <mapper namespace="com.persagy.dmp.rwd.repository.ProjectDao">
+	<resultMap id="BaseResultMap" type="com.persagy.dmp.rwd.entity.ObjectInstance">
+		<id property="id" column="id" jdbcType="VARCHAR"/>
+		<result property="name" column="name" jdbcType="VARCHAR"/>
+		<result property="localId" column="local_id" jdbcType="VARCHAR"/>
+		<result property="localName" column="local_name" jdbcType="VARCHAR"/>
+		<result property="groupCode" column="group_code" jdbcType="VARCHAR"/>
+		<result property="projectId" column="project_id" jdbcType="VARCHAR"/>
+		<result property="objType" column="obj_type" jdbcType="VARCHAR"/>
+		<result property="classCode" column="class_code" jdbcType="VARCHAR"/>
+		<result property="grouping" column="grouping" jdbcType="INTEGER"/>
+		<result property="infos" column="infos" jdbcType="JAVA_OBJECT" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+		<result property="virtualInfoCodes" column="virtual_codes" jdbcType="ARRAY" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+		<result property="createApp" column="create_app" jdbcType="VARCHAR"/>
+		<result property="updateApp" column="update_app" jdbcType="VARCHAR"/>
+		<result property="createUser" column="create_user" jdbcType="VARCHAR"/>
+		<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+		<result property="updateUser" column="update_user" jdbcType="VARCHAR"/>
+		<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+		<result property="valid" column="valid" jdbcType="INTEGER"/>
+	</resultMap>
+
 	<select id="queryRwdObjectTableNamesByGroupCode" parameterType="hashmap" resultType="string">
 		USE INFORMATION_SCHEMA;
 		SET SESSION group_concat_max_len = 65535;
@@ -17,7 +37,7 @@
 	<select id="queryAllProjects" parameterType="string" resultType="com.persagy.dmp.rwd.entity.ObjectInstance">
 		${querySql}
 	</select>
-	<select id="queryRwdObjectsMultiTablesAndLocalIds" resultType="com.persagy.dmp.rwd.entity.ObjectInstance">
+	<select id="queryRwdObjectsMultiTablesAndLocalIds" resultMap="BaseResultMap">
 		<if test="null!=tableNames and tableNames.size()>0">
 			<foreach collection="tableNames" separator=" UNION " item="tableName">
 				SELECT * FROM ${tableName} WHERE 1=1 AND(
@@ -26,8 +46,11 @@
 						#{projectId}
 					</foreach>
 				</if>
+				<if test="null!=projectIds and projectIds.size()>0 and null!=localIds and localIds.size()>0">
+					OR
+				</if>
 				<if test="null!=localIds and localIds.size()>0">
-					<foreach collection="localIds" item="localId" open=" OR local_id IN(" close=")" separator=",">
+					<foreach collection="localIds" item="localId" open="local_id IN(" close=")" separator=",">
 						#{localId}
 					</foreach>
 				</if>

BIN
dmp-rwd/src/main/resources/template/ObjectInfoTemplate.xlsx