소스 검색

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

lijie 3 년 전
부모
커밋
82f72ce46b

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

@@ -53,5 +53,17 @@ public class CommonConstant {
     public static final String DTO_FILE="file";
     /**批量导入物理世界对象错误提示文件名称*/
     public static final String UPLOAD_ERR_FILE_NAME="批量导入物理世界对象错误提示文件.txt";
+    /**物理世界对象表模板*/
+    public static final String RWD_OBJECT_TABLE_NAME_FORMAT="rwd_object_{}%";
+    /**第几行模板*/
+    public static final String REL_COL_FORMAT="{}Sheet表中第{}行,";
+    /**第几行第几列模板*/
+    public static final String REL_ROW_COL_FORMAT="{}Sheet表中第{}行第{}列,";
+    /**基础对象录入*/
+    public static final String COMMON_SHEET_NAME="基础对象录入";
+    /**设备对象录入*/
+    public static final String EQUIP_SHEET_NAME="设备对象录入";
+    /**空间对象录入*/
+    public static final String SYSTEM_SHEET_NAME ="系统对象录入";
 
 }

+ 19 - 15
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/CommonObjectColumnEnum.java

@@ -10,35 +10,35 @@ package com.persagy.dmp.rwd.constants;
 public enum CommonObjectColumnEnum {
 
 	/**项目id**/
-	PROJECT_ID(0,"项目id*"),
+	PROJECT_ID(0,"项目id*","项目id"),
 	/**建筑本地编码**/
-	BUILD_LOCAL_ID(1,"建筑本地编码*"),
+	BUILD_LOCAL_ID(1,"建筑本地编码*","建筑本地编码"),
 	/**建筑本地名称**/
-	BUILD_LOCAL_NAME(2,"建筑本地名称*"),
+	BUILD_LOCAL_NAME(2,"建筑本地名称*","建筑本地名称"),
 	/**建筑功能类型**/
-	BUILD_FUNC_TYPE(3,"建筑功能类型*"),
+	BUILD_FUNC_TYPE(3,"建筑功能类型*","建筑功能类型"),
 	/**楼层本地编码**/
-	FLOOR_LOCAL_ID(4,"楼层本地编码*"),
+	FLOOR_LOCAL_ID(4,"楼层本地编码*","楼层本地编码"),
 	/**楼层本地名称**/
-	FLOOR_LOCAL_NAME(5,"楼层本地名称*"),
+	FLOOR_LOCAL_NAME(5,"楼层本地名称*","楼层本地名称"),
 	/**楼层编码**/
-	FLOOR_IDENTITY(6,"楼层编码*"),
+	FLOOR_IDENTITY(6,"楼层编码*","楼层编码"),
 	/**空间本地编码**/
-	SPACE_LOCAL_ID(7,"空间本地编码*"),
+	SPACE_LOCAL_ID(7,"空间本地编码*","空间本地编码"),
 	/**空间名称**/
-	SPACE_LOCAL_NAME(8,"空间名称*"),
+	SPACE_LOCAL_NAME(8,"空间名称*","空间名称"),
 	/**空间分区**/
-	SPACE_ZONE(9,"空间分区*"),
+	SPACE_ZONE(9,"空间分区*","空间分区"),
 	/**空间功能类型**/
-	SPACE_FUNC_TYPE(10,"空间功能类型*");
+	SPACE_FUNC_TYPE(10,"空间功能类型*","空间功能类型");
 
 	/**在上传标准文件中的列索引号*/
 	private Integer index;
 
-	/**
-	 * 描述
-	 */
+	/**描述*/
 	private String name;
+	/**真实行含义名称*/
+	private String realName;
 
 	public Integer getIndex() {
 		return index;
@@ -47,10 +47,14 @@ public enum CommonObjectColumnEnum {
 	public String getName() {
 		return this.name;
 	}
+	public String getRealName() {
+		return this.realName;
+	}
 
-	CommonObjectColumnEnum(Integer index, String name) {
+	CommonObjectColumnEnum(Integer index, String name,String realName) {
 		this.name = name;
 		this.index = index;
+		this.realName = realName;
 	}
 
 	@Override

+ 15 - 9
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/EquipObjectColumnEnum.java

@@ -9,24 +9,26 @@ package com.persagy.dmp.rwd.constants;
  */
 public enum EquipObjectColumnEnum {
 
+	/**项目id**/
+	PROJECT_ID(1,"项目id*","项目id"),
 	/**空间本地编码**/
-	SPACE_LOCAL_ID(0,"空间本地编码*"),
+	SPACE_LOCAL_ID(2,"空间本地编码*","空间本地编码"),
 	/**空间与设备关系**/
-	SPACE_EQUIP_REL(1,"空间与设备关系*"),
+	SPACE_EQUIP_REL(3,"空间与设备关系*","空间与设备关系"),
 	/**设备本地编码**/
-	EQUIP_LOCAL_ID(2,"设备本地编码*"),
+	EQUIP_LOCAL_ID(4,"设备本地编码*","设备本地编码"),
 	/**设备名称**/
-	EQUIP_LOCAL_NAME(3,"设备名称*"),
+	EQUIP_LOCAL_NAME(5,"设备名称*","设备名称"),
 	/**有效状态**/
-	VALID(4,"有效状态*");
+	VALID(6,"有效状态*","有效状态");
 
 	/**在上传标准文件中的列索引号*/
 	private Integer index;
 
-	/**
-	 * 描述
-	 */
+	/**描述*/
 	private String name;
+	/**真实名称*/
+	private String relName;
 
 	public Integer getIndex() {
 		return index;
@@ -35,10 +37,14 @@ public enum EquipObjectColumnEnum {
 	public String getName() {
 		return this.name;
 	}
+	public String getRelName() {
+		return this.relName;
+	}
 
-	EquipObjectColumnEnum(Integer index, String name) {
+	EquipObjectColumnEnum(Integer index, String name,String relName) {
 		this.name = name;
 		this.index = index;
+		this.relName = relName;
 	}
 
 	@Override

+ 4 - 28
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/ErrorEnum.java

@@ -18,42 +18,18 @@ public enum ErrorEnum {
 	 */
 	INFO_NAME_NOT_EXIST_ERROR("信息点名称错误"),
 	/**
-	 *存在
+	 *存在多个
 	 */
-	REPEAT_ERROR("存在"),
+	REPEAT_ERROR("存在多个"),
 	/**
-	 *手机号重复
+	 *不存在
 	 */
-	PHONE_NUM_REPEAT_ERROR("手机号已存在"),
-	/**
-	 *格式不正确
-	 */
-	PHONE_REGEX_ERROR("格式不正确(11-13位数字或-)"),
-	/**
-	 *邮箱格式不正确
-	 */
-	MAIL_REGEX_ERROR("邮箱格式不正确"),
+	NO_EXIST_ERROR("不存在"),
 	/**
 	 *不能为空
 	 */
 	CONTENT_BLANK_ERROR("不能为空"),
 	/**
-	 *存在非法数字
-	 */
-	NUMBER_ERROR("存在非法数字"),
-	/**
-	 *存在空格
-	 */
-	CONTENT_BLANK_EXISTS_ERROR("存在空格"),
-	/**
-	 *长度超过20字符
-	 */
-	CONTENT_LENGTH_GT_20_ERROR("长度超过20字符"),
-	/**
-	 *长度超过50字符
-	 */
-	CONTENT_LENGTH_GT_50_ERROR("长度超过50字符"),
-	/**
 	 *仅可输入数字、字母
 	 */
 	CONTENT_ILLEGAL_ERROR("仅可输入数字、字母"),

+ 15 - 9
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/SystemObjectColumnEnum.java

@@ -9,24 +9,26 @@ package com.persagy.dmp.rwd.constants;
  */
 public enum SystemObjectColumnEnum {
 
+	/**项目id**/
+	PROJECT_ID(1,"项目id*","项目id"),
 	/**建筑本地编码**/
-	BUILD_LOCAL_ID(0,"建筑本地编码*"),
+	BUILD_LOCAL_ID(2,"建筑本地编码*","建筑本地编码"),
 	/**建筑与系统关系**/
-	BUILD_EQUIP_REL(1,"建筑与系统关系*"),
+	BUILD_EQUIP_REL(3,"建筑与系统关系*","建筑与系统关系"),
 	/**系统本地编码**/
-	SYSTEM_LOCAL_ID(2,"系统本地编码*"),
+	SYSTEM_LOCAL_ID(4,"系统本地编码*","系统本地编码"),
 	/**系统名称**/
-	SYSTEM_LOCAL_NAME(3,"系统名称*"),
+	SYSTEM_LOCAL_NAME(5,"系统名称*","系统名称"),
 	/**有效状态**/
-	VALID(4,"有效状态*");
+	VALID(6,"有效状态*","有效状态");
 
 	/**在上传标准文件中的列索引号*/
 	private Integer index;
 
-	/**
-	 * 描述
-	 */
+	/**描述*/
 	private String name;
+	/**真实名称*/
+	private String relName;
 
 	public Integer getIndex() {
 		return index;
@@ -35,10 +37,14 @@ public enum SystemObjectColumnEnum {
 	public String getName() {
 		return this.name;
 	}
+	public String getRelName() {
+		return this.relName;
+	}
 
-	SystemObjectColumnEnum(Integer index, String name) {
+	SystemObjectColumnEnum(Integer index, String name,String relName) {
 		this.name = name;
 		this.index = index;
+		this.relName = relName;
 	}
 
 	@Override

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

@@ -1,14 +1,15 @@
 package com.persagy.dmp.rwd.controller;
 
+import cn.hutool.core.lang.TypeReference;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
-import com.persagy.common.criteria.JacksonCriteria;
-import com.persagy.common.web.PagedResponse;
 import com.persagy.dmp.config.DmpParameterStorage;
-import com.persagy.dmp.rwd.config.RwdConstants;
 import com.persagy.dmp.rwd.constants.CommonConstant;
+import com.persagy.dmp.rwd.entity.ObjectInstance;
 import com.persagy.dmp.rwd.handler.BusinessException;
 import com.persagy.dmp.rwd.handler.ResponseCode;
-import com.persagy.dmp.rwd.model.RelationInstanceModel;
+import com.persagy.dmp.rwd.handler.SpringHelper;
+import com.persagy.dmp.rwd.repository.ProjectDao;
 import com.persagy.dmp.rwd.service.BatchHandleObjectService;
 import com.persagy.dmp.rwd.util.FileUtil;
 import lombok.RequiredArgsConstructor;
@@ -19,8 +20,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 @RestController
 @RequestMapping("/rwd/instance/object/")
@@ -74,7 +74,7 @@ public class BatchHandleObjectController {
             if (!originalFilename.endsWith(CommonConstant.EXCEL_SUFFIX)){
                 throw new BusinessException(ResponseCode.A0400.getCode(),"文件后缀名不符合,应该为xlsx");
             }
-            batchHandleObjectService.uploadObjectTemplateFile(file,request,response);
+            batchHandleObjectService.uploadObjectTemplateFile(file,request,response,groupCode);
         }catch (Exception exr){
             log.error("上传文件失败",exr);
             List<String> errorList = new ArrayList<>();
@@ -82,6 +82,25 @@ public class BatchHandleObjectController {
             FileUtil.writeErrorContentToResponse(errorList,response,request,CommonConstant.UPLOAD_ERR_FILE_NAME);
         }
     }
+    /***
+     * Description: 测试查询表名称列表
+     * return : void
+     * @author : lijie
+     * date :2021/9/24 10:10
+     * Update By lijie 2021/9/24 10:10
+     * @return
+     */
+    @PostMapping("testQueryTableNames")
+    public List<ObjectInstance> 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<>()));
+    }
 
 
 

+ 3 - 8
dmp-rwd/src/main/java/com/persagy/dmp/rwd/repository/ObjectInstanceRepository.java

@@ -5,16 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.querydsl.QuerydslPredicateExecutor;
 
-import java.util.List;
+import java.util.Set;
 
 public interface ObjectInstanceRepository extends JpaRepository<ObjectInstance, String>, QuerydslPredicateExecutor<ObjectInstance>{
-    @Query(nativeQuery=true,value = "USE mysql;")
-    void selectUseDatabase();
-    @Query(nativeQuery=true,value = "SET SESSION group_concat_max_len = 65535;")
-    void setSessionConcatMaxLen();
-    @Query(nativeQuery=true,value = "SELECT REPLACE(GROUP_CONCAT(CONCAT(\"(SELECT * FROM \",table_name,\" WHERE class_code='project') UNION\")),\",\",\" \") "
-            + "from mysql.innodb_table_stats where table_name like '%rwd_object_wd%'")
-    String queryAllProjectTableNames();
+    @Query(nativeQuery=true,value = "SHOW TABLES LIKE ?")
+    Set<String> queryAllProjectTableNames(String queryKeyword);
 
 }
 

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

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 数据库操作dao
@@ -36,4 +37,17 @@ public interface ProjectDao  extends BaseMapper<ObjectInstance> {
      * Update By lijie 2021/6/30 22:31
      */
     List<ObjectInstance> queryAllProjects(@Param("querySql") String querySql);
+    /***
+     * Description: 根据项目id集合和本地编码id集合查询物理世界对象
+     * @param validTableNames : 有效表名称列表
+     * @param transferProjectIds : 项目id集合
+     * @param localIds : 本地编码集合
+     * @return : java.util.List<com.persagy.dmp.rwd.entity.ObjectInstance>
+     * @author : lijie
+     * @date :2021/9/24 23:15
+     * Update By lijie 2021/9/24 23:15
+     */
+    List<ObjectInstance> queryRwdObjectsMultiTablesAndLocalIds(@Param("tableNames") Set<String> validTableNames,
+                                                               @Param("projectIds") Set<String> transferProjectIds,
+                                                               @Param("localIds") Set<String> localIds);
 }

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

@@ -28,10 +28,11 @@ public interface BatchHandleObjectService {
      * @param file : 文件对象
      * @param request : 请求参数
      * @param response : 响应参数
+     * @param groupCode : 集团编码
      * return : void
      * @author : lijie
      * date :2021/9/24 10:10
      * Update By lijie 2021/9/24 10:10
      */
-    void uploadObjectTemplateFile(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IOException;
+    void uploadObjectTemplateFile(MultipartFile file, HttpServletRequest request, HttpServletResponse response,String groupCode) throws IOException;
 }

+ 4 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ObjectInstanceQueryService.java

@@ -463,4 +463,8 @@ public class ObjectInstanceQueryService extends BaseService {
         analysisQueryResult(projects,criteria,result);
         return result;
     }
+
+
+
+
 }

+ 510 - 23
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/impl/BatchHandleObjectServiceImpl.java

@@ -2,7 +2,6 @@ package com.persagy.dmp.rwd.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
-import cn.hutool.core.util.EnumUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
@@ -11,15 +10,11 @@ import cn.hutool.poi.excel.WorkbookUtil;
 import cn.hutool.poi.excel.cell.CellUtil;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.common.criteria.JacksonCriteria;
-import com.persagy.common.json.JacksonMapper;
 import com.persagy.common.web.ListResponse;
 import com.persagy.common.web.PagedResponse;
-import com.persagy.dmp.rwd.constants.CommonConstant;
-import com.persagy.dmp.rwd.constants.ErrorEnum;
-import com.persagy.dmp.rwd.entity.FuncidDef;
-import com.persagy.dmp.rwd.entity.QFuncidDef;
+import com.persagy.dmp.rwd.constants.*;
+import com.persagy.dmp.rwd.entity.ObjectInstance;
 import com.persagy.dmp.rwd.enums.ObjType;
 import com.persagy.dmp.rwd.feign.DicClient;
 import com.persagy.dmp.rwd.handler.BusinessException;
@@ -27,7 +22,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.repository.FuncidDefRepository;
+import com.persagy.dmp.rwd.repository.ObjectInstanceRepository;
+import com.persagy.dmp.rwd.repository.ProjectDao;
 import com.persagy.dmp.rwd.service.*;
 import com.persagy.dmp.rwd.util.FileUtil;
 import com.persagy.dmp.rwd.validators.service.FileCheckService;
@@ -39,7 +35,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.ss.util.SheetUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -90,6 +85,10 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     /**楼层定义sheet*/
     private static final String FLOOR_IDENTITIES_SHEET_NAME="floorIdentities";
 
+    private final ObjectInstanceRepository objectInstanceRepository;
+
+    private final ProjectDao projectDao;
+
 
     /***
      * Description: 下载模板接口
@@ -133,7 +132,7 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
      */
     @Override
     public void uploadObjectTemplateFile(MultipartFile file, HttpServletRequest request,
-                                         HttpServletResponse response) throws IOException {
+                                         HttpServletResponse response,String groupCode) throws IOException {
         Workbook workbook = WorkbookUtil.createBook(file.getInputStream());
         // 1.获得各个sheet的列表数据
         ExcelReader commonObjectSheet = ExcelUtil.getReader(file.getInputStream(),0);
@@ -145,6 +144,7 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         ExcelReader floorIdentitiesSheet = ExcelUtil.getReader(file.getInputStream(), FLOOR_IDENTITIES_SHEET_NAME);
         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 设备对象录入列表
@@ -163,6 +163,8 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         List<List<Object>> spaceZonesListList = spaceZonesSheet.read();
         // 1.9 空间功能类型列表
         List<List<Object>> spaceFuncTypesListList = spaceFuncTypesSheet.read();
+        // 1.10 专业系统设备类型列表
+        List<List<Object>> objectClazzListList = objectClazzSheet.read();
         // 2.获得名称与信息点的映射
         // 2.1 {系统信息点名称:系统信息点code}映射
         Map<String,String> systemObjectInfosMap = createDataMap(systemObjectInfosListList,0,1);
@@ -176,6 +178,8 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
         Map<String,String> spaceZonesMap = createDataMap(spaceZonesListList,0,1);
         // 2.6 {空间功能类型名称:空间功能类型code}映射
         Map<String,String> spaceFuncTypesMap = createDataMap(spaceFuncTypesListList,0,1);
+        // 2.7 {专业系统设备类型名称:专业系统设备类型code}映射
+        Map<String,String> objectClazzMap = createDataMap(objectClazzListList,0,1);
         List<String> errorList = new ArrayList<>();
         // 3.文件及文件表头校验
         // 3.1 校验基础对象录入
@@ -192,20 +196,203 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
             return;
         }
         // 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(commonObjectUploadData, equipObjectUploadData, systemObjectUploadData,
+                projectMap, buildMap, floorMap, spaceMap, equipMap, systemMap, groupCode);
         // 4.1 校验基础对象录入
-        checkCommonDataIsValid(errorList,commonObjectUploadData,buildingFuncTypesMap,floorIdentitiesMap,spaceZonesMap,spaceFuncTypesMap);
-//        // 4.2 校验设备对象录入
-//        checkEquipDataIsValid(errorList,equipObjectUploadData,equipObjectInfosMap);
-//        // 4.3 校验系统对象录入
-//        checkSystemDataIsValid(errorList,systemObjectUploadData,systemObjectInfosMap);
-//        if (CollUtil.isNotEmpty(errorList)){
-//            FileUtil.writeErrorContentToResponse(errorList,response,request, CommonConstant.UPLOAD_ERR_FILE_NAME);
-//            return;
-//        }
+        checkCommonDataIsValid(errorList,commonObjectUploadData,buildingFuncTypesMap,
+                floorIdentitiesMap,spaceZonesMap,spaceFuncTypesMap,projectMap,buildMap,floorMap,spaceMap);
+        // 4.2 校验设备对象录入
+        checkEquipDataIsValid(errorList,equipObjectUploadData,equipObjectInfosMap,objectClazzMap,projectMap,equipMap);
+        // 4.3 校验系统对象录入
+        checkSystemDataIsValid(errorList,systemObjectUploadData,systemObjectInfosMap,objectClazzMap,projectMap,systemMap);
+        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);
+        response.addHeader(CommonConstant.UPLOAD_FLAG,CommonConstant.SUCCESS_FLAG_ONE);
+    }
+
+    /***
+     * 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());
+        }
     }
+
+    /***
+     * 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()));
+            }
+        }
+    }
+
     /***
      * Description: 校验基础对象录入的数据
      * @param errorList : 错误提示列表
@@ -214,6 +401,10 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
      * @param floorIdentitiesMap : 楼层编码名称和楼层编码code的映射
      * @param spaceZonesMap : 空间分区名称和空间分区code的映射
      * @param spaceFuncTypesMap : 空间功能类型名称和空间功能类型code的映射
+     * @param projectMap: 项目id与项目对象的映射
+     * @param buildMap:建筑本地编码与建筑对象的映射
+     * @param floorMap:楼层本地编码与楼层对象的映射
+     * @param spaceMap:空间本地编码与空间对象的映射
      * @return : void
      * @author : lijie
      * @date :2021/9/24 17:30
@@ -221,22 +412,318 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
      */
     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, 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()<3){
+        if (commonObjectUploadData.size()<=startRowIndex){
             return;
         }
         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
+            // 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()));
+        }
+    }
 
+    /***
+     * Description: 获取已存在的项目id,建筑本地编码,楼层本地编码,空间本地编码
+     * @param commonObjectUploadData : 基本对象录入数据
+     * @param equipObjectUploadData : 设备对象录入数据
+     * @param systemObjectUploadData : 系统对象录入数据
+     * @param projectMap : 项目本地编码与项目信息的映射
+     * @param buildMap : 建筑本地编码与建筑信息的映射
+     * @param floorMap : 楼层本地编码与楼层信息的映射
+     * @param spaceMap : 空间本地编码与空间信息的映射
+     * @param equipMap : 设备本地编码与设备信息的映射
+     * @param systemMap : 系统本地编码与系统信息的映射
+     * @param groupCode : 集团编码
+     * @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) {
+        // 1.获得有效的项目id
+        Set<String> transferProjectIds = new HashSet<>();
+        Set<String> validTableNames = queryValidTableNames(commonObjectUploadData,equipObjectUploadData,
+                systemObjectUploadData,groupCode,transferProjectIds);
+        if (CollUtil.isEmpty(validTableNames)){
+            return new HashSet<>();
+        }
+        // 2.获得所有的本地编码
+        Set<String> localIds = queryLocalIdsFromExcel(commonObjectUploadData,equipObjectUploadData,systemObjectUploadData);
+        if (CollUtil.isEmpty(localIds) && CollUtil.isEmpty(transferProjectIds)){
+            return new HashSet<>();
+        }
+        // 3.根据表名称,项目id列表,本地编码列表查询物理世界对象集合
+        List<ObjectInstance> objectInstances = projectDao.queryRwdObjectsMultiTablesAndLocalIds(validTableNames,transferProjectIds,localIds);
+        if (CollUtil.isEmpty(objectInstances)){
+            return new HashSet<>();
+        }
+        // 4.解析查询的对象
+        for (ObjectInstance objectInstance : objectInstances) {
+            if (ObjType.project.name().equals(objectInstance.getObjType())){
+                projectMap.put(objectInstance.getId(),objectInstance);
+            }
+            if (ObjType.building.name().equals(objectInstance.getObjType())){
+                fillObjectInstanceMap(buildMap,objectInstance);
+            }
+            if (ObjType.floor.name().equals(objectInstance.getObjType())){
+                fillObjectInstanceMap(floorMap,objectInstance);
+            }
+            if (ObjType.space.name().equals(objectInstance.getObjType())){
+                fillObjectInstanceMap(spaceMap,objectInstance);
+            }
+            if (ObjType.equipment.name().equals(objectInstance.getObjType())){
+                fillObjectInstanceMap(equipMap,objectInstance);
+            }
+            if (ObjType.system.name().equals(objectInstance.getObjType())){
+                fillObjectInstanceMap(systemMap,objectInstance);
+            }
+        }
+        return new HashSet<>();
+    }
+    /***
+     * Description: 填充映射
+     * @param objectMap : 对象映射
+     * @param objectInstance : 物理世界对象
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/25 0:00
+     * Update By lijie 2021/9/25 0:00
+     */
+    private void fillObjectInstanceMap(Map<String, Map<String, List<ObjectInstance>>> objectMap, ObjectInstance objectInstance) {
+        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);
+        objectMap.put(objectInstance.getLocalId(),buildingMap);
+    }
 
+    /***
+     * Description: 查询本地编码id集合
+     * @param commonObjectUploadData : 通用对象数据
+     * @param equipObjectUploadData : 设备对象数据
+     * @param systemObjectUploadData : 系统对象数据
+     * @return : java.util.Set<java.lang.String>
+     * @author : lijie
+     * @date :2021/9/24 23:02
+     * Update By lijie 2021/9/24 23:02
+     */
+    private Set<String> queryLocalIdsFromExcel(List<List<Object>> commonObjectUploadData,
+                                               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);
+        return localIds;
+    }
 
+    /***
+     * Description: 从上传的Excel解析本地编码id
+     * @param uploadData : 上传的数据
+     * @param startRowIndex : 开始的行索引
+     * @param columnIndexs : 取值的列索引组合
+     * @param localIds : 存储的本地编码列表
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/24 22:06
+     * Update By lijie 2021/9/24 22:06
+     */
+    private void analysisLocalIdFromExcel(List<List<Object>> uploadData, Integer startRowIndex,
+                                          Set<Integer> columnIndexs,Set<String> localIds) {
+        int commonSize = uploadData.size();
+        if (commonSize < startRowIndex){
+            return;
+        }
+        for (int i = startRowIndex; i < commonSize; i++) {
+            List<Object> commonRow = uploadData.get(i);
+            for (Integer columnIndex : columnIndexs) {
+                String localId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(commonRow.get(columnIndex)));
+                if (StrUtil.isNotBlank(localId)){
+                    localIds.add(localId);
+                }
+            }
+        }
+    }
 
+    /***
+     * Description: 查询有效的object表名称
+     * @param commonObjectUploadData : 基础对象数据
+     * @param equipObjectUploadData : 设备对象数据
+     * @param systemObjectUploadData : 系统对象数据
+     * @return : java.util.Set<java.lang.String>
+     * @author : lijie
+     * @date :2021/9/24 22:16
+     * Update By lijie 2021/9/24 22:16
+     */
+    private Set<String> queryValidTableNames(List<List<Object>> commonObjectUploadData,
+                                             List<List<Object>> equipObjectUploadData,
+                                             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));
+        if (CollUtil.isEmpty(tableNames)){
+            return new HashSet<>();
+        }
+        // 2.获得Excel中传值的项目id
+        // 2.1 获得基础对象导入表的项目id
+        analysisProjectFromExcel(commonObjectUploadData,2,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;
+                }
+            }
         }
+        return validProjectIds;
+    }
 
+    /***
+     * Description: 从上传的Excel解析项目id
+     * @param uploadData : 上传的数据
+     * @param startRowIndex : 开始的行索引
+     * @param columnIndex : 取值的列索引
+     * @param transferProjectIds : 存储的项目id列表
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/24 22:06
+     * Update By lijie 2021/9/24 22:06
+     */
+    private void analysisProjectFromExcel(List<List<Object>> uploadData, Integer startRowIndex,
+                                          Integer columnIndex,Set<String> transferProjectIds) {
+        int commonSize = uploadData.size();
+        if (commonSize < startRowIndex){
+            return;
+        }
+        for (int i = startRowIndex; i < commonSize; i++) {
+            List<Object> commonRow = uploadData.get(i);
+            String projectId = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(commonRow.get(columnIndex)));
+            if (StrUtil.isNotBlank(projectId)){
+                transferProjectIds.add(projectId);
+            }
+        }
+    }
 
+    /***
+     * 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()));
     }
 
     /***

+ 0 - 9
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/DataCheckService.java

@@ -1,9 +0,0 @@
-package com.persagy.dmp.rwd.validators.service;
-/***
- * Description: 数据校验逻辑类
- * @author : lijie
- * @date :2021/9/24 17:17
- * Update By lijie 2021/9/24 17:17
- */
-public interface DataCheckService {
-}

+ 0 - 9
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractDataCheckService.java

@@ -1,9 +0,0 @@
-package com.persagy.dmp.rwd.validators.service.impl;
-/***
- * Description: 抽象数据校验逻辑类
- * @author : lijie
- * @date :2021/9/24 17:18
- * Update By lijie 2021/9/24 17:18
- */
-public abstract class AbstractDataCheckService {
-}

+ 19 - 0
dmp-rwd/src/main/resources/mapper/ProjectDao.xml

@@ -17,5 +17,24 @@
 	<select id="queryAllProjects" parameterType="string" resultType="com.persagy.dmp.rwd.entity.ObjectInstance">
 		${querySql}
 	</select>
+	<select id="queryRwdObjectsMultiTablesAndLocalIds" resultType="com.persagy.dmp.rwd.entity.ObjectInstance">
+		<if test="null!=tableNames and tableNames.size()>0">
+			<foreach collection="tableNames" separator=" UNION " item="tableName">
+				SELECT * FROM ${tableName} WHERE 1=1 AND(
+				<if test="null!=projectIds and projectIds.size()>0">
+					<foreach collection="projectIds" item="projectId" open="id IN(" close=")" separator=",">
+						#{projectId}
+					</foreach>
+				</if>
+				<if test="null!=localIds and localIds.size()>0">
+					<foreach collection="localIds" item="localId" open=" OR local_id IN(" close=")" separator=",">
+						#{localId}
+					</foreach>
+				</if>
+				)
+			</foreach>
+			;
+		</if>
+	</select>
 
 </mapper>

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