Browse Source

自测物理世界对象上传/下载逻辑,修复其中的bug

lijie 3 years ago
parent
commit
1daea666d0
23 changed files with 576 additions and 189 deletions
  1. 0 2
      dmp-alarm/pom.xml
  2. 1 1
      dmp-common/src/main/java/com/persagy/dmp/common/excel/ExcelUtils.java
  3. 0 1
      dmp-rwd-datautils/pom.xml
  4. 1 1
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ExcelUtils.java
  5. 1 1
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ExcelUtilsForEdit.java
  6. 0 1
      dmp-rwd-edit/pom.xml
  7. 0 6
      dmp-rwd/pom.xml
  8. 4 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/CommonConstant.java
  9. 4 4
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/controller/BatchHandleObjectController.java
  10. 19 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/model/rwd/RelDTO.java
  11. 4 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/model/rwd/UploadDTO.java
  12. 33 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/repository/FuncidDefMapper.java
  13. 12 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/repository/ProjectDao.java
  14. 129 89
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/impl/BatchHandleObjectServiceImpl.java
  15. 10 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/FileCheckService.java
  16. 46 24
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractFileCheckService.java
  17. 60 21
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/CommonFileCheckServiceImpl.java
  18. 87 17
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/EquipFileCheckServiceImpl.java
  19. 62 16
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/SystemFileCheckServiceImpl.java
  20. 5 1
      dmp-rwd/src/main/resources/application.yml
  21. 60 0
      dmp-rwd/src/main/resources/mapper/FuncidDefMapper.xml
  22. 30 1
      dmp-rwd/src/main/resources/mapper/ProjectDao.xml
  23. 8 3
      pom.xml

+ 0 - 2
dmp-alarm/pom.xml

@@ -111,8 +111,6 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.4.3</version>
-            <scope>compile</scope>
         </dependency>
     </dependencies>
 

+ 1 - 1
dmp-common/src/main/java/com/persagy/dmp/common/excel/ExcelUtils.java

@@ -11,7 +11,7 @@ import java.util.*;
 public class ExcelUtils {
 
     public static Object parseCell(Cell cell, String type) {
-        CellType cellType = cell.getCellTypeEnum();
+        CellType cellType = cell.getCellType();
         if ("string".equalsIgnoreCase(type)) {
             if (cellType == CellType.STRING) {
                 return cell.getStringCellValue();

+ 0 - 1
dmp-rwd-datautils/pom.xml

@@ -69,7 +69,6 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.7.2</version>
         </dependency>
     </dependencies>
 </project>

+ 1 - 1
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ExcelUtils.java

@@ -25,7 +25,7 @@ public class ExcelUtils {
         if (cell == null) {
             return null;
         }
-        CellType cellType = cell.getCellTypeEnum();
+        CellType cellType = cell.getCellType();
         if ("string".equalsIgnoreCase(type)) {
             if (cellType == CellType.STRING) {
                 String val = cell.getStringCellValue();

+ 1 - 1
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ExcelUtilsForEdit.java

@@ -39,7 +39,7 @@ public class ExcelUtilsForEdit {
         if (cell == null) {
             return null;
         }
-        CellType cellType = cell.getCellTypeEnum();
+        CellType cellType = cell.getCellType();
         if ("string".equalsIgnoreCase(type)) {
             if (cellType == CellType.STRING) {
                 String val = cell.getStringCellValue();

+ 0 - 1
dmp-rwd-edit/pom.xml

@@ -101,7 +101,6 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.7.2</version>
         </dependency>
         <dependency>
             <groupId>commons-lang</groupId>

+ 0 - 6
dmp-rwd/pom.xml

@@ -69,7 +69,6 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.7.2</version>
         </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
@@ -143,11 +142,6 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>-->
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.5.8</version>
-        </dependency>
         <!-- 注册中心 -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>

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

@@ -55,10 +55,14 @@ public class CommonConstant {
     public static final String UPLOAD_ERR_FILE_NAME="批量导入物理世界对象错误提示文件.txt";
     /**物理世界对象表模板*/
     public static final String RWD_OBJECT_TABLE_NAME_FORMAT="rwd_object_{}%";
+    /**物理世界关系表模板*/
+    public static final String RWD_RELATION_TABLE_NAME_FORMAT="rwd_relation_{}%";
     /**第几行模板*/
     public static final String REL_COL_FORMAT="{}Sheet表中第{}行,";
     /**第几行第几列模板*/
     public static final String REL_ROW_COL_FORMAT="{}Sheet表中第{}行第{}列,";
+    /**多个字符串模板*/
+    public static final String THREE_FORMAT ="{}{}{}";
     /**第几行第几列模板*/
     public static final String GRAPH_ID_FORMAT="Gt{}001";
     /**基础对象录入*/

+ 4 - 4
dmp-rwd/src/main/java/com/persagy/dmp/rwd/controller/BatchHandleObjectController.java

@@ -6,9 +6,11 @@ import cn.hutool.core.util.StrUtil;
 import com.persagy.dmp.config.DmpParameterStorage;
 import com.persagy.dmp.rwd.constants.CommonConstant;
 import com.persagy.dmp.rwd.entity.ObjectInstance;
+import com.persagy.dmp.rwd.entity.RelationInstance;
 import com.persagy.dmp.rwd.handler.BusinessException;
 import com.persagy.dmp.rwd.handler.ResponseCode;
 import com.persagy.dmp.rwd.handler.SpringHelper;
+import com.persagy.dmp.rwd.model.rwd.RelDTO;
 import com.persagy.dmp.rwd.repository.ProjectDao;
 import com.persagy.dmp.rwd.service.BatchHandleObjectService;
 import com.persagy.dmp.rwd.util.FileUtil;
@@ -91,15 +93,13 @@ public class BatchHandleObjectController {
      * @return
      */
     @PostMapping("testQueryTableNames")
-    public List<ObjectInstance> testQueryTableNames(@RequestBody Map<String,Object> param){
+    public List<RelationInstance> testQueryTableNames(@RequestBody Map<String,Object> param){
         String groupCode = DmpParameterStorage.getGroupCode();
         if (StrUtil.isBlank(groupCode)) {
             throw new BusinessException(ResponseCode.A0402.getCode(),"缺少集团编码");
         }
         ProjectDao projectDao = SpringHelper.getBean(ProjectDao.class);
-        return projectDao.queryRwdObjectsMultiTablesAndLocalIds(MapUtil.get(param,"tableNames", new TypeReference<HashSet<String>>(){},new HashSet<>()),
-                MapUtil.get(param,"projectIds", new TypeReference<HashSet<String>>(){},new HashSet<>()),
-                MapUtil.get(param,"localIds", new TypeReference<HashSet<String>>(){},new HashSet<>()));
+        return projectDao.queryObjRelBySpaceIdsAndProjectId(MapUtil.get(param,"rels", new TypeReference<List<RelDTO>>(){},new ArrayList<>()),groupCode);
     }
 
 

+ 19 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/model/rwd/RelDTO.java

@@ -0,0 +1,19 @@
+package com.persagy.dmp.rwd.model.rwd;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Set;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RelDTO {
+
+    private String projectId;
+    private Set<String> spaceIds;
+
+}

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

@@ -78,6 +78,10 @@ public class UploadDTO {
     private Map<String, Map<String,List<ObjectInstance>>> equipMap;
     /**{系统本地编码:{项目id:[系统对象A,系统对象B]}}映射*/
     private Map<String, Map<String,List<ObjectInstance>>> systemMap;
+    /**{"空间id":"楼层id"}映射*/
+    private Map<String, String> spaceFloorMap;
+    /**{"楼层id":"建筑id"}映射*/
+    private Map<String, String> floorBuildMap;
 
 
 

+ 33 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/repository/FuncidDefMapper.java

@@ -0,0 +1,33 @@
+package com.persagy.dmp.rwd.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.common.web.ListResponse;
+import com.persagy.dmp.rwd.entity.FuncidDef;
+import com.persagy.dmp.rwd.model.FuncidDefModel;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/***
+ * Description: 功能点定义Mapper
+ * @author : lijie
+ * @date :2021/9/27 11:31
+ * Update By lijie 2021/9/27 11:31
+ */
+@Repository
+@Mapper
+public interface FuncidDefMapper extends BaseMapper<FuncidDef> {
+
+    /***
+     * Description: 根据classCode和集团编码查询系统和设备的信息点
+     * @param classCodeSet : classCode的集合
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/23 18:14
+     * Update By lijie 2021/9/23 18:14
+     */
+    List<FuncidDef> queryFuncidByClassCodesAndGroupCode(@Param("classCodes") Set<String> classCodeSet,@Param("groupCode") String groupCode);
+}

+ 12 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/repository/ProjectDao.java

@@ -3,6 +3,8 @@ package com.persagy.dmp.rwd.repository;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.persagy.dmp.rwd.entity.ObjectInstance;
+import com.persagy.dmp.rwd.entity.RelationInstance;
+import com.persagy.dmp.rwd.model.rwd.RelDTO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
@@ -50,4 +52,14 @@ public interface ProjectDao  extends BaseMapper<ObjectInstance> {
     List<ObjectInstance> queryRwdObjectsMultiTablesAndLocalIds(@Param("tableNames") Set<String> validTableNames,
                                                                @Param("projectIds") Set<String> transferProjectIds,
                                                                @Param("localIds") Set<String> localIds);
+    /***
+     * Description: 根据空间id查询其所属的楼层和建筑关系
+     * @param relDTOS : 关系列表
+     * @param groupCode : 集团编码
+     * @return : java.util.List<com.persagy.dmp.rwd.entity.RelationInstance>
+     * @author : lijie
+     * @date :2021/9/27 22:56
+     * Update By lijie 2021/9/27 22:56
+     */
+    List<RelationInstance> queryObjRelBySpaceIdsAndProjectId(@Param("rels") List<RelDTO> relDTOS,@Param("groupCode") String groupCode);
 }

+ 129 - 89
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/impl/BatchHandleObjectServiceImpl.java

@@ -1,6 +1,7 @@
 package com.persagy.dmp.rwd.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.StrUtil;
 import cn.hutool.poi.excel.ExcelReader;
@@ -15,7 +16,9 @@ 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.FuncidDef;
 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.feign.DicClient;
 import com.persagy.dmp.rwd.handler.BusinessException;
@@ -24,7 +27,9 @@ 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.RelDTO;
 import com.persagy.dmp.rwd.model.rwd.UploadDTO;
+import com.persagy.dmp.rwd.repository.FuncidDefMapper;
 import com.persagy.dmp.rwd.repository.ObjectInstanceRepository;
 import com.persagy.dmp.rwd.repository.ProjectDao;
 import com.persagy.dmp.rwd.service.*;
@@ -39,6 +44,7 @@ import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
@@ -65,6 +71,8 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     private final FuncidDefService funcidDefService;
     /**类型定义逻辑处理类*/
     private final ClassDefService classDefService;
+    /**功能点定义*/
+    private final FuncidDefMapper funcidDefMapper;
     /**字典服务客户端*/
     private final DicClient dicClient;
     /**物理世界对象批量导入模板的位置*/
@@ -215,13 +223,13 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         // 4.检验数据合法性
         // 4.1 查询相关数据
         // 4.1.1 获取已存在的项目id,建筑本地编码,楼层本地编码,空间本地编码
-        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<>();
         queryExistDatas(uploadDTO);
+        // 4.1.2 如果项目为空,则直接返回
+//        if (CollUtil.isEmpty(uploadDTO.getProjectMap().keySet())){
+//            errorList.add()
+//            FileUtil.writeErrorContentToResponse(errorList,response,request, CommonConstant.UPLOAD_ERR_FILE_NAME);
+//            return;
+//        }
         // 4.1 校验基础对象录入
         commonFileCheckService.checkDataIsValid(errorList,uploadDTO);
         // 4.2 校验设备对象录入
@@ -236,12 +244,86 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         // 5.1 处理基础对象录入
         commonFileCheckService.batchHandleUploadDatas(uploadDTO);
         // 5.2 处理设备对象录入
-
+        // 5.2.1 校验空间本地编码是否存在
+        equipFileCheckService.secondCheckSpaceDataIsValid(errorList,uploadDTO);
+        if (CollUtil.isNotEmpty(errorList)){
+            FileUtil.writeErrorContentToResponse(errorList,response,request, CommonConstant.UPLOAD_ERR_FILE_NAME);
+            return;
+        }
+        // 5.2.2 根据空间信息查询其楼层,建筑关系
+        querySpaceRels(uploadDTO);
+        // 5.2.3 设备对象录入
+        equipFileCheckService.batchHandleUploadDatas(uploadDTO);
         // 5.3 处理系统对象录入
-
+        // 5.3.1 校验建筑本地编码是否存在
+        systemFileCheckService.secondCheckSpaceDataIsValid(errorList,uploadDTO);
+        if (CollUtil.isNotEmpty(errorList)){
+            FileUtil.writeErrorContentToResponse(errorList,response,request, CommonConstant.UPLOAD_ERR_FILE_NAME);
+            return;
+        }
+        // 5.3.2 系统对象录入
+        systemFileCheckService.batchHandleUploadDatas(uploadDTO);
         response.addHeader(CommonConstant.UPLOAD_FLAG,CommonConstant.SUCCESS_FLAG_ONE);
     }
     /***
+     * Description: 根据空间信息查询其楼层关系,楼层与建筑关系
+     * @param uploadDTO : 上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/27 22:43
+     * Update By lijie 2021/9/27 22:43
+     */
+    private void querySpaceRels(UploadDTO uploadDTO) {
+        Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        if (MapUtil.isEmpty(spaceMap)){
+            return;
+        }
+        Set<Map.Entry<String, Map<String, List<ObjectInstance>>>> entries = spaceMap.entrySet();
+        List<RelDTO> relDTOS = new ArrayList<>();
+        // 1.收集查询参数
+        for (Map.Entry<String, Map<String, List<ObjectInstance>>> entry : entries) {
+            Map<String, List<ObjectInstance>> projectMap = entry.getValue();
+            if (MapUtil.isEmpty(projectMap)){
+                continue;
+            }
+            Set<Map.Entry<String, List<ObjectInstance>>> projectEntries = projectMap.entrySet();
+            for (Map.Entry<String, List<ObjectInstance>> projectEntry : projectEntries) {
+                if (StrUtil.isBlank(projectEntry.getKey())
+                        || CollUtil.isEmpty(projectEntry.getValue())){
+                    continue;
+                }
+                relDTOS.add(RelDTO.builder()
+                        .projectId(projectEntry.getKey())
+                        .spaceIds(projectEntry.getValue()
+                                .stream()
+                                .map(ObjectInstance::getId)
+                                .collect(Collectors.toSet()))
+                        .build());
+            }
+        }
+        if (CollUtil.isEmpty(relDTOS)){
+            return;
+        }
+        // 2.查询关系对象
+        List<RelationInstance> relationInstances = projectDao.queryObjRelBySpaceIdsAndProjectId(relDTOS,uploadDTO.getGroupCode());
+        if (CollUtil.isEmpty(relationInstances)){
+            return;
+        }
+        Map<String, String> spaceFloorMap = new HashMap<>();
+        Map<String, String> floorBuildMap = new HashMap<>();
+        for (RelationInstance relationInstance : relationInstances) {
+            if (RelCodeEnum.FL_2_SP.getIndex().equals(relationInstance.getRelCode())){
+                spaceFloorMap.put(relationInstance.getObjTo(),relationInstance.getObjFrom());
+            }
+            if (RelCodeEnum.BD_2_FL.getIndex().equals(relationInstance.getRelCode())){
+                floorBuildMap.put(relationInstance.getObjTo(),relationInstance.getObjFrom());
+            }
+        }
+        uploadDTO.setSpaceFloorMap(spaceFloorMap);
+        uploadDTO.setFloorBuildMap(floorBuildMap);
+    }
+
+    /***
      * Description: 解析关系类型的对象
      * @param relCodesListList : 关系类型对象列表
      * @return : java.util.Map<java.lang.String,com.persagy.dmp.rwd.model.rwd.RelCodeDTO>
@@ -278,6 +360,12 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
      * Update By lijie 2021/9/24 20:43
      */
     private Set<String> queryExistDatas(UploadDTO uploadDTO) {
+        uploadDTO.setProjectMap(new HashMap<>());
+        uploadDTO.setBuildMap(new HashMap<>());
+        uploadDTO.setFloorMap(new HashMap<>());
+        uploadDTO.setSpaceMap(new HashMap<>());
+        uploadDTO.setSystemMap(new HashMap<>());
+        uploadDTO.setEquipMap(new HashMap<>());
         // 1.获得有效的项目id
         Set<String> transferProjectIds = new HashSet<>();
         Set<String> validTableNames = queryValidTableNames(uploadDTO.getCommonObjectUploadData(),
@@ -299,38 +387,26 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
             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);
+                uploadDTO.getProjectMap().put(objectInstance.getId(),objectInstance);
             }
             if (ObjType.building.name().equals(objectInstance.getObjType())){
-                fillObjectInstanceMap(buildMap,objectInstance);
+                fillObjectInstanceMap(uploadDTO.getBuildMap(),objectInstance);
             }
             if (ObjType.floor.name().equals(objectInstance.getObjType())){
-                fillObjectInstanceMap(floorMap,objectInstance);
+                fillObjectInstanceMap(uploadDTO.getFloorMap(),objectInstance);
             }
             if (ObjType.space.name().equals(objectInstance.getObjType())){
-                fillObjectInstanceMap(spaceMap,objectInstance);
+                fillObjectInstanceMap(uploadDTO.getSpaceMap(),objectInstance);
             }
             if (ObjType.equipment.name().equals(objectInstance.getObjType())){
-                fillObjectInstanceMap(equipMap,objectInstance);
+                fillObjectInstanceMap(uploadDTO.getEquipMap(),objectInstance);
             }
             if (ObjType.system.name().equals(objectInstance.getObjType())){
-                fillObjectInstanceMap(systemMap,objectInstance);
+                fillObjectInstanceMap(uploadDTO.getSystemMap(),objectInstance);
             }
         }
-        uploadDTO.setProjectMap(projectMap);
-        uploadDTO.setBuildMap(buildMap);
-        uploadDTO.setFloorMap(floorMap);
-        uploadDTO.setSpaceMap(spaceMap);
-        uploadDTO.setEquipMap(equipMap);
-        uploadDTO.setSystemMap(systemMap);
         return new HashSet<>();
     }
     /***
@@ -346,7 +422,7 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         Map<String,List<ObjectInstance>> buildingMap = objectMap.getOrDefault(objectInstance.getLocalId(), new HashMap<>());
         List<ObjectInstance> buildings = buildingMap.getOrDefault(objectInstance.getProjectId(), new ArrayList<>());
         buildings.add(objectInstance);
-        buildingMap.put(objectInstance.getLocalId(),buildings);
+        buildingMap.put(objectInstance.getProjectId(),buildings);
         objectMap.put(objectInstance.getLocalId(),buildingMap);
     }
 
@@ -364,9 +440,9 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
                                                List<List<Object>> equipObjectUploadData,
                                                List<List<Object>> systemObjectUploadData) {
         Set<String> localIds = new HashSet<>();
-        analysisLocalIdFromExcel(commonObjectUploadData,2,CollUtil.newHashSet(1,4,7),localIds);
-        analysisLocalIdFromExcel(commonObjectUploadData,7,CollUtil.newHashSet(2,4),localIds);
-        analysisLocalIdFromExcel(commonObjectUploadData,7,CollUtil.newHashSet(2,4),localIds);
+        analysisLocalIdFromExcel(commonObjectUploadData,3,CollUtil.newHashSet(1,4,7),localIds);
+        analysisLocalIdFromExcel(equipObjectUploadData,7,CollUtil.newHashSet(2,4),localIds);
+        analysisLocalIdFromExcel(systemObjectUploadData,7,CollUtil.newHashSet(2,4),localIds);
         return localIds;
     }
 
@@ -413,26 +489,36 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
                                              List<List<Object>> systemObjectUploadData,
                                              String groupCode,
                                              Set<String> transferProjectIds) {
-        // 1.获取所有的rwd_object表
-        Set<String> tableNames = objectInstanceRepository.queryAllProjectTableNames(StrUtil.format(CommonConstant.RWD_OBJECT_TABLE_NAME_FORMAT,groupCode));
+        // 1.获取所有的rwd_object表和rwd_relation表(因为自测过程中发现有些rwd_object表有但rwd_relation表没有)
+        // 1.1 获取所有的rwd_object表
+        Set<String> tableNames = objectInstanceRepository
+                .queryAllProjectTableNames(StrUtil.format(CommonConstant.RWD_OBJECT_TABLE_NAME_FORMAT,groupCode));
         if (CollUtil.isEmpty(tableNames)){
             return new HashSet<>();
         }
+        // 1.获取所有的rwd_object表
+        Set<String> tableRelationNames = objectInstanceRepository
+                .queryAllProjectTableNames(StrUtil.format(CommonConstant.RWD_RELATION_TABLE_NAME_FORMAT,groupCode));
+        if (CollUtil.isEmpty(tableRelationNames)){
+            return new HashSet<>();
+        }
+        Map<String, String> objTableNameMap = tableNames.stream().collect(Collectors.toMap(tableName -> tableName
+                .substring(StrUtil.lastIndexOfIgnoreCase(tableName, "Pj")), tableName -> tableName, (k1, k2) -> k1));
+        Map<String, String> relTableNameMap = tableRelationNames.stream().collect(Collectors.toMap(tableName -> tableName
+                .substring(StrUtil.lastIndexOfIgnoreCase(tableName, "Pj")), tableName -> tableName, (k1, k2) -> k1));
         // 2.获得Excel中传值的项目id
         // 2.1 获得基础对象导入表的项目id
-        analysisProjectFromExcel(commonObjectUploadData,2,0,transferProjectIds);
+        analysisProjectFromExcel(commonObjectUploadData,3,0,transferProjectIds);
         // 2.2 获得设备对象导入表的项目id
         analysisProjectFromExcel(equipObjectUploadData,7,1,transferProjectIds);
         // 2.3 获得基础对象导入表的项目id
         analysisProjectFromExcel(systemObjectUploadData,7,1,transferProjectIds);
         // 3. 过滤表名称
         Set<String> validProjectIds = new HashSet<>();
-        for (String next : tableNames) {
-            for (String projectId : transferProjectIds) {
-                if (next.endsWith(projectId)) {
-                    validProjectIds.add(next);
-                    break;
-                }
+        for (String projectId : transferProjectIds) {
+            if (objTableNameMap.containsKey(projectId.toLowerCase())
+                    && relTableNameMap.containsKey(projectId.toLowerCase())){
+                validProjectIds.add(objTableNameMap.get(projectId.toLowerCase()));
             }
         }
         return validProjectIds;
@@ -465,51 +551,6 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     }
 
     /***
-     * 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
-     */
-    private 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 content : 校验内容
-     * @param relCol : 真实列名称
-     * @param realName : 真实名称
-     * @return : void
-     * @author : lijie
-     * @date :2021/9/25 0:38
-     * Update By lijie 2021/9/25 0:38
-     */
-    private 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 dataListList : 数据列表
      * @return : java.util.Map<java.lang.String,java.lang.String>
@@ -906,12 +947,11 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     private List<FuncidDefModel> queryDefFuncidByClassCodes(Set<String> classCodeSet,String groupCode) {
         JacksonCriteria jacksonCriteria = JacksonCriteria.newInstance();
         jacksonCriteria.add("classCode").in(new ArrayList<>(classCodeSet));
-        ListResponse<FuncidDefModel> modelListResponse =
-                funcidDefService.queryFuncid(groupCode, null, null, null, jacksonCriteria);
-        if (!modelListResponse.success() || CollUtil.isEmpty(modelListResponse.getData())){
+        List<FuncidDef> list = funcidDefMapper.queryFuncidByClassCodesAndGroupCode(classCodeSet,groupCode);
+        if (CollUtil.isEmpty(list)){
             return new ArrayList<>();
         }
-        return modelListResponse.getData();
+        return list.stream().map(FuncidDef::toModel).collect(Collectors.toList());
     }
 
     /***
@@ -976,7 +1016,7 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         JacksonCriteria jacksonCriteria = JacksonCriteria.newInstance();
         jacksonCriteria.add("majorCode").in(domainCodes);
         ListResponse<ClassDefModel> queryClass =
-                classDefService.queryClass(groupCode, null, null, null, true, jacksonCriteria);
+                classDefService.queryClass(groupCode, null, null, null, false, jacksonCriteria);
         if (!queryClass.success()){
             throw new BusinessException(ResponseCode.B0001.getCode(),"查询系统设备类数据失败");
         }

+ 10 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/FileCheckService.java

@@ -42,4 +42,14 @@ public interface FileCheckService {
      * Update By lijie 2021/9/26 15:22
      */
     void batchHandleUploadDatas(UploadDTO uploadDTO);
+    /***
+     * Description: 校验空间数据是否存在
+     * @param errorList : 错误列表
+     * @param uploadDTO : 上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/27 22:33
+     * Update By lijie 2021/9/27 22:33
+     */
+    void secondCheckSpaceDataIsValid(List<String> errorList, UploadDTO uploadDTO);
 }

+ 46 - 24
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractFileCheckService.java

@@ -3,9 +3,7 @@ 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;
@@ -24,7 +22,6 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /***
  * Description: 文件检测抽象逻辑类(模板模式)
@@ -54,31 +51,33 @@ public abstract class AbstractFileCheckService implements FileCheckService {
         int excelHeadIndex = getExcelHeadIndex();
         String excelSheetName = getExcelSheetName();
         if (lists.size() < excelHeadIndex){
-            errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+            errorList.add(excelSheetName+ErrorEnum.FILE_ERROR.getDesc());
             return;
         }
         // 2.获的行头行的数据
         List<Object> rows = lists.get(excelHeadIndex);
         if (CollUtil.isEmpty(rows)){
-            errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+            errorList.add(excelSheetName+ErrorEnum.FILE_ERROR.getDesc());
             return;
         }
         // 3.获得不可变行头的映射
         Map<Integer,String> persistentHeadMap = getPersistentHeadMap();
         if (rows.size()<persistentHeadMap.size()){
-            errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+            errorList.add(excelSheetName+ErrorEnum.FILE_ERROR.getDesc());
             return;
         }
         // 4.校验不可变行头
-        for (int i=0;i<persistentHeadMap.size();i++){
+        int excelColumnOffset = getExcelColumnOffset();
+        int size = persistentHeadMap.size()+excelColumnOffset;
+        for (int i=excelColumnOffset;i<size;i++){
             String columnName = persistentHeadMap.get(i);
             if (StrUtil.isBlank(columnName)){
-                errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+                errorList.add(excelSheetName+ErrorEnum.FILE_ERROR.getDesc());
                 return;
             }
             String realName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(rows.get(i)));
             if (StrUtil.isBlank(realName) || !realName.contains(columnName)){
-                errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+                errorList.add(excelSheetName+ErrorEnum.FILE_ERROR.getDesc());
                 return;
             }
         }
@@ -86,16 +85,25 @@ public abstract class AbstractFileCheckService implements FileCheckService {
             return;
         }
         // 5.校验动态行头
-        int dynamicSize = persistentHeadMap.size();
+        int dynamicSize = persistentHeadMap.size()+excelColumnOffset;
         for (int i = dynamicSize; i < rows.size(); i++) {
-            String realCol=excelSheetName+"Sheet表:第"+(i+1)+"行,";
+            String realCol=excelSheetName+"Sheet表:第"+(excelHeadIndex+1)+"行第"+(i+1)+"列,";
             String tempStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(rows.get(i)));
-            if (!dynamicMap.containsKey(tempStr)){
+            if (StrUtil.isNotBlank(tempStr) && !dynamicMap.containsKey(tempStr)){
                 errorList.add(realCol+ErrorEnum.INFO_NAME_NOT_EXIST_ERROR);
             }
         }
     }
     /***
+     * Description: 获得行的偏移量
+     * @return : java.lang.Integer
+     * @author : lijie
+     * @date :2021/9/27 15:31
+     * Update By lijie 2021/9/27 15:31
+     */
+    protected Integer getExcelColumnOffset(){return 0;};
+
+    /***
      * Description: 校验数据的正确性
      * @param errorList : 错误列表
      * @param uploadDTO : 整体上传数据
@@ -116,6 +124,17 @@ public abstract class AbstractFileCheckService implements FileCheckService {
      */
     @Override
     public void batchHandleUploadDatas(UploadDTO uploadDTO) {}
+    /***
+     * Description: 校验空间数据是否存在
+     * @param errorList : 错误列表
+     * @param uploadDTO : 上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/27 22:33
+     * Update By lijie 2021/9/27 22:33
+     */
+    @Override
+    public void secondCheckSpaceDataIsValid(List<String> errorList, UploadDTO uploadDTO) {}
 
     /***
      * Description: 获得所在excel名称
@@ -167,7 +186,7 @@ public abstract class AbstractFileCheckService implements FileCheckService {
             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()));
+                errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relCol, realName,ErrorEnum.REPEAT_ERROR.getDesc()));
             }
         }
     }
@@ -186,7 +205,7 @@ public abstract class AbstractFileCheckService implements FileCheckService {
         if (StrUtil.isNotBlank(content)){
             return;
         }
-        errorList.add(StrUtil.appendIfMissing(relCol, realName,ErrorEnum.CONTENT_BLANK_ERROR.getDesc()));
+        errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relCol, realName,ErrorEnum.CONTENT_BLANK_ERROR.getDesc()));
     }
 
     /***
@@ -203,7 +222,7 @@ public abstract class AbstractFileCheckService implements FileCheckService {
     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()));
+            errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT, relCol, CommonObjectColumnEnum.PROJECT_ID.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
         }
     }
 
@@ -231,13 +250,15 @@ public abstract class AbstractFileCheckService implements FileCheckService {
             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)){
+                checkContentBlank(errorList,code,codeRelCol,"信息点code");
+            }
+            // checkContentBlank(errorList,name,nameRelCol,"信息点名称");
             if (StrUtil.isNotBlank(name) && !objectInfosMap.containsKey(name)){
-                errorList.add(StrUtil.appendIfMissing(nameRelCol, "信息点名称",ErrorEnum.NO_EXIST_ERROR.getDesc()));
+                errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,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()));
+                errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,codeRelCol, "信息点code",ErrorEnum.NO_EXIST_ERROR.getDesc()));
             }
         }
     }
@@ -254,10 +275,10 @@ public abstract class AbstractFileCheckService implements FileCheckService {
      * @date :2021/9/26 22:43
      * Update By lijie 2021/9/26 22:43
      */
-    protected final void commonUpdateObjectInstance(String localName, UploadDTO uploadDTO, String projectId,
+    protected final void commonUpdateObjectInstance(String localId, 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<>())
+        ObjectInstance objectInstance = existInsMap.getOrDefault(localId, new HashMap<>())
                 .getOrDefault(projectId,new ArrayList<>()).get(0);
         ObjectNode srcInfos = objectInstance.getInfos();
         if (null==srcInfos){
@@ -270,6 +291,7 @@ public abstract class AbstractFileCheckService implements FileCheckService {
         objectInstance.setUpdateUser(uploadDTO.getUserId());
         objectInstance.setLocalName(localName);
         objectInstance.setInfos(infos);
+        objectInstance.setUpdateTime(new Date());
         if (null!=valid){
             objectInstance.setValid(BooleanUtil.toInt(valid));
         }
@@ -293,7 +315,7 @@ public abstract class AbstractFileCheckService implements FileCheckService {
         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);
+            SpringHelper.getBean("baseService",BaseService.class).setSharding(uploadDTO.getGroupCode(),projectId);
             if (CollUtil.isNotEmpty(entry.getValue())){
                 SpringHelper.getBean(ObjectInstanceRepository.class).saveAll(entry.getValue());
             }
@@ -328,7 +350,7 @@ public abstract class AbstractFileCheckService implements FileCheckService {
                                                       Map<String, Map<String, List<ObjectInstance>>> existInstanceMap,
                                                               Boolean valid) {
         ObjectInstance objectInstance = new ObjectInstance();
-        objectInstance.setId(StrUtil.appendIfMissing(idPrefix, projectId.substring(2), IdWorker.getIdStr()));
+        objectInstance.setId(StrUtil.format(CommonConstant.THREE_FORMAT,idPrefix, projectId.substring(2), IdWorker.getIdStr()));
         objectInstance.setName(localName);
         objectInstance.setLocalId(localId);
         objectInstance.setLocalName(localName);
@@ -371,7 +393,7 @@ public abstract class AbstractFileCheckService implements FileCheckService {
         relationInstance.setGroupCode(uploadDTO.getGroupCode());
         relationInstance.setProjectId(projectId);
         relationInstance.setGraphId(StrUtil.format(CommonConstant.GRAPH_ID_FORMAT, graphCode));
-        relationInstance.setGroupCode(graphCode);
+        relationInstance.setGraphCode(graphCode);
         relationInstance.setRelCode(relCode);
         relationInstance.setObjFrom(fromId);
         relationInstance.setRelValue(relVal);

+ 60 - 21
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/CommonFileCheckServiceImpl.java

@@ -21,6 +21,7 @@ import com.persagy.dmp.rwd.service.BaseService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -54,55 +55,92 @@ public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
         Map<String, String> spaceZonesMap = uploadDTO.getSpaceZonesMap();
         Map<String, String> spaceFuncTypesMap = uploadDTO.getSpaceFuncTypesMap();
         Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        Map<String,String> floorBuildLocalIdMap = new HashMap<>();
+        Map<String, String> spaceFloorIdMap = 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)));
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,0)));
             checkProjectValid(errorList,projectId,projectMap,relCol);
             // 2.建筑本地编码:必填,是否在项目下有重复
-            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,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());
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,2))),relCol,CommonObjectColumnEnum.BUILD_LOCAL_NAME.getRealName());
             // 4.建筑功能类型:必填,是否存在
-            String buildFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
+            String buildFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,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()));
+                errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relCol, CommonObjectColumnEnum.BUILD_FUNC_TYPE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
             }
             // 5.楼层本地编码:必填,是否在项目下有重复
-            String floorLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
+            String floorLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,4)));
             checkLocalIdExists(errorList,floorLocalId,projectId,floorMap,relCol,CommonObjectColumnEnum.FLOOR_LOCAL_ID.getRealName());
+            checkLocalIdRepeated(floorLocalId,buildLocalId,projectId,floorBuildLocalIdMap,relCol,CommonObjectColumnEnum.FLOOR_LOCAL_ID.getRealName(),errorList);
             // 6.楼层本地名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5))),relCol,CommonObjectColumnEnum.FLOOR_LOCAL_NAME.getRealName());
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,5))),relCol,CommonObjectColumnEnum.FLOOR_LOCAL_NAME.getRealName());
             // 7.楼层编码:必填,是否存在
-            String floorIdentity = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
+            String floorIdentity = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,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()));
+                errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relCol, CommonObjectColumnEnum.FLOOR_IDENTITY.getRealName(), ErrorEnum.NO_EXIST_ERROR.getDesc()));
             }
             // 8.空间本地编码:必填,是否在项目下有重复
-            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(7))),
+            String spaceLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas, 7)));
+            checkLocalIdExists(errorList,spaceLocalId,
                     projectId,spaceMap,relCol,CommonObjectColumnEnum.SPACE_LOCAL_ID.getRealName());
+            checkLocalIdRepeated(spaceLocalId,floorLocalId,projectId,spaceFloorIdMap,relCol,CommonObjectColumnEnum.SPACE_LOCAL_ID.getRealName(),errorList);
             // 9.空间名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(8))),
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,8))),
                     relCol,CommonObjectColumnEnum.SPACE_LOCAL_NAME.getRealName());
             // 10.空间分区:必填,是否存在
-            String spaceZone = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(9)));
+            String spaceZone = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,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()));
+                errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relCol, CommonObjectColumnEnum.SPACE_ZONE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
             }
             // 11.空间功能类型:必填,是否存在
-            String spaceFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(10)));
+            String spaceFuncType = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,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()));
+                errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relCol, CommonObjectColumnEnum.SPACE_FUNC_TYPE.getRealName(),ErrorEnum.NO_EXIST_ERROR.getDesc()));
+            }
+        }
+    }
+    /***
+     * Description: 校验楼层本地编码或空间本地编码是否重复
+     * @param sonLocalId : 子级本地编码
+     * @param parentLocalId : 父级本地编码
+     * @param projectId : 项目id
+     * @param localIdMap : 本地编码_项目id与父级本地编码的映射
+     * @param relCol : 关系字段
+     * @param realName : 关系名称
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/27 21:20
+     * Update By lijie 2021/9/27 21:20
+     */
+    private void checkLocalIdRepeated(String sonLocalId, String parentLocalId, String projectId,
+                                      Map<String, String> localIdMap, String relCol, String realName,List<String> errorList) {
+        if (StrUtil.isNotBlank(sonLocalId)
+                && StrUtil.isNotBlank(parentLocalId)
+                && StrUtil.isNotBlank(projectId)){
+            // 判断楼层本地编码对应的建筑本地编码是否一致
+            String otherParentLocalId = localIdMap.getOrDefault(StrUtil.format("{}_{}", sonLocalId, projectId), "");
+            if (StrUtil.isNotBlank(otherParentLocalId)
+                    && !otherParentLocalId.equals(parentLocalId)){
+                errorList.add(StrUtil.format("{}{}{}{}{}",
+                        relCol,realName,"在",parentLocalId,"下已存在"));
+            }else {
+                localIdMap.put(StrUtil.format("{}_{}", sonLocalId, projectId),parentLocalId);
             }
         }
+
+
     }
+
     /***
      * Description: 批量处理物理世界对象数据
      * @param uploadDTO : 整体上传数据
@@ -112,13 +150,14 @@ public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
      * Update By lijie 2021/9/26 15:22
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     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);
+        List<Object> infosData = commonObjectUploadData.get(1);
         int objSize = commonObjectUploadData.size();
         Map<String,List<ObjectInstance>> instanceMap = new HashMap<>();
         Map<String,List<RelationInstance>> relationMap = new HashMap<>();
@@ -231,7 +270,7 @@ public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
             ObjectNode infos = SpringHelper.getBean(ObjectMapper.class)
                     .createObjectNode()
                     .put(spaceFuncTypeInfo, spaceFuncTypesMap.get(spaceFuncType));
-            commonUpdateObjectInstance(spaceLocalName,uploadDTO,projectId, spaceMap,instanceMap, infos,null);
+            commonUpdateObjectInstance(spaceLocalId,spaceLocalName,uploadDTO,projectId, spaceMap,instanceMap, infos,null);
             return;
         }
         // 新增对象
@@ -275,12 +314,12 @@ public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
         if (floorMap.containsKey(floorLocalId)
                 && floorMap.getOrDefault(floorLocalId,new HashMap<>()).containsKey(projectId)){
             // 更新对象
-            ObjectInstance floor = floorMap.getOrDefault(projectId, new HashMap<>())
+            ObjectInstance floor = floorMap.getOrDefault(floorLocalId, 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);
+            commonUpdateObjectInstance(floorLocalId, floorLocalName,uploadDTO,projectId, floorMap,instanceMap,infos,null);
             return floor.getId();
         }
         // 新增对象
@@ -318,12 +357,12 @@ public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
         if (buildMap.containsKey(buildLocalId)
                 && buildMap.getOrDefault(buildLocalId,new HashMap<>()).containsKey(projectId)){
             // 更新建筑
-            ObjectInstance building = buildMap.getOrDefault(projectId, new HashMap<>())
+            ObjectInstance building = buildMap.getOrDefault(buildLocalId, 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);
+            commonUpdateObjectInstance(buildLocalId, buildLocalName,uploadDTO,projectId, buildMap,instanceMap,infos,null);
             return building.getId();
         }
         // 新增建筑

+ 87 - 17
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/EquipFileCheckServiceImpl.java

@@ -1,6 +1,7 @@
 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.BooleanUtil;
 import cn.hutool.core.util.EnumUtil;
@@ -47,19 +48,19 @@ public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
         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()));
+            errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,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()));
+            errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,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()));
+            errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relClazzCol, "设备类型", ErrorEnum.NO_EXIST_ERROR.getDesc()));
         }
         // 2.校验信息点code是否正确
         checkObjectInfoValid(errorList,equipObjectUploadData.get(6),equipObjectUploadData.get(3),
@@ -70,22 +71,22 @@ public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
             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)));
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,1)));
             checkProjectValid(errorList,projectId,projectMap,relCol);
             // 2.空间本地编码:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,2))),relCol,
                     EquipObjectColumnEnum.SPACE_LOCAL_ID.getRelName());
             // 3.空间与设备关系:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,3))),relCol,
                     EquipObjectColumnEnum.SPACE_EQUIP_REL.getRelName());
             // 4.设备本地编码:必填,唯一
-            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4))),projectId,
+            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,4))),projectId,
                     equipMap,relCol,EquipObjectColumnEnum.EQUIP_LOCAL_ID.getRelName());
             // 5.设备名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,5))),relCol,
                     EquipObjectColumnEnum.EQUIP_LOCAL_NAME.getRelName());
             // 6.有效状态:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,6))),relCol,
                     EquipObjectColumnEnum.VALID.getRelName());
         }
     }
@@ -114,6 +115,8 @@ public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
         // 1.2 获得设备类型code
         String classCode = objectClazzMap.get(equipTypeName);
         Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        Map<String, String> spaceFloorMap = MapUtil.defaultIfEmpty(uploadDTO.getSpaceFloorMap(), new HashMap<>());
+        Map<String, String> floorBuildMap = MapUtil.defaultIfEmpty(uploadDTO.getFloorBuildMap(), new HashMap<>());
         Map<String, RelCodeDTO> relCodesMap = uploadDTO.getRelCodesMap();
         int equipSize = equipObjectUploadData.size();
         Map<String,List<ObjectInstance>> instanceMap = new HashMap<>();
@@ -122,24 +125,24 @@ public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
         for (int i = startRowIndex; i < equipSize; i++) {
             List<Object> datas = equipObjectUploadData.get(i);
             // 1.项目id
-            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,1)));
             // 2.空间本地编码
-            String spaceLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2)));
+            String spaceLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,2)));
             // 3.空间与设备关系:必填
-            String relCodeStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
+            String relCodeStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,3)));
             // 4.设备本地编码
-            String equipLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
+            String equipLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,4)));
             // 5.设备本地名称
-            String equipLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5)));
+            String equipLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,5)));
             // 6.有效状态
-            String validStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
+            String validStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,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);
+                commonUpdateObjectInstance(equipLocalId,equipLocalName,uploadDTO,projectId, equipMap,instanceMap,infos, valid);
                 continue;
             }
             // 新增设备
@@ -154,12 +157,68 @@ public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
             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()));
+                        relCodeDTO.getRelCode(),objectInstance.getId(),space.getId(),space.getClassCode()));
+                String floorId = spaceFloorMap.getOrDefault(space.getId(), "");
+                if (StrUtil.isNotBlank(floorId)
+                        && GraphCodeEnum.MECH_IN_ARCH.getIndex().equals(relCodeDTO.getGraphCode())){
+                    rels.add(commmonCreateRelationInstance(projectId,uploadDTO, GraphCodeEnum.MECH_IN_ARCH.getIndex(),
+                            RelCodeEnum.EQ_2_FL.getIndex(),objectInstance.getId(),floorId,null));
+                    if (floorBuildMap.containsKey(floorId)
+                            && StrUtil.isNotBlank(floorBuildMap.get(floorId))){
+                        rels.add(commmonCreateRelationInstance(projectId,uploadDTO, GraphCodeEnum.MECH_IN_ARCH.getIndex(),
+                                RelCodeEnum.EQ_2_BD.getIndex(),objectInstance.getId(),floorBuildMap.get(floorId),null));
+                    }
+                }
+                if (StrUtil.isNotBlank(floorId)
+                        && GraphCodeEnum.MECH_FOR_ARCH.getIndex().equals(relCodeDTO.getGraphCode())){
+                    rels.add(commmonCreateRelationInstance(projectId,uploadDTO, GraphCodeEnum.MECH_FOR_ARCH.getIndex(),
+                            RelCodeEnum.EQ_2_FL.getIndex(),objectInstance.getId(),floorId,null));
+                    if (floorBuildMap.containsKey(floorId)
+                            && StrUtil.isNotBlank(floorBuildMap.get(floorId))){
+                        rels.add(commmonCreateRelationInstance(projectId,uploadDTO, GraphCodeEnum.MECH_FOR_ARCH.getIndex(),
+                                RelCodeEnum.EQ_2_BD.getIndex(),objectInstance.getId(),floorBuildMap.get(floorId),null));
+                    }
+                }
                 relationMap.put(projectId,rels);
             }
         }
         commonUpdateInstances(instanceMap,relationMap,uploadDTO);
     }
+    /***
+     * Description: 校验空间数据是否存在
+     * @param errorList : 错误列表
+     * @param uploadDTO : 上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/27 22:33
+     * Update By lijie 2021/9/27 22:33
+     */
+    @Override
+    public void secondCheckSpaceDataIsValid(List<String> errorList, UploadDTO uploadDTO) {
+        int startRowIndex = 7;
+        List<List<Object>> equipObjectUploadData = uploadDTO.getEquipObjectUploadData();
+        if (equipObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        Map<String, Map<String, List<ObjectInstance>>> spaceMap = uploadDTO.getSpaceMap();
+        Map<String, ObjectInstance> projectMap = uploadDTO.getProjectMap();
+        // 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(CollUtil.get(datas,1)));
+            // 2.空间本地编码:必填
+            String spaceLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas, 2)));
+            if (!spaceMap.containsKey(spaceLocalId)
+                    || !spaceMap.getOrDefault(spaceLocalId,new HashMap<>()).containsKey(projectId)){
+                // 空间对象不存在
+                errorList.add(StrUtil.format("{}{}{}{}{}",relCol,
+                        EquipObjectColumnEnum.SPACE_LOCAL_ID.getRelName(),"在项目",projectId,"下不存在"));
+            }
+        }
+    }
 
     /***
      * Description: 获得excel的sheet名称
@@ -198,4 +257,15 @@ public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
     protected Integer getExcelHeadIndex() {
         return 6;
     }
+    /***
+     * Description: 获得列偏移量
+     * @return : java.lang.Integer
+     * @author : lijie
+     * @date :2021/9/27 15:32
+     * Update By lijie 2021/9/27 15:32
+     */
+    @Override
+    protected Integer getExcelColumnOffset() {
+        return 1;
+    }
 }

+ 62 - 16
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/SystemFileCheckServiceImpl.java

@@ -57,13 +57,13 @@ public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
         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()));
+            errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,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()));
+            errorList.add(StrUtil.format(CommonConstant.THREE_FORMAT,relClazzCol, "系统类", ErrorEnum.NO_EXIST_ERROR.getDesc()));
         }
         // 2.校验信息点code是否正确
         checkObjectInfoValid(errorList,systemObjectUploadData.get(6),systemObjectUploadData.get(3),
@@ -74,22 +74,22 @@ public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
             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)));
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,1)));
             checkProjectValid(errorList,projectId,projectMap,relCol);
             // 2.建筑本地编码:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,2))),relCol,
                     SystemObjectColumnEnum.BUILD_LOCAL_ID.getRelName());
             // 3.建筑与系统关系:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,3))),relCol,
                     SystemObjectColumnEnum.BUILD_EQUIP_REL.getRelName());
             // 4.系统本地编码:必填,唯一
-            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4))),projectId,
+            checkLocalIdExists(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,4))),projectId,
                     systemMap,relCol,SystemObjectColumnEnum.SYSTEM_LOCAL_ID.getRelName());
             // 5.系统名称:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,5))),relCol,
                     SystemObjectColumnEnum.SYSTEM_LOCAL_NAME.getRelName());
             // 6.系统状态:必填
-            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3))),relCol,
+            checkContentBlank(errorList,CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,6))),relCol,
                     SystemObjectColumnEnum.VALID.getRelName());
         }
     }
@@ -126,24 +126,24 @@ public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
         for (int i = startRowIndex; i < equipSize; i++) {
             List<Object> datas = systemObjectUploadData.get(i);
             // 1.项目id
-            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(1)));
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,1)));
             // 2.建筑本地编码
-            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(2)));
+            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,2)));
             // 3.建筑与系统关系
-            String relCodeStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(3)));
+            String relCodeStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,3)));
             // 4.系统本地编码
-            String systemLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(4)));
+            String systemLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,4)));
             // 5.系统本地名称
-            String systemLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(5)));
+            String systemLocalName = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,5)));
             // 6.有效状态
-            String validStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(datas.get(6)));
+            String validStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas,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);
+                commonUpdateObjectInstance(systemLocalId,systemLocalName,uploadDTO,projectId, spaceMap,instanceMap,infos, valid);
                 continue;
             }
             // 新增系统
@@ -158,7 +158,7 @@ public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
             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));
+                        relCodeDTO.getRelCode(),objectInstance.getId(),building.getId(),null));
                 relationMap.put(projectId,rels);
             }
         }
@@ -166,6 +166,41 @@ public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
     }
 
     /***
+     * Description: 校验空间数据是否存在
+     * @param errorList : 错误列表
+     * @param uploadDTO : 上传数据
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/27 22:33
+     * Update By lijie 2021/9/27 22:33
+     */
+    @Override
+    public void secondCheckSpaceDataIsValid(List<String> errorList, UploadDTO uploadDTO) {
+        int startRowIndex = 7;
+        List<List<Object>> systemObjectUploadData = uploadDTO.getSystemObjectUploadData();
+        if (systemObjectUploadData.size()<=startRowIndex){
+            return;
+        }
+        Map<String, Map<String, List<ObjectInstance>>> buildMap = uploadDTO.getBuildMap();
+        // 3.校验必填项
+        int systemSize = systemObjectUploadData.size();
+        for (int i = startRowIndex; i < systemSize; 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(CollUtil.get(datas,1)));
+            // 2.建筑本地编码:必填
+            String buildLocalId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(CollUtil.get(datas, 2)));
+            if (!buildMap.containsKey(buildLocalId)
+                    || !buildMap.getOrDefault(buildLocalId,new HashMap<>()).containsKey(projectId)){
+                // 空间对象不存在
+                errorList.add(StrUtil.format("{}{}{}{}{}",relCol,
+                        SystemObjectColumnEnum.BUILD_LOCAL_ID.getRelName(),"在项目",projectId,"下不存在"));
+            }
+        }
+    }
+
+    /***
      * Description: 获得excel的sheet名称
      * @return : java.lang.String
      * @author : lijie
@@ -203,5 +238,16 @@ public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
         return 6;
     }
 
+    /***
+     * Description: 获得列偏移量
+     * @return : java.lang.Integer
+     * @author : lijie
+     * @date :2021/9/27 15:32
+     * Update By lijie 2021/9/27 15:32
+     */
+    @Override
+    protected Integer getExcelColumnOffset() {
+        return 1;
+    }
 
 }

+ 5 - 1
dmp-rwd/src/main/resources/application.yml

@@ -6,4 +6,8 @@ spring:
         session_factory:
           statement_inspector: com.persagy.dmp.rwd.sharding.JpaSqlStatementInspector
     hibernate:
-      ddl-auto: none
+      ddl-auto: none
+  servlet:
+    multipart:
+      max-file-size: 20MB
+      max-request-size: 20MB

+ 60 - 0
dmp-rwd/src/main/resources/mapper/FuncidDefMapper.xml

@@ -0,0 +1,60 @@
+<?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.FuncidDefMapper">
+	<resultMap id="BaseResultMap" type="com.persagy.dmp.rwd.entity.FuncidDef">
+		<id property="id" column="id" jdbcType="VARCHAR"/>
+		<result property="name" column="name" jdbcType="VARCHAR"/>
+		<result property="code" column="code" jdbcType="VARCHAR"/>
+		<result property="origCode" column="orig_code" jdbcType="VARCHAR"/>
+		<result property="aliasCode" column="alias_code" jdbcType="VARCHAR"/>
+		<result property="aliasName" column="alias_name" jdbcType="VARCHAR"/>
+		<result property="classCode" column="class_code" jdbcType="VARCHAR"/>
+		<result property="type" column="type" jdbcType="VARCHAR"/>
+		<result property="groupCode" column="group_code" jdbcType="VARCHAR"/>
+		<result property="projectId" column="project_id" jdbcType="VARCHAR"/>
+		<result property="category" column="category" jdbcType="VARCHAR"/>
+		<result property="firstTag" column="first_tag" jdbcType="VARCHAR"/>
+		<result property="secondTag" column="second_tag" jdbcType="VARCHAR"/>
+		<result property="priority" column="priority" jdbcType="VARCHAR"/>
+		<result property="inputMode" column="input_mode" jdbcType="VARCHAR"/>
+		<result property="unit" column="unit" jdbcType="VARCHAR"/>
+		<result property="dataType" column="data_type" jdbcType="VARCHAR"/>
+		<result property="origDataType" column="orig_data_type" jdbcType="VARCHAR"/>
+		<result property="isMultiple" column="is_multiple" jdbcType="INTEGER"/>
+		<result property="isRegion" column="is_region" jdbcType="INTEGER"/>
+		<result property="formater" column="formater" jdbcType="VARCHAR"/>
+		<result property="dataSource" column="data_source" jdbcType="JAVA_OBJECT" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+		<result property="note" column="note" jdbcType="VARCHAR"/>
+		<result property="subFlag" column="sub_flag" jdbcType="INTEGER"/>
+		<result property="weakPoint" column="weak_point" jdbcType="INTEGER"/>
+		<result property="aliasFirstTag" column="alias_first_tag" jdbcType="VARCHAR"/>
+		<result property="aliasSecondTag" column="alias_second_tag" jdbcType="VARCHAR"/>
+	</resultMap>
+	<select id="queryFuncidByClassCodesAndGroupCode" resultType="com.persagy.dmp.rwd.entity.FuncidDef">
+		SELECT
+			*
+		FROM
+			rwd_def_funcid_${groupCode}
+		WHERE 1=1
+		<if test="null!=classCodes and classCodes.size()>0">
+			<foreach collection="classCodes" item="classCode" open=" AND class_code IN(" close=")" separator=",">
+				#{classCode}
+			</foreach>
+		</if>
+		UNION
+		SELECT
+			*
+		FROM
+			rwd_def_funcid
+		WHERE 1=1
+		<if test="null!=classCodes and classCodes.size()>0">
+			<foreach collection="classCodes" item="classCode" open=" AND class_code IN(" close=")" separator=",">
+				#{classCode}
+			</foreach>
+		</if>
+		  AND CONCAT(class_code, '_', `code`) NOT IN ( SELECT CONCAT( class_code, '_', `code`) FROM rwd_def_funcid_${groupCode});
+	</select>
+
+
+</mapper>

+ 30 - 1
dmp-rwd/src/main/resources/mapper/ProjectDao.xml

@@ -13,7 +13,7 @@
 		<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="virtualInfoCodes" column="virtual_codes" jdbcType="VARCHAR" 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"/>
@@ -59,5 +59,34 @@
 			;
 		</if>
 	</select>
+	<select id="queryObjRelBySpaceIdsAndProjectId" resultType="com.persagy.dmp.rwd.entity.RelationInstance">
+		<foreach collection="rels" item="rel" separator=" UNION ">
+			SELECT
+			*
+			FROM
+			rwd_relation_${groupCode}_${rel.projectId}
+			WHERE graph_code='ArchSubset'
+			AND rel_code = 'Fl2Sp'
+			<foreach collection="rel.spaceIds" item="spaceId" open="AND obj_to IN (" close=")" separator=",">
+				#{spaceId}
+			</foreach>
+			UNION
+			SELECT
+			*
+			FROM
+			rwd_relation_${groupCode}_${rel.projectId}
+			WHERE
+			graph_code = 'ArchSubset'
+			AND rel_code = 'Bd2Fl'
+			AND obj_to IN(
+			    SELECT obj_from
+			    FROM rwd_relation_${groupCode}_${rel.projectId}
+			    WHERE graph_code = 'ArchSubset'
+			    AND rel_code = 'Fl2Sp'
+			<foreach collection="rel.spaceIds" item="spaceId" open="AND obj_to IN (" close=")" separator=",">
+				#{spaceId}
+			</foreach>)
+		</foreach>
+	</select>
 
 </mapper>

+ 8 - 3
pom.xml

@@ -127,7 +127,7 @@
             <dependency>
                 <groupId>org.apache.poi</groupId>
                 <artifactId>poi</artifactId>
-                <version>3.17</version>
+                <version>5.0.0</version>
                 <exclusions>
                     <exclusion>
                         <groupId>commons-logging</groupId>
@@ -138,12 +138,12 @@
             <dependency>
                 <groupId>org.apache.poi</groupId>
                 <artifactId>poi-ooxml</artifactId>
-                <version>3.17</version>
+                <version>5.0.0</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.poi</groupId>
                 <artifactId>poi-ooxml-schemas</artifactId>
-                <version>3.17</version>
+                <version>4.1.2</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>
@@ -160,6 +160,11 @@
                 <artifactId>spring-boot-starter-amqp</artifactId>
                 <version>${springboot.version}</version>
             </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>5.7.10</version>
+            </dependency>
         </dependencies>
 
     </dependencyManagement>