From f212f5c80218e364d7752a399cd1884358e7cfb8 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Mon, 30 Dec 2024 18:22:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=208.2.3=201.=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=BB=98=E8=AE=A4=E5=AE=89=E8=A3=85=E6=97=B6=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=20protocol=20=E5=B1=9E=E6=80=A7=E7=9A=84=20bug?= =?UTF-8?q?=E3=80=82=202.=20=E5=89=8D=E7=AB=AF=E6=9B=B4=E6=96=B0=E5=88=B0?= =?UTF-8?q?=208.2.15=E3=80=82=203.=20=E8=A7=84=E5=88=99=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8F=82=E6=95=B0=E7=B1=BB=E5=9E=8B=E4=B8=BA?= =?UTF-8?q?=E7=89=B9=E5=BE=81=E7=9A=84=E8=BE=93=E5=85=A5=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- erm.frontend/package.json | 2 +- gradle.properties | 2 +- io.sc.engine.mv.frontend/package.json | 2 +- .../sc/engine/rule/core/FieldValidator.java | 274 +++++++++++++----- .../generator/impl/IndicatorGenerator.java | 35 ++- .../generator/impl/ParameterGenerator.java | 50 +++- .../core/code/template/argument_render.tpl | 2 +- .../rule/core/code/template/impl/resource.tpl | 4 +- .../rule/core/code/template/lib_render.tpl | 76 +++++ .../engine/rule/core/enums/ValidatorType.java | 3 +- .../ExpressionIndicatorValidator.java | 30 ++ .../DateRangeParameterValidator.java | 1 + .../ExpressionParameterValidator.java | 24 ++ .../core/po/testcase/TestCaseParameter.java | 7 + .../sc/engine/rule/core/util/IdReplacer.java | 72 +++-- .../sc/engine/rule/core/i18n/enums.properties | 1 + .../rule/core/i18n/enums_tw_CN.properties | 1 + .../rule/core/i18n/enums_zh_CN.properties | 1 + io.sc.engine.rule.frontend/package.json | 2 +- .../src/i18n/messages.json | 1 + .../src/i18n/messages_tw_CN.json | 1 + .../src/i18n/messages_zh_CN.json | 1 + .../src/utils/PlaceHolder.ts | 5 +- .../src/views/lib/Lib.vue | 11 +- .../src/views/lib/ValidatorGrid.vue | 213 -------------- .../src/views/resources/Resources.vue | 2 +- .../src/views/resources/designer/Designer.vue | 6 +- .../resources/designer/DesignerDialog.vue | 7 +- .../views/shared/TestcaseParameterGrid.vue | 26 +- .../designer => shared}/Validator.vue | 62 +++- .../IndicatorValidatorWebController.java | 37 ++- .../IndicatorValidatorEntityConverter.java | 29 +- .../lib/entity/IndicatorValidatorEntity.java | 10 +- .../ExpressionIndicatorValidatorEntity.java | 62 ++++ .../impl/IndicatorValidatorServiceImpl.java | 23 ++ .../ExpressionIndicatorValidatorVo.java | 24 ++ .../ParameterValidatorWebController.java | 37 ++- .../ParameterValidatorEntityConverter.java | 27 +- .../server/model/entity/ParameterEntity.java | 2 +- .../entity/ParameterValidatorEntity.java | 13 +- .../RuleSetParameterProcessorEntity.java | 4 +- .../ExpressionParameterValidatorEntity.java | 62 ++++ .../service/ParameterValidatorService.java | 8 +- .../impl/ParameterValidatorServiceImpl.java | 27 +- .../ExpressionParameterValidatorVo.java | 24 ++ .../bean/LibTestCaseParameterBuilder.java | 1 + .../bean/ModelTestCaseParameterBuilder.java | 1 + .../entity/TestCaseParameterEntity.java | 11 + .../service/impl/TestCaseServiceImpl.java | 39 ++- .../testcase/vo/TestCaseParameterVo.java | 9 + ...20515__Rule Engine Database Schema DDL.xml | 6 +- io.sc.engine.st.frontend/package.json | 2 +- io.sc.platform.core.frontend/package.json | 2 +- .../src/platform/utils/Tools.ts | 13 + .../testcase/code-mirror/code-mirror.vue | 1 + .../template-project/package.json | 4 +- .../testcase/code-mirror/code-mirror.vue | 1 + io.sc.platform.developer.doc/package.json | 70 ++--- .../package.json | 2 +- io.sc.platform.lcdp.frontend/package.json | 2 +- .../package.json | 2 +- .../service/impl/LicenseServiceImpl.java | 16 + .../java/io/sc/platform/util/StringUtil.java | 17 ++ .../io/sc/platform/util/TypeConvertor.java | 24 +- 64 files changed, 1048 insertions(+), 488 deletions(-) create mode 100644 io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/validator/ExpressionIndicatorValidator.java create mode 100644 io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/ExpressionParameterValidator.java delete mode 100644 io.sc.engine.rule.frontend/src/views/lib/ValidatorGrid.vue rename io.sc.engine.rule.frontend/src/views/{resources/designer => shared}/Validator.vue (75%) create mode 100644 io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/validator/ExpressionIndicatorValidatorEntity.java create mode 100644 io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/validator/ExpressionIndicatorValidatorVo.java create mode 100644 io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/validator/ExpressionParameterValidatorEntity.java create mode 100644 io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/validator/ExpressionParameterValidatorVo.java diff --git a/erm.frontend/package.json b/erm.frontend/package.json index d69c8b9a..0141f0c8 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.14", + "platform-core": "8.2.15", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/gradle.properties b/gradle.properties index 7bff8e03..317065d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,7 +38,7 @@ application_version=1.0.0 platform_group=io.sc platform_version=8.2.3 platform_plugin_version=8.2.3 -platform_core_frontend_version=8.2.14 +platform_core_frontend_version=8.2.15 ########################################################### # dependencies version diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index cb59ee45..03515641 100644 --- a/io.sc.engine.mv.frontend/package.json +++ b/io.sc.engine.mv.frontend/package.json @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.14", + "platform-core": "8.2.15", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/FieldValidator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/FieldValidator.java index 2ff6842b..8ce61a37 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/FieldValidator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/FieldValidator.java @@ -1,7 +1,9 @@ package io.sc.engine.rule.core; import io.sc.platform.util.StringUtil; +import org.springframework.util.StringUtils; +import java.math.BigDecimal; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -12,34 +14,50 @@ import java.util.regex.Pattern; * */ public class FieldValidator { - private static final Pattern EMAIL_PATTERN = Pattern.compile("[a-zA-Z0-9_\\\\-\\\\.]+@[a-zA-Z0-9]+(\\\\.(com))"); + private static final Pattern EMAIL_PATTERN = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"); - public static boolean empty(String fieldCode,String fieldName,Object obj,ValidateResult result) { + public static boolean empty(String fieldCode,String fieldName,Object obj,String tip,ValidateResult result) { if(obj!=null) { - result.error(fieldCode,fieldName, "only null or empty string value can been accepted"); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode, fieldName, "only null or empty string value can been accepted"); + } return false; } return true; } - public static boolean notEmpty(String fieldCode,String fieldName,Object obj,ValidateResult result) { + public static boolean notEmpty(String fieldCode,String fieldName,Object obj,String tip,ValidateResult result) { if(obj==null) { - result.error(fieldCode,fieldName, "not null value can been accepted"); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode, fieldName, "not null value can been accepted"); + } return false; } if(obj instanceof String) { if(obj.toString().isEmpty()) { - result.error(fieldCode,fieldName, "not empty string value can been accepted"); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode, fieldName, "not empty string value can been accepted"); + } return false; } } return true; } - public static boolean trueValue(String fieldCode,String fieldName,Object obj,ValidateResult result) { + public static boolean trueValue(String fieldCode,String fieldName,Object obj,String tip,ValidateResult result) { if(obj instanceof Boolean) { if(!((Boolean)obj)) { - result.error(fieldCode,fieldName, "true value can been accepted"); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode, fieldName, "true value can been accepted"); + } return false; }else { return true; @@ -49,10 +67,14 @@ public class FieldValidator { return false; } - public static boolean falseValue(String fieldCode,String fieldName,Object obj,ValidateResult result) { + public static boolean falseValue(String fieldCode,String fieldName,Object obj,String tip,ValidateResult result) { if(obj instanceof Boolean) { if(((Boolean)obj)) { - result.error(fieldCode,fieldName, "false value can been accepted"); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode, fieldName, "false value can been accepted"); + } return false; }else { return true; @@ -61,139 +83,231 @@ public class FieldValidator { result.error(fieldCode,fieldName, "only boolean value can been accepted"); return false; } - - public static boolean integerRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Integer min,Integer max,Boolean maxInclude,ValidateResult result) { - if(obj instanceof Integer) { - if(min==null && max==null) { - return true; - } - String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); - Integer value =(Integer)obj; - if((min!=null && valuemax)) { - result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage)); - return false; + + public static boolean numberRange(String fieldCode,String fieldName,Number obj,Boolean minInclude,Number min,Number max,Boolean maxInclude,String tip,ValidateResult result){ + if(min==null && max==null) { + return true; + } + String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); + double value =obj.doubleValue(); + double minValue =min.doubleValue(); + double maxValue =max.doubleValue(); + if((min!=null && valuemaxValue)) { + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); }else { - if((minInclude==null || !minInclude) && value==min){ + result.error(fieldCode, fieldName, StringUtil.format("integer ${0} can been accepted", errorMessage)); + } + return false; + }else { + if((minInclude==null || !minInclude) && value==minValue){ + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage)); - return false; } - if((maxInclude!=null || !maxInclude) && value==max){ + return false; + } + if((maxInclude==null || !maxInclude) && value==maxValue){ + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage)); - return false; } - return true; - } - } - result.error(fieldCode,fieldName, "only integer value can been accepted"); - return false; - } - - public static boolean decimalRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Double min,Double max,Boolean maxInclude,ValidateResult result) { - if(obj instanceof Double) { - if(min==null && max==null) { - return true; - } - String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); - Double value =(Double)obj; - if((min!=null && valuemax)) { - result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage)); return false; - }else { - if((minInclude==null || !minInclude) && value==min){ - result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage)); - return false; - } - if((maxInclude!=null || !maxInclude) && value==max){ - result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage)); - return false; - } - return true; } + return true; } - result.error(fieldCode,fieldName, "only double value can been accepted"); - return false; } + +// public static boolean integerRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Long min,Long max,Boolean maxInclude,String tip,ValidateResult result) { +// if(obj instanceof Integer || obj instanceof Long) { +// if(min==null && max==null) { +// return true; +// } +// String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); +// Long value =(Long)obj; +// if((min!=null && valuemax)) { +// if(StringUtils.hasText(tip)){ +// result.error(fieldCode, fieldName, tip); +// }else { +// result.error(fieldCode, fieldName, StringUtil.format("integer ${0} can been accepted", errorMessage)); +// } +// return false; +// }else { +// if((minInclude==null || !minInclude) && value==min){ +// if(StringUtils.hasText(tip)){ +// result.error(fieldCode, fieldName, tip); +// }else { +// result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage)); +// } +// return false; +// } +// if((maxInclude!=null || !maxInclude) && value==max){ +// if(StringUtils.hasText(tip)){ +// result.error(fieldCode, fieldName, tip); +// }else { +// result.error(fieldCode,fieldName, StringUtil.format("integer ${0} can been accepted",errorMessage)); +// } +// return false; +// } +// return true; +// } +// } +// result.error(fieldCode,fieldName, "only integer value can been accepted"); +// return false; +// } +// +// public static boolean decimalRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Double min,Double max,Boolean maxInclude,String tip,ValidateResult result) { +// if(obj instanceof Double || obj instanceof BigDecimal) { +// if(min==null && max==null) { +// return true; +// } +// String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); +// Double value =(Double)obj; +// if((min!=null && valuemax)) { +// if(StringUtils.hasText(tip)){ +// result.error(fieldCode, fieldName, tip); +// }else { +// result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage)); +// } +// return false; +// }else { +// if((minInclude==null || !minInclude) && value==min){ +// if(StringUtils.hasText(tip)){ +// result.error(fieldCode, fieldName, tip); +// }else { +// result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage)); +// } +// return false; +// } +// if((maxInclude!=null || !maxInclude) && value==max){ +// if(StringUtils.hasText(tip)){ +// result.error(fieldCode, fieldName, tip); +// }else { +// result.error(fieldCode,fieldName, StringUtil.format("decimal ${0} can been accepted",errorMessage)); +// } +// return false; +// } +// return true; +// } +// } +// result.error(fieldCode,fieldName, "only double value can been accepted"); +// return false; +// } - public static boolean lengthRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Integer min,Integer max,Boolean maxInclude,ValidateResult result) { + public static boolean lengthRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Integer min,Integer max,Boolean maxInclude,String tip,ValidateResult result) { + if(min==null && max==null) { + return true; + } + String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); if(obj instanceof String) { - if(min==null && max==null) { - return true; - } - String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); String value =(String)obj; if((min!=null && value.length()max)) { - result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage)); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage)); + } return false; }else { if((minInclude==null || !minInclude) && value.length()==min){ - result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage)); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage)); + } return false; } - if((maxInclude!=null || !maxInclude) && value.length()==max){ - result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage)); + if((maxInclude==null || !maxInclude) && value.length()==max){ + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage)); + } return false; } return true; } } - result.error(fieldCode,fieldName, "only string value can been accepted"); + result.error(fieldCode,fieldName, StringUtil.format("length ${0} can been accepted",errorMessage)); return false; } - - public static boolean dateRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Date min,Date max,Boolean maxInclude,ValidateResult result) { + + public static boolean dateRange(String fieldCode,String fieldName,Object obj,Boolean minInclude,Date min,Date max,Boolean maxInclude,String tip,ValidateResult result) { + if(min==null && max==null) { + return true; + } + String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); if(obj instanceof Date) { - if(min==null && max==null) { - return true; - } - String errorMessage =getRangeRestrictionMessage(minInclude,min,max,maxInclude); Date value =(Date)obj; if((min!=null && value.getTime()max.getTime())) { - result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage)); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage)); + } return false; }else { if((minInclude==null || !minInclude) && value.getTime()==min.getTime()){ - result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage)); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage)); + } return false; } - if((maxInclude!=null || !maxInclude) && value.getTime()==max.getTime()){ - result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage)); + if((maxInclude==null || !maxInclude) && value.getTime()==max.getTime()){ + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage)); + } return false; } return true; } } - result.error(fieldCode,fieldName, "only date value can been accepted"); + result.error(fieldCode,fieldName, StringUtil.format("date ${0} can been accepted",errorMessage)); return false; } - public static boolean mail(String fieldCode,String fieldName,Object obj,ValidateResult result) { + public static boolean mail(String fieldCode,String fieldName,Object obj,String tip,ValidateResult result) { if(obj instanceof String) { String value =(String)obj; Matcher m = EMAIL_PATTERN.matcher(value); if(!m.matches()) { - result.error(fieldCode,fieldName, "only email address can been accepted"); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, "only email address can been accepted"); + } return false; }else { return true; } } - result.error(fieldCode,fieldName, "only string value can been accepted"); + result.error(fieldCode,fieldName, "only email address can been accepted"); return false; } - public static boolean pattern(String fieldCode,String fieldName,Object obj,String pattern,ValidateResult result) { + public static boolean pattern(String fieldCode,String fieldName,Object obj,String pattern,String tip,ValidateResult result) { if(obj instanceof String) { String value =(String)obj; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(value); if(!m.matches()) { - result.error(fieldCode,fieldName, "only string value matched " + pattern + " pattern can been accepted"); + if(StringUtils.hasText(tip)){ + result.error(fieldCode, fieldName, tip); + }else { + result.error(fieldCode,fieldName, "only string value matched " + pattern + " pattern can been accepted"); + } return false; }else { return true; } } - result.error(fieldCode,fieldName, "only string value can been accepted"); + result.error(fieldCode,fieldName, "only string value matched " + pattern + " pattern can been accepted"); return false; } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java index 6a5586a0..1b750e8f 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java @@ -8,6 +8,7 @@ import io.sc.engine.rule.core.po.lib.validator.*; import io.sc.engine.rule.core.po.model.Parameter; import io.sc.engine.rule.core.po.model.ParameterValidator; import io.sc.engine.rule.core.po.model.validator.*; +import io.sc.engine.rule.core.util.GroovyExpressionReplacer; import io.sc.engine.rule.core.util.IdReplacer; import io.sc.engine.rule.core.util.ValueTypeUtil; import io.sc.platform.util.CollectionUtil; @@ -74,14 +75,14 @@ public class IndicatorGenerator { variables.put("fieldName",IdReplacer.fieldName(code)); variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); if (indicator.getValueTypeIsList()) { - String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),new TypeReference>(){}); //${name}"; + String tpl ="this.${fieldName} =TypeConvertor.getValue(map.get('${code}'),new TypeReference>(){}); //${name}"; sb.append(StringUtil.format(tpl,variables)).append("\n"); } else { - String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}"; + String tpl ="this.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}"; sb.append(StringUtil.format(tpl,variables)).append("\n"); } if (!ValueTypeUtil.isBase(valueType)) { - String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); }"; + String tpl ="if(this.${fieldName}!=null) { this.${fieldName}.init(); }"; sb.append(StringUtil.format(tpl,variables)).append("\n"); } } @@ -123,20 +124,21 @@ public class IndicatorGenerator { variables.put("code",code); variables.put("name",name); variables.put("fieldName",IdReplacer.fieldName(code)); + variables.put("tip",StringUtils.hasText(validator.getTip())?"'''" + validator.getTip() + "'''" :"null"); if(validator instanceof EmptyIndicatorValidator){ - String tpl ="FieldValidator.empty('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.empty('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof NotEmptyIndicatorValidator){ - String tpl ="FieldValidator.notEmpty('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.notEmpty('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof TrueIndicatorValidator){ - String tpl ="FieldValidator.trueValue('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.trueValue('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof FalseIndicatorValidator){ - String tpl ="FieldValidator.falseValue('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.falseValue('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof EmailIndicatorValidator){ - String tpl ="FieldValidator.mail('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.mail('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof IntegerRangeIndicatorValidator){ IntegerRangeIndicatorValidator integerRangeIndicatorValidator =(IntegerRangeIndicatorValidator)validator; @@ -144,7 +146,7 @@ public class IndicatorGenerator { variables.put("min",StringUtils.hasText(integerRangeIndicatorValidator.getMinValue())?integerRangeIndicatorValidator.getMinValue():"null"); variables.put("max",StringUtils.hasText(integerRangeIndicatorValidator.getMaxValue())?integerRangeIndicatorValidator.getMaxValue():"null"); variables.put("maxInclude",integerRangeIndicatorValidator.getMaxInclude()); - String tpl ="FieldValidator.integerRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.integerRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof DecimalRangeIndicatorValidator){ DecimalRangeIndicatorValidator decimalRangeIndicatorValidator =(DecimalRangeIndicatorValidator)validator; @@ -152,7 +154,7 @@ public class IndicatorGenerator { variables.put("min",StringUtils.hasText(decimalRangeIndicatorValidator.getMinValue())?decimalRangeIndicatorValidator.getMinValue():"null"); variables.put("max",StringUtils.hasText(decimalRangeIndicatorValidator.getMaxValue())?decimalRangeIndicatorValidator.getMaxValue():"null"); variables.put("maxInclude",decimalRangeIndicatorValidator.getMaxInclude()); - String tpl ="FieldValidator.decimalRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.decimalRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof LengthRangeIndicatorValidator){ LengthRangeIndicatorValidator lengthRangeIndicatorValidator =(LengthRangeIndicatorValidator)validator; @@ -160,7 +162,7 @@ public class IndicatorGenerator { variables.put("min",StringUtils.hasText(lengthRangeIndicatorValidator.getMinValue())?lengthRangeIndicatorValidator.getMinValue():"null"); variables.put("max",StringUtils.hasText(lengthRangeIndicatorValidator.getMaxValue())?lengthRangeIndicatorValidator.getMaxValue():"null"); variables.put("maxInclude",lengthRangeIndicatorValidator.getMaxInclude()); - String tpl ="FieldValidator.lengthRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.lengthRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof DateRangeIndicatorValidator){ DateRangeIndicatorValidator dateRangeIndicatorValidator =(DateRangeIndicatorValidator)validator; @@ -168,13 +170,20 @@ public class IndicatorGenerator { variables.put("min",StringUtils.hasText(dateRangeIndicatorValidator.getMinValue())?"DateUtil.parseDate(\"" + dateRangeIndicatorValidator.getMinValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null"); variables.put("max",StringUtils.hasText(dateRangeIndicatorValidator.getMaxValue())?"DateUtil.parseDate(\"" + dateRangeIndicatorValidator.getMaxValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null"); variables.put("maxInclude",dateRangeIndicatorValidator.getMaxInclude()); - String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof PatternIndicatorValidator){ PatternIndicatorValidator patternIndicatorValidator =(PatternIndicatorValidator)validator; variables.put("pattern",StringUtils.hasText(patternIndicatorValidator.getPattern())?patternIndicatorValidator.getPattern():"null"); - String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},'${pattern}',result);"; + String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},'${pattern}',${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); + }else if(validator instanceof ExpressionIndicatorValidator){ + ExpressionIndicatorValidator expressionIndicatorValidator =(ExpressionIndicatorValidator)validator; + String condition =GroovyExpressionReplacer.groovy(expressionIndicatorValidator.getExpression(),null).replace("arg.","this."); + sb.append("if(!(").append(condition).append(")){"); + String tpl ="result.error('${code}','${name}',${tip});"; + sb.append(StringUtil.format(tpl,variables)); + sb.append("}").append("\n"); } } } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java index 283b9ee9..155a174d 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java @@ -4,7 +4,9 @@ import io.sc.engine.rule.core.RuleSetResult; import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.po.model.Parameter; import io.sc.engine.rule.core.po.model.ParameterValidator; +import io.sc.engine.rule.core.po.model.parameter.IndicatorParameter; import io.sc.engine.rule.core.po.model.validator.*; +import io.sc.engine.rule.core.util.GroovyExpressionReplacer; import io.sc.engine.rule.core.util.IdReplacer; import io.sc.engine.rule.core.util.ValueTypeUtil; import io.sc.platform.util.CollectionUtil; @@ -120,20 +122,21 @@ public class ParameterGenerator { variables.put("code",code); variables.put("name",name); variables.put("fieldName",IdReplacer.fieldName(code)); + variables.put("tip",StringUtils.hasText(validator.getTip())?"'''" + validator.getTip() + "'''" :"null"); if(validator instanceof EmptyParameterValidator){ - String tpl ="FieldValidator.empty('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.empty('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof NotEmptyParameterValidator){ - String tpl ="FieldValidator.notEmpty('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.notEmpty('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof TrueParameterValidator){ - String tpl ="FieldValidator.trueValue('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.trueValue('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof FalseParameterValidator){ - String tpl ="FieldValidator.falseValue('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.falseValue('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof EmailParameterValidator){ - String tpl ="FieldValidator.mail('${code}','${name}',this.${fieldName},result);"; + String tpl ="FieldValidator.mail('${code}','${name}',this.${fieldName},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof IntegerRangeParameterValidator){ IntegerRangeParameterValidator integerRangeParameterValidator =(IntegerRangeParameterValidator)validator; @@ -141,7 +144,7 @@ public class ParameterGenerator { variables.put("min",StringUtils.hasText(integerRangeParameterValidator.getMinValue())?integerRangeParameterValidator.getMinValue():"null"); variables.put("max",StringUtils.hasText(integerRangeParameterValidator.getMaxValue())?integerRangeParameterValidator.getMaxValue():"null"); variables.put("maxInclude",integerRangeParameterValidator.getMaxInclude()); - String tpl ="FieldValidator.integerRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.numberRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof DecimalRangeParameterValidator){ DecimalRangeParameterValidator decimalRangeParameterValidator =(DecimalRangeParameterValidator)validator; @@ -149,7 +152,7 @@ public class ParameterGenerator { variables.put("min",StringUtils.hasText(decimalRangeParameterValidator.getMinValue())?decimalRangeParameterValidator.getMinValue():"null"); variables.put("max",StringUtils.hasText(decimalRangeParameterValidator.getMaxValue())?decimalRangeParameterValidator.getMaxValue():"null"); variables.put("maxInclude",decimalRangeParameterValidator.getMaxInclude()); - String tpl ="FieldValidator.decimalRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.numberRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof LengthRangeParameterValidator){ LengthRangeParameterValidator lengthRangeParameterValidator =(LengthRangeParameterValidator)validator; @@ -157,7 +160,7 @@ public class ParameterGenerator { variables.put("min",StringUtils.hasText(lengthRangeParameterValidator.getMinValue())?lengthRangeParameterValidator.getMinValue():"null"); variables.put("max",StringUtils.hasText(lengthRangeParameterValidator.getMaxValue())?lengthRangeParameterValidator.getMaxValue():"null"); variables.put("maxInclude",lengthRangeParameterValidator.getMaxInclude()); - String tpl ="FieldValidator.lengthRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.lengthRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof DateRangeParameterValidator){ DateRangeParameterValidator dateRangeParameterValidator =(DateRangeParameterValidator)validator; @@ -165,13 +168,20 @@ public class ParameterGenerator { variables.put("min",StringUtils.hasText(dateRangeParameterValidator.getMinValue())?"DateUtil.parseDate(\"" + dateRangeParameterValidator.getMinValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null"); variables.put("max",StringUtils.hasText(dateRangeParameterValidator.getMaxValue())?"DateUtil.parseDate(\"" + dateRangeParameterValidator.getMaxValue() + "\",DateUtil.yyyy_MM_dd_HH_mm_ss)":"null"); variables.put("maxInclude",dateRangeParameterValidator.getMaxInclude()); - String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},result);"; + String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},${minInclude},${min},${max},${maxInclude},${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); }else if(validator instanceof PatternParameterValidator){ PatternParameterValidator patternParameterValidator =(PatternParameterValidator)validator; - variables.put("pattern",StringUtils.hasText(patternParameterValidator.getPattern())?patternParameterValidator.getPattern():"null"); - String tpl ="FieldValidator.dateRange('${code}','${name}',this.${fieldName},'${pattern}',result);"; + variables.put("pattern",StringUtils.hasText(patternParameterValidator.getPattern())?patternParameterValidator.getPattern().replace("\\","\\\\"):"null"); + String tpl ="FieldValidator.pattern('${code}','${name}',this.${fieldName},'''${pattern}''',${tip},result);"; sb.append(StringUtil.format(tpl,variables)).append("\n"); + }else if(validator instanceof ExpressionParameterValidator){ + ExpressionParameterValidator expressionParameterValidator =(ExpressionParameterValidator)validator; + String condition =GroovyExpressionReplacer.groovy(expressionParameterValidator.getExpression(),null).replace("arg.","this."); + sb.append("if(!(").append(condition).append(")){"); + String tpl ="result.error('${code}','${name}',${tip});"; + sb.append(StringUtil.format(tpl,variables)); + sb.append("}").append("\n"); } } } @@ -251,4 +261,22 @@ public class ParameterGenerator { } return sb.toString(); } + + public static String generateMergeParameterValueFromIndicatorLib(List parameters) { + if (!CollectionUtil.hasElements(parameters)) { + return null; + } + StringBuilder sb = new StringBuilder(""); + for (Parameter parameter : parameters) { + if(ParameterType.INDICATOR.equals(parameter.getType())){ + IndicatorParameter indicatorParameter =(IndicatorParameter)parameter; + sb.append("this.").append(IdReplacer.fieldName(parameter.getCode())); + sb.append(" ="); + sb.append("libs.get(\"").append(IdReplacer.varName(indicatorParameter.getLibCode(),indicatorParameter.getLibVersion())).append("\")"); + sb.append(".").append(IdReplacer.fieldName(indicatorParameter.getIndicatorCode())); + sb.append(";").append("\n"); + } + } + return sb.toString(); + } } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/argument_render.tpl b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/argument_render.tpl index 61097356..c46af8bf 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/argument_render.tpl +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/argument_render.tpl @@ -25,7 +25,7 @@ class Argument { } public void mergeParameterValueFromIndicatorLib(Map libs){ - + #(tabs(ParameterGenerator.generateMergeParameterValueFromIndicatorLib(model.getAllParameters()),2)) } public ResourceResult toResult(){ diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl index 79389ae0..28e5ee99 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl @@ -68,8 +68,8 @@ class #(className(resource.code,resource.version)) { #for(lib : libs) if(log.isDebugEnabled()){log.debug("初始化指标库 : #(lib.name)_V#(lib.version)");} - #(className(lib.code,lib.version)) #(varName(lib.code,lib.version)) =new #(className)(); - #(className(lib.code,lib.version)).convertArgument(data); + #(className(lib.code,lib.version)) #(varName(lib.code,lib.version)) =new #(className(lib.code,lib.version))(); + #(varName(lib.code,lib.version)).convertArgument(data); #end //初始化模型参数 diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl index 4c0ead33..fa12df21 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl @@ -1,3 +1,79 @@ #define renderLib(lib) +@JsonIgnoreProperties(ignoreUnknown=true) +class #(className(lib.code,lib.version)) { + private static final Logger log =LoggerFactory.getLogger(#(className(lib.code,lib.version)).class); + #(tabs(IndicatorGenerator.generateFields(lib.indicators),1)) + //通过输入参数构建指标库对象 + public void convertArgument(Map map){ + #(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators),2)) + } + + public void convertArgument(String json){ + #(tabs(IndicatorGenerator.generateConvertorFromJson(lib.indicators),2)) + } + + public void execute() throws Exception{ + #for(indicator : lib.indicators) + #if(indicator.type.toString()=="INDICATOR" && indicator.processors!=null && indicator.processors.size()>0) + #(methodName(indicator.code))();//#(indicator.name),#(indicator.type) + #end + #end + } + + public void validate(ValidateResult result) { + #(tabs(IndicatorGenerator.generateValidator(lib.indicators),2)) + } + +#for(indicator : lib.indicators) + #if(indicator.type.toString()=="INDICATOR" && indicator.processors!=null && indicator.processors.size()>0) + #set(parameter=indicator) + public void #(methodName(indicator.code))(){ + #(className(lib.code,lib.version)) arg =this; + #for(processor : indicator.processors) + if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");} + #switch (processor.type.toString()) + #case ("ARITHMETIC") + //算数运算 + #include("/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl") + if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",arg.#(fieldName(parameter.code)));} + #case ("CONDITION_RANGE") + //条件分段函数 + #include("/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl") + if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));} + #case ("GROOVY_SCRIPT") + //Groovy 脚本 + #include("/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl") + #case ("HTTP_REQUEST") + //Http 请求 + #include("/io/sc/engine/rule/core/code/template/processor/http_request.tpl") + #case ("MATH_FORMULA") + //数学公式 + #include("/io/sc/engine/rule/core/code/template/processor/math_formula.tpl") + if(log.isDebugEnabled()){log.debug(" 数学公式运算结果 : {}",arg.#(fieldName(parameter.code)));} + #case ("NUMBER_RANGE") + //数值分段函数 + #include("/io/sc/engine/rule/core/code/template/processor/numberRange.tpl") + if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));} + #case ("OBJECT_PROPERTIES") + //对象属性赋值函数 + #include("/io/sc/engine/rule/core/code/template/processor/object_properties.tpl") + if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",arg.#(fieldName(parameter.code)));} + #case ("SQL") + //SQL 运算 + #include("/io/sc/engine/rule/core/code/template/processor/sql.tpl") + #case ("TERNARY") + //三元运算 + #include("/io/sc/engine/rule/core/code/template/processor/ternary.tpl") + if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",arg.#(fieldName(parameter.code)));} + #case ("WHEN_THEN") + //WhenThen 运算 + #include("/io/sc/engine/rule/core/code/template/processor/when_then.tpl") + if(log.isDebugEnabled()){log.debug(" WhenThen 运算结果 : {}",arg.#(fieldName(parameter.code)));} + #end + #end + } + #end +#end +} #end diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValidatorType.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValidatorType.java index 1a228c1f..8e50f776 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValidatorType.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValidatorType.java @@ -13,5 +13,6 @@ public enum ValidatorType { EMAIL, //邮件 LENGTH_RANGE, //长度范围 DATE_RANGE, //日期范围 - PATTERN; //正则表达式 + PATTERN, //正则表达式 + EXPRESSION; //表达式 } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/validator/ExpressionIndicatorValidator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/validator/ExpressionIndicatorValidator.java new file mode 100644 index 00000000..a1b2cbf2 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/validator/ExpressionIndicatorValidator.java @@ -0,0 +1,30 @@ +package io.sc.engine.rule.core.po.lib.validator; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeName; +import io.sc.engine.rule.core.enums.ValidatorType; +import io.sc.engine.rule.core.po.lib.IndicatorValidator; + +/** + * 验证器(表达式) + * @author wangshaoping + * + */ +@JsonTypeName("EXPRESSION") +@JsonIgnoreProperties(ignoreUnknown=true) +public class ExpressionIndicatorValidator extends IndicatorValidator { + private String expression; + + @Override + public ValidatorType getType() { + return ValidatorType.EXPRESSION; + } + + public String getExpression() { + return expression; + } + + public void setExpression(String expression) { + this.expression = expression; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/DateRangeParameterValidator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/DateRangeParameterValidator.java index 1e65c913..872b0308 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/DateRangeParameterValidator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/DateRangeParameterValidator.java @@ -1,5 +1,6 @@ package io.sc.engine.rule.core.po.model.validator; +import io.sc.engine.rule.core.enums.ValidatorType; import io.sc.engine.rule.core.po.model.RangeParameterValidator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/ExpressionParameterValidator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/ExpressionParameterValidator.java new file mode 100644 index 00000000..7fd75bd9 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/ExpressionParameterValidator.java @@ -0,0 +1,24 @@ +package io.sc.engine.rule.core.po.model.validator; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeName; +import io.sc.engine.rule.core.po.model.ParameterValidator; + +/** + * 验证器(表达式) + * @author wangshaoping + * + */ +@JsonTypeName("EXPRESSION") +@JsonIgnoreProperties(ignoreUnknown=true) +public class ExpressionParameterValidator extends ParameterValidator { + private String expression; + + public String getExpression() { + return expression; + } + + public void setExpression(String expression) { + this.expression = expression; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/TestCaseParameter.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/TestCaseParameter.java index 2f7f0887..fb09fee9 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/TestCaseParameter.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/TestCaseParameter.java @@ -9,6 +9,7 @@ public class TestCaseParameter { protected String id; //ID protected String code; //对应的参数代码 protected String inputValue; //参数输入值 + protected String inputValueValidateMessage;//参数输入值检验结果 protected String expectValue; //参数期望值 protected String resultValue; //参数实际执行结果值 protected TestResult testResult;//最近一次执行测试用例的结果 @@ -46,6 +47,12 @@ public class TestCaseParameter { public void setInputValue(String inputValue) { this.inputValue = inputValue; } + public String getInputValueValidateMessage() { + return inputValueValidateMessage; + } + public void setInputValueValidateMessage(String inputValueValidateMessage) { + this.inputValueValidateMessage = inputValueValidateMessage; + } public String getExpectValue() { return expectValue; } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java index a7165bcb..01a02fd6 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java @@ -30,6 +30,10 @@ public class IdReplacer { "transient", "try", "void", "volatile", "while" }; private static String[] 标志符 =new String[] {"null","true","false"}; + + public static boolean isKeywords(String word){ + return Arrays.binarySearch(关键字, word)>-1 || Arrays.binarySearch(标志符, word)>-1; + } /** * 将字符串转换成合法的Java类名 @@ -40,24 +44,42 @@ public class IdReplacer { if(!StringUtils.hasText(code)){ return "Object"; } + if(isKeywords(code)){ + return CLASS_NAME_PREFIX + code; + } if(!code.contains(".")) { return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code)); + }else{ + if(ValueTypeUtil.isBase(code)){ + return ValueTypeUtil.getSimpleName(code); + } + return code; } - return code; } public static String className(String code,Integer version) { if(!StringUtils.hasText(code)){ return "Object"; } + if(isKeywords(code)) { + if(version!=null){ + return CLASS_NAME_PREFIX + code + "_V" + version; + }else{ + return CLASS_NAME_PREFIX + code; + } + } if(!code.contains(".")) { if(version!=null){ return StringUtil.capitalize(code) + "_V" + version; }else{ return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code)); } + }else{ + if(ValueTypeUtil.isBase(code)){ + return ValueTypeUtil.getSimpleName(code); + } + return code; } - return code; } /** @@ -66,12 +88,14 @@ public class IdReplacer { * @return 合法的Java方法名 */ public static String methodName(String code) { - if(code!=null) { - if(Arrays.binarySearch(关键字, code)>-1 || Arrays.binarySearch(标志符, code)>-1) { - return METHOD_NAME_PREFIX + code; - } + if (!StringUtils.hasText(code)) { + return null; + } + if(isKeywords(code)) { + return METHOD_NAME_PREFIX + code; + }else{ + return StringUtil.unCapitalize(code); } - return code; } /** @@ -80,12 +104,14 @@ public class IdReplacer { * @return 合法的Java字段名 */ public static String fieldName(String code) { - if(code!=null) { - if(Arrays.binarySearch(关键字, code)>-1 || Arrays.binarySearch(标志符, code)>-1) { - return FIELD_NAME_PREFIX + code; - } + if(!StringUtils.hasText(code)) { + return null; + } + if(isKeywords(code)) { + return FIELD_NAME_PREFIX + code; + }else { + return StringUtil.unCapitalize(code); } - return code; } /** @@ -94,12 +120,14 @@ public class IdReplacer { * @return 合法的Java变量名 */ public static String varName(String code) { - if(code!=null) { - if(Arrays.binarySearch(关键字, code)>-1 || Arrays.binarySearch(标志符, code)>-1) { - return VAR_NAME_PREFIX + code; - } + if(!StringUtils.hasText(code)) { + return null; + } + if(isKeywords(code)) { + return VAR_NAME_PREFIX + code; + }else { + return StringUtil.unCapitalize(code); } - return code; } /** @@ -109,10 +137,14 @@ public class IdReplacer { * @return 合法的Java变量名 */ public static String varName(String code,Integer version) { - if(code!=null && version!=null) { - return StringUtil.capitalize(code) + "_V" + version; + if(!StringUtils.hasText(code)) { + return null; + } + if(version!=null) { + return StringUtil.unCapitalize(code) + "_V" + version; + }else { + return StringUtil.capitalize(code); } - return StringUtil.capitalize(code); } /** diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties index a13facf9..b8ecbe9d 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties @@ -117,6 +117,7 @@ io.sc.engine.rule.core.enums.ValidatorType.EMAIL=Email io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE=Length Range io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE=Date Range io.sc.engine.rule.core.enums.ValidatorType.PATTERN=Regular Expression +io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION=Expression # \u6307\u6807\u7C7B\u578B\u679A\u4E3E io.sc.engine.rule.core.enums.IndicatorType.INTERFACE=Interface diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties index 2859d192..4b168157 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties @@ -117,6 +117,7 @@ io.sc.engine.rule.core.enums.ValidatorType.EMAIL=\u90F5\u7BB1 io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE=\u9577\u5EA6\u7BC4\u570D io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE=\u65E5\u671F\u7BC4\u570D io.sc.engine.rule.core.enums.ValidatorType.PATTERN=\u6B63\u5247\u8868\u9054\u5F0F +io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION=\u8868\u9054\u5F0F # \u6307\u6807\u7C7B\u578B\u679A\u4E3E io.sc.engine.rule.core.enums.IndicatorType.INTERFACE=\u63A5\u53E3 diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties index 375cb5e3..4fff15ea 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties @@ -117,6 +117,7 @@ io.sc.engine.rule.core.enums.ValidatorType.EMAIL=\u90AE\u7BB1 io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE=\u957F\u5EA6\u8303\u56F4 io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE=\u65E5\u671F\u8303\u56F4 io.sc.engine.rule.core.enums.ValidatorType.PATTERN=\u6B63\u5219\u8868\u8FBE\u5F0F +io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION=\u8868\u8FBE\u5F0F # \u6307\u6807\u7C7B\u578B\u679A\u4E3E io.sc.engine.rule.core.enums.IndicatorType.INTERFACE=\u63A5\u53E3 diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json index 75dd330b..d1672290 100644 --- a/io.sc.engine.rule.frontend/package.json +++ b/io.sc.engine.rule.frontend/package.json @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.14", + "platform-core": "8.2.15", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.engine.rule.frontend/src/i18n/messages.json b/io.sc.engine.rule.frontend/src/i18n/messages.json index d8e6f163..c96f315e 100644 --- a/io.sc.engine.rule.frontend/src/i18n/messages.json +++ b/io.sc.engine.rule.frontend/src/i18n/messages.json @@ -228,6 +228,7 @@ "re.testCaseParameter.grid.title": "Parameter List", "re.testCaseParameter.grid.entity.testCaseId": "Test Case ID", "re.testCaseParameter.grid.entity.inputValue": "Input Value", + "re.testCaseParameter.grid.entity.inputValueValidateMessage": "Validation", "re.testCaseParameter.grid.entity.expectValue": "Expect Value", "re.testCaseParameter.grid.entity.resultValue": "Result Value", "re.testCaseParameter.grid.entity.skipCheck": "Skip Check", diff --git a/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json b/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json index c7c010ac..ad46d7a7 100644 --- a/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json +++ b/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json @@ -228,6 +228,7 @@ "re.testCaseParameter.grid.title": "參數列表", "re.testCaseParameter.grid.entity.testCaseId": "試算用例ID", "re.testCaseParameter.grid.entity.inputValue": "輸入值", + "re.testCaseParameter.grid.entity.inputValueValidateMessage": "驗證結果", "re.testCaseParameter.grid.entity.expectValue": "期望值", "re.testCaseParameter.grid.entity.resultValue": "結果值", "re.testCaseParameter.grid.entity.skipCheck": "跳過檢查", diff --git a/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json b/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json index 786bff43..5abf0a3b 100644 --- a/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json +++ b/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json @@ -227,6 +227,7 @@ "re.testCaseParameter.grid.title": "参数列表", "re.testCaseParameter.grid.entity.testCaseId": "测试用例ID", "re.testCaseParameter.grid.entity.inputValue": "输入值", + "re.testCaseParameter.grid.entity.inputValueValidateMessage": "验证结果", "re.testCaseParameter.grid.entity.expectValue": "期望值", "re.testCaseParameter.grid.entity.resultValue": "结果值", "re.testCaseParameter.grid.entity.skipCheck": "跳过检查", diff --git a/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts b/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts index db6f29f2..330db0d3 100644 --- a/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts +++ b/io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts @@ -4,7 +4,8 @@ class PlaceHolder { static #prefix: string = ''; static #suffix: string = ''; public static replace(str: string, prefix?: string, suffix?: string) { - if (str) { + if (Tools.isString(str)) { + str = str.replace('<', '<'); if (Tools.isUndefinedOrNull(prefix)) { prefix = PlaceHolder.#prefix; } @@ -13,7 +14,7 @@ class PlaceHolder { } return str.replace(/\$\{(.+?)\}/g, prefix + '$1' + suffix); } - return ''; + return str; } } diff --git a/io.sc.engine.rule.frontend/src/views/lib/Lib.vue b/io.sc.engine.rule.frontend/src/views/lib/Lib.vue index 5351af29..79051319 100644 --- a/io.sc.engine.rule.frontend/src/views/lib/Lib.vue +++ b/io.sc.engine.rule.frontend/src/views/lib/Lib.vue @@ -64,12 +64,14 @@ > - diff --git a/io.sc.engine.rule.frontend/src/views/resources/Resources.vue b/io.sc.engine.rule.frontend/src/views/resources/Resources.vue index cce423f0..3d2f1bdd 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/Resources.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/Resources.vue @@ -22,7 +22,7 @@ " :data-url="Environment.apiContextPath('/api/re/resource')" :pageable="false" - :sort-by="['type', 'namec', '-lastModifyDate']" + :sort-by="['type', 'namec', 'version']" :toolbar-configure="{ noIcon: false }" :toolbar-actions="[ 'refresh', diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue index ba781607..109d5629 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue @@ -146,8 +146,10 @@ diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index e5765719..c01651b6 100644 --- a/io.sc.platform.core.frontend/template-project/package.json +++ b/io.sc.platform.core.frontend/template-project/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.2.14", + "version": "8.2.15", "description": "前端核心包,用于快速构建前端的脚手架", "private": false, "keywords": [], @@ -110,7 +110,7 @@ "mockjs": "1.1.0", "node-sql-parser": "5.3.4", "pinia": "2.2.6", - "platform-core": "8.2.14", + "platform-core": "8.2.15", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue index 85f4fc91..3c8834d8 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue @@ -24,4 +24,5 @@ const click = () => { const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); userDefinedFunctionsManager.load(); +console.log(Tools.escapeHtml('&')); diff --git a/io.sc.platform.developer.doc/package.json b/io.sc.platform.developer.doc/package.json index e31ea330..fbba44f1 100644 --- a/io.sc.platform.developer.doc/package.json +++ b/io.sc.platform.developer.doc/package.json @@ -1,36 +1,38 @@ { - "name": "io.sc.platform.developer.doc", - "version": "8.2.3", - "description": "", - "main": "index.js", - "scripts": { - "serve": "vuepress dev vuepress-src", - "//build": "vuepress build vuepress-src && rm -rf dist/public/io.sc.platform.developer.doc && mv dist/public/site/ dist/public/io.sc.platform.developer.doc/", - "//prod": "vuepress build vuepress-src && rm -rf dist/public/io.sc.platform.developer.doc && mv dist/public/site/ dist/public/io.sc.platform.developer.doc/", - "build": "cd .", - "prod": "cd .", - "clean": "platform clean dist ./node_modules ./pnpm-lock.yaml ./package-lock.json", - "sync": "platform sync" - }, - "keywords": [], - "author": "", - "license": "ISC", - "engines": { - "node": ">=18.19.0", - "pnpm": ">=7" - }, - "devDependencies": { - "sass": "1.81.0", - "sass-loader": "16.0.3", - "vue-loader": "17.4.2", - "@vuepress/bundler-webpack": "2.0.0-rc.15", - "@vuepress/theme-default": "2.0.0-rc.49", - "vuepress": "2.0.0-rc.15" - }, - "dependencies": { - "platform-core": "8.2.14", - "quasar": "2.17.4", - "vue": "3.5.13", - "vue-i18n": "10.0.4" - } + "name": "io.sc.platform.developer.doc", + "version": "8.2.3", + "description": "", + "main": "index.js", + "scripts": { + "serve": "vuepress dev vuepress-src", + "//build": "vuepress build vuepress-src && rm -rf dist/public/io.sc.platform.developer.doc && mv dist/public/site/ dist/public/io.sc.platform.developer.doc/", + "//prod": "vuepress build vuepress-src && rm -rf dist/public/io.sc.platform.developer.doc && mv dist/public/site/ dist/public/io.sc.platform.developer.doc/", + "build": "cd .", + "prod": "cd .", + "clean": "platform clean dist ./node_modules ./pnpm-lock.yaml ./package-lock.json", + "sync": "platform sync" + }, + "keywords": [ + + ], + "author": "", + "license": "ISC", + "engines": { + "node": ">=18.19.0", + "pnpm": ">=7" + }, + "devDependencies": { + "sass": "1.81.0", + "sass-loader": "16.0.3", + "vue-loader": "17.4.2", + "@vuepress/bundler-webpack": "2.0.0-rc.15", + "@vuepress/theme-default": "2.0.0-rc.49", + "vuepress": "2.0.0-rc.15" + }, + "dependencies": { + "platform-core": "8.2.15", + "quasar": "2.17.4", + "vue": "3.5.13", + "vue-i18n": "10.0.4" + } } \ No newline at end of file diff --git a/io.sc.platform.developer.frontend/package.json b/io.sc.platform.developer.frontend/package.json index c7fbc75b..2c2044cf 100644 --- a/io.sc.platform.developer.frontend/package.json +++ b/io.sc.platform.developer.frontend/package.json @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.14", + "platform-core": "8.2.15", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.lcdp.frontend/package.json b/io.sc.platform.lcdp.frontend/package.json index fc2e7a91..695575c6 100644 --- a/io.sc.platform.lcdp.frontend/package.json +++ b/io.sc.platform.lcdp.frontend/package.json @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.14", + "platform-core": "8.2.15", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.license.keygen.frontend/package.json b/io.sc.platform.license.keygen.frontend/package.json index f600b7d2..b15e39a8 100644 --- a/io.sc.platform.license.keygen.frontend/package.json +++ b/io.sc.platform.license.keygen.frontend/package.json @@ -111,7 +111,7 @@ "node-sql-parser": "5.3.4", "pinia": "2.2.6", "pinia-undo": "0.2.4", - "platform-core": "8.2.14", + "platform-core": "8.2.15", "quasar": "2.17.4", "sort-array": "5.0.0", "svg-path-commander": "2.1.5", diff --git a/io.sc.platform.license.keygen/src/main/java/io/sc/platform/license/keygen/service/impl/LicenseServiceImpl.java b/io.sc.platform.license.keygen/src/main/java/io/sc/platform/license/keygen/service/impl/LicenseServiceImpl.java index 80f50044..135ca61f 100644 --- a/io.sc.platform.license.keygen/src/main/java/io/sc/platform/license/keygen/service/impl/LicenseServiceImpl.java +++ b/io.sc.platform.license.keygen/src/main/java/io/sc/platform/license/keygen/service/impl/LicenseServiceImpl.java @@ -4,11 +4,15 @@ import io.sc.platform.license.keygen.jpa.entity.LicenseEntity; import io.sc.platform.license.keygen.jpa.repository.LicenseRepository; import io.sc.platform.license.keygen.service.LicenseService; import io.sc.platform.orm.service.impl.DaoServiceImpl; +import io.sc.platform.util.StringUtil; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import javax.transaction.Transactional; import java.util.Calendar; import java.util.Date; +import java.util.HashSet; +import java.util.Set; @Service("io.sc.platform.license.keygen.service.impl.LicenseServiceImpl") public class LicenseServiceImpl extends DaoServiceImpl implements LicenseService { @@ -27,6 +31,18 @@ public class LicenseServiceImpl extends DaoServiceImpl macs =new HashSet<>(); + String macAddresses =entity.getMacAddresses(); + if(StringUtils.hasText(macAddresses)){ + String[] splits =macAddresses.split(","); + if(splits!=null && splits.length>0){ + for(String split : splits){ + macs.add(split); + } + entity.setMacAddresses(StringUtil.combine(",",macs)); + } + } + Calendar startCalendar = Calendar.getInstance(); startCalendar.set(Calendar.HOUR_OF_DAY,0); startCalendar.set(Calendar.MINUTE,0); diff --git a/io.sc.platform.util/src/main/java/io/sc/platform/util/StringUtil.java b/io.sc.platform.util/src/main/java/io/sc/platform/util/StringUtil.java index 6d5b7284..b8c0ec49 100644 --- a/io.sc.platform.util/src/main/java/io/sc/platform/util/StringUtil.java +++ b/io.sc.platform.util/src/main/java/io/sc/platform/util/StringUtil.java @@ -1518,6 +1518,23 @@ public class StringUtil { return String.valueOf(chars); } + /** + * 将字符串首字母转小写 + * @param str 字符串 + * @return 转化后的字符串 + */ + public static String unCapitalize(String str){ + if(str==null || str.length()==0){ + return str; + } + char[] chars =str.toCharArray(); + char firstChar =chars[0]; + if(firstChar>=65 && firstChar<=90){ + chars[0] +=32; + } + return String.valueOf(chars); + } + /** * 将字符串首字母转小写 * @param str 字符串 diff --git a/io.sc.platform.util/src/main/java/io/sc/platform/util/TypeConvertor.java b/io.sc.platform.util/src/main/java/io/sc/platform/util/TypeConvertor.java index fbea8fea..adbfe349 100644 --- a/io.sc.platform.util/src/main/java/io/sc/platform/util/TypeConvertor.java +++ b/io.sc.platform.util/src/main/java/io/sc/platform/util/TypeConvertor.java @@ -1,13 +1,35 @@ package io.sc.platform.util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.core.convert.ConverterNotFoundException; +import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.util.StringUtils; +import java.util.Date; + /** * 类型转换器 */ public class TypeConvertor { + private static final Logger log = LoggerFactory.getLogger(TypeConvertor.class); + private static DefaultConversionService defaultConversionService =new DefaultConversionService(); + + static { + defaultConversionService.addConverter(String.class, Date.class, new Converter() { + @Override + public Date convert(String source) { + try { + return DateUtil.tryParseDate(source); + }catch (Exception e){ + log.error("",e); + return null; + } + } + }); + } + private TypeConvertor(){} /** @@ -38,7 +60,7 @@ public class TypeConvertor { public static T getValue(String string, Class targetType){ if(StringUtils.hasText(string)) { try { - return DefaultConversionService.getSharedInstance().convert(string, targetType); + return defaultConversionService.convert(string, targetType); }catch (ConverterNotFoundException e){ try { return ObjectMapperUtil.json().readValue(string, targetType);