|
@@ -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()));
|
|
|
}
|
|
|
|
|
|
/***
|