|
@@ -0,0 +1,173 @@
|
|
|
+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.model.data.RegionValue;
|
|
|
+import com.persagy.dc.common.utils.RegionUtil;
|
|
|
+import com.persagy.dc.parser.entity.ParserResult;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+
|
|
|
+ * 日期信息点 处理器
|
|
|
+ * @author Charlie Yu
|
|
|
+ * @date 2021-07-12
|
|
|
+ */
|
|
|
+public class DateInfoParser extends AbstractInfoDataParser {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected boolean validateDefine(ParserResult result) {
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected boolean validateValue(ParserResult result) {
|
|
|
+ boolean multiFlag = BooleanUtil.isTrue(result.getInfoDefine().getMultipleFlag());
|
|
|
+ boolean regionFlag = BooleanUtil.isTrue(result.getInfoDefine().getRegionFlag());
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ result.addErrorMsg("信息点[{}]数据格式有误!", result.getInfoDefine().getCode());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 是否为指定格式日期区间
|
|
|
+ * @param formatter 格式
|
|
|
+ * @param regions 区间
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean matchRegionDataFormat(String formatter, List<RegionValue<String>> regions) {
|
|
|
+ if(CollUtil.isEmpty(regions) || StrUtil.isBlank(formatter)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ for(RegionValue<String> region:regions) {
|
|
|
+
|
|
|
+ if(matchDataFormat(formatter, region.getStart()) && matchDataFormat(formatter, region.getEnd())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 是否为指定格式日期
|
|
|
+ * @param formatter 格式
|
|
|
+ * @param valueList 日期字符串
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean matchDataFormat(String formatter, List<String> valueList) {
|
|
|
+ if(CollUtil.isEmpty(valueList) || StrUtil.isBlank(formatter)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ for(String value:valueList) {
|
|
|
+
|
|
|
+ if(matchDataFormat(formatter, value)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 是否为指定格式日期
|
|
|
+ * @param formatter 格式
|
|
|
+ * @param value 日期字符串
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean matchDataFormat(String formatter, String value) {
|
|
|
+
|
|
|
+ return StrUtil.isBlank(formatter) || StrUtil.isBlank(value) || formatter.length() == value.length();
|
|
|
+ }
|
|
|
+}
|