Procházet zdrojové kódy

增加信息点、对象数据格式校验。

yucheng před 3 roky
rodič
revize
de9a4a8e8c

+ 29 - 0
dc-business/dc-digital/src/main/java/com/persagy/dc/define/service/IObjectInfoService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.dc.define.entity.ObjectInfo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 信息点 接口
@@ -14,6 +15,34 @@ import java.util.List;
 public interface IObjectInfoService {
 
     /**
+     * 通过主键查询
+     * @param id
+     * @return
+     */
+    ObjectInfo load(String id);
+
+    /**
+     * 通过多主键查询
+     * @param idList
+     * @return
+     */
+    List<ObjectInfo> queryByIds(List<String> idList);
+
+    /**
+     * 通过对象类型编码查询
+     * @param typeCode
+     * @return
+     */
+    List<ObjectInfo> queryByType(String typeCode);
+
+    /**
+     * 通过多对象类型编码查询
+     * @param typeCodeList
+     * @return Map<typeCode, Map<InfoCode, ObjectInfo>>
+     */
+    Map<String, Map<String, ObjectInfo>> queryByTypes(List<String> typeCodeList);
+
+    /**
      * 按条件查询
      * @param queryWrapper 查询条件
      * @return 列表

+ 36 - 0
dc-business/dc-digital/src/main/java/com/persagy/dc/define/service/impl/ObjectInfoServiceImpl.java

@@ -15,12 +15,14 @@ import com.persagy.dc.common.model.entity.BaseEntity;
 import com.persagy.dc.define.dao.ObjectInfoMapper;
 import com.persagy.dc.define.entity.ObjectInfo;
 import com.persagy.dc.define.service.IObjectInfoService;
+import com.persagy.dc.parser.service.InfoDataFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 信息点 实现类
@@ -37,6 +39,38 @@ public class ObjectInfoServiceImpl implements IObjectInfoService {
     private DigitalMessageHelper messageSender;
 
     @Override
+    public ObjectInfo load(String id) {
+        return dao.selectById(id);
+    }
+
+    @Override
+    public List<ObjectInfo> queryByIds(List<String> idList) {
+        return dao.selectBatchIds(idList);
+    }
+
+    @Override
+    public List<ObjectInfo> queryByType(String typeCode) {
+        LambdaQueryWrapper<ObjectInfo> wrapper = new LambdaQueryWrapper();
+        wrapper.eq(ObjectInfo::getClassCode, typeCode);
+        wrapper.eq(ObjectInfo::getValid, ValidEnum.TRUE.getType());
+        wrapper.orderByAsc(ObjectInfo::getShowOrder);
+        return queryByCondition(wrapper);
+    }
+
+    @Override
+    public Map<String, Map<String, ObjectInfo>> queryByTypes(List<String> typeCodeList) {
+        LambdaQueryWrapper<ObjectInfo> wrapper = new LambdaQueryWrapper();
+        wrapper.in(ObjectInfo::getClassCode, typeCodeList);
+        wrapper.eq(ObjectInfo::getValid, ValidEnum.TRUE.getType());
+        wrapper.orderByAsc(ObjectInfo::getShowOrder);
+        List<ObjectInfo> infoList = queryByCondition(wrapper);
+        if(CollUtil.isEmpty(infoList)) {
+            return null;
+        }
+        return infoList.stream().collect(Collectors.groupingBy(ObjectInfo::getClassCode, Collectors.toMap(ObjectInfo::getCode, p->p)));
+    }
+
+    @Override
     public List<ObjectInfo> queryByCondition(Wrapper<ObjectInfo> queryWrapper) {
         return dao.selectList(queryWrapper);
     }
@@ -102,6 +136,8 @@ public class ObjectInfoServiceImpl implements IObjectInfoService {
             if(!codeSet.add(vo.getCode())) {
                 throw new BusinessException(StrFormatter.format("存在重复编码{},不允许保存!", vo.getCode()));
             }
+            // 校验器校验
+            InfoDataFactory.parse(vo, null);
             // 修改时,收集待排除的主键
             if(isUpdate) {
                 idList.add(vo.getId());

+ 44 - 2
dc-business/dc-digital/src/main/java/com/persagy/dc/digital/service/impl/ObjectDigitalServiceImpl.java

@@ -5,12 +5,16 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dc.basic.utils.DigitalMessageHelper;
 import com.persagy.dc.common.constant.ValidEnum;
 import com.persagy.dc.common.model.entity.BaseEntity;
+import com.persagy.dc.define.entity.ObjectInfo;
+import com.persagy.dc.define.service.IObjectInfoService;
 import com.persagy.dc.digital.dao.ObjectDigitalMapper;
 import com.persagy.dc.digital.entity.ObjectDigital;
 import com.persagy.dc.digital.service.IObjectDigitalService;
+import com.persagy.dc.parser.service.InfoDataFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -32,6 +36,8 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
     private ObjectDigitalMapper dao;
     @Autowired
     private DigitalMessageHelper messageSender;
+    @Autowired
+    private IObjectInfoService infoService;
 
     @Override
     public ObjectDigital load(String id) {
@@ -53,7 +59,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
-//        validateOnSave(voList, false);
+        validateOnSave(voList, false);
         voList.forEach(vo -> {
             // 新增
             dao.insert(vo);
@@ -66,7 +72,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
-//        validateOnSave(voList, true);
+        validateOnSave(voList, true);
         List<String> idList = CollUtil.getFieldValues(voList, BaseEntity.PROP_ID, String.class);
         List<ObjectDigital> dbList = dao.selectBatchIds(idList);
         Map<String, ObjectDigital> dbMap = CollectionUtil.fieldValueMap(dbList, BaseEntity.PROP_ID);
@@ -82,6 +88,42 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
         return voList;
     }
 
+    /**
+     * 保存校验
+     * 编码全局唯一
+     * @param voList
+     * @param isUpdate
+     */
+    private void validateOnSave(List<ObjectDigital> voList, boolean isUpdate) {
+        validateInfoCode(voList);
+    }
+
+    /**
+     * 信息点值校验
+     * @param voList
+     */
+    private void validateInfoCode(List<ObjectDigital> voList) {
+        // 查询信息点定义
+        List<String> typeCodeList = CollUtil.getFieldValues(voList, "classCode", String.class);
+        Map<String, Map<String, ObjectInfo>> allInfoMap = infoService.queryByTypes(typeCodeList);
+        // 信息点校验器
+        for(ObjectDigital vo:voList) {
+            Map<String, ObjectInfo> infoMap = allInfoMap.get(vo.getClassCode());
+            if(MapUtil.isEmpty(infoMap)) {
+                continue;
+            }
+            // 信息点值对象
+            ObjectNode infos = vo.getInfos();
+            // 按信息点定义循环校验
+            for(String infoCode:infoMap.keySet()) {
+                if(!infos.has(infoCode)) {
+                    continue;
+                }
+                InfoDataFactory.parse(infoMap.get(infoCode), infos.get(infoCode));
+            }
+        }
+    }
+
     @Override
     public void delete(List<String> idList) {
         if(CollUtil.isEmpty(idList)) {

+ 1 - 20
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/entity/ParserResult.java

@@ -1,7 +1,6 @@
 package com.persagy.dc.parser.entity;
 
 import cn.hutool.core.util.BooleanUtil;
-import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.persagy.dc.define.entity.ObjectInfo;
 import lombok.Data;
@@ -13,12 +12,11 @@ import lombok.Data;
  */
 @Data
 public class ParserResult {
+
     /** 信息点定义 */
     private ObjectInfo infoDefine;
     /** 信息点值 */
     private JsonNode valueInfo;
-    /** 错误信息 */
-    private StringBuilder errorMsg = new StringBuilder();
 
     public ParserResult(ObjectInfo infoDefine, JsonNode valueInfo) {
         this.infoDefine = infoDefine;
@@ -40,21 +38,4 @@ public class ParserResult {
     public boolean isRegion() {
         return BooleanUtil.isTrue(infoDefine.getRegionFlag());
     }
-
-    /**
-     * 追加错误信息
-     * @param error 错误信息
-     */
-    public void addErrorMsg(String error) {
-        errorMsg.append(error);
-    }
-
-    /**
-     * 追加错误信息
-     * @param error 错误信息
-     * @param params 格式信息
-     */
-    public void addErrorMsg(String error, Object... params) {
-        errorMsg.append(StrUtil.format(error, params));
-    }
 }

+ 1 - 1
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/InfoDataFactory.java

@@ -37,7 +37,7 @@ public class InfoDataFactory {
      * @param dataType 数据类型
      * @return
      */
-    public static IInfoDataParser getParser(String dataType) {
+    private static IInfoDataParser getParser(String dataType) {
         // 懒加载
         if(MapUtil.isEmpty(parserMap)) {
             parserMap.put(DigitalDataType.ATTACHMENT.getIndex(), new AttachmentInfoParser());

+ 21 - 9
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/impl/AbstractInfoDataParser.java

@@ -1,16 +1,19 @@
 package com.persagy.dc.parser.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.JsonNodeType;
 import com.persagy.dc.basic.constant.DigitalDataCategory;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.common.helper.SpringHelper;
 import com.persagy.dc.common.model.data.RegionValue;
 import com.persagy.dc.define.entity.ObjectInfo;
 import com.persagy.dc.parser.entity.ParserResult;
 import com.persagy.dc.parser.entity.RegionVO;
 import com.persagy.dc.parser.service.IInfoDataParser;
+import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -21,6 +24,7 @@ import java.util.List;
  * @author Charlie Yu
  * @date 2021-07-12
  */
+@Slf4j
 public abstract class AbstractInfoDataParser implements IInfoDataParser {
 
     private static ObjectMapper objectMapper;
@@ -34,9 +38,12 @@ public abstract class AbstractInfoDataParser implements IInfoDataParser {
     @Override
     public ParserResult parse(ObjectInfo infoDefine, JsonNode valueInfo) {
         ParserResult result = new ParserResult(infoDefine, valueInfo);
-        // 校验信息点定义
-        if(!validateDefine(result)) {
-            return result;
+        try {
+            // 校验信息点定义
+            validateDefine(result);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+            throw new BusinessException(StrUtil.format("信息点[{}]定义有误,数据源格式有误!", result.getInfoDefine().getCode()));
         }
         // 空值、非静态信息点不需要值校验
         if(valueInfo == null ||
@@ -44,24 +51,29 @@ public abstract class AbstractInfoDataParser implements IInfoDataParser {
                 DigitalDataCategory.STATIC.getIndex().equalsIgnoreCase(infoDefine.getCategory())) {
             return result;
         }
-        // 值校验
-        validateValue(result);
+        try {
+            // 值校验
+            validateValue(result);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+            throw new BusinessException(StrUtil.format("信息点[{}]数据格式有误!", result.getInfoDefine().getCode()));
+        }
         return result;
     }
 
     /**
      * 信息点定义校验
      * @param result 校验参数
-     * @return 是否校验通过
+     * @throws IOException json转换异常
      */
-    protected abstract boolean validateDefine(ParserResult result);
+    protected abstract void validateDefine(ParserResult result) throws IOException;
 
     /**
      * 信息点值校验
      * @param result 校验参数
-     * @return 是否校验通过
+     * @throws IOException json转换异常
      */
-    protected abstract boolean validateValue(ParserResult result);
+    protected abstract void validateValue(ParserResult result) throws IOException;
 
     /**
      * 获取数据

+ 12 - 22
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/impl/AttachmentInfoParser.java

@@ -1,7 +1,8 @@
 package com.persagy.dc.parser.service.impl;
 
-import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.parser.entity.ParserResult;
 
 import java.io.IOException;
@@ -15,32 +16,21 @@ import java.util.List;
 public class AttachmentInfoParser extends AbstractInfoDataParser {
 
     @Override
-    protected boolean validateDefine(ParserResult result) {
-        boolean regionFlag = BooleanUtil.isTrue(result.getInfoDefine().getRegionFlag());
+    protected void validateDefine(ParserResult result) {
         // 不支持区间格式
-        if(regionFlag) {
-            result.addErrorMsg("信息点[{}]定义有误,Attachment类型不允许定义区间!", result.getInfoDefine().getCode());
-            return false;
+        if(result.isRegion()) {
+            throw new BusinessException(StrUtil.format("信息点[{}]定义有误,Attachment类型不允许定义区间!", result.getInfoDefine().getCode()));
         }
-        return true;
     }
 
     @Override
-    protected boolean validateValue(ParserResult result) {
-        boolean multiFlag = BooleanUtil.isTrue(result.getInfoDefine().getMultipleFlag());
-        // 数据源 - 应为区间列表格式
-        try {
-            // 复数
-            if(multiFlag) {
-                List<ObjectNode> valueList = formatListValue(result.getValueInfo(), ObjectNode.class);
-            } else {
-                // 单数
-                ObjectNode value = formatValue(result.getValueInfo(), ObjectNode.class);
-            }
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-            return false;
+    protected void validateValue(ParserResult result) throws IOException{
+        // 复数
+        if(result.isMulti()) {
+            List<ObjectNode> valueList = formatListValue(result.getValueInfo(), ObjectNode.class);
+        } else {
+            // 单数
+            ObjectNode value = formatValue(result.getValueInfo(), ObjectNode.class);
         }
-        return true;
     }
 }

+ 12 - 24
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/impl/BooleanInfoParser.java

@@ -1,11 +1,10 @@
 package com.persagy.dc.parser.service.impl;
 
-import cn.hutool.core.util.BooleanUtil;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.parser.entity.ParserResult;
 
 import java.io.IOException;
-import java.util.List;
 
 /**
  * 布尔信息点 处理器
@@ -15,32 +14,21 @@ import java.util.List;
 public class BooleanInfoParser extends AbstractInfoDataParser {
 
     @Override
-    protected boolean validateDefine(ParserResult result) {
-        boolean regionFlag = BooleanUtil.isTrue(result.getInfoDefine().getRegionFlag());
+    protected void validateDefine(ParserResult result) {
         // 不支持区间格式
-        if(regionFlag) {
-            result.addErrorMsg("信息点[{}]定义有误,Boolean类型不允许定义区间!", result.getInfoDefine().getCode());
-            return false;
+        if(result.isRegion()) {
+            throw new BusinessException(StrUtil.format("信息点[{}]定义有误,Boolean类型不允许定义区间!", result.getInfoDefine().getCode()));
         }
-        return true;
     }
 
     @Override
-    protected boolean validateValue(ParserResult result) {
-        boolean multiFlag = BooleanUtil.isTrue(result.getInfoDefine().getMultipleFlag());
-        // 数据源 - 应为区间列表格式
-        try {
-            // 复数
-            if(multiFlag) {
-                List<Boolean> valueList = formatListValue(result.getValueInfo(), Boolean.class);
-            } else {
-                // 单数
-                Boolean value = formatValue(result.getValueInfo(), Boolean.class);
-            }
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-            return false;
+    protected void validateValue(ParserResult result) throws IOException {
+        // 复数
+        if(result.isMulti()) {
+            formatListValue(result.getValueInfo(), Boolean.class);
+        } else {
+            // 单数
+            formatValue(result.getValueInfo(), Boolean.class);
         }
-        return true;
     }
 }

+ 54 - 85
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/impl/DateInfoParser.java

@@ -1,8 +1,8 @@
 package com.persagy.dc.parser.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.common.model.data.RegionValue;
 import com.persagy.dc.common.utils.RegionUtil;
 import com.persagy.dc.parser.entity.ParserResult;
@@ -18,106 +18,75 @@ import java.util.List;
 public class DateInfoParser extends AbstractInfoDataParser {
 
     @Override
-    protected boolean validateDefine(ParserResult result) {
+    protected void validateDefine(ParserResult result) throws IOException {
         // 格式默认为yyyyMMddHHmmss
         if(StrUtil.isBlank(result.getInfoDefine().getFormatter())) {
             result.getInfoDefine().setFormatter("yyyyMMddHHmmss");
         }
         String formatter = result.getInfoDefine().getFormatter();
         // 数据源 - 应为区间列表格式
-        try {
-            List<RegionValue<String>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), String.class);
-            // 区间格式校验
-            if(!matchRegionDataFormat(formatter, dataSource)) {
-                result.addErrorMsg("信息点[{}]定义有误,数据源格式有误!", result.getInfoDefine().getCode());
-                return false;
-            }
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]定义有误,数据源格式有误!", result.getInfoDefine().getCode());
-            return false;
+        List<RegionValue<String>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), String.class);
+        // 区间格式校验
+        if(!matchRegionDataFormat(formatter, dataSource)) {
+            throw new BusinessException(StrUtil.format("信息点[{}]定义有误,数据源格式有误!", result.getInfoDefine().getCode()));
         }
-        return true;
     }
 
     @Override
-    protected boolean validateValue(ParserResult result) {
-        boolean multiFlag = BooleanUtil.isTrue(result.getInfoDefine().getMultipleFlag());
-        boolean regionFlag = BooleanUtil.isTrue(result.getInfoDefine().getRegionFlag());
+    protected void validateValue(ParserResult result) throws IOException {
         String formatter = result.getInfoDefine().getFormatter();
-        try {
-            // 数据源定义信息
-            List<RegionValue<String>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), String.class);
-            // 复数
-            if(multiFlag) {
-                // 复数区间
-                if(regionFlag) {
-                    List<RegionValue<String>> valueList = formatRegionListValue(result.getValueInfo(), String.class);
-                    // 区间格式校验
-                    if (!matchRegionDataFormat(formatter, valueList)) {
-                        result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-                        return false;
-                    }
-                    // 区间范围校验
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        if (!RegionUtil.allContains(dataSource, valueList)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
-                } else {
-                    // 复数非区间
-                    List<String> valueList = formatListValue(result.getValueInfo(), String.class);
-                    // 区间格式校验
-                    if (!matchDataFormat(formatter, valueList)) {
-                        result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-                        return false;
-                    }
-                    // 区间范围校验
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        if (!RegionUtil.allContain(dataSource, valueList)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
+        // 数据源定义信息
+        List<RegionValue<String>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), String.class);
+        // 复数
+        if(result.isMulti()) {
+            // 复数区间
+            if(result.isRegion()) {
+                List<RegionValue<String>> valueList = formatRegionListValue(result.getValueInfo(), String.class);
+                // 区间格式校验
+                if (!matchRegionDataFormat(formatter, valueList)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据格式有误!", result.getInfoDefine().getCode()));
+                }
+                // 区间范围校验
+                if (!RegionUtil.allContains(dataSource, valueList)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
                 }
             } else {
-                // 单数区间
-                if(regionFlag) {
-                    RegionValue<String> value = formatRegionValue(result.getValueInfo(), String.class);
-                    // 日期格式校验
-                    if (!matchRegionDataFormat(formatter, CollUtil.newArrayList(value))) {
-                        result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-                        return false;
-                    }
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        // 区间范围校验
-                        if (!RegionUtil.anyContains(dataSource, value)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
-                } else {
-                    // 单数非区间
-                    String value = formatValue(result.getValueInfo(), String.class);
-                    // 日期格式校验
-                    if (!matchDataFormat(formatter, value)) {
-                        result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-                        return false;
-                    }
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        // 区间范围校验
-                        if (!RegionUtil.anyContain(dataSource, value)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
+                // 复数非区间
+                List<String> valueList = formatListValue(result.getValueInfo(), String.class);
+                // 区间格式校验
+                if (!matchDataFormat(formatter, valueList)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据格式有误!", result.getInfoDefine().getCode()));
+                }
+                // 区间范围校验
+                if (!RegionUtil.allContain(dataSource, valueList)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
+                }
+            }
+        } else {
+            // 单数区间
+            if(result.isRegion()) {
+                RegionValue<String> value = formatRegionValue(result.getValueInfo(), String.class);
+                // 日期格式校验
+                if (!matchRegionDataFormat(formatter, CollUtil.newArrayList(value))) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据格式有误!", result.getInfoDefine().getCode()));
+                }
+                // 区间范围校验
+                if (!RegionUtil.anyContains(dataSource, value)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
+                }
+            } else {
+                // 单数非区间
+                String value = formatValue(result.getValueInfo(), String.class);
+                // 日期格式校验
+                if (!matchDataFormat(formatter, value)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据格式有误!", result.getInfoDefine().getCode()));
+                }
+                // 区间范围校验
+                if (!RegionUtil.anyContain(dataSource, value)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
                 }
             }
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-            return false;
         }
-        return true;
     }
 
     /**

+ 22 - 35
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/impl/EnumInfoParser.java

@@ -1,6 +1,8 @@
 package com.persagy.dc.parser.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.parser.entity.EnumVO;
 import com.persagy.dc.parser.entity.ParserResult;
 
@@ -17,50 +19,35 @@ import java.util.Set;
 public class EnumInfoParser extends AbstractInfoDataParser {
 
     @Override
-    protected boolean validateDefine(ParserResult result) {
+    protected void validateDefine(ParserResult result) throws IOException {
         // 字符串类型不支持区间格式
         if(result.isRegion()) {
-            result.addErrorMsg("信息点[{}]定义有误,ENUM类型不允许定义区间!", result.getInfoDefine().getCode());
-            return false;
+            throw new BusinessException(StrUtil.format("信息点[{}]定义有误,ENUM类型不允许定义区间!", result.getInfoDefine().getCode()));
         }
         // 数据源 - 应为区间列表格式
-        try {
-            formatListValue(result.getInfoDefine().getDataSource(), EnumVO.class);
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]定义有误,数据源格式有误!", result.getInfoDefine().getCode());
-            return false;
-        }
-        return true;
+        formatListValue(result.getInfoDefine().getDataSource(), EnumVO.class);
     }
 
     @Override
-    protected boolean validateValue(ParserResult result) {
-        try {
-            // 数据源定义信息
-            List<EnumVO> dataSource = formatListValue(result.getInfoDefine().getDataSource(), EnumVO.class);
-            Set<String> codeSet = new HashSet<>();
-            for(EnumVO enumVO:dataSource) {
-                codeSet.add(enumVO.getCode());
+    protected void validateValue(ParserResult result) throws IOException {
+        // 数据源定义信息
+        List<EnumVO> dataSource = formatListValue(result.getInfoDefine().getDataSource(), EnumVO.class);
+        Set<String> codeSet = new HashSet<>();
+        for(EnumVO enumVO:dataSource) {
+            codeSet.add(enumVO.getCode());
+        }
+        // 复数
+        if(result.isMulti()) {
+            List<String> valueList = formatListValue(result.getValueInfo(), String.class);
+            if(!CollUtil.containsAll(codeSet, valueList)) {
+                throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
             }
-            // 复数
-            if(result.isMulti()) {
-                List<String> valueList = formatListValue(result.getValueInfo(), String.class);
-                if(!CollUtil.containsAll(codeSet, valueList)) {
-                    result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                    return false;
-                }
-            } else {
-                // 单数
-                String value = formatValue(result.getValueInfo(), String.class);
-                if(!codeSet.contains(value)) {
-                    result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                    return false;
-                }
+        } else {
+            // 单数
+            String value = formatValue(result.getValueInfo(), String.class);
+            if(!codeSet.contains(value)) {
+                throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
             }
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-            return false;
         }
-        return true;
     }
 }

+ 36 - 59
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/impl/NumberInfoParser.java

@@ -1,6 +1,7 @@
 package com.persagy.dc.parser.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.common.model.data.RegionValue;
 import com.persagy.dc.common.utils.RegionUtil;
 import com.persagy.dc.parser.entity.ParserResult;
@@ -16,73 +17,49 @@ import java.util.List;
 public class NumberInfoParser <T extends Comparable> extends AbstractInfoDataParser {
 
     @Override
-    protected boolean validateDefine(ParserResult result) {
+    protected void validateDefine(ParserResult result) throws IOException {
         // 数据源 - 应为区间列表格式
-        try {
-            formatRegionListValue(result.getInfoDefine().getDataSource(), getClassType());
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]定义有误,数据源格式有误!", result.getInfoDefine().getCode());
-            return false;
-        }
-        return true;
+        formatRegionListValue(result.getInfoDefine().getDataSource(), getClassType());
     }
 
     @Override
-    protected boolean validateValue(ParserResult result) {
-        try {
-            // 数据源定义信息
-            List<RegionValue<T>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), getClassType());
-            // 复数
-            if(result.isMulti()) {
-                // 复数区间
-                if(result.isRegion()) {
-                    List<RegionValue<T>> valueList = formatRegionListValue(result.getValueInfo(), getClassType());
-                    // 区间范围校验
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        if (!RegionUtil.allContains(dataSource, valueList)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
-                } else {
-                    // 复数非区间
-                    List<T> valueList = formatListValue(result.getValueInfo(), getClassType());
-                    // 区间范围校验
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        if (!RegionUtil.allContain(dataSource, valueList)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
+    protected void validateValue(ParserResult result) throws IOException {
+        // 数据源定义信息
+        List<RegionValue<T>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), getClassType());
+        // 复数
+        if(result.isMulti()) {
+            // 复数区间
+            if(result.isRegion()) {
+                List<RegionValue<T>> valueList = formatRegionListValue(result.getValueInfo(), getClassType());
+                // 区间范围校验
+                if (!RegionUtil.allContains(dataSource, valueList)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
+                }
+            } else {
+                // 复数非区间
+                List<T> valueList = formatListValue(result.getValueInfo(), getClassType());
+                // 区间范围校验
+                if (!RegionUtil.allContain(dataSource, valueList)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
+                }
+            }
+        } else {
+            // 单数区间
+            if(result.isRegion()) {
+                RegionValue<T> value = formatRegionValue(result.getValueInfo(), getClassType());
+                // 区间范围校验
+                if (!RegionUtil.anyContains(dataSource, value)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
                 }
             } else {
-                // 单数区间
-                if(result.isRegion()) {
-                    RegionValue<T> value = formatRegionValue(result.getValueInfo(), getClassType());
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        // 区间范围校验
-                        if (!RegionUtil.anyContains(dataSource, value)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
-                } else {
-                    // 单数非区间
-                    T value = formatValue(result.getValueInfo(), getClassType());
-                    if (CollUtil.isNotEmpty(dataSource)) {
-                        // 区间范围校验
-                        if (!RegionUtil.anyContain(dataSource, value)) {
-                            result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                            return false;
-                        }
-                    }
+                // 单数非区间
+                T value = formatValue(result.getValueInfo(), getClassType());
+                // 区间范围校验
+                if (!RegionUtil.anyContain(dataSource, value)) {
+                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
                 }
             }
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-            return false;
         }
-        return true;
     }
 
     /**

+ 23 - 45
dc-business/dc-digital/src/main/java/com/persagy/dc/parser/service/impl/StringInfoParser.java

@@ -1,7 +1,7 @@
 package com.persagy.dc.parser.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.common.model.data.RegionValue;
 import com.persagy.dc.common.utils.RegionUtil;
 import com.persagy.dc.parser.entity.ParserResult;
@@ -18,56 +18,34 @@ import java.util.stream.Collectors;
 public class StringInfoParser extends AbstractInfoDataParser{
 
     @Override
-    protected boolean validateDefine(ParserResult result) {
-        boolean regionFlag = BooleanUtil.isTrue(result.getInfoDefine().getRegionFlag());
+    protected void validateDefine(ParserResult result) throws IOException {
         // 字符串类型不支持区间格式
-        if(regionFlag) {
-            result.addErrorMsg("信息点[{}]定义有误,STRING类型不允许定义区间!", result.getInfoDefine().getCode());
-            return false;
+        if(result.isRegion()) {
+            throw new BusinessException(StrUtil.format("信息点[{}]定义有误,STRING类型不允许定义区间!", result.getInfoDefine().getCode()));
         }
         // 数据源 - 应为区间列表格式
-        try {
-            formatRegionListValue(result.getInfoDefine().getDataSource(), Integer.class);
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]定义有误,数据源格式有误!", result.getInfoDefine().getCode());
-            return false;
-        }
-        return true;
+        formatRegionListValue(result.getInfoDefine().getDataSource(), Integer.class);
     }
 
     @Override
-    protected boolean validateValue(ParserResult result) {
-        boolean multiFlag = BooleanUtil.isTrue(result.getInfoDefine().getMultipleFlag());
-        try {
-            // 数据源定义信息
-            List<RegionValue<Integer>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), Integer.class);
-            // 复数
-            if(multiFlag) {
-                List<String> valueList = formatListValue(result.getValueInfo(), String.class);
-                if(CollUtil.isNotEmpty(dataSource)) {
-                    // 字符串长度校验
-                    List<Integer> lengthList = valueList.stream().map(String::length).collect(Collectors.toList());
-                    if(!RegionUtil.allContain(dataSource, lengthList)) {
-                        result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                        return false;
-                    }
-                }
-            } else {
-                // 单数
-                String value = formatValue(result.getValueInfo(), String.class);
-                if(CollUtil.isNotEmpty(dataSource)) {
-                    // 字符串长度校验
-                    if(!RegionUtil.anyContain(dataSource, value.length())) {
-                        result.addErrorMsg("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode());
-                        return false;
-                    }
-                }
+    protected void validateValue(ParserResult result) throws IOException {
+        // 数据源定义信息
+        List<RegionValue<Integer>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), Integer.class);
+        // 复数
+        if(result.isMulti()) {
+            List<String> valueList = formatListValue(result.getValueInfo(), String.class);
+            // 字符串长度校验
+            List<Integer> lengthList = valueList.stream().map(String::length).collect(Collectors.toList());
+            if(!RegionUtil.allContain(dataSource, lengthList)) {
+                throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
+            }
+        } else {
+            // 单数
+            String value = formatValue(result.getValueInfo(), String.class);
+            // 字符串长度校验
+            if(!RegionUtil.anyContain(dataSource, value.length())) {
+                throw new BusinessException(StrUtil.format("信息点[{}]数据有误,超出区间范围!", result.getInfoDefine().getCode()));
             }
-        } catch (IOException e) {
-            result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
-            return false;
         }
-        return true;
     }
-
 }

+ 40 - 16
dc-common/src/main/java/com/persagy/dc/common/utils/RegionUtil.java

@@ -15,12 +15,15 @@ public class RegionUtil {
 
     /**
      * 是否包含
-     * @param region 区间
+     * @param region 区间 - 为空表示不限制
      * @param value 待比较数据
      * @return value是否在region范围内
      */
     public static <T extends Comparable> boolean contain(RegionValue<T> region, T value) {
-        if(region == null || region.isEmpty() || value == null) {
+        if(region == null || region.isEmpty()) {
+            return true;
+        }
+        if(value == null) {
             return false;
         }
         // 区间有开始
@@ -48,12 +51,15 @@ public class RegionUtil {
 
     /**
      * 是否全部包含
-     * @param region 区间
+     * @param region 区间 - 为空表示不限制
      * @param valueList 待比较数据
      * @return valueList是否全部在region范围内
      */
     public static <T extends Comparable> boolean containAll(RegionValue<T> region, List<T> valueList) {
-        if(region == null || region.isEmpty() || CollUtil.isEmpty(valueList)) {
+        if(region == null || region.isEmpty()) {
+            return true;
+        }
+        if(CollUtil.isEmpty(valueList)) {
             return false;
         }
         for(T value:valueList) {
@@ -67,12 +73,15 @@ public class RegionUtil {
 
     /**
      * 是否全部包含
-     * @param regionList 区间列表
+     * @param regionList 区间列表 - 为空表示不限制
      * @param value 待比较数据
      * @return value是否在regionList范围内
      */
     public static <T extends Comparable> boolean anyContain(List<RegionValue<T>> regionList, T value) {
-        if(CollUtil.isEmpty(regionList) || value == null) {
+        if(CollUtil.isEmpty(regionList)) {
+            return true;
+        }
+        if(value == null) {
             return false;
         }
         for(RegionValue<T> region:regionList) {
@@ -85,12 +94,15 @@ public class RegionUtil {
 
     /**
      * 是否全部包含
-     * @param regionList 区间列表
+     * @param regionList 区间列表 - 为空表示不限制
      * @param valueList 待比较数据
      * @return valueList是否全部在regionList范围内
      */
     public static <T extends Comparable> boolean allContain(List<RegionValue<T>> regionList, List<T> valueList) {
-        if(CollUtil.isEmpty(regionList) || CollUtil.isEmpty(valueList)) {
+        if(CollUtil.isEmpty(regionList)) {
+            return true;
+        }
+        if(CollUtil.isEmpty(valueList)) {
             return false;
         }
         for(T value:valueList) {
@@ -105,12 +117,15 @@ public class RegionUtil {
 
     /**
      * 是否包含
-     * @param region 区间
+     * @param region 区间 - 为空表示不限制
      * @param value 待比较数据
      * @return value是否在region范围内
      */
     public static <T extends Comparable> boolean contains(RegionValue<T> region, RegionValue<T> value) {
-        if(region == null || region.isEmpty() || value == null || value.isEmpty()) {
+        if(region == null || region.isEmpty()) {
+            return true;
+        }
+        if(value == null || value.isEmpty()) {
             return false;
         }
         // value区间开始为空,region区间有开始,则一定不包含
@@ -147,12 +162,15 @@ public class RegionUtil {
 
     /**
      * 是否全部包含
-     * @param region 区间
+     * @param region 区间 - 为空表示不限制
      * @param valueList 待比较数据
      * @return valueList是否全部在region范围内
      */
     public static <T extends Comparable> boolean containsAll(RegionValue<T> region, List<RegionValue<T>> valueList) {
-        if(region == null || region.isEmpty() || CollUtil.isEmpty(valueList)) {
+        if(region == null || region.isEmpty()) {
+            return true;
+        }
+        if(CollUtil.isEmpty(valueList)) {
             return false;
         }
         for(RegionValue<T> value:valueList) {
@@ -166,12 +184,15 @@ public class RegionUtil {
 
     /**
      * 是否全部包含
-     * @param regionList 区间列表
+     * @param regionList 区间列表 - 为空表示不限制
      * @param value 待比较数据
      * @return value是否在regionList范围内
      */
     public static <T extends Comparable> boolean anyContains(List<RegionValue<T>> regionList, RegionValue<T> value) {
-        if(CollUtil.isEmpty(regionList) || value == null || value.isEmpty()) {
+        if(CollUtil.isEmpty(regionList)) {
+            return true;
+        }
+        if(value == null || value.isEmpty()) {
             return false;
         }
         for(RegionValue<T> region:regionList) {
@@ -184,12 +205,15 @@ public class RegionUtil {
 
     /**
      * 是否全部包含
-     * @param regionList 区间列表
+     * @param regionList 区间列表 - 为空表示不限制
      * @param valueList 待比较数据
      * @return valueList是否全部在regionList范围内
      */
     public static <T extends Comparable> boolean allContains(List<RegionValue<T>> regionList, List<RegionValue<T>> valueList) {
-        if(CollUtil.isEmpty(regionList) || CollUtil.isEmpty(valueList)) {
+        if(CollUtil.isEmpty(regionList)) {
+            return true;
+        }
+        if(CollUtil.isEmpty(valueList)) {
             return false;
         }
         for(RegionValue<T> value:valueList) {