소스 검색

增加物理世界对象上传逻辑处理代码

lijie 3 년 전
부모
커밋
69801abf9f
16개의 변경된 파일1140개의 추가작업 그리고 44개의 파일을 삭제
  1. 1 1
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/CommonConstant.java
  2. 60 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/CommonObjectColumnEnum.java
  3. 48 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/EquipObjectColumnEnum.java
  4. 86 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/ErrorEnum.java
  5. 48 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/SystemObjectColumnEnum.java
  6. 1 1
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/controller/BatchHandleObjectController.java
  7. 152 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/handler/SpringHelper.java
  8. 284 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/handler/TypeConvertUtil.java
  9. 131 42
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/impl/BatchHandleObjectServiceImpl.java
  10. 9 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/DataCheckService.java
  11. 26 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/FileCheckService.java
  12. 9 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractDataCheckService.java
  13. 118 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractFileCheckService.java
  14. 55 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/CommonFileCheckServiceImpl.java
  15. 56 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/EquipFileCheckServiceImpl.java
  16. 56 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/SystemFileCheckServiceImpl.java

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

@@ -52,6 +52,6 @@ public class CommonConstant {
     /**文件名称*/
     public static final String DTO_FILE="file";
     /**批量导入物理世界对象错误提示文件名称*/
-    public static final String UPLOAD_PERSON_ERR_FILE_NAME="批量导入物理世界对象错误提示文件.txt";
+    public static final String UPLOAD_ERR_FILE_NAME="批量导入物理世界对象错误提示文件.txt";
 
 }

+ 60 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/CommonObjectColumnEnum.java

@@ -0,0 +1,60 @@
+package com.persagy.dmp.rwd.constants;
+
+
+/***
+ * Description: 导入SOP文件表头
+ * @author : lijie
+ * @date :2021/3/4 10:58
+ * Update By lijie 2021/3/4 10:58
+ */
+public enum CommonObjectColumnEnum {
+
+	/**项目id**/
+	PROJECT_ID(0,"项目id*"),
+	/**建筑本地编码**/
+	BUILD_LOCAL_ID(1,"建筑本地编码*"),
+	/**建筑本地名称**/
+	BUILD_LOCAL_NAME(2,"建筑本地名称*"),
+	/**建筑功能类型**/
+	BUILD_FUNC_TYPE(3,"建筑功能类型*"),
+	/**楼层本地编码**/
+	FLOOR_LOCAL_ID(4,"楼层本地编码*"),
+	/**楼层本地名称**/
+	FLOOR_LOCAL_NAME(5,"楼层本地名称*"),
+	/**楼层编码**/
+	FLOOR_IDENTITY(6,"楼层编码*"),
+	/**空间本地编码**/
+	SPACE_LOCAL_ID(7,"空间本地编码*"),
+	/**空间名称**/
+	SPACE_LOCAL_NAME(8,"空间名称*"),
+	/**空间分区**/
+	SPACE_ZONE(9,"空间分区*"),
+	/**空间功能类型**/
+	SPACE_FUNC_TYPE(10,"空间功能类型*");
+
+	/**在上传标准文件中的列索引号*/
+	private Integer index;
+
+	/**
+	 * 描述
+	 */
+	private String name;
+
+	public Integer getIndex() {
+		return index;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	CommonObjectColumnEnum(Integer index, String name) {
+		this.name = name;
+		this.index = index;
+	}
+
+	@Override
+	public String toString() {
+		return this.index+"_"+this.name;
+	}
+}

+ 48 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/EquipObjectColumnEnum.java

@@ -0,0 +1,48 @@
+package com.persagy.dmp.rwd.constants;
+
+
+/***
+ * Description: 导入SOP文件表头
+ * @author : lijie
+ * @date :2021/3/4 10:58
+ * Update By lijie 2021/3/4 10:58
+ */
+public enum EquipObjectColumnEnum {
+
+	/**空间本地编码**/
+	SPACE_LOCAL_ID(0,"空间本地编码*"),
+	/**空间与设备关系**/
+	SPACE_EQUIP_REL(1,"空间与设备关系*"),
+	/**设备本地编码**/
+	EQUIP_LOCAL_ID(2,"设备本地编码*"),
+	/**设备名称**/
+	EQUIP_LOCAL_NAME(3,"设备名称*"),
+	/**有效状态**/
+	VALID(4,"有效状态*");
+
+	/**在上传标准文件中的列索引号*/
+	private Integer index;
+
+	/**
+	 * 描述
+	 */
+	private String name;
+
+	public Integer getIndex() {
+		return index;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	EquipObjectColumnEnum(Integer index, String name) {
+		this.name = name;
+		this.index = index;
+	}
+
+	@Override
+	public String toString() {
+		return this.index+"_"+this.name;
+	}
+}

+ 86 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/ErrorEnum.java

@@ -0,0 +1,86 @@
+package com.persagy.dmp.rwd.constants;
+
+
+/***
+ * Description: 导入标准错误提示码
+ * @author : lijie
+ * @date :2021/3/4 10:58
+ * Update By lijie 2021/3/4 10:58
+ */
+public enum ErrorEnum {
+
+	/**
+	 *内容错误
+	 */
+	CONTENT_ERROR("内容错误"),
+	/**
+	 *信息点名称错误
+	 */
+	INFO_NAME_NOT_EXIST_ERROR("信息点名称错误"),
+	/**
+	 *已存在
+	 */
+	REPEAT_ERROR("已存在"),
+	/**
+	 *手机号重复
+	 */
+	PHONE_NUM_REPEAT_ERROR("手机号已存在"),
+	/**
+	 *格式不正确
+	 */
+	PHONE_REGEX_ERROR("格式不正确(11-13位数字或-)"),
+	/**
+	 *邮箱格式不正确
+	 */
+	MAIL_REGEX_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("仅可输入数字、字母"),
+	/**
+	 *仅可输入汉字、字母
+	 */
+	CONTENT_ILLEGAL_CHINA_ERROR("仅可输入汉字、字母"),
+	/**
+	 *非模板文件,请上传正确的模板文件
+	 */
+	FILE_ERROR("非模板文件,请上传正确的模板文件");
+
+	/**
+	 * 描述
+	 */
+	private String desc;
+
+	public String getDesc() {
+		return this.desc;
+	}
+
+	ErrorEnum(String desc) {
+		this.desc = desc;
+	}
+
+	@Override
+	public String toString() {
+		return this.desc;
+	}
+}

+ 48 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/constants/SystemObjectColumnEnum.java

@@ -0,0 +1,48 @@
+package com.persagy.dmp.rwd.constants;
+
+
+/***
+ * Description: 导入SOP文件表头
+ * @author : lijie
+ * @date :2021/3/4 10:58
+ * Update By lijie 2021/3/4 10:58
+ */
+public enum SystemObjectColumnEnum {
+
+	/**建筑本地编码**/
+	BUILD_LOCAL_ID(0,"建筑本地编码*"),
+	/**建筑与系统关系**/
+	BUILD_EQUIP_REL(1,"建筑与系统关系*"),
+	/**系统本地编码**/
+	SYSTEM_LOCAL_ID(2,"系统本地编码*"),
+	/**系统名称**/
+	SYSTEM_LOCAL_NAME(3,"系统名称*"),
+	/**有效状态**/
+	VALID(4,"有效状态*");
+
+	/**在上传标准文件中的列索引号*/
+	private Integer index;
+
+	/**
+	 * 描述
+	 */
+	private String name;
+
+	public Integer getIndex() {
+		return index;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	SystemObjectColumnEnum(Integer index, String name) {
+		this.name = name;
+		this.index = index;
+	}
+
+	@Override
+	public String toString() {
+		return this.index+"_"+this.name;
+	}
+}

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

@@ -79,7 +79,7 @@ public class BatchHandleObjectController {
             log.error("上传文件失败",exr);
             List<String> errorList = new ArrayList<>();
             errorList.add(exr.getMessage());
-            FileUtil.writeErrorContentToResponse(errorList,response,request,CommonConstant.UPLOAD_PERSON_ERR_FILE_NAME);
+            FileUtil.writeErrorContentToResponse(errorList,response,request,CommonConstant.UPLOAD_ERR_FILE_NAME);
         }
     }
 

+ 152 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/handler/SpringHelper.java

@@ -0,0 +1,152 @@
+package com.persagy.dmp.rwd.handler;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import org.springframework.context.ApplicationContext;
+
+import java.util.Map;
+
+/**
+ * Spring助手
+ * @author Charlie Yu
+ * @version 1.0 2021-03-02
+ */
+public class SpringHelper {
+
+    /**
+     * spring上下文
+     * @return spring上下文
+     */
+    public static ApplicationContext getContext(){
+        return SpringUtil.getApplicationContext();
+    }
+
+    /**
+     * 根据类名搜索相应的bean对象
+     * @param <T> 类模板标识返回值类型
+     * @param clazz 模板类
+     * @return bean对象
+     */
+    public static <T>T getBean(Class<T> clazz){
+        return SpringUtil.getBean(clazz);
+    }
+
+    /**
+     * 根据类型取得所有
+     * @param type 接口类
+     * @return 取得所有的实现bean
+     */
+    public static <T> Map<String, T> getBeansOfType(Class<T> type){
+        return SpringUtil.getBeansOfType(type);
+    }
+
+    /**
+     * 根据bean名称和bean类型搜索相应的bean对象
+     * @param <T> 类模板标识返回值类型
+     * @param beanName bean名称
+     * @param clazz 模板类
+     * @return bean对象
+     */
+    public static <T>T getBean(String beanName,Class<T> clazz){
+        return SpringUtil.getBean(beanName, clazz);
+    }
+
+    /**
+     * 根据bean名称搜索相应的bean对象
+     * @param beanName bean名称
+     * @return bean对象
+     */
+    public static <T>T getBean(String beanName){
+        return SpringUtil.getBean(beanName);
+    }
+
+    /**
+     * 根据配置名称取得字符串配置值(配置名形式为nodeName.nodeName)
+     * @param key 配置名称
+     * @return 指定配置字符串值
+     */
+    public static String getString(String key) {
+        return SpringUtil.getProperty(key);
+    }
+
+    /**
+     * 根据配置名称取得字符串配置值,如果配置值为空使用指定的默认值
+     * @param key         配置名称
+     * @param defaultValue 指定默认值
+     * @return 最终配置值
+     */
+    public static String getString(String key, String defaultValue) {
+        String value = getString(key);
+        return StrUtil.isBlank(value) ? defaultValue : value;
+    }
+
+    /**
+     * 根据配置名称取得整型配置值,如果配置值为空使用指定的默认值
+     * @param key         配置名称
+     * @param defaultValue 默认整型值
+     * @return 最终配置值
+     */
+    public static int getInt(String key, int defaultValue) {
+        String value = getString(key);
+        if (StrUtil.isEmpty(value)) {
+            return defaultValue;
+        }
+        return TypeConvertUtil.parseInt(value);
+    }
+    /**
+     * 根据配置名称取得布尔配置值,如果配置值为空使用指定的默认值
+     * @param key         配置名称
+     * @param defaultValue 默认布尔值
+     * @return 最终配置值
+     */
+    public static boolean getBoolean(String key, boolean defaultValue) {
+        String value = getString(key);
+        if (StrUtil.isEmpty(value)) {
+            return defaultValue;
+        }
+        return TypeConvertUtil.parseBoolean(value);
+    }
+
+    /**
+     * 根据配置名称取得长整型配置值,如果配置值为空使用指定的默认值
+     * @param key         配置名称
+     * @param defaultValue 默认长整型值
+     * @return 最终配置值
+     */
+    public static long getLong(String key, long defaultValue) {
+        String value = getString(key);
+        if (StrUtil.isEmpty(value)) {
+            return defaultValue;
+        }
+        return TypeConvertUtil.parseLong(value);
+    }
+
+    /**
+     * 根据配置名称取得浮点型配置值,如果配置值为空使用指定的默认值
+     * @param key         配置名称
+     * @param defaultValue 默认浮点型值
+     * @return 最终配置值
+     */
+    public static float getFloat(String key, float defaultValue) {
+        String value = getString(key);
+        if (StrUtil.isEmpty(value)) {
+            return defaultValue;
+        }
+        return TypeConvertUtil.parseFloat(value);
+    }
+
+    /**
+     * 根据配置名称取得双浮点型配置值,如果配置值为空使用指定的默认值
+     * @param key         配置名称
+     * @param defaultValue 默认双浮点型值
+     * @return 最终配置值
+     */
+    public static double getDouble(String key, double defaultValue) {
+        String value = getString(key);
+        if (StrUtil.isEmpty(value)) {
+            return defaultValue;
+        }
+        return TypeConvertUtil.parseDouble(value);
+    }
+
+}

+ 284 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/handler/TypeConvertUtil.java

@@ -0,0 +1,284 @@
+package com.persagy.dmp.rwd.handler;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 数据类型转换器
+ * @author Charlie Yu
+ * @version 1.0 2021-03-03
+ */
+@Slf4j
+public class TypeConvertUtil {
+
+    /**
+     * 私有构造方法,防止实例化
+     */
+    private TypeConvertUtil() {
+
+    }
+
+    /**
+     * 将Object对象解析成字符串类型
+     * @param obj 需要转换的对象
+     * @return 字符串
+     */
+    public static final String parseString(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        return obj.toString();
+    }
+
+    /**
+     * 将对象解析成字节类型
+     * @param obj 需要转换的对象
+     * @return 字节值
+     */
+    public static final byte parseByte(Object obj) {
+        if (obj == null) {
+            return 0;
+        }
+        if (obj instanceof Number) {
+            return ((Number) obj).byteValue();
+        }
+        if (obj instanceof Boolean) {
+            return (byte) (((Boolean) obj).booleanValue() ? 1 : 0);
+        }
+        String s;
+        if ("".equals(s = obj.toString())) {
+            return 0;
+        } else {
+            return Byte.parseByte(s);
+        }
+    }
+
+    /**
+     * 将对象解析成字节类型
+     * @param obj 需要转换的对象
+     * @return 字节值
+     */
+    public static final short parseShort(Object obj) {
+        if (obj == null) {
+            return 0;
+        }
+        if (obj instanceof Number) {
+            return ((Number) obj).shortValue();
+        }
+        if (obj instanceof Boolean) {
+            return (short) (((Boolean) obj).booleanValue() ? 1 : 0);
+        }
+        String s;
+        if ("".equals(s = obj.toString())) {
+            return 0;
+        } else {
+            return Short.parseShort(s);
+        }
+    }
+
+    /**
+     * 将对象解析成整数类型
+     * @param obj 需转换的对象
+     * @return 整数值
+     */
+    public static final int parseInt(Object obj) {
+        if (obj == null) {
+            return 0;
+        }
+        if (obj instanceof Number) {
+            return ((Number) obj).intValue();
+        }
+        if (obj instanceof Boolean) {
+            return !((Boolean) obj).booleanValue() ? 0 : 1;
+        }
+        String s;
+        if ("".equals(s = obj.toString())) {
+            return 0;
+        } else {
+            return Integer.parseInt(s);
+        }
+    }
+
+    /**
+     * 将对象解析成长整类型
+     * @param obj 需转换的对象
+     * @return 长整数值
+     */
+    public static final long parseLong(Object obj) {
+        if (obj == null) {
+            return 0;
+        }
+        if (obj instanceof Number) {
+            return ((Number) obj).longValue();
+        }
+        if (obj instanceof Boolean) {
+            return !((Boolean) obj).booleanValue() ? 0L : 1L;
+        }
+        if (obj instanceof Date) {
+            return ((Date) obj).getTime();
+        }
+        String s;
+        if ("".equals(s = obj.toString())) {
+            return 0;
+        } else {
+            return Long.parseLong(s);
+        }
+    }
+
+    /**
+     * 将对象解析成布尔类型数据
+     * @param obj 需转换的对象
+     * @return 布尔值
+     */
+    public static final boolean parseBoolean(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj instanceof Boolean) {
+            return ((Boolean) obj).booleanValue();
+        } else {
+            String s = obj.toString();
+            return "true".equalsIgnoreCase(s) || "1".equals(s) || "Y".equalsIgnoreCase(s) || "YES".equalsIgnoreCase(s);
+        }
+    }
+
+    /**
+     * 将对象解析成浮点型数据
+     * @param obj 需转换的对象
+     * @return 浮点数值
+     */
+    public static final float parseFloat(Object obj) {
+        if (obj == null) {
+            return 0.0f;
+        }
+        if (obj instanceof Number) {
+            return ((Number) obj).floatValue();
+        }
+        if (obj instanceof Boolean) {
+            return !((Boolean) obj).booleanValue() ? 0.0F : 1.0F;
+        }
+        String s;
+        if ("".equals(s = obj.toString())) {
+            return 0.0f;
+        } else {
+            return Float.parseFloat(s);
+        }
+    }
+
+    /**
+     * 将对象解析成双浮点型数据
+     * @param obj 需转换的对象
+     * @return 双浮点值
+     */
+    public static final double parseDouble(Object obj) {
+        if (obj == null) {
+            return 0.0d;
+        }
+        if (obj instanceof Number) {
+            return ((Number) obj).doubleValue();
+        }
+        if (obj instanceof Boolean) {
+            return !((Boolean) obj).booleanValue() ? 0.0D : 1.0D;
+        }
+        String s;
+        if ("".equals(s = obj.toString())) {
+            return 0.0d;
+        } else {
+            return Double.parseDouble(s);
+        }
+    }
+
+    /**
+     * 解析对象成大数字类型数据
+     * @param obj 需要转换的对象
+     * @return 大数字对象
+     */
+    public static final BigDecimal parseBigDecimal(Object obj) {
+        if (obj == null) {
+            return BigDecimal.valueOf(0L);
+        }
+        if (obj instanceof BigDecimal) {
+            return (BigDecimal) obj;
+        }
+        if (obj instanceof Number) {
+            return BigDecimal.valueOf(((Number) obj).doubleValue());
+        }
+        if (obj instanceof Boolean) {
+            return BigDecimal.valueOf(((Boolean) obj).booleanValue() ? 1L : 0L);
+        }
+        String s;
+        if ("".equals(s = obj.toString())) {
+            return BigDecimal.valueOf(0L);
+        } else {
+            return new BigDecimal(s);
+        }
+    }
+
+    /**
+     * 解析对象成日期数据类型
+     *
+     * @param obj 需转换的对象
+     * @return 日期对象
+     */
+    public static Date parseDate(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj instanceof Date) {
+            return (Date) obj;
+        }
+        if (obj instanceof Number) {
+            return new Date(((Number) obj).longValue());
+        }
+        String objString = String.valueOf(obj);
+        if (StrUtil.isBlank(objString)) {
+            return null;
+        }
+        if (isNumeric(objString)) {
+            long time = Long.parseLong(objString);
+            return new Date(time);
+        }
+        int len = objString.length();
+        if (len >= 19) {
+            return null;
+        }
+        boolean isDate = objString.indexOf("-") > 0;
+        boolean isTime = objString.indexOf(":") > 0;
+        try {
+            if (isDate && isTime) {
+                return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(objString);
+            }
+            if (isDate) {
+                return new SimpleDateFormat("yyyy-MM-dd").parse(objString);
+            }
+            if (isTime) {
+                return new SimpleDateFormat("HH:mm:ss").parse(objString);
+            }
+        } catch (ParseException e) {
+            log.error("TypeConvert parse: Date parse error", e);
+        }
+        return null;
+    }
+
+    /**
+     * 判断字符串是否是有效的数组
+     * @param s 需要判断的字符串
+     * @return 布尔值
+     */
+    public static boolean isNumeric(String s) {
+        int length = s.length();
+        for (int i = 0; i < length; i++) {
+            char c = s.charAt(i);
+            boolean isNumberChar = (c < '0' || c > '9') && c != '.' && (i != 0 || c != '-');
+            if (isNumberChar) {
+                return false;
+            }
+        }
+        return true;
+    }
+}

+ 131 - 42
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/impl/BatchHandleObjectServiceImpl.java

@@ -1,6 +1,8 @@
 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;
@@ -15,17 +17,23 @@ 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.enums.ObjType;
 import com.persagy.dmp.rwd.feign.DicClient;
 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.ClassDefModel;
 import com.persagy.dmp.rwd.model.FuncidDefModel;
 import com.persagy.dmp.rwd.repository.FuncidDefRepository;
 import com.persagy.dmp.rwd.service.*;
 import com.persagy.dmp.rwd.util.FileUtil;
+import com.persagy.dmp.rwd.validators.service.FileCheckService;
+import com.persagy.dmp.rwd.validators.service.impl.CommonFileCheckServiceImpl;
+import com.persagy.dmp.rwd.validators.service.impl.EquipFileCheckServiceImpl;
+import com.persagy.dmp.rwd.validators.service.impl.SystemFileCheckServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Name;
@@ -69,16 +77,18 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     private static final String SPACE_ZONES_SHEET_NAME="spaceZones";
     /**空间功能类型sheet*/
     private static final String SPACE_FUNC_TYPES_SHEET_NAME="roomFuncTypes";
-    /**专业系统类sheet*/
+    /**做系统类级联选择的sheet*/
     private static final String SYSTEM_OBJECT_CLAZZ_SHEET_NAME="systemObjectClazz";
-    /**专业系统设备类sheet*/
+    /**做设备类级联选择的sheet*/
     private static final String EQUIPMENT_OBJECT_CLAZZ_SHEET_NAME="equipmentObjectClazz";
-    /**对象信息点sheet*/
+    /**系统对象信息点sheet*/
     private static final String SYSTEM_OBJECT_INFOS_SHEET_NAME="systemObjectInfos";
-    /**对象信息点sheet*/
+    /**设备对象信息点sheet*/
     private static final String EQUIPMENT_OBJECT_INFOS_SHEET_NAME="equipmentObjectInfos";
-    /**对象信息点sheet*/
+    /**专业系统设备类sheet*/
     private static final String OBJECT_CLAZZ_SHEET_NAME="objectClazz";
+    /**楼层定义sheet*/
+    private static final String FLOOR_IDENTITIES_SHEET_NAME="floorIdentities";
 
 
     /***
@@ -124,48 +134,127 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
     @Override
     public void uploadObjectTemplateFile(MultipartFile file, HttpServletRequest request,
                                          HttpServletResponse response) throws IOException {
+        Workbook workbook = WorkbookUtil.createBook(file.getInputStream());
+        // 1.获得各个sheet的列表数据
         ExcelReader commonObjectSheet = ExcelUtil.getReader(file.getInputStream(),0);
         ExcelReader equipObjectSheet = ExcelUtil.getReader(file.getInputStream(),1);
         ExcelReader systemObjectSheet = ExcelUtil.getReader(file.getInputStream(),2);
         ExcelReader systemObjectInfosSheet = ExcelUtil.getReader(file.getInputStream(), SYSTEM_OBJECT_INFOS_SHEET_NAME);
         ExcelReader equipObjectInfosSheet = ExcelUtil.getReader(file.getInputStream(), EQUIPMENT_OBJECT_INFOS_SHEET_NAME);
-        ExcelReader deptSheet = ExcelUtil.getReader(file.getInputStream(),1);
-        ExcelReader positionSheet = ExcelUtil.getReader(file.getInputStream(),2);
-        ExcelReader domainSheet = ExcelUtil.getReader(file.getInputStream(),3);
-        ExcelReader sexSheet = ExcelUtil.getReader(file.getInputStream(),4);
-        ExcelReader prjectSheet = ExcelUtil.getReader(file.getInputStream(),5);
-//        List<List<Object>> uploadData = firstSheet.read();
-//        List<List<Object>> deptListList = deptSheet.read();
-//        List<List<Object>> positionListList = positionSheet.read();
-//        List<List<Object>> domainListList = domainSheet.read();
-//        List<List<Object>> sexListList = sexSheet.read();
-//        List<List<Object>> prjectListList = prjectSheet.read();
-//        List<String> checkFileErrList = checkFileIsValid(uploadData);
-//        if (CollUtil.isNotEmpty(checkFileErrList)){
-//            FileUtil.writeErrorContentToResponse(checkFileErrList,response,request, WorkConstant.UPLOAD_PERSON_ERR_FILE_NAME);
-//            return;
-//        }
-//        // 1.{部门名称:部门id}映射
-//        Map<String,String> deptMap = createDataMap(deptListList,0,1);
-//        Map<String,String> deptTypeMap = createDataMap(deptListList,1,2);
-//        // 2.{岗位名称:岗位id}映射
-//        Map<String,String> positionMap = createDataMap(positionListList,0,1);
-//        Map<String,String> positionAuthoMap = createDataMap(positionListList,1,2);
-//        // 3.{专业名称:专业id}映射
-//        Map<String,String> domainMap = createDataMap(domainListList,0,1);
-//        // 4.{性别名称:性别id}映射
-//        Map<String,String> sexMap = createDataMap(sexListList,0,1);
-//        // 5.{项目名称:项目id}映射
-//        Map<String,String> projectMap = createDataMap(prjectListList,0,1);
-//        // 4.检验数据合法性
-//        List<String> checkDataErrList = checkDataIsValid(uploadData, deptMap, positionMap, domainMap,sexMap,projectMap,firstSheet);
-//        if (CollUtil.isNotEmpty(checkDataErrList)){
-//            FileUtil.writeErrorContentToResponse(checkDataErrList,response,request, WorkConstant.UPLOAD_PERSON_ERR_FILE_NAME);
+        ExcelReader buildingFuncTypesSheet = ExcelUtil.getReader(file.getInputStream(), BUILDING_FUNC_TYPE_SHEET_NAME);
+        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);
+        // 1.1 基础对象录入列表
+        List<List<Object>> commonObjectUploadData = commonObjectSheet.read();
+        // 1.2 设备对象录入列表
+        List<List<Object>> equipObjectUploadData = equipObjectSheet.read();
+        // 1.3 系统对象录入列表
+        List<List<Object>> systemObjectUploadData = systemObjectSheet.read();
+        // 1.4 系统对象信息点列表
+        List<List<Object>> systemObjectInfosListList = systemObjectInfosSheet.read();
+        // 1.5 设备对象信息点列表
+        List<List<Object>> equipObjectInfosListList = equipObjectInfosSheet.read();
+        // 1.6 建筑功能类型列表
+        List<List<Object>> buildingFuncTypesListList = buildingFuncTypesSheet.read();
+        // 1.7 楼层编码列表
+        List<List<Object>> floorIdentitiesListList = floorIdentitiesSheet.read();
+        // 1.8 空间分区列表
+        List<List<Object>> spaceZonesListList = spaceZonesSheet.read();
+        // 1.9 空间功能类型列表
+        List<List<Object>> spaceFuncTypesListList = spaceFuncTypesSheet.read();
+        // 2.获得名称与信息点的映射
+        // 2.1 {系统信息点名称:系统信息点code}映射
+        Map<String,String> systemObjectInfosMap = createDataMap(systemObjectInfosListList,0,1);
+        // 2.2 {设备信息点名称:设备信息点code}映射
+        Map<String,String> equipObjectInfosMap = createDataMap(equipObjectInfosListList,0,1);
+        // 2.3 {建筑功能类型名称:建筑功能类型code}映射
+        Map<String,String> buildingFuncTypesMap = createDataMap(buildingFuncTypesListList,0,1);
+        // 2.4 {楼层编码名称:楼层编码code}映射
+        Map<String,String> floorIdentitiesMap = createDataMap(floorIdentitiesListList,0,1);
+        // 2.5 {空间分区名称:空间分区code}映射
+        Map<String,String> spaceZonesMap = createDataMap(spaceZonesListList,0,1);
+        // 2.6 {空间功能类型名称:空间功能类型code}映射
+        Map<String,String> spaceFuncTypesMap = createDataMap(spaceFuncTypesListList,0,1);
+        List<String> errorList = new ArrayList<>();
+        // 3.文件及文件表头校验
+        // 3.1 校验基础对象录入
+        FileCheckService commonFileCheckService = SpringHelper.getBean(CommonFileCheckServiceImpl.class);
+        commonFileCheckService.checkFileIsValid(errorList,commonObjectUploadData,new HashMap<>());
+        // 3.2 校验设备对象录入
+        FileCheckService equipFileCheckService = SpringHelper.getBean(EquipFileCheckServiceImpl.class);
+        equipFileCheckService.checkFileIsValid(errorList,equipObjectUploadData,equipObjectInfosMap);
+        // 3.3 校验系统对象录入
+        FileCheckService systemFileCheckService = SpringHelper.getBean(SystemFileCheckServiceImpl.class);
+        systemFileCheckService.checkFileIsValid(errorList,systemObjectUploadData,systemObjectInfosMap);
+        if (CollUtil.isNotEmpty(errorList)){
+            FileUtil.writeErrorContentToResponse(errorList,response,request, CommonConstant.UPLOAD_ERR_FILE_NAME);
+            return;
+        }
+        // 4.检验数据合法性
+        // 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;
 //        }
 //        batchHandleUploadDatas(userId, uploadData,firstSheet, deptMap, positionMap, domainMap,
 //                sexMap,projectMap,deptTypeMap,positionAuthoMap);
-//        response.addHeader(CommonConstant.UPLOAD_FLAG,MagicNumEnum.SUCCESS_FLAG_ONE.getValue());
+//        response.addHeader(CommonConstant.UPLOAD_FLAG,CommonConstant.SUCCESS_FLAG_ONE);
+    }
+    /***
+     * Description: 校验基础对象录入的数据
+     * @param errorList : 错误提示列表
+     * @param commonObjectUploadData : 基础对象录入数据
+     * @param buildingFuncTypesMap : 建筑功能类型名称和建筑功能类型code的映射
+     * @param floorIdentitiesMap : 楼层编码名称和楼层编码code的映射
+     * @param spaceZonesMap : 空间分区名称和空间分区code的映射
+     * @param spaceFuncTypesMap : 空间功能类型名称和空间功能类型code的映射
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/24 17:30
+     * Update By lijie 2021/9/24 17:30
+     */
+    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) {
+        int startRowIndex=2;
+        if (commonObjectUploadData.size()<3){
+            return;
+        }
+        int objSize = commonObjectUploadData.size();
+        for (int i = startRowIndex; i < objSize; i++) {
+            List<Object> datas = commonObjectUploadData.get(i);
+            // 1.项目id
+
+
+
+
+        }
+
+
+    }
+
+    /***
+     * Description: 创建映射关系
+     * @param dataListList : 数据列表
+     * @return : java.util.Map<java.lang.String,java.lang.String>
+     * @author : lijie
+     * @date :2021/8/5 20:12
+     * Update By lijie 2021/8/5 20:12
+     */
+    private Map<String, String> createDataMap(List<List<Object>> dataListList,Integer keyIndex,Integer valIndex) {
+        Map<String,String> dataMap = new HashMap<>();
+        for (List<Object> objects : dataListList) {
+            String key = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(objects.get(keyIndex)));
+            String value = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(objects.get(valIndex)));
+            dataMap.put(key, value);
+        }
+        return dataMap;
     }
 
     /***
@@ -268,8 +357,8 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
             int n=1;
             for (Map.Entry<String, String> clazzEntry : systemClazzEntries) {
                 CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(equipObjectClazzSheet,n),m),clazzEntry.getValue()+StrUtil.UNDERLINE,null);
-                CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),0),entry.getValue(),null);
-                CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),1),entry.getKey(),null);
+                CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),0),clazzEntry.getValue(),null);
+                CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),1),clazzEntry.getKey(),null);
                 n++;
                 clazzIndex++;
             }
@@ -293,8 +382,8 @@ public class BatchHandleObjectServiceImpl extends BaseService implements BatchHa
                 for (Map.Entry<String, String> equipEntry : equipClazzList) {
                     String modelName = equipEntry.getValue();
                     CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(equipObjectClazzSheet,n),m),modelName,null);
-                    CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),0),entry.getValue(),null);
-                    CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),1),entry.getKey(),null);
+                    CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),0),equipEntry.getValue(),null);
+                    CellUtil.setCellValue(CellUtil.getOrCreateCell(RowUtil.getOrCreateRow(objectClazzSheet,clazzIndex),1),equipEntry.getKey(),null);
                     n++;
                     clazzIndex++;
                 }

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

@@ -0,0 +1,9 @@
+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 {
+}

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

@@ -0,0 +1,26 @@
+package com.persagy.dmp.rwd.validators.service;
+
+import java.util.List;
+import java.util.Map;
+
+/***
+ * Description: 文件校验逻辑处理类
+ * @author : lijie
+ * @date :2021/9/24 15:42
+ * Update By lijie 2021/9/24 15:42
+ */
+public interface FileCheckService {
+    /***
+     * Description: 校验文件的正确性
+     * @param lists : 数据列表
+     * @param dynamicMap : 动态表头映射
+     * @return : java.util.List<java.lang.String>
+     * @author : lijie
+     * @date :2021/3/15 11:51
+     * Update By lijie 2021/3/15 11:51
+     */
+    void checkFileIsValid(List<String> errorList, List<List<Object>> lists, Map<String,String> dynamicMap);
+
+
+
+}

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

@@ -0,0 +1,9 @@
+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 {
+}

+ 118 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/AbstractFileCheckService.java

@@ -0,0 +1,118 @@
+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.EnumUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.poi.excel.cell.CellUtil;
+import com.persagy.dmp.rwd.constants.ErrorEnum;
+import com.persagy.dmp.rwd.validators.service.FileCheckService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/***
+ * Description: 文件检测抽象逻辑类(模板模式)
+ * @author : lijie
+ * @date :2021/9/24 15:51
+ * Update By lijie 2021/9/24 15:51
+ */
+public abstract class AbstractFileCheckService implements FileCheckService {
+
+    /***
+     * Description: 校验文件的正确性
+     * @param lists : 数据列表
+     * @return : java.util.List<java.lang.String>
+     * @author : lijie
+     * @date :2021/3/15 11:51
+     * Update By lijie 2021/3/15 11:51
+     */
+    @Override
+    public void checkFileIsValid(List<String> errorList, List<List<Object>> lists, Map<String,String> dynamicMap) {
+        // 1.通过钩子获得行头索引
+        int excelHeadIndex = getExcelHeadIndex();
+        String excelSheetName = getExcelSheetName();
+        if (lists.size() < excelHeadIndex){
+            errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+            return;
+        }
+        // 2.获的行头行的数据
+        List<Object> rows = lists.get(excelHeadIndex);
+        if (CollUtil.isEmpty(rows)){
+            errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+            return;
+        }
+        // 3.获得不可变行头的映射
+        Map<Integer,String> persistentHeadMap = getPersistentHeadMap();
+        if (rows.size()<persistentHeadMap.size()){
+            errorList.add(ErrorEnum.FILE_ERROR.getDesc());
+            return;
+        }
+        // 4.校验不可变行头
+        for (int i=0;i<persistentHeadMap.size();i++){
+            String columnName = persistentHeadMap.get(i);
+            if (StrUtil.isBlank(columnName)){
+                errorList.add(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());
+                return;
+            }
+        }
+        if (dynamicMap.size()<=0){
+            return;
+        }
+        // 5.校验动态行头
+        int dynamicSize = persistentHeadMap.size();
+        for (int i = dynamicSize; i < rows.size(); i++) {
+            String realCol=excelSheetName+"Sheet表:第"+(i+1)+"行,";
+            String tempStr = CharSequenceUtil.trimToEmpty(StrUtil.utf8Str(rows.get(i)));
+            if (!dynamicMap.containsKey(tempStr)){
+                errorList.add(realCol+ErrorEnum.INFO_NAME_NOT_EXIST_ERROR);
+            }
+        }
+        specialCheckFileIsValid(errorList,rows);
+    }
+    /***
+     * Description: 获得所在excel名称
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/24 16:53
+     * Update By lijie 2021/9/24 16:53
+     */
+    protected abstract String getExcelSheetName();
+
+    /***
+     * Description: 获得不可变行头的映射
+     * @return : java.util.Map<java.lang.String,java.lang.String>
+     * @author : lijie
+     * @date :2021/9/24 16:09
+     * Update By lijie 2021/9/24 16:09
+     */
+    protected abstract Map<Integer, String> getPersistentHeadMap();
+
+    /***
+     * Description: 获得excel行头索引
+     * @return : java.lang.Integer
+     * @author : lijie
+     * @date :2021/9/24 15:59
+     * Update By lijie 2021/9/24 15:59
+     */
+    protected abstract Integer getExcelHeadIndex();
+
+    /***
+     * Description: 特有的文件校验逻辑
+     * @param errorList : 错误列表
+     * @param rows : 行数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/24 15:56
+     * Update By lijie 2021/9/24 15:56
+     */
+    protected void specialCheckFileIsValid(List<String> errorList, List<Object> rows){};
+
+
+}

+ 55 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/CommonFileCheckServiceImpl.java

@@ -0,0 +1,55 @@
+package com.persagy.dmp.rwd.validators.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.EnumUtil;
+import com.persagy.dmp.rwd.constants.CommonObjectColumnEnum;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class CommonFileCheckServiceImpl extends AbstractFileCheckService {
+    /***
+     * Description: 获得excel的sheet名称
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/24 16:54
+     * Update By lijie 2021/9/24 16:54
+     */
+    @Override
+    protected String getExcelSheetName() {
+        return "基础对象录入";
+    }
+
+    /***
+     * Description: 获得不可变行头的映射
+     * @return : java.util.Map<java.lang.String,java.lang.String>
+     * @author : lijie
+     * @date :2021/9/24 16:09
+     * Update By lijie 2021/9/24 16:09
+     */
+    @Override
+    protected Map<Integer, String> getPersistentHeadMap() {
+        List<CommonObjectColumnEnum> list = CollUtil.list(false, EnumUtil.getEnumMap(CommonObjectColumnEnum.class).values());
+        return list.stream()
+                .collect(Collectors.toMap(CommonObjectColumnEnum::getIndex, CommonObjectColumnEnum::getName, (k1, k2) -> k1));
+    }
+
+    /***
+     * Description: 获得excel行头索引
+     * @return : java.lang.Integer
+     * @author : lijie
+     * @date :2021/9/24 15:59
+     * Update By lijie 2021/9/24 15:59
+     */
+    @Override
+    protected Integer getExcelHeadIndex() {
+        return 1;
+    }
+}

+ 56 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/validators/service/impl/EquipFileCheckServiceImpl.java

@@ -0,0 +1,56 @@
+package com.persagy.dmp.rwd.validators.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.EnumUtil;
+import com.persagy.dmp.rwd.constants.CommonObjectColumnEnum;
+import com.persagy.dmp.rwd.constants.EquipObjectColumnEnum;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class EquipFileCheckServiceImpl extends AbstractFileCheckService {
+    /***
+     * Description: 获得excel的sheet名称
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/24 16:54
+     * Update By lijie 2021/9/24 16:54
+     */
+    @Override
+    protected String getExcelSheetName() {
+        return "设备对象录入";
+    }
+
+    /***
+     * Description: 获得不可变行头的映射
+     * @return : java.util.Map<java.lang.String,java.lang.String>
+     * @author : lijie
+     * @date :2021/9/24 16:09
+     * Update By lijie 2021/9/24 16:09
+     */
+    @Override
+    protected Map<Integer, String> getPersistentHeadMap() {
+        List<EquipObjectColumnEnum> list = CollUtil.list(false, EnumUtil.getEnumMap(EquipObjectColumnEnum.class).values());
+        return list.stream()
+                .collect(Collectors.toMap(EquipObjectColumnEnum::getIndex, EquipObjectColumnEnum::getName, (k1, k2) -> k1));
+    }
+
+    /***
+     * Description: 获得excel行头索引
+     * @return : java.lang.Integer
+     * @author : lijie
+     * @date :2021/9/24 15:59
+     * Update By lijie 2021/9/24 15:59
+     */
+    @Override
+    protected Integer getExcelHeadIndex() {
+        return 6;
+    }
+}

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

@@ -0,0 +1,56 @@
+package com.persagy.dmp.rwd.validators.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.EnumUtil;
+import com.persagy.dmp.rwd.constants.EquipObjectColumnEnum;
+import com.persagy.dmp.rwd.constants.SystemObjectColumnEnum;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SystemFileCheckServiceImpl extends AbstractFileCheckService {
+    /***
+     * Description: 获得excel的sheet名称
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/24 16:54
+     * Update By lijie 2021/9/24 16:54
+     */
+    @Override
+    protected String getExcelSheetName() {
+        return "系统对象录入";
+    }
+
+    /***
+     * Description: 获得不可变行头的映射
+     * @return : java.util.Map<java.lang.String,java.lang.String>
+     * @author : lijie
+     * @date :2021/9/24 16:09
+     * Update By lijie 2021/9/24 16:09
+     */
+    @Override
+    protected Map<Integer, String> getPersistentHeadMap() {
+        List<SystemObjectColumnEnum> list = CollUtil.list(false, EnumUtil.getEnumMap(SystemObjectColumnEnum.class).values());
+        return list.stream()
+                .collect(Collectors.toMap(SystemObjectColumnEnum::getIndex, SystemObjectColumnEnum::getName, (k1, k2) -> k1));
+    }
+
+    /***
+     * Description: 获得excel行头索引
+     * @return : java.lang.Integer
+     * @author : lijie
+     * @date :2021/9/24 15:59
+     * Update By lijie 2021/9/24 15:59
+     */
+    @Override
+    protected Integer getExcelHeadIndex() {
+        return 6;
+    }
+}