Browse Source

发布 8.2.3

1. 修复默认安装时缺失 protocol 属性的 bug。
2. 前端更新到 8.2.15。
3. 规则引擎支持参数类型为特征的输入参数。
main
wangshaoping 2 months ago
parent
commit
f212f5c802
  1. 2
      erm.frontend/package.json
  2. 2
      gradle.properties
  3. 2
      io.sc.engine.mv.frontend/package.json
  4. 274
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/FieldValidator.java
  5. 35
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
  6. 50
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
  7. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/argument_render.tpl
  8. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl
  9. 76
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl
  10. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValidatorType.java
  11. 30
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/validator/ExpressionIndicatorValidator.java
  12. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/DateRangeParameterValidator.java
  13. 24
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/validator/ExpressionParameterValidator.java
  14. 7
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/TestCaseParameter.java
  15. 72
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java
  16. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties
  17. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties
  18. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties
  19. 2
      io.sc.engine.rule.frontend/package.json
  20. 1
      io.sc.engine.rule.frontend/src/i18n/messages.json
  21. 1
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  22. 1
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  23. 5
      io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts
  24. 11
      io.sc.engine.rule.frontend/src/views/lib/Lib.vue
  25. 213
      io.sc.engine.rule.frontend/src/views/lib/ValidatorGrid.vue
  26. 2
      io.sc.engine.rule.frontend/src/views/resources/Resources.vue
  27. 6
      io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue
  28. 7
      io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue
  29. 26
      io.sc.engine.rule.frontend/src/views/shared/TestcaseParameterGrid.vue
  30. 62
      io.sc.engine.rule.frontend/src/views/shared/Validator.vue
  31. 37
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/controller/IndicatorValidatorWebController.java
  32. 29
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/converter/IndicatorValidatorEntityConverter.java
  33. 10
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/IndicatorValidatorEntity.java
  34. 62
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/validator/ExpressionIndicatorValidatorEntity.java
  35. 23
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorValidatorServiceImpl.java
  36. 24
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/validator/ExpressionIndicatorValidatorVo.java
  37. 37
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterValidatorWebController.java
  38. 27
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterValidatorEntityConverter.java
  39. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterEntity.java
  40. 13
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterValidatorEntity.java
  41. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/RuleSetParameterProcessorEntity.java
  42. 62
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/validator/ExpressionParameterValidatorEntity.java
  43. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterValidatorService.java
  44. 27
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterValidatorServiceImpl.java
  45. 24
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/validator/ExpressionParameterValidatorVo.java
  46. 1
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/bean/LibTestCaseParameterBuilder.java
  47. 1
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/bean/ModelTestCaseParameterBuilder.java
  48. 11
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/entity/TestCaseParameterEntity.java
  49. 39
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java
  50. 9
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/vo/TestCaseParameterVo.java
  51. 6
      io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml
  52. 2
      io.sc.engine.st.frontend/package.json
  53. 2
      io.sc.platform.core.frontend/package.json
  54. 13
      io.sc.platform.core.frontend/src/platform/utils/Tools.ts
  55. 1
      io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue
  56. 4
      io.sc.platform.core.frontend/template-project/package.json
  57. 1
      io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue
  58. 70
      io.sc.platform.developer.doc/package.json
  59. 2
      io.sc.platform.developer.frontend/package.json
  60. 2
      io.sc.platform.lcdp.frontend/package.json
  61. 2
      io.sc.platform.license.keygen.frontend/package.json
  62. 16
      io.sc.platform.license.keygen/src/main/java/io/sc/platform/license/keygen/service/impl/LicenseServiceImpl.java
  63. 17
      io.sc.platform.util/src/main/java/io/sc/platform/util/StringUtil.java
  64. 24
      io.sc.platform.util/src/main/java/io/sc/platform/util/TypeConvertor.java

2
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",

2
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

2
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",

274
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 && value<min) || (max!=null && value>max)) {
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 && value<minValue) || (max!=null && value>maxValue)) {
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 && value<min) || (max!=null && value>max)) {
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 && value<min) || (max!=null && 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;
// }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 && value<min) || (max!=null && 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;
// }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()<min) || (max!=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()<min.getTime()) || (max!=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;
}

35
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<List<${className}>>(){}); //${name}";
String tpl ="this.${fieldName} =TypeConvertor.getValue(map.get('${code}'),new TypeReference<List<${className}>>(){}); //${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");
}
}
}

50
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<Parameter> 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();
}
}

2
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<String,Object> libs){
#(tabs(ParameterGenerator.generateMergeParameterValueFromIndicatorLib(model.getAllParameters()),2))
}
public ResourceResult toResult(){

4
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
//初始化模型参数

76
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<String,Object> 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

3
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; //表达式
}

30
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;
}
}

1
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;

24
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;
}
}

7
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;
}

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

1
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

1
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

1
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

2
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",

1
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",

1
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": "跳過檢查",

1
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": "跳过检查",

5
io.sc.engine.rule.frontend/src/utils/PlaceHolder.ts

@ -4,7 +4,8 @@ class PlaceHolder {
static #prefix: string = '<span class="p-0.5"><span class="p-0.5 border border-gray-800 rounded-md">';
static #suffix: string = '</span></span>';
public static replace(str: string, prefix?: string, suffix?: string) {
if (str) {
if (Tools.isString(str)) {
str = str.replace('<', '&lt;');
if (Tools.isUndefinedOrNull(prefix)) {
prefix = PlaceHolder.#prefix;
}
@ -13,7 +14,7 @@ class PlaceHolder {
}
return str.replace(/\$\{(.+?)\}/g, prefix + '$1' + suffix);
}
return '';
return str;
}
}

11
io.sc.engine.rule.frontend/src/views/lib/Lib.vue

@ -64,12 +64,14 @@
></IndicatorGrid>
</template>
<template #after>
<ValidatorGrid
<Validator
v-if="showStatus.validator"
ref="validatorGridRef"
:indicator="currentSelectedIndicatorRef"
type="indicator"
:data-url="Environment.apiContextPath('/api/re/indicator/validator')"
:owner="currentSelectedIndicatorRef"
:read-only="readOnlyRef"
></ValidatorGrid>
></Validator>
<ProcessorGrid
v-if="showStatus.processor"
ref="processorGridRef"
@ -115,11 +117,10 @@ import { ref, reactive } from 'vue';
import { Environment, Tools } from 'platform-core';
import LibGrid from './LibGrid.vue';
import IndicatorGrid from './IndicatorGrid.vue';
import ValidatorGrid from './ValidatorGrid.vue';
import Validator from '@/views/shared/Validator.vue';
import ProcessorGrid from './ProcessorGrid.vue';
import TestcaseGrid from '@/views/shared/TestcaseGrid.vue';
import TestcaseParameterGrid from '@/views/shared/TestcaseParameterGrid.vue';
//import TestCase from './TestCase.vue';
import TestCaseParameter from './TestCaseParameter.vue';
const readOnlyRef = ref(false);

213
io.sc.engine.rule.frontend/src/views/lib/ValidatorGrid.vue

@ -1,213 +0,0 @@
<template>
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.validator.grid.title')"
dense-body
hide-bottom
:config-button="true"
selection="multiple"
:checkbox-selection="false"
:tree="false"
:fetch-data-url="Environment.apiContextPath('/api/re/indicator/validator?indicator=' + indicator.id)"
:data-url="Environment.apiContextPath('/api/re/indicator/validator')"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' },
{ width: 100, name: 'type', label: $t('type'), sortable: false, format: EngineEnums.ValidatorType.formater },
{
width: 300,
name: 'content',
label: $t('re.validator.grid.entity.content'),
sortable: false,
format: (value, row) => {
const type = row.type;
if (type == 'EMPTY' || type == 'NOT_EMPTY' || type == 'TRUE' || type == 'FALSE' || type == 'EMAIL') {
return '';
} else if (type == 'INTEGER_RANGE' || type == 'DECIMAL_RANGE' || type == 'LENGTH_RANGE' || type == 'DATE_RANGE') {
return Tools.generateIntervalRange(row.minInclude, row.minValue, row.maxValue, row.maxInclude);
} else if (type == 'PATTERN') {
return row.pattern;
}
return '';
},
},
{ width: '100%', name: 'tip', label: $t('re.validator.grid.entity.tip'), sortable: false },
]"
:editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{ name: 'indicator', label: 'indicator', type: 'w-text', defaultValue: indicator.id, showIf: false },
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{
name: 'description',
label: $t('description'),
type: 'w-text',
},
{
name: 'type',
label: $t('type'),
type: 'w-select',
requiredIf: true,
options:
ValueTypeAndValidatorTypeMapping[ValueTypeAndValidatorTypeMapping[indicator.valueType] == null ? 'java.lang.Object' : indicator.valueType],
},
{
name: 'minValue',
label: $t('minValue'),
type: 'w-text',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
if (type == 'INTEGER_RANGE' || type == 'DECIMAL_RANGE' || type == 'LENGTH_RANGE' || type == 'DATE_RANGE') {
return true;
}
return false;
},
},
{
name: 'minInclude',
label: $t('isMinValueInclude'),
type: 'w-checkbox',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
if (type == 'INTEGER_RANGE' || type == 'DECIMAL_RANGE' || type == 'LENGTH_RANGE' || type == 'DATE_RANGE') {
return true;
}
return false;
},
},
{
name: 'maxValue',
label: $t('maxValue'),
type: 'w-text',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
if (type == 'INTEGER_RANGE' || type == 'DECIMAL_RANGE' || type == 'LENGTH_RANGE' || type == 'DATE_RANGE') {
return true;
}
return false;
},
},
{
name: 'maxInclude',
label: $t('isMaxValueInclude'),
type: 'w-checkbox',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
if (type == 'INTEGER_RANGE' || type == 'DECIMAL_RANGE' || type == 'LENGTH_RANGE' || type == 'DATE_RANGE') {
return true;
}
return false;
},
},
{
name: 'pattern',
label: $t('RegExp'),
type: 'w-text',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
if (type == 'PATTERN') {
return true;
}
return false;
},
},
{
name: 'tip',
label: $t('re.validator.grid.entity.tip'),
type: 'w-text',
},
{ name: 'order', label: $t('order'), type: 'w-number' },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'order', label: $t('order') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'description', label: $t('description') },
{ name: 'tip', label: $t('re.validator.grid.entity.tip') },
{ name: 'minInclude', label: $t('isMinValueInclude') },
{ name: 'minValue', label: $t('minValue') },
{ name: 'maxValue', label: $t('maxValue') },
{ name: 'maxInclude', label: $t('isMaxValueInclude') },
{ name: 'pattern', label: $t('RegExp') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
></w-grid>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, Formater, Tools, CorporationAuditorEntityManager } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
indicator: { type: Object, default: undefined },
});
const { t } = useI18n();
const gridRef = ref();
const ValueTypeAndValidatorTypeMapping = {
'java.lang.Boolean': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'TRUE', label: t('io.sc.engine.rule.core.enums.ValidatorType.TRUE') },
{ value: 'FALSE', label: t('io.sc.engine.rule.core.enums.ValidatorType.FALSE') },
],
'java.lang.Long': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'INTEGER_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.INTEGER_RANGE') },
],
'java.math.BigDecimal': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DECIMAL_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.DECIMAL_RANGE') },
],
'java.lang.String': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'LENGTH_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE') },
{ value: 'EMAIL', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMAIL') },
{ value: 'PATTERN', label: t('io.sc.engine.rule.core.enums.ValidatorType.PATTERN') },
],
'java.util.Date': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DATE_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE') },
],
'java.lang.Object': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
],
};
const refresh = () => {
gridRef?.value?.refresh();
};
onMounted(() => {
gridRef?.value?.refresh();
});
defineExpose({
refresh,
});
await EngineEnums.init();
</script>

2
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',

6
io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue

@ -146,8 +146,10 @@
<Validator
v-if="statusReactive.isShowValidator"
ref="validatorGridRef"
type="parameter"
:data-url="Environment.apiContextPath('/api/re/model/parameter/validator')"
:owner="currentSelectedParameterRef"
:read-only="readOnlyRef"
:parameter="currentSelectedParameterRef"
></Validator>
<Processor
v-if="statusReactive.isShowProcessor"
@ -172,7 +174,7 @@ import { ref, nextTick, reactive } from 'vue';
import { useRoute } from 'vue-router';
import Model from './Model.vue';
import Parameter from './Parameter.vue';
import Validator from './Validator.vue';
import Validator from '@/views/shared/Validator.vue';
import Processor from './Processor.vue';
import Option from './Option.vue';
import TestcaseGrid from '@/views/shared/TestcaseGrid.vue';

7
io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue

@ -166,8 +166,10 @@
<Validator
v-if="statusReactive.isShowValidator"
ref="validatorGridRef"
type="parameter"
:data-url="Environment.apiContextPath('/api/re/model/parameter/validator')"
:owner="currentSelectedParameterRef"
:read-only="readOnlyRef"
:parameter="currentSelectedParameterRef"
></Validator>
<Processor
v-if="statusReactive.isShowProcessor"
@ -190,9 +192,10 @@
</template>
<script setup lang="ts">
import { ref, nextTick, reactive } from 'vue';
import { Environment } from 'platform-core';
import Model from './Model.vue';
import Parameter from './Parameter.vue';
import Validator from './Validator.vue';
import Validator from '@/views/shared/Validator.vue';
import Processor from './Processor.vue';
import Option from './Option.vue';
import TestcaseGrid from '@/views/shared/TestcaseGrid.vue';

26
io.sc.engine.rule.frontend/src/views/shared/TestcaseParameterGrid.vue

@ -78,6 +78,21 @@
},
...valueTypeManager.getColumns([], false),
{ width: 100, name: 'inputValue', label: $t('re.testCaseParameter.grid.entity.inputValue'), sortable: false },
{
width: 100,
name: 'inputValueValidateMessage',
label: $t('re.testCaseParameter.grid.entity.inputValueValidateMessage'),
sortable: false,
format: (value: any, row: any) => {
if (value) {
return '<span class=\'text-red-500\'>' + value + '</span>';
}
return value;
},
title: (args: any) => {
return args.value;
},
},
{ width: 100, name: 'expectValue', label: $t('re.testCaseParameter.grid.entity.expectValue'), sortable: false },
{ width: 100, name: 'resultValue', label: $t('re.testCaseParameter.grid.entity.resultValue'), sortable: false },
{
@ -179,7 +194,16 @@
],
},
}"
v-bind="attrs"
@after-editor-open="
(args: any) => {
const form = args.grid.getEditorForm();
if (args.data.inputValueValidateMessage) {
form.setValidationErrors([{ fieldName: 'inputValue', errorMessage: args.data.inputValueValidateMessage }]);
} else {
form.resetValidation();
}
}
"
></w-grid>
<SimulatorDialog ref="simulatorDialogRef"></SimulatorDialog>
</div>

62
io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue → io.sc.engine.rule.frontend/src/views/shared/Validator.vue

@ -2,7 +2,7 @@
<w-grid
ref="gridRef"
:title="$t('re.validator.grid.title')"
draggable="server"
dnd-mode="server"
dense-body
class="px-1"
hide-bottom
@ -11,8 +11,8 @@
:checkbox-selection="true"
db-click-operation="edit"
:tree="false"
:fetch-data-url="Environment.apiContextPath('/api/re/model/parameter/validator/findByParameterId?parameterId=' + parameter.id)"
:data-url="Environment.apiContextPath('/api/re/model/parameter/validator')"
:fetch-data-url="dataUrl + '?' + (type === 'indicator' ? 'indicator' : 'parameter') + '=' + owner.id"
:data-url="dataUrl"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
@ -57,8 +57,10 @@
return Tools.generateIntervalRange(row.minInclude, row.minValue, row.maxValue, row.maxInclude);
} else if (type == 'PATTERN') {
return row.pattern;
} else if (type == 'EXPRESSION') {
return PlaceHolder.replace(row.expression);
}
return '';
return value;
},
},
{ width: '100%', name: 'tip', label: $t('re.validator.grid.entity.tip'), sortable: false },
@ -70,14 +72,15 @@
form: {
colsNum: 1,
fields: [
{ name: 'parameter', label: 'parameter', type: 'w-text', defaultValue: parameter.id, showIf: false },
{ name: 'parameter', label: 'parameter', type: 'w-text', defaultValue: owner.id, showIf: false },
{ name: 'indicator', label: 'indicator', type: 'w-text', defaultValue: owner.id, showIf: false },
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{
name: 'description',
label: $t('description'),
type: 'w-text',
},
{ name: 'type', label: $t('type'), type: 'w-select', options: ValueTypeAndValidatorTypeMapping[parameter.valueType] },
{ name: 'type', label: $t('type'), type: 'w-select', options: ValueTypeAndValidatorTypeMapping[owner.valueType] },
{
name: 'minValue',
label: $t('minValue'),
@ -138,6 +141,25 @@
return false;
},
},
{
name: 'expression',
label: $t('expression'),
type: 'w-code-mirror',
lang: 'java',
rows: 5,
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
if (type == 'EXPRESSION') {
return true;
}
return false;
},
},
{
name: 'tip',
label: $t('re.validator.grid.entity.tip'),
@ -165,18 +187,31 @@
],
},
}"
@after-editor-open="
(args: any) => {
if (type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByParameterId/' + owner.id));
} else if (type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByIndicatorId/' + owner.id));
}
userDefinedFunctionsManager.load();
}
"
></w-grid>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { $t, Environment, Formater, Tools, CorporationAuditorEntityManager } from 'platform-core';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
fetchDataUrl: { type: String, default: '' },
dataUrl: { type: String, default: '' },
parameter: { type: Object, default: undefined },
type: { type: String, default: undefined },
dataUrl: { type: String, default: undefined },
owner: { type: Object, default: undefined },
readOnly: { type: Boolean, default: false },
});
@ -184,7 +219,10 @@ const emit = defineEmits<{
(e: 'rowClick', evt: Event, row: any, index: number): void;
(e: 'beforeRequestData', requestParams: URLSearchParams | any, callback: any): void;
}>();
const gridRef = ref();
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
const ValueTypeAndValidatorTypeMapping = {
'java.lang.Boolean': [
@ -192,16 +230,19 @@ const ValueTypeAndValidatorTypeMapping = {
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'TRUE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.TRUE') },
{ value: 'FALSE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.FALSE') },
{ value: 'EXPRESSION', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION') },
],
'java.lang.Long': [
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'INTEGER_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.INTEGER_RANGE') },
{ value: 'EXPRESSION', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION') },
],
'java.math.BigDecimal': [
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DECIMAL_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.DECIMAL_RANGE') },
{ value: 'EXPRESSION', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION') },
],
'java.lang.String': [
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
@ -209,15 +250,18 @@ const ValueTypeAndValidatorTypeMapping = {
{ value: 'LENGTH_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE') },
{ value: 'EMAIL', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMAIL') },
{ value: 'PATTERN', label: $t('io.sc.engine.rule.core.enums.ValidatorType.PATTERN') },
{ value: 'EXPRESSION', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION') },
],
'java.util.Date': [
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DATE_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE') },
{ value: 'EXPRESSION', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION') },
],
'java.lang.Object': [
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'EXPRESSION', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EXPRESSION') },
],
};

37
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/controller/IndicatorValidatorWebController.java

@ -1,13 +1,30 @@
package io.sc.engine.rule.server.lib.controller;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.server.common.service.ParameterAndValueTypeService;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.common.util.VariableCodeAndNameReplacer;
import io.sc.engine.rule.server.lib.entity.IndicatorProcessorEntity;
import io.sc.engine.rule.server.lib.entity.IndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.repository.IndicatorValidatorRepository;
import io.sc.engine.rule.server.lib.service.IndicatorValidatorService;
import io.sc.engine.rule.server.lib.vo.IndicatorProcessorVo;
import io.sc.engine.rule.server.lib.vo.IndicatorValidatorVo;
import io.sc.platform.mvc.controller.support.RestCrudController;
import io.sc.platform.orm.entity.BaseEntity;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* 指标验证器 Controller
*
@ -15,5 +32,23 @@ import org.springframework.web.bind.annotation.RestController;
@RestController("io.sc.engine.rule.server.lib.controller.IndicatorValidatorWebController")
@RequestMapping("/api/re/indicator/validator")
public class IndicatorValidatorWebController extends RestCrudController<IndicatorValidatorVo, IndicatorValidatorEntity,String,IndicatorValidatorRepository,IndicatorValidatorService> {
@Autowired private ParameterAndValueTypeService parameterAndValueTypeService;
@Override
protected Page<IndicatorValidatorVo> query(HttpServletRequest request, HttpServletResponse response, QueryParameter queryParameter) throws Exception {
Page<IndicatorValidatorEntity> page =service.query(queryParameter);
if(page==null){
return QueryResult.emptyPage();
}
List<IndicatorValidatorEntity> entities =page.getContent();
List<IndicatorValidatorVo> vos =new ArrayList<>(entities.size());
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByIndicatorId(request.getParameter("indicator"),request.getLocale());
VariableCodeAndNameReplacer.replace(entities,parameterAndValueType, ReplaceMode.CODE_TO_NAME);
for(IndicatorValidatorEntity entity : entities){
if(entity instanceof BaseEntity){
vos.add(((BaseEntity<IndicatorValidatorVo>)entity).toVo());
}
}
return new PageImpl<>(vos,page.getPageable(),page.getTotalElements());
}
}

29
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/converter/IndicatorValidatorEntityConverter.java

@ -5,28 +5,12 @@ import java.util.List;
import io.sc.engine.rule.core.po.lib.IndicatorValidator;
import io.sc.engine.rule.core.po.lib.RangeIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.DateRangeIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.DecimalRangeIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.EmailIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.EmptyIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.FalseIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.IntegerRangeIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.LengthRangeIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.NotEmptyIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.PatternIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.TrueIndicatorValidator;
import io.sc.engine.rule.core.po.lib.validator.*;
import io.sc.engine.rule.core.po.model.validator.ExpressionParameterValidator;
import io.sc.engine.rule.server.lib.entity.IndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.RangeIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.DateRangeIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.DecimalRangeIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.EmailIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.EmptyIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.FalseIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.IntegerRangeIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.LengthRangeIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.NotEmptyIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.PatternIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.TrueIndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.entity.validator.*;
import io.sc.engine.rule.server.model.entity.validator.ExpressionParameterValidatorEntity;
/**
* 指标验证器实体转换器用于实现持久化实体和PO对象之间的互相转换
@ -63,6 +47,11 @@ public class IndicatorValidatorEntityConverter {
po =_po;
}else if(entity instanceof TrueIndicatorValidatorEntity) {
po =new TrueIndicatorValidator();
}else if(entity instanceof ExpressionIndicatorValidatorEntity) {
ExpressionIndicatorValidatorEntity _entity =(ExpressionIndicatorValidatorEntity)entity;
ExpressionIndicatorValidator _po =new ExpressionIndicatorValidator();
_po.setExpression(_entity.getExpression());
po =_po;
}else {
po =new NotEmptyIndicatorValidator();
}

10
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/IndicatorValidatorEntity.java

@ -2,7 +2,10 @@ package io.sc.engine.rule.server.lib.entity;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.common.CodeAndNameReplacer;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.lib.entity.validator.*;
import io.sc.engine.rule.server.lib.vo.IndicatorValidatorVo;
import io.sc.platform.orm.DeepClone;
@ -34,7 +37,7 @@ import javax.validation.constraints.Size;
@JsonSubTypes.Type(value=PatternIndicatorValidatorEntity.class),
@JsonSubTypes.Type(value=TrueIndicatorValidatorEntity.class)
})
public class IndicatorValidatorEntity extends CorporationAuditorEntity<IndicatorValidatorVo> implements DeepClone, IdClearable {
public class IndicatorValidatorEntity extends CorporationAuditorEntity<IndicatorValidatorVo> implements DeepClone, IdClearable, CodeAndNameReplacer {
//参数验证器类型
@Column(name="TYPE_", length=20, insertable = false,updatable = false)
@Enumerated(EnumType.STRING)
@ -140,4 +143,9 @@ public class IndicatorValidatorEntity extends CorporationAuditorEntity<Indicator
public void clearId() {
this.setId(null);
}
@Override
public boolean replace(ParameterAndValueType parameterAndValueType, ReplaceMode mode) {
return false;
}
}

62
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/entity/validator/ExpressionIndicatorValidatorEntity.java

@ -0,0 +1,62 @@
package io.sc.engine.rule.server.lib.entity.validator;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.lib.entity.IndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.vo.validator.ExpressionIndicatorValidatorVo;
import io.sc.engine.rule.server.lib.vo.validator.TrueIndicatorValidatorVo;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Transient;
import javax.validation.constraints.Size;
/**
* 验证器表达式实体类
*/
@Entity
@DiscriminatorValue("EXPRESSION")
@JsonTypeName("EXPRESSION")
public class ExpressionIndicatorValidatorEntity extends IndicatorValidatorEntity {
//表达式
@Column(name="EXPRESSION_", length=1024)
@Size(max=1024)
private String expression;
@Override
public ExpressionIndicatorValidatorVo toVo() {
ExpressionIndicatorValidatorVo vo =new ExpressionIndicatorValidatorVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setExpression(this.getExpression());
return vo;
}
@Override
public ValidatorType getType() {
return ValidatorType.EXPRESSION;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
@Override
public boolean replace(ParameterAndValueType parameterAndValueType, ReplaceMode mode) {
String replaced =parameterAndValueType.replace(this.expression, mode);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.expression)) {
result =true;
}
this.expression =replaced;
return result;
}
}

23
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorValidatorServiceImpl.java

@ -1,14 +1,22 @@
package io.sc.engine.rule.server.lib.service.impl;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.server.common.service.ParameterAndValueTypeService;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.common.util.VariableCodeAndNameReplacer;
import io.sc.engine.rule.server.lib.entity.IndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.repository.IndicatorValidatorRepository;
import io.sc.engine.rule.server.lib.service.IndicatorValidatorService;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Locale;
@Service("io.sc.engine.rule.server.lib.service.impl.IndicatorValidatorServiceImpl")
public class IndicatorValidatorServiceImpl extends DaoServiceImpl<IndicatorValidatorEntity, String, IndicatorValidatorRepository> implements IndicatorValidatorService{
@Autowired private ParameterAndValueTypeService parameterAndValueTypeService;
public String[] getDefaultSortBy() {
return new String[]{"order"};
@ -17,6 +25,11 @@ public class IndicatorValidatorServiceImpl extends DaoServiceImpl<IndicatorValid
@Override
@Transactional
public IndicatorValidatorEntity add(IndicatorValidatorEntity entity) throws Exception {
//获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getIndicator().getId(), Locale.getDefault());
//将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);
Integer nextOrder =repository.getNextOrder(entity.getIndicator().getId());
if(nextOrder!=null) {
entity.setOrder(nextOrder);
@ -25,4 +38,14 @@ public class IndicatorValidatorServiceImpl extends DaoServiceImpl<IndicatorValid
}
return super.add(entity);
}
@Override
@Transactional
public IndicatorValidatorEntity update(String s, IndicatorValidatorEntity entity) throws Exception {
//获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getIndicator().getId(), Locale.getDefault());
//将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);
return super.update(s, entity);
}
}

24
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/vo/validator/ExpressionIndicatorValidatorVo.java

@ -0,0 +1,24 @@
package io.sc.engine.rule.server.lib.vo.validator;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.lib.vo.IndicatorValidatorVo;
/**
* 验证器表达式Vo
*/
public class ExpressionIndicatorValidatorVo extends IndicatorValidatorVo {
private String expression;
@Override
public ValidatorType getType() {
return ValidatorType.EXPRESSION;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
}

37
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterValidatorWebController.java

@ -1,17 +1,32 @@
package io.sc.engine.rule.server.model.controller;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.server.common.service.ParameterAndValueTypeService;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.common.util.VariableCodeAndNameReplacer;
import io.sc.engine.rule.server.lib.entity.IndicatorValidatorEntity;
import io.sc.engine.rule.server.lib.vo.IndicatorValidatorVo;
import io.sc.engine.rule.server.model.entity.ParameterValidatorEntity;
import io.sc.engine.rule.server.model.repository.ParameterValidatorRepository;
import io.sc.engine.rule.server.model.service.ParameterValidatorService;
import io.sc.engine.rule.server.model.vo.ParameterValidatorVo;
import io.sc.platform.mvc.controller.support.RestCrudController;
import io.sc.platform.orm.entity.BaseEntity;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.orm.util.EntityVoUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@ -21,11 +36,23 @@ import java.util.List;
@RestController("io.sc.engine.rule.server.model.controller.ParameterValidatorWebController")
@RequestMapping("/api/re/model/parameter/validator")
public class ParameterValidatorWebController extends RestCrudController<ParameterValidatorVo,ParameterValidatorEntity,String,ParameterValidatorRepository,ParameterValidatorService> {
@GetMapping("findByParameterId")
public List<ParameterValidatorVo> findByParameterId(@RequestParam(name="parameterId",required = false)String parameterId) throws Exception {
if(!StringUtils.hasText(parameterId)){
return Collections.emptyList();
@Autowired private ParameterAndValueTypeService parameterAndValueTypeService;
@Override
protected Page<ParameterValidatorVo> query(HttpServletRequest request, HttpServletResponse response, QueryParameter queryParameter) throws Exception {
Page<ParameterValidatorEntity> page =service.query(queryParameter);
if(page==null){
return QueryResult.emptyPage();
}
List<ParameterValidatorEntity> entities =page.getContent();
List<ParameterValidatorVo> vos =new ArrayList<>(entities.size());
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(request.getParameter("parameter"),request.getLocale());
VariableCodeAndNameReplacer.replace(entities,parameterAndValueType, ReplaceMode.CODE_TO_NAME);
for(ParameterValidatorEntity entity : entities){
if(entity instanceof BaseEntity){
vos.add(((BaseEntity<ParameterValidatorVo>)entity).toVo());
}
}
return EntityVoUtil.toVo(service.findByParameterId(parameterId));
return new PageImpl<>(vos,page.getPageable(),page.getTotalElements());
}
}

27
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterValidatorEntityConverter.java

@ -5,28 +5,10 @@ import java.util.List;
import io.sc.engine.rule.core.po.model.ParameterValidator;
import io.sc.engine.rule.core.po.model.RangeParameterValidator;
import io.sc.engine.rule.core.po.model.validator.DateRangeParameterValidator;
import io.sc.engine.rule.core.po.model.validator.DecimalRangeParameterValidator;
import io.sc.engine.rule.core.po.model.validator.EmailParameterValidator;
import io.sc.engine.rule.core.po.model.validator.EmptyParameterValidator;
import io.sc.engine.rule.core.po.model.validator.FalseParameterValidator;
import io.sc.engine.rule.core.po.model.validator.IntegerRangeParameterValidator;
import io.sc.engine.rule.core.po.model.validator.LengthRangeParameterValidator;
import io.sc.engine.rule.core.po.model.validator.NotEmptyParameterValidator;
import io.sc.engine.rule.core.po.model.validator.PatternParameterValidator;
import io.sc.engine.rule.core.po.model.validator.TrueParameterValidator;
import io.sc.engine.rule.core.po.model.validator.*;
import io.sc.engine.rule.server.model.entity.ParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.RangeParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.DateRangeParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.DecimalRangeParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.EmailParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.EmptyParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.FalseParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.IntegerRangeParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.LengthRangeParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.NotEmptyParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.PatternParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.TrueParameterValidatorEntity;
import io.sc.engine.rule.server.model.entity.validator.*;
/**
* 参数验证器实体转换器
@ -63,6 +45,11 @@ public class ParameterValidatorEntityConverter {
po =_po;
}else if(entity instanceof TrueParameterValidatorEntity) {
po =new TrueParameterValidator();
}else if(entity instanceof ExpressionParameterValidatorEntity) {
ExpressionParameterValidatorEntity _entity =(ExpressionParameterValidatorEntity)entity;
ExpressionParameterValidator _po =new ExpressionParameterValidator();
_po.setExpression(_entity.getExpression());
po =_po;
}else {
po =new NotEmptyParameterValidator();
}

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterEntity.java

@ -38,7 +38,7 @@ import java.util.List;
@JsonSubTypes.Type(value=IntermediateParameterEntity.class), //中间值
@JsonSubTypes.Type(value=OutParameterEntity.class) //结果值
})
public abstract class ParameterEntity extends CorporationAuditorEntity<ParameterVo> implements DeepClone, IdClearable, TestCaseParameterAble{
public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> implements DeepClone, IdClearable, TestCaseParameterAble{
//ID,主键
@Id
@GeneratedValue(generator = "system-uuid")

13
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterValidatorEntity.java

@ -2,7 +2,10 @@ package io.sc.engine.rule.server.model.entity;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.common.CodeAndNameReplacer;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.model.entity.validator.*;
import io.sc.engine.rule.server.model.vo.ParameterValidatorVo;
import io.sc.platform.orm.DeepClone;
@ -32,9 +35,10 @@ import javax.validation.constraints.Size;
@JsonSubTypes.Type(value=LengthRangeParameterValidatorEntity.class),
@JsonSubTypes.Type(value=NotEmptyParameterValidatorEntity.class),
@JsonSubTypes.Type(value=PatternParameterValidatorEntity.class),
@JsonSubTypes.Type(value=TrueParameterValidatorEntity.class)
@JsonSubTypes.Type(value=TrueParameterValidatorEntity.class),
@JsonSubTypes.Type(value=ExpressionParameterValidatorEntity.class)
})
public abstract class ParameterValidatorEntity extends CorporationAuditorEntity<ParameterValidatorVo> implements DeepClone, IdClearable {
public class ParameterValidatorEntity extends CorporationAuditorEntity<ParameterValidatorVo> implements DeepClone, IdClearable, CodeAndNameReplacer {
//ID,主键
@Id
@GeneratedValue(generator = "system-uuid")
@ -142,4 +146,9 @@ public abstract class ParameterValidatorEntity extends CorporationAuditorEntity<
public void clearId() {
this.setId(null);
}
@Override
public boolean replace(ParameterAndValueType parameterAndValueType, ReplaceMode mode) {
return false;
}
}

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/RuleSetParameterProcessorEntity.java

@ -19,8 +19,8 @@ import javax.persistence.Entity;
@JsonTypeName("RULE_SET")
public class RuleSetParameterProcessorEntity extends ParameterProcessorEntity {
//规则配置
@Column(name="RULE_")
//规则配置
@Column(name="RULE_SET_")
private String ruleSet;
@Override

62
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/validator/ExpressionParameterValidatorEntity.java

@ -0,0 +1,62 @@
package io.sc.engine.rule.server.model.entity.validator;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.common.CodeAndNameReplacer;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.model.entity.ParameterValidatorEntity;
import io.sc.engine.rule.server.model.vo.validator.ExpressionParameterValidatorVo;
import io.sc.engine.rule.server.model.vo.validator.TrueParameterValidatorVo;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Transient;
import javax.validation.constraints.Size;
/**
* 验证器表达式实体类
*/
@Entity
@DiscriminatorValue("EXPRESSION")
@JsonTypeName("EXPRESSION")
public class ExpressionParameterValidatorEntity extends ParameterValidatorEntity {
//表达式
@Column(name="EXPRESSION_", length=1024)
@Size(max=1024)
private String expression;
@Override
public ExpressionParameterValidatorVo toVo() {
ExpressionParameterValidatorVo vo =new ExpressionParameterValidatorVo();
super.toVo(vo);
vo.setExpression(this.getExpression());
return vo;
}
@Override
public ValidatorType getType() {
return ValidatorType.EXPRESSION;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
@Override
public boolean replace(ParameterAndValueType parameterAndValueType, ReplaceMode mode) {
String replaced =parameterAndValueType.replace(this.expression, mode);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.expression)) {
result =true;
}
this.expression =replaced;
return result;
}
}

8
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterValidatorService.java

@ -11,11 +11,5 @@ import java.util.List;
* 模型参数验证器服务器接口
*/
public interface ParameterValidatorService extends DaoService<ParameterValidatorEntity, String, ParameterValidatorRepository>{
/**
* 通过参数ID查找参数验证器
* @param parameterId 参数ID
* @return 参数验证器列表
* @throws Exception 违例
*/
public List<ParameterValidatorEntity> findByParameterId(String parameterId) throws Exception;
}

27
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterValidatorServiceImpl.java

@ -1,30 +1,37 @@
package io.sc.engine.rule.server.model.service.impl;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.server.common.service.ParameterAndValueTypeService;
import io.sc.engine.rule.server.common.service.support.ParameterAndValueType;
import io.sc.engine.rule.server.common.util.VariableCodeAndNameReplacer;
import io.sc.engine.rule.server.model.entity.ParameterValidatorEntity;
import io.sc.engine.rule.server.model.repository.ParameterValidatorRepository;
import io.sc.engine.rule.server.model.service.ParameterValidatorService;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Locale;
@Service("io.sc.engine.rule.server.model.service.impl.ParameterValidatorServiceImpl")
public class ParameterValidatorServiceImpl extends DaoServiceImpl<ParameterValidatorEntity, String, ParameterValidatorRepository> implements ParameterValidatorService{
@Autowired private ParameterAndValueTypeService parameterAndValueTypeService;
@Override
public String[] getDefaultSortBy() {
return new String[]{"order"};
}
@Override
public List<ParameterValidatorEntity> findByParameterId(String parameterId) throws Exception {
return repository.findByParameterId(parameterId);
}
@Override
@Transactional
public ParameterValidatorEntity add(ParameterValidatorEntity entity) throws Exception {
//获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getParameter().getId(), Locale.getDefault());
//将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);
Integer nextOrder =repository.getNextOrder(entity.getParameter().getId());
if(nextOrder!=null) {
entity.setOrder(nextOrder);
@ -33,4 +40,14 @@ public class ParameterValidatorServiceImpl extends DaoServiceImpl<ParameterValid
}
return super.add(entity);
}
@Override
@Transactional
public ParameterValidatorEntity update(String s, ParameterValidatorEntity entity) throws Exception {
//获取代码和名称的映射表
ParameterAndValueType parameterAndValueType =parameterAndValueTypeService.findByParameterId(entity.getParameter().getId(), Locale.getDefault());
//将名称替换为代码
VariableCodeAndNameReplacer.replace(entity, parameterAndValueType, ReplaceMode.NAME_TO_CODE);
return super.update(s, entity);
}
}

24
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/validator/ExpressionParameterValidatorVo.java

@ -0,0 +1,24 @@
package io.sc.engine.rule.server.model.vo.validator;
import io.sc.engine.rule.core.enums.ValidatorType;
import io.sc.engine.rule.server.model.vo.ParameterValidatorVo;
/**
* 验证器表达式实体类
*/
public class ExpressionParameterValidatorVo extends ParameterValidatorVo {
private String expression;
@Override
public ValidatorType getType() {
return ValidatorType.EXPRESSION;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
}

1
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/bean/LibTestCaseParameterBuilder.java

@ -97,6 +97,7 @@ public class LibTestCaseParameterBuilder implements TestCaseParameterBuilder{
wrapper.setId(entity.getId());
wrapper.setSkipCheck(entity.getSkipCheck());
wrapper.setInputValue(entity.getInputValue());
wrapper.setInputValueValidateMessage(entity.getInputValueValidateMessage());
wrapper.setExpectValue(entity.getExpectValue());
wrapper.setResultValue(entity.getResultValue());
wrapper.setTestResult(entity.getTestResult());

1
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/bean/ModelTestCaseParameterBuilder.java

@ -130,6 +130,7 @@ public class ModelTestCaseParameterBuilder implements TestCaseParameterBuilder{
wrapper.setParent(parentId);
wrapper.setSkipCheck(entity.getSkipCheck());
wrapper.setInputValue(entity.getInputValue());
wrapper.setInputValueValidateMessage(entity.getInputValueValidateMessage());
wrapper.setExpectValue(entity.getExpectValue());
wrapper.setResultValue(entity.getResultValue());
wrapper.setTestResult(entity.getTestResult());

11
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/entity/TestCaseParameterEntity.java

@ -41,6 +41,10 @@ public class TestCaseParameterEntity extends CorporationAuditorEntity<TestCasePa
//参数输入值
@Column(name="INPUT_VALUE_")
protected String inputValue;
//参数输入值检验结果
@Column(name="INPUT_VALUE_VALIDATE_MESSAGE_")
protected String inputValueValidateMessage;
//参数期望值
@Column(name="EXPECT_VALUE_")
@ -68,6 +72,7 @@ public class TestCaseParameterEntity extends CorporationAuditorEntity<TestCasePa
vo.setCode(this.getCode());
vo.setSkipCheck(this.getSkipCheck());
vo.setInputValue(this.getInputValue());
vo.setInputValueValidateMessage(this.getInputValueValidateMessage());
vo.setExpectValue(this.getExpectValue());
vo.setResultValue(this.getResultValue());
vo.setTestCase(this.getTestCase()==null?null:this.getTestCase().getId());
@ -103,6 +108,12 @@ public class TestCaseParameterEntity extends CorporationAuditorEntity<TestCasePa
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;
}

39
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java

@ -6,6 +6,8 @@ import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImp
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.ValidateField;
import io.sc.engine.rule.core.ValidateResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.SourceCode;
@ -642,6 +644,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
if(parameters!=null && parameters.size()>0) {
Map<String,Object> map =new HashMap<String,Object>();
for(TestCaseParameterEntity parameter : parameters) {
parameter.setInputValueValidateMessage(null);
cache.put(parameter.getCode(), parameter);
map.put(parameter.getCode(), parameter.getInputValue());
}
@ -649,19 +652,29 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
if(executor!=null) {
ResourceResult result =executor.execute(resourceEntity.getId(), map);
if(result!=null) {
List<ParameterResult> datas =result.getData();
if(datas!=null && datas.size()>0) {
for(ParameterResult data : datas) {
String code =data.getCode();
String valueType =data.getValueType();
String value =data.getValue();
TestCaseParameterEntity entity =cache.get(code);
if(entity!=null) {
entity.setResultValue(value);
if(entity.getSkipCheck()!=null && entity.getSkipCheck()) {
entity.setTestResult(TestResult.PASSED);
}else {
entity.setTestResult(checkTestResult(entity.getExpectValue(),value,valueType));
ValidateResult validateResult =result.getValidateResult();
if(validateResult!=null && validateResult.hasError()){
List<ValidateField> errorFields =validateResult.getErrorFields();
for(ValidateField validateField : errorFields){
TestCaseParameterEntity entity = cache.get(validateField.getFieldCode());
entity.setInputValueValidateMessage(validateField.getMessage());
entity.setTestResult(TestResult.UN_PASSED);
}
}else {
List<ParameterResult> datas = result.getData();
if (datas != null && datas.size() > 0) {
for (ParameterResult data : datas) {
String code = data.getCode();
String valueType = data.getValueType();
String value = data.getValue();
TestCaseParameterEntity entity = cache.get(code);
if (entity != null) {
entity.setResultValue(value);
if (entity.getSkipCheck() != null && entity.getSkipCheck()) {
entity.setTestResult(TestResult.PASSED);
} else {
entity.setTestResult(checkTestResult(entity.getExpectValue(), value, valueType));
}
}
}
}

9
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/vo/TestCaseParameterVo.java

@ -18,6 +18,9 @@ public class TestCaseParameterVo extends CorporationAuditorVo {
//参数输入值
protected String inputValue;
//参数输入值检验结果
protected String inputValueValidateMessage;
//参数期望值
protected String expectValue;
@ -55,6 +58,12 @@ public class TestCaseParameterVo extends CorporationAuditorVo {
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;
}

6
io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml

@ -266,6 +266,7 @@
<column name="IS_MIN_INCLUDE_" type="SMALLINT" remarks="是否包含最小值"/>
<column name="IS_MAX_INCLUDE_" type="SMALLINT" remarks="是否包含最大值"/>
<column name="PATTERN_" type="NVARCHAR(255)" remarks="正则表达式"/>
<column name="EXPRESSION_" type="NVARCHAR(1024)" remarks="表达式"/>
<column name="TIP_" type="NVARCHAR(1024)" remarks="错误提示"/>
<!-- 审计字段 -->
@ -337,9 +338,7 @@
<column name="OBJECT_PROPERTIES_" type="CLOB" remarks="对象属性"/>
<column name="OPTION_CODE_" type="NVARCHAR(255)" remarks="计算选项值使用的选项代码"/>
<column name="PMML_" type="CLOB" remarks="预测模型标记语言"/>
<column name="RULE_" type="CLOB" remarks="规则"/>
<column name="SCORE_CARD_" type="CLOB" remarks="评分卡"/>
<column name="SINGLE_RULE_" type="CLOB" remarks="单规则"/>
<column name="SQL_DATASOURCE_NAME_" type="NVARCHAR(255)" remarks="数据源名称"/>
<column name="SQL_" type="CLOB" remarks="SQL_"/>
<column name="SQL_PARAMETER_VALUES_" type="CLOB" remarks="SQL语句中参数测试值"/>
@ -350,6 +349,8 @@
<column name="WHEN_" type="CLOB" remarks="When表达式"/>
<column name="THEN_" type="CLOB" remarks="Then表达式"/>
<column name="IS_WHEN_THEN_SHORTED_" type="SMALLINT" remarks="When表达式成立时是否短路操作"/>
<column name="SINGLE_RULE_" type="CLOB" remarks="单规则"/>
<column name="RULE_SET_" type="CLOB" remarks="规则集"/>
<!-- 审计字段 -->
<column name="JPA_VERSION_" type="INTEGER" remarks="JPA乐观锁版本"/>
@ -681,6 +682,7 @@
<column name="IS_MIN_INCLUDE_" type="SMALLINT" remarks="是否包含最小值"/>
<column name="IS_MAX_INCLUDE_" type="SMALLINT" remarks="是否包含最大值"/>
<column name="PATTERN_" type="NVARCHAR(255)" remarks="正则表达式"/>
<column name="EXPRESSION_" type="NVARCHAR(1024)" remarks="表达式"/>
<column name="TIP_" type="NVARCHAR(1024)" remarks="错误提示"/>
<!-- 审计字段 -->

2
io.sc.engine.st.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",

2
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.2.14",
"version": "8.2.15",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"main": "dist/platform-core.js",

13
io.sc.platform.core.frontend/src/platform/utils/Tools.ts

@ -1077,6 +1077,19 @@ class Tools {
}
return false;
}
/**
* HTML
* @param html HTML
* @returns
*/
public static escapeHtml(html: string) {
html = html || '';
html = html.replace(/&/g, '&amp;');
html = html.replace(/</g, '&lt;');
html = html.replace(/>/g, '&gt;');
return html;
}
}
export { Tools };

1
io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue

@ -24,4 +24,5 @@ const click = () => {
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
userDefinedFunctionsManager.load();
console.log(Tools.escapeHtml('<xml>&</xml>'));
</script>

4
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",

1
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('<xml>&</xml>'));
</script>

70
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"
}
}

2
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",

2
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",

2
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",

16
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<LicenseEntity, String, LicenseRepository> implements LicenseService {
@ -27,6 +31,18 @@ public class LicenseServiceImpl extends DaoServiceImpl<LicenseEntity, String, Li
}
private void standardEntity(LicenseEntity entity){
Set<String> 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);

17
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 字符串

24
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<String, Date>() {
@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> T getValue(String string, Class<T> 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);

Loading…
Cancel
Save