Browse Source

后端 8.2.3, 通过 javassist 支持动态修改第三方包中的类

main
wangshaoping 2 months ago
parent
commit
512190a34a
  1. BIN
      app.platform/Wsp.class
  2. 1
      build-version.gradle
  3. 4
      erm.frontend/package.json
  4. 9
      gradle.properties
  5. 3
      io.sc.creditreport.core/build.gradle
  6. 20
      io.sc.creditreport.core/src/main/java/io/sc/creditreport/core/CreditReportParser.java
  7. 4
      io.sc.engine.mv.frontend/package.json
  8. 20
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
  9. 21
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java
  10. 32
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java
  11. 28
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java
  12. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceResult.java
  13. 6
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/RuleSetResult.java
  14. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ScoreCardItem.java
  15. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java
  16. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/GroovySourceCodeGenerator.java
  17. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
  18. 5
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
  19. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ConditionRange.java
  20. 67
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java
  21. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/MathFormula.java
  22. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java
  23. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ObjectProperty.java
  24. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java
  25. 145
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/RuleSet.java
  26. 146
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ScoreCard.java
  27. 115
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SingleRule.java
  28. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java
  29. 5
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/functions_render.tpl
  30. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/lib.tpl
  31. 8
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl
  32. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/import_render.tpl
  33. 27
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/parameter_render.tpl
  34. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/rule_set.tpl
  35. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/score_card.tpl
  36. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/single_rule.tpl
  37. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ParameterType.java
  38. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ProcessorType.java
  39. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/ArithmeticFunction.java
  40. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/parser/ExecutionFlowParser.java
  41. 48
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/EdgeConditionBranchNode.java
  42. 13
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/EdgeNode.java
  43. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/Parameter.java
  44. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterProcessor.java
  45. 17
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/RuleResultParameter.java
  46. 17
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/SingleRuleResultParameter.java
  47. 16
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/RuleSetParameterProcessor.java
  48. 9
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java
  49. 63
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java
  50. 6
      io.sc.engine.rule.core/src/main/resources/META-INF/platform/plugins/rule-engine-dictionary.json
  51. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary.properties
  52. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_tw_CN.properties
  53. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_zh_CN.properties
  54. 4
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties
  55. 4
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties
  56. 4
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties
  57. 4
      io.sc.engine.rule.frontend/package.json
  58. 2
      io.sc.engine.rule.frontend/src/i18n/messages.json
  59. 2
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  60. 2
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  61. 2
      io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue
  62. 1
      io.sc.engine.rule.frontend/src/views/lib/Lib.vue
  63. 1
      io.sc.engine.rule.frontend/src/views/resources/Resources.vue
  64. 2
      io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue
  65. 6
      io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue
  66. 19
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  67. 23
      io.sc.engine.rule.frontend/src/views/shared/ProcessorManager.ts
  68. 9
      io.sc.engine.rule.frontend/src/views/shared/TestCaseGrid.vue
  69. 3
      io.sc.engine.rule.frontend/src/views/shared/TestcaseParameterGrid.vue
  70. 2
      io.sc.engine.rule.frontend/src/views/shared/UserDefinedFunctionsManager.ts
  71. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts
  72. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts
  73. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts
  74. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts
  75. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts
  76. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts
  77. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts
  78. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts
  79. 19
      io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts
  80. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts
  81. 7
      io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts
  82. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts
  83. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts
  84. 175
      io.sc.engine.rule.frontend/src/views/shared/processors/RuleSet.ts
  85. 7
      io.sc.engine.rule.frontend/src/views/shared/processors/ScoreCard.ts
  86. 163
      io.sc.engine.rule.frontend/src/views/shared/processors/SingleRule.ts
  87. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts
  88. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/Ternary.ts
  89. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/WhenThen.ts
  90. 5
      io.sc.engine.rule.frontend/src/views/shared/processors/index.ts
  91. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/AutoCompletionServiceImpl.java
  92. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java
  93. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/function/controller/FunctionWebController.java
  94. 12
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java
  95. 16
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterProcessorEntityConverter.java
  96. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterEntity.java
  97. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterProcessorEntity.java
  98. 14
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/InSubOutParameterEntity.java
  99. 61
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/RuleResultParameterEntity.java
  100. 61
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/SingleRuleResultParameterEntity.java

BIN
app.platform/Wsp.class

Binary file not shown.

1
build-version.gradle

@ -7,6 +7,7 @@ ext['PlatformDependencyVersions'] =[
"org.checkerframework:checker-qual" : "${checker_version}", "org.checkerframework:checker-qual" : "${checker_version}",
"com.google.guava:guava" : "${guava_version}", "com.google.guava:guava" : "${guava_version}",
"com.nimbusds:nimbus-jose-jwt" : "9.22", "com.nimbusds:nimbus-jose-jwt" : "9.22",
"org.javassist:javassist" : "${javassist_version}",
"org.codehaus.groovy:groovy" : "3.0.19", "org.codehaus.groovy:groovy" : "3.0.19",
"org.codehaus.groovy:groovy-jsr223" : "3.0.19", "org.codehaus.groovy:groovy-jsr223" : "3.0.19",
"org.codehaus.groovy:groovy-datetime" : "3.0.19", "org.codehaus.groovy:groovy-datetime" : "3.0.19",

4
erm.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "erm.frontend", "name": "erm.frontend",
"version": "8.2.2", "version": "8.2.3",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.8", "platform-core": "8.2.14",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

9
gradle.properties

@ -36,15 +36,15 @@ application_version=1.0.0
# platform # platform
######################################gra##################### ######################################gra#####################
platform_group=io.sc platform_group=io.sc
platform_version=8.2.2 platform_version=8.2.3
platform_plugin_version=8.2.2 platform_plugin_version=8.2.3
platform_core_frontend_version=8.2.10 platform_core_frontend_version=8.2.14
########################################################### ###########################################################
# dependencies version # dependencies version
########################################################### ###########################################################
asciidoctor_version=3.3.2 asciidoctor_version=3.3.2
asm_version=9.7 asm_version=9.7.1
checker_version=3.43.0 checker_version=3.43.0
commons_fileupload_version=1.4 commons_fileupload_version=1.4
commons_io_version=2.16.1 commons_io_version=2.16.1
@ -56,6 +56,7 @@ flowable_version=6.8.0
guava_version=31.1-jre guava_version=31.1-jre
ipaddress_version=5.4.0 ipaddress_version=5.4.0
jackson_version=2.13.5 jackson_version=2.13.5
javassist_version=3.21.0-GA
jasypt_version=2.1.2 jasypt_version=2.1.2
jboss_logging_version=3.3.2.Final jboss_logging_version=3.3.2.Final
jcommander_version=1.82 jcommander_version=1.82

3
io.sc.creditreport.core/build.gradle

@ -1,6 +1,5 @@
dependencies { dependencies {
api( api(
"org.springframework:spring-core", project(":io.sc.platform.util"),
"com.fasterxml.jackson.dataformat:jackson-dataformat-xml",
) )
} }

20
io.sc.creditreport.core/src/main/java/io/sc/creditreport/core/CreditReportParser.java

@ -1,28 +1,14 @@
package io.sc.creditreport.core; package io.sc.creditreport.core;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature; import io.sc.platform.util.ObjectMapperUtil;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class CreditReportParser { public class CreditReportParser {
private static XmlMapper mapper =new XmlMapper();
static {
mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES,false);
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE,false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
}
public static io.sc.creditreport.core.person.Document parsePersonCreditReport(String xml) throws JsonProcessingException { public static io.sc.creditreport.core.person.Document parsePersonCreditReport(String xml) throws JsonProcessingException {
return mapper.readValue(xml, io.sc.creditreport.core.person.Document.class); return ObjectMapperUtil.xml().readValue(xml, io.sc.creditreport.core.person.Document.class);
} }
public static io.sc.creditreport.core.company.Document parseCompanyCreditReport(String xml) throws JsonProcessingException { public static io.sc.creditreport.core.company.Document parseCompanyCreditReport(String xml) throws JsonProcessingException {
return mapper.readValue(xml, io.sc.creditreport.core.company.Document.class); return ObjectMapperUtil.xml().readValue(xml, io.sc.creditreport.core.company.Document.class);
} }
} }

4
io.sc.engine.mv.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.mv.frontend", "name": "io.sc.engine.mv.frontend",
"version": "8.2.2", "version": "8.2.3",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.10", "platform-core": "8.2.14",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

20
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java

@ -29,60 +29,60 @@ public class LocalExecutor implements Executor {
@Override @Override
public void compile(String resourceId) throws Exception { public void compile(String resourceId) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId); ExecuteUnit executeUnit =loader.load(resourceId);
EngineRuntime.getInstance().compileById(resourceId,executeUnit); EngineRuntime.getInstance().compile(resourceId,executeUnit);
} }
@Override @Override
public void compile(String resourceCode, Integer version) throws Exception { public void compile(String resourceCode, Integer version) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode,version); ExecuteUnit executeUnit =loader.load(resourceCode,version);
EngineRuntime.getInstance().compileByCode(resourceCode,version,executeUnit); EngineRuntime.getInstance().compile(resourceCode,version,executeUnit);
} }
@Override @Override
public ResourceResult execute(String resourceId, Map<String, Object> map) throws Exception { public ResourceResult execute(String resourceId, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId); ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit, map); return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, map);
} }
@Override @Override
public ResourceResult execute(String resourceId, String json) throws Exception { public ResourceResult execute(String resourceId, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId); ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit, json); return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, json);
} }
@Override @Override
public ResourceResult execute(String resourceId, String subModelCode, Map<String, Object> map) throws Exception { public ResourceResult execute(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId); ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit,subModelCode,map); return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,map);
} }
@Override @Override
public ResourceResult execute(String resourceId, String subModelCode, String json) throws Exception { public ResourceResult execute(String resourceId, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId); ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit,subModelCode,json); return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,json);
} }
@Override @Override
public ResourceResult execute(String resourceCode, Integer version, Map<String, Object> map) throws Exception { public ResourceResult execute(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version); ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit, map); return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit, map);
} }
@Override @Override
public ResourceResult execute(String resourceCode, Integer version, String json) throws Exception { public ResourceResult execute(String resourceCode, Integer version, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version); ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit, json); return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit, json);
} }
@Override @Override
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception { public ResourceResult execute(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version); ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit,subModelCode,map); return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit,subModelCode,map);
} }
@Override @Override
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, String json) throws Exception { public ResourceResult execute(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version); ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,executeUnit,subModelCode,json); return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit,subModelCode,json);
} }
} }

21
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java

@ -22,18 +22,17 @@ public abstract class EngineRuntime {
return getInstance(GROOVY); return getInstance(GROOVY);
} }
public abstract ResourceResult executeById(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception; public abstract void compile(String resourceId, ExecuteUnit wrapper) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ExecuteUnit wrapper,String subModelCode,String json) throws Exception; public abstract void compile(String resourceCode, Integer version, ExecuteUnit wrapper) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,String json) throws Exception; public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,String subModelCode,String json) throws Exception; public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, Map<String,Object> map) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String,Object> map) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ExecuteUnit wrapper,Map<String,Object> map) throws Exception; public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception;
public abstract ResourceResult executeById(Executor executor,String resourceId,ExecuteUnit wrapper,String subModelCode,Map<String,Object> map) throws Exception; public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, Map<String,Object> map) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String,Object> map) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,Map<String,Object> map) throws Exception;
public abstract ResourceResult executeByCode(Executor executor,String resourceCode,Integer version,ExecuteUnit wrapper,String subModelCode,Map<String,Object> map) throws Exception;
public abstract void compileById(String resourceId,ExecuteUnit wrapper) throws Exception;
public abstract void compileByCode(String resourceCode,Integer version,ExecuteUnit wrapper) throws Exception;
} }

32
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java

@ -28,7 +28,7 @@ public class GroovyEngineRuntime extends EngineRuntime{
} }
@Override @Override
public void compileById(String resourceId, ExecuteUnit executeUnit) throws Exception { public void compile(String resourceId, ExecuteUnit executeUnit) throws Exception {
SourceCode code = generator.generate(resourceId, executeUnit); SourceCode code = generator.generate(resourceId, executeUnit);
String resourceName =null; String resourceName =null;
if("RESOURCE".equals(executeUnit.getType())){ if("RESOURCE".equals(executeUnit.getType())){
@ -49,7 +49,7 @@ public class GroovyEngineRuntime extends EngineRuntime{
} }
@Override @Override
public void compileByCode(String resourceCode, Integer version, ExecuteUnit wrapper) throws Exception { public void compile(String resourceCode, Integer version, ExecuteUnit wrapper) throws Exception {
SourceCode code = generator.generate(resourceCode, version, wrapper); SourceCode code = generator.generate(resourceCode, version, wrapper);
String resourceName =null; String resourceName =null;
if("RESOURCE".equals(wrapper.getType())){ if("RESOURCE".equals(wrapper.getType())){
@ -69,7 +69,7 @@ public class GroovyEngineRuntime extends EngineRuntime{
} }
@Override @Override
public ResourceResult executeById(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception { public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper); SourceCode code = generator.generate(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
@ -77,23 +77,23 @@ public class GroovyEngineRuntime extends EngineRuntime{
} }
@Override @Override
public ResourceResult executeById(Executor executor,String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception { public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper); SourceCode code = generator.generate(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
return result; return result;
} }
@Override @Override
public ResourceResult executeById(Executor executor,String resourceId, ExecuteUnit wrapper, Map<String, Object> map) throws Exception { public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper); SourceCode code = generator.generate(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
return result; return result;
} }
@Override @Override
public ResourceResult executeById(Executor executor,String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception { public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper); SourceCode code = generator.generate(resourceId,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));
@ -101,7 +101,7 @@ public class GroovyEngineRuntime extends EngineRuntime{
} }
@Override @Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception { public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper); SourceCode code = generator.generate(resourceCode,version,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
@ -109,23 +109,23 @@ public class GroovyEngineRuntime extends EngineRuntime{
} }
@Override @Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception { public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper); SourceCode code = generator.generate(resourceCode,version,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} //if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
return result; return result;
} }
@Override @Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper,Map<String, Object> map) throws Exception { public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper); SourceCode code = generator.generate(resourceCode,version,wrapper);
//if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
return result; return result;
} }
@Override @Override
public ResourceResult executeByCode(Executor executor,String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception { public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper); SourceCode code = generator.generate(resourceCode,version,wrapper);
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());} if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map)); ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));

28
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java

@ -21,8 +21,8 @@ public class ParameterResult {
private RoundingMode valueRoundingMode; //参数值四舍五入模式 private RoundingMode valueRoundingMode; //参数值四舍五入模式
private String defaultValue; //默认值 private String defaultValue; //默认值
private String value; //结果值 private String value; //结果值
private RuleResult ruleResult; //规则结果值
private SingleRuleResult singleRuleResult; //单规则结果值 private SingleRuleResult singleRuleResult; //单规则结果值
private RuleSetResult ruleSetResult; //规则集结果值
public ParameterResult() {} public ParameterResult() {}
public ParameterResult(String code,String name,ParameterType type,String valueType,String value) { public ParameterResult(String code,String name,ParameterType type,String valueType,String value) {
@ -33,18 +33,18 @@ public class ParameterResult {
this.value =value; this.value =value;
} }
public ParameterResult(String code,String name,ParameterType type,RuleResult ruleResult) { public ParameterResult(String code,String name,ParameterType type,SingleRuleResult singleRuleResult) {
this.code =code; this.code =code;
this.name =name; this.name =name;
this.type =type; this.type =type;
this.ruleResult =ruleResult; this.singleRuleResult =singleRuleResult;
} }
public ParameterResult(String code,String name,ParameterType type,SingleRuleResult singleRuleResult) { public ParameterResult(String code, String name, ParameterType type, RuleSetResult ruleSetResult) {
this.code =code; this.code =code;
this.name =name; this.name =name;
this.type =type; this.type =type;
this.singleRuleResult =singleRuleResult; this.ruleSetResult =ruleSetResult;
} }
public ParameterResult(String code,String name,ParameterType type,String valueType,Integer valueScale,RoundingMode valueRoundingMode,String value) { public ParameterResult(String code,String name,ParameterType type,String valueType,Integer valueScale,RoundingMode valueRoundingMode,String value) {
@ -117,26 +117,16 @@ public class ParameterResult {
public void setValue(String value) { public void setValue(String value) {
this.value = value; this.value = value;
} }
public RuleResult getRuleResult() {
return ruleResult;
}
public void setRuleResult(RuleResult ruleResult) {
this.ruleResult = ruleResult;
}
public SingleRuleResult getSingleRuleResult() { public SingleRuleResult getSingleRuleResult() {
return singleRuleResult; return singleRuleResult;
} }
public void setSingleRuleResult(SingleRuleResult singleRuleResult) { public void setSingleRuleResult(SingleRuleResult singleRuleResult) {
this.singleRuleResult = singleRuleResult; this.singleRuleResult = singleRuleResult;
} }
@Override public RuleSetResult getRuleResult() {
public String toString() { return ruleSetResult;
try {
return ObjectMapperUtil.json().writeValueAsString(this);
} catch (JsonProcessingException e) {
return "ParameterResult [code=" + code + ", name=" + name + ", type=" + type + ", valueType=" + valueType
+ ", valueScale=" + valueScale + ", valueRoundingMode=" + valueRoundingMode + ", defaultValue="
+ defaultValue + ", value=" + value + "]";
} }
public void setRuleResult(RuleSetResult ruleResult) {
this.ruleSetResult = ruleResult;
} }
} }

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceResult.java

@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.platform.util.ObjectMapperUtil; import io.sc.platform.util.ObjectMapperUtil;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

6
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/RuleResult.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/RuleSetResult.java

@ -9,10 +9,10 @@ import java.util.List;
/** /**
* 规则结果值 * 规则结果值
*/ */
public class RuleResult { public class RuleSetResult {
private boolean triggered; //是否触发 private boolean triggered; //是否触发
private Integer level; //等级 private Integer level; //等级
private List<Rule> rules =new ArrayList<Rule>(); //触发的规则集合 private List<Rule> rules =new ArrayList<>(); //触发的规则集合
public void addRule(boolean isTriggered,Integer level,String code,String name,String category,String value,String message) { public void addRule(boolean isTriggered,Integer level,String code,String name,String category,String value,String message) {
Rule rule =new Rule(isTriggered,level,code,name,category,value,message); Rule rule =new Rule(isTriggered,level,code,name,category,value,message);
@ -85,7 +85,7 @@ public class RuleResult {
return false; return false;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())
return false; return false;
RuleResult other = (RuleResult) obj; RuleSetResult other = (RuleSetResult) obj;
if (triggered != other.triggered) if (triggered != other.triggered)
return false; return false;
if (level == null) { if (level == null) {

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ScoreCardItem.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ScoreCardItem.java

@ -1,6 +1,8 @@
package io.sc.engine.rule.core.code.generator.impl.processor; package io.sc.engine.rule.core;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.sc.engine.rule.core.code.generator.impl.processor.ConditionRange;
import io.sc.engine.rule.core.code.generator.impl.processor.NumberRange;
import io.sc.engine.rule.core.enums.ProcessorType; import io.sc.engine.rule.core.enums.ProcessorType;
import java.util.List; import java.util.List;

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java

@ -60,6 +60,9 @@ public class ExecuteUnit4ResourceGenerator extends ExecuteUnitGenerator {
engine.addSharedObject("SqlFieldMapping",new SqlFieldMapping()); engine.addSharedObject("SqlFieldMapping",new SqlFieldMapping());
engine.addSharedObject("Ternary",new Ternary()); engine.addSharedObject("Ternary",new Ternary());
engine.addSharedObject("WhenThen",new WhenThen()); engine.addSharedObject("WhenThen",new WhenThen());
engine.addSharedObject("ScoreCard",new ScoreCard());
engine.addSharedObject("SingleRule",new SingleRule());
engine.addSharedObject("RuleSet",new RuleSet());
Map<String,Object> data =new HashMap<>(); Map<String,Object> data =new HashMap<>();
data.put("packageName",this.getPackageName()); data.put("packageName",this.getPackageName());

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/GroovySourceCodeGenerator.java

@ -22,6 +22,6 @@ public class GroovySourceCodeGenerator implements SourceCodeGenerator {
@Override @Override
public SourceCode generate(String resourceCode, Integer version, ExecuteUnit executeUnit) throws Exception { public SourceCode generate(String resourceCode, Integer version, ExecuteUnit executeUnit) throws Exception {
return null; return generate(executeUnit);
} }
} }

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java

@ -1,5 +1,6 @@
package io.sc.engine.rule.core.code.generator.impl; package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.enums.IndicatorType;
import io.sc.engine.rule.core.enums.ParameterType; import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.po.lib.Indicator; import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.IndicatorValidator; import io.sc.engine.rule.core.po.lib.IndicatorValidator;
@ -200,7 +201,7 @@ public class IndicatorGenerator {
variables.put("valueRoundingMode",valueRoundingMode==null?RoundingMode.HALF_UP:valueRoundingMode); variables.put("valueRoundingMode",valueRoundingMode==null?RoundingMode.HALF_UP:valueRoundingMode);
variables.put("fieldName",IdReplacer.fieldName(code)); variables.put("fieldName",IdReplacer.fieldName(code));
if(ParameterType.INDICATOR.equals(indicator.getType()) || ParameterType.OUT.equals(indicator.getType()) || ParameterType.INTERMEDIATE.equals(indicator.getType())){ if(IndicatorType.INDICATOR.equals(indicator.getType())){
if(ValueTypeUtil.isDecimal(indicator.getValueType())){ if(ValueTypeUtil.isDecimal(indicator.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode})));"; String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode})));";
sb.append(StringUtil.format(tpl,variables)).append("\n"); sb.append(StringUtil.format(tpl,variables)).append("\n");

5
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java

@ -1,5 +1,6 @@
package io.sc.engine.rule.core.code.generator.impl; package io.sc.engine.rule.core.code.generator.impl;
import io.sc.engine.rule.core.RuleSetResult;
import io.sc.engine.rule.core.enums.ParameterType; 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.Parameter;
import io.sc.engine.rule.core.po.model.ParameterValidator; import io.sc.engine.rule.core.po.model.ParameterValidator;
@ -199,10 +200,10 @@ public class ParameterGenerator {
if(ParameterType.INDICATOR.equals(parameter.getType()) || ParameterType.OUT.equals(parameter.getType()) || ParameterType.INTERMEDIATE.equals(parameter.getType())){ if(ParameterType.INDICATOR.equals(parameter.getType()) || ParameterType.OUT.equals(parameter.getType()) || ParameterType.INTERMEDIATE.equals(parameter.getType())){
if(ValueTypeUtil.isDecimal(parameter.getValueType())){ if(ValueTypeUtil.isDecimal(parameter.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode})));"; String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode}).toString()));";
sb.append(StringUtil.format(tpl,variables)).append("\n"); sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(ValueTypeUtil.isBase(parameter.getValueType())){ }else if(ValueTypeUtil.isBase(parameter.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:this.${fieldName}));"; String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:this.${fieldName}.toString()));";
sb.append(StringUtil.format(tpl,variables)).append("\n"); sb.append(StringUtil.format(tpl,variables)).append("\n");
}else{ }else{
String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:ObjectMapperUtil.json().writeValueAsString(this.${fieldName})));"; String tpl ="result.addParameterResult(new ParameterResult('${code}','${name}',ParameterType.${type},'${valueType}',null,null,this.${fieldName}==null?null:ObjectMapperUtil.json().writeValueAsString(this.${fieldName})));";

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ConditionRange.java

@ -42,7 +42,7 @@ public class ConditionRange {
} }
} }
private String groovy(String code, String valueType,List<ConditionRange> conditionRanges){ public String groovy(String code, String valueType,List<ConditionRange> conditionRanges){
if(!CollectionUtil.hasElements(conditionRanges)){ return null; } if(!CollectionUtil.hasElements(conditionRanges)){ return null; }
List<ConditionRange> _conditionRanges =new ArrayList<ConditionRange>(); List<ConditionRange> _conditionRanges =new ArrayList<ConditionRange>();
//移除没有填写条件的条件范围 //移除没有填写条件的条件范围

67
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java

@ -88,7 +88,7 @@ public class ExecutionFlow {
methodNameCache.put(methodName, null); methodNameCache.put(methodName, null);
} }
} }
return StringUtil.tabs(sb.toString(),1); return sb.toString();
} }
/** /**
@ -101,16 +101,15 @@ public class ExecutionFlow {
*/ */
private String generateConditionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConditionNode node,String methodName) { private String generateConditionGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConditionNode node,String methodName) {
StringBuilder sb =new StringBuilder(); StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//条件判断").append("\n"); sb.append("private static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//条件判断").append("\n");
List<GraphNode> branches =node.getOuts(); //获取条件的所有出口边 List<GraphNode> branches =node.getOuts(); //获取条件的所有出口边
if(branches!=null && branches.size()>0) { if(branches!=null && branches.size()>0) {
List<GraphNode> outs =orderEdges(branches); //对出口边进行排序,有条件的放前面,无条件的放后面 List<GraphNode> outs =orderEdges(branches); //对出口边进行排序,有条件的放前面,无条件的放后面
for(int i=0;i<outs.size();i++) { for(int i=0;i<outs.size();i++) {
EdgeConditionBranchNode edge =(EdgeConditionBranchNode)outs.get(i); //出口边 EdgeConditionBranchNode edge =(EdgeConditionBranchNode)outs.get(i); //出口边
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点 GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
if(i==0) { if(i==0) {
sb.append("\t\tif((").append(ExpressionReplacer.groovy(node.getCondition(),null)).append(")==").append(ExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append("){").append("\n"); sb.append("\tif((").append(ExpressionReplacer.groovy(node.getCondition(),null)).append(")==").append(ExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append("){").append("\n");
}else { }else {
if(edge.getValue()!=null && !edge.getValue().trim().isEmpty()) { if(edge.getValue()!=null && !edge.getValue().trim().isEmpty()) {
sb.append("else if((").append(ExpressionReplacer.groovy(node.getCondition(),null)).append(")==").append(ExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append("){").append("\n"); sb.append("else if((").append(ExpressionReplacer.groovy(node.getCondition(),null)).append(")==").append(ExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append("){").append("\n");
@ -123,14 +122,14 @@ public class ExecutionFlow {
String[] commandSplits =commands.split("\n"); String[] commandSplits =commands.split("\n");
if(commandSplits!=null && commandSplits.length>0) { if(commandSplits!=null && commandSplits.length>0) {
for(String split : commandSplits) { for(String split : commandSplits) {
sb.append("\t\t\t").append(split).append("\n"); sb.append("\t\t").append(split).append("\n");
} }
} }
} }
sb.append("\t\t\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n"); sb.append("\t\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n");
sb.append("\t\t}"); sb.append("\t}");
} }
sb.append("\n\t}\n\n"); sb.append("\n}\n\n");
//继续生成后续方法 //继续生成后续方法
for(GraphNode out :outs) { for(GraphNode out :outs) {
sb.append(_generateGroovyCode(methodNameCache,parameter,out.getOuts().get(0))); sb.append(_generateGroovyCode(methodNameCache,parameter,out.getOuts().get(0)));
@ -149,16 +148,16 @@ public class ExecutionFlow {
*/ */
private String generateParallelGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ParallelNode node,String methodName) { private String generateParallelGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ParallelNode node,String methodName) {
StringBuilder sb =new StringBuilder(); StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//并发网关").append("\n"); sb.append("private static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//并发网关").append("\n");
List<GraphNode> outs =node.getOuts(); //获取条件的所有出口边 List<GraphNode> outs =node.getOuts(); //获取条件的所有出口边
if(outs!=null && outs.size()>0) { if(outs!=null && outs.size()>0) {
for(int i=0;i<outs.size();i++) { for(int i=0;i<outs.size();i++) {
EdgeNode edge =(EdgeNode)outs.get(i); //出口边 EdgeNode edge =(EdgeNode)outs.get(i); //出口边
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点 GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
sb.append("\t\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n"); sb.append("\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n");
} }
sb.append("\t}\n\n"); sb.append("}\n\n");
//继续生成后续方法 //继续生成后续方法
for(GraphNode out :outs) { for(GraphNode out :outs) {
sb.append(_generateGroovyCode(methodNameCache,parameter,out.getOuts().get(0))); sb.append(_generateGroovyCode(methodNameCache,parameter,out.getOuts().get(0)));
@ -177,20 +176,20 @@ public class ExecutionFlow {
*/ */
private String generateCommandSetGroovyCode(Map<String,String> methodNameCache,Parameter parameter,CommandSetNode node,String methodName) { private String generateCommandSetGroovyCode(Map<String,String> methodNameCache,Parameter parameter,CommandSetNode node,String methodName) {
StringBuilder sb =new StringBuilder(); StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//指令集").append("\n"); sb.append("private static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//指令集").append("\n");
String commands =node.getCommands(); String commands =node.getCommands();
if(commands!=null && !commands.isEmpty()) { if(commands!=null && !commands.isEmpty()) {
sb.append("\t\t").append(ExpressionReplacer.groovy(commands,null)).append("\n"); sb.append("\t").append(ExpressionReplacer.groovy(commands,null)).append("\n");
//继续调用后续方法 //继续调用后续方法
List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边 List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) { if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) { for(GraphNode edge : edges) {
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点 GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
sb.append("\t\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n"); sb.append("\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n");
} }
} }
} }
sb.append("\t}").append("\n\n"); sb.append("}").append("\n\n");
//继续生成后续方法 //继续生成后续方法
List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边 List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边
@ -213,23 +212,23 @@ public class ExecutionFlow {
*/ */
private String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode node,String methodName) { private String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode node,String methodName) {
StringBuilder sb =new StringBuilder(); StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n"); sb.append("private static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n");
String code =node.getCode(); String code =node.getCode();
String version =node.getVersion(); String version =node.getVersion();
if(version==null || version.trim().equals("")) { if(version==null || version.trim().equals("")) {
version ="null"; version ="null";
} }
sb.append("\t\t").append("ResourceResult result =executor.executeByCode(\"").append(code).append("\",").append(version).append(",arg.toMap())").append(";\n"); sb.append("\t").append("ResourceResult result =executor.execute(\"").append(code).append("\",").append(version).append(",arg.toMap())").append(";\n");
sb.append("\t\t").append("arg.mergeResult(result);").append("\n"); sb.append("\t").append("arg.mergeResult(result);").append("\n");
//继续调用后续方法 //继续调用后续方法
List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边 List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) { if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) { for(GraphNode edge : edges) {
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点 GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
sb.append("\t\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n"); sb.append("\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n");
} }
} }
sb.append("\t}").append("\n\n"); sb.append("}").append("\n\n");
//继续生成后续方法 //继续生成后续方法
edges =node.getOuts(); //获取条件的所有出口边 edges =node.getOuts(); //获取条件的所有出口边
@ -252,7 +251,7 @@ public class ExecutionFlow {
*/ */
private String generateConfigurableResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConfigurableResourceAbstractNode node,String methodName) { private String generateConfigurableResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConfigurableResourceAbstractNode node,String methodName) {
StringBuilder sb =new StringBuilder(); StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//可配置资源").append("\n"); sb.append("private static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//可配置资源").append("\n");
String code =node.getCode(); String code =node.getCode();
String version =node.getVersion(); String version =node.getVersion();
String inputCommands =node.getInputCommands(); String inputCommands =node.getInputCommands();
@ -261,24 +260,24 @@ public class ExecutionFlow {
version ="null"; version ="null";
} }
sb.append("\t\t//准备调用资源的输入参数\n"); sb.append("\t//准备调用资源的输入参数\n");
sb.append("\t\t").append("Map<String,Object> map =new HashMap<String,Object>();").append("\n"); sb.append("\t").append("Map<String,Object> map =new HashMap<String,Object>();").append("\n");
sb.append("\t\t").append(ExpressionReplacer.groovy(inputCommands,null).replace("\n", "\n\t\t")).append("\n"); sb.append("\t").append(StringUtil.tabs(ExpressionReplacer.groovy(inputCommands,null),1)).append("\n");
sb.append("\n"); sb.append("\n");
sb.append("\t\t//调用资源\n"); sb.append("\t//调用资源\n");
sb.append("\t\t").append("ResourceResult result =executor.executeByCode(\"").append(code).append("\",").append(version).append(",map);").append("\n"); sb.append("\t").append("ResourceResult result =executor.execute(\"").append(code).append("\",").append(version).append(",map);").append("\n");
sb.append("\n"); sb.append("\n");
sb.append("\t\t//处理资源调用完毕后的输出值\n"); sb.append("\t//处理资源调用完毕后的输出值\n");
sb.append("\t\t").append(ExpressionReplacer.groovy(outputCommands,null).replace("\n", "\n\t\t")).append("\n"); sb.append("\t").append(ExpressionReplacer.groovy(outputCommands,null).replace("\n", "\n\t\t")).append("\n");
//继续调用后续方法 //继续调用后续方法
List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边 List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) { if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) { for(GraphNode edge : edges) {
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点 GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
sb.append("\t\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n"); sb.append("\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n");
} }
} }
sb.append("\t}").append("\n\n"); sb.append("}").append("\n\n");
//继续生成后续方法 //继续生成后续方法
edges =node.getOuts(); //获取条件的所有出口边 edges =node.getOuts(); //获取条件的所有出口边
@ -301,18 +300,18 @@ public class ExecutionFlow {
*/ */
private String generateModelAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,SubModelAbstractNode node,String methodName) { private String generateModelAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,SubModelAbstractNode node,String methodName) {
StringBuilder sb =new StringBuilder(); StringBuilder sb =new StringBuilder();
sb.append("\tprivate static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//模型").append("\n"); sb.append("private static void ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//模型").append("\n");
String code =node.getCode(); String code =node.getCode();
sb.append("\t\t").append("").append(code).append("(executor,arg);\n"); sb.append("\t").append("").append(code).append("(executor,arg);\n");
//继续调用后续方法 //继续调用后续方法
List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边 List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) { if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) { for(GraphNode edge : edges) {
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点 GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
sb.append("\t\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n"); sb.append("\t").append("Flow_").append(parameter.getCode()).append("_").append(nexNode.getId()).append("(").append("executor,").append(ExpressionReplacer.ARGUMENT_NAME).append(");").append("\n");
} }
} }
sb.append("\t}").append("\n\n"); sb.append("}").append("\n\n");
//继续生成后续方法 //继续生成后续方法
edges =node.getOuts(); //获取条件的所有出口边 edges =node.getOuts(); //获取条件的所有出口边

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/MathFormula.java

@ -1,6 +1,5 @@
package io.sc.engine.rule.core.code.generator.impl.processor; package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.sc.engine.rule.core.po.lib.Indicator; import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.MathFormulaIndicatorProcessor; import io.sc.engine.rule.core.po.lib.processor.MathFormulaIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter; import io.sc.engine.rule.core.po.model.Parameter;
@ -18,7 +17,6 @@ import java.io.Reader;
import java.io.StringReader; import java.io.StringReader;
import java.util.ArrayDeque; import java.util.ArrayDeque;
@JsonIgnoreProperties(ignoreUnknown=true)
public class MathFormula { public class MathFormula {
public String groovy(Parameter parameter, MathFormulaParameterProcessor processor) throws Exception{ public String groovy(Parameter parameter, MathFormulaParameterProcessor processor) throws Exception{
if (parameter == null || processor == null) { if (parameter == null || processor == null) {

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java

@ -1,6 +1,5 @@
package io.sc.engine.rule.core.code.generator.impl.processor; package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator; import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.NumberRangeIndicatorProcessor; import io.sc.engine.rule.core.po.lib.processor.NumberRangeIndicatorProcessor;
@ -14,7 +13,6 @@ import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class NumberRange { public class NumberRange {
private Boolean minIncluded; private Boolean minIncluded;
private BigDecimal min; private BigDecimal min;

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ObjectProperty.java

@ -16,7 +16,6 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class ObjectProperty { public class ObjectProperty {
private String code; private String code;
private String name; private String name;
@ -74,7 +73,7 @@ public class ObjectProperty {
sb.append("if (true) {").append("\n"); sb.append("if (true) {").append("\n");
} }
sb.append("\tif (").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append("==null) {").append("\n"); sb.append("\tif (").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append("==null) {").append("\n");
sb.append("t\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(" =new ").append(valueType).append("_V").append(valueTypeVersion).append("();").append("\n"); sb.append("\t\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code)).append(" =new ").append(valueType).append("_V").append(valueTypeVersion).append("();").append("\n");
sb.append("\t}").append("\n"); sb.append("\t}").append("\n");
int size =_objectProperties.size(); int size =_objectProperties.size();
for(int i=0;i<size;i++) { for(int i=0;i<size;i++) {

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java

@ -41,7 +41,7 @@ public class OptionValue {
sb.append("){").append("\n"); sb.append("){").append("\n");
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode())); sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode()));
sb.append("="); sb.append("=");
sb.append(GroovyExpressionReplacer.groovy(item.getInputValue(),parameter.getValueType())); sb.append(GroovyExpressionReplacer.groovy(item.getValue(),parameter.getValueType()));
sb.append("\n"); sb.append("\n");
sb.append("}"); sb.append("}");
} }

145
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/RuleSet.java

@ -0,0 +1,145 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.RuleSetParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.ArrayList;
import java.util.List;
public class RuleSet {
private Integer level;
private String code;
private String name;
private String category;
private String condition;
private String value;
private String message;
public static List<RuleSet> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<RuleSet>>(){});
}
public String groovy(Parameter parameter, RuleSetParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<RuleSet> rules =parse(processor.getRuleSet());
List<RuleSet> _rules =new ArrayList<>();
//移除没有填写条件的条件范围
if(rules!=null && rules.size()>0) {
for(RuleSet rule : rules) {
if(rule.getCondition()!=null && !"".equals(rule.getCondition().trim())) {
_rules.add(rule);
}
}
}
if(_rules!=null && _rules.size()>0) {
StringBuilder sb =new StringBuilder();
sb.append("RuleSetResult temp =new RuleSetResult();").append("\n");
int size =_rules.size();
for(int i=0;i<size;i++) {
RuleSet rule =_rules.get(i);
sb.append("if(");
sb.append(GroovyExpressionReplacer.groovy(rule.condition, null));
sb.append(")").append("{").append("\n");
sb.append("\t").append("temp.addRule(");
sb.append("true,");
sb.append(rule.level).append(",");
sb.append("'''" + rule.code + "''',");
sb.append("'''" + rule.name + "''',");
if(rule.category!=null && !"".equals(rule.category)) {
sb.append("'''" + rule.category + "''',");
}else {
sb.append("null,");
}
sb.append(GroovyExpressionReplacer.groovy(rule.value, "java.lang.String")).append(",");
sb.append(GroovyExpressionReplacer.groovy(rule.message, "java.lang.String"));
sb.append(")").append(";\n");
sb.append("}else{").append("\n");
sb.append("\t").append("temp.addRule(");
sb.append("false,");
sb.append(rule.level).append(",");
sb.append("'''" + rule.code + "''',");
sb.append("'''" + rule.name + "''',");
if(rule.category!=null && !"".equals(rule.category)) {
sb.append("'''" + rule.category + "''',");
}else {
sb.append("null,");
}
sb.append(GroovyExpressionReplacer.groovy(rule.value, "java.lang.String")).append(",");
sb.append(GroovyExpressionReplacer.groovy(rule.message, "java.lang.String"));
sb.append(")").append(";\n");
sb.append("}\n");
}
sb.append("").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode())).append(" =temp;").append("\n");
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Rule Set groovy source code.", e);
}
return null;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

146
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ScoreCard.java

@ -0,0 +1,146 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.ScoreCardItem;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ScoreCardParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class ScoreCard {
public List<ScoreCardItem> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<ScoreCardItem>>(){});
}
public String groovy(Parameter parameter, ScoreCardParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<ScoreCardItem> scoreCardItems = parse(processor.getScoreCard());
if(!CollectionUtil.hasElements(scoreCardItems)){
return null;
}
StringBuilder sb =new StringBuilder();
sb.append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode())).append(" =0;");
sb.append("//初始化结果值").append("\n");
sb.append("\n");
for(ScoreCardItem item : scoreCardItems){
sb.append("//").append(item.getCode()).append(",").append(item.getType()).append("\n");
switch(item.getType()){
case CONDITION_RANGE:
sb.append(groovyConditionRange(parameter,item));
break;
case NUMBER_RANGE:
sb.append(groovyNumberRange(parameter,item));
break;
}
sb.append("\n\n");
}
return sb.toString();
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s ScoreCard groovy source code.", e);
}
}
public String groovyConditionRange(Parameter parameter,ScoreCardItem scoreCardItem){
if(!CollectionUtil.hasElements(scoreCardItem.getConditionRange())){ return null; }
List<ConditionRange> _conditionRanges =new ArrayList<ConditionRange>();
//移除没有填写条件的条件范围
for(ConditionRange conditionRange : scoreCardItem.getConditionRange()) {
if(StringUtils.hasText(conditionRange.getCondition())) {
_conditionRanges.add(conditionRange);
}
}
if(_conditionRanges.isEmpty()){
return null;
}
StringBuilder sb =new StringBuilder();
int size =_conditionRanges.size();
for(int i=0;i<size;i++) {
ConditionRange conditionRange =_conditionRanges.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
sb.append(GroovyExpressionReplacer.groovy(conditionRange.getCondition()));
sb.append(")").append("{").append("\n");
if(StringUtils.hasText(conditionRange.getValue())){
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode()));
sb.append(" +=");
if(scoreCardItem.getWeight()!=null) {
sb.append(scoreCardItem.getWeight()).append("*").append(GroovyExpressionReplacer.groovy(conditionRange.getValue(), parameter.getValueType())).append(";\n");
}else{
sb.append(GroovyExpressionReplacer.groovy(conditionRange.getValue(), parameter.getValueType())).append(";\n");
}
}
sb.append("}");
}
return sb.toString();
}
public String groovyNumberRange(Parameter parameter,ScoreCardItem scoreCardItem){
if(!CollectionUtil.hasElements(scoreCardItem.getNumberRange())){ return null; }
List<NumberRange> _numberRanges =new ArrayList<NumberRange>();
//移除空行
for(NumberRange numberRange : scoreCardItem.getNumberRange()) {
if(numberRange.getMin()!=null || numberRange.getMax()!=null || numberRange.getValue()!=null) {
_numberRanges.add(numberRange);
}
}
if(_numberRanges.isEmpty()){
return null;
}
String var =GroovyExpressionReplacer.ARGUMENT_NAME + "." + scoreCardItem.getCode();
StringBuilder sb = new StringBuilder();
int size = _numberRanges.size();
for (int i = 0; i < size; i++) {
NumberRange numberRange = _numberRanges.get(i);
if (i == 0) {
sb.append("if(");
} else {
sb.append("else if(");
}
if (numberRange.getMin() == null && numberRange.getMax() == null) {
sb.append(GroovyExpressionReplacer.groovy(var)).append("==null");
} else if (numberRange.getMin() != null) {
if (numberRange.getMaxIncluded() != null && numberRange.getMinIncluded()) {
sb.append(GroovyExpressionReplacer.groovy(var)).append(">=").append(numberRange.getMin());
} else {
sb.append(GroovyExpressionReplacer.groovy(var)).append(">").append(numberRange.getMin());
}
}
if (numberRange.getMin() != null && numberRange.getMax() != null) {
sb.append(" && ");
}
if (numberRange.getMax() != null) {
if (numberRange.getMaxIncluded() != null && numberRange.getMaxIncluded()) {
sb.append(GroovyExpressionReplacer.groovy(var)).append("<=").append(numberRange.getMax());
} else {
sb.append(GroovyExpressionReplacer.groovy(var)).append("<").append(numberRange.getMax());
}
}
sb.append(")").append("{").append("\n");
if(StringUtils.hasText(numberRange.getValue())){
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode()));
sb.append(" +=");
if(scoreCardItem.getWeight()!=null) {
sb.append(scoreCardItem.getWeight()).append("*").append(GroovyExpressionReplacer.groovy(numberRange.getValue(), parameter.getValueType())).append(";\n");
}else{
sb.append(GroovyExpressionReplacer.groovy(numberRange.getValue(), parameter.getValueType())).append(";\n");
}
}
sb.append("}");
}
return sb.toString();
}
}

115
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SingleRule.java

@ -0,0 +1,115 @@
package io.sc.engine.rule.core.code.generator.impl.processor;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.SingleRuleParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.platform.util.ObjectMapperUtil;
import java.util.ArrayList;
import java.util.List;
public class SingleRule {
private Integer level;
private String category;
private String condition;
private String value;
private String message;
public static List<SingleRule> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<SingleRule>>(){});
}
public String groovy(Parameter parameter, SingleRuleParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){
return null;
}
try {
List<SingleRule> rules =parse(processor.getSingleRule());
List<SingleRule> _rules =new ArrayList<>();
//移除没有填写条件的条件范围
if(rules!=null && rules.size()>0) {
for(SingleRule rule : rules) {
if(rule.getCondition()!=null && !"".equals(rule.getCondition().trim())) {
_rules.add(rule);
}
}
}
if(_rules!=null && _rules.size()>0) {
StringBuilder sb =new StringBuilder();
sb.append("SingleRuleResult result =new SingleRuleResult();").append("\n");
int size =_rules.size();
for(int i=0;i<size;i++) {
SingleRule rule =_rules.get(i);
sb.append("if(");
sb.append(GroovyExpressionReplacer.groovy(rule.condition, null));
sb.append(")").append("{").append("\n");
sb.append("\t").append("SingleRuleResult temp =new SingleRuleResult(");
sb.append("true,");
sb.append(rule.level).append(",");
if(rule.category!=null && !"".equals(rule.category)) {
sb.append("'''" + rule.category + "''',");
}else {
sb.append("null,");
}
sb.append(GroovyExpressionReplacer.groovy(rule.value, "java.lang.String")).append(",");
sb.append(GroovyExpressionReplacer.groovy(rule.message, "java.lang.String"));
sb.append(")").append(";\n");
sb.append("\tif(!result.getTriggered() || result.getLevel()>temp.getLevel()){").append("\n");
sb.append("\t\t").append("result =temp;").append("\n");
sb.append("\t}").append("\n");
sb.append("}\n");
}
sb.append("\n");
sb.append("").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode())).append(" =result;").append("\n");
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s Single Rule groovy source code.", e);
}
return null;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java

@ -16,7 +16,6 @@ import org.springframework.util.StringUtils;
import java.util.List; import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class SqlFieldMapping { public class SqlFieldMapping {
private String parameter; private String parameter;
private String field; private String field;

5
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/functions_render.tpl

@ -1,6 +1,7 @@
#define renderFunction(function) #define renderFunction(function)
/**
/**
* #(function.description) * #(function.description)
*/ */
#(function.body) #(tabs(function.body,1))
#end #end

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/lib.tpl

@ -17,9 +17,11 @@
//****************************************************************************** //******************************************************************************
// 自定义函数 // 自定义函数
//****************************************************************************** //******************************************************************************
class UDF {
#for(function : executeUnit.functions) #for(function : executeUnit.functions)
#@renderFunction(function) #@renderFunction(function)
#end #end
}
//****************************************************************************** //******************************************************************************
// 执行主体类 // 执行主体类

8
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl

@ -22,9 +22,11 @@
//****************************************************************************** //******************************************************************************
// 自定义函数 // 自定义函数
//****************************************************************************** //******************************************************************************
class UDF {
#for(function : executeUnit.functions) #for(function : executeUnit.functions)
#@renderFunction(function) #@renderFunction(function)
#end #end
}
//****************************************************************************** //******************************************************************************
// 执行主体类 // 执行主体类
@ -44,7 +46,7 @@ class #(className(resource.code,resource.version)) {
* @return 执行结果 * @return 执行结果
*/ */
public static ResourceResult execute(Map<String,Object> map) throws Exception{ public static ResourceResult execute(Map<String,Object> map) throws Exception{
return execute(map["executor"],map["subModelCode"],map["arg"]); return execute(map["executor"],map["subModelCode"],map["argument"]);
} }
/** /**
@ -71,7 +73,7 @@ class #(className(resource.code,resource.version)) {
#end #end
//初始化模型参数 //初始化模型参数
if(log.isDebugEnabled()){log.debug("从 {} 初始化模型参数","java.lang.String"==data.class?"Json":"Map");} if(log.isDebugEnabled()){log.debug("从 {} 初始化模型参数",String.class==data.class?"Json":"Map");}
Argument arg =Argument.convertArgument(data); Argument arg =Argument.convertArgument(data);
//输入参数合法性检查 //输入参数合法性检查

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/import_render.tpl

@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import groovy.transform.Canonical; import groovy.transform.Canonical;
import io.sc.engine.rule.client.Executor; import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.core.ResourceAbstract; import io.sc.engine.rule.core.ResourceAbstract;
import io.sc.engine.rule.core.RuleResult; import io.sc.engine.rule.core.RuleSetResult;
import io.sc.engine.rule.core.SingleRuleResult; import io.sc.engine.rule.core.SingleRuleResult;
import io.sc.engine.rule.core.FieldValidator; import io.sc.engine.rule.core.FieldValidator;
import io.sc.engine.rule.core.ParameterResult; import io.sc.engine.rule.core.ParameterResult;
@ -30,6 +30,7 @@ import static io.sc.engine.rule.core.function.ArithmeticFunction.ln;
import static io.sc.engine.rule.core.function.ArithmeticFunction.log; import static io.sc.engine.rule.core.function.ArithmeticFunction.log;
import static io.sc.engine.rule.core.function.ArithmeticFunction.max; import static io.sc.engine.rule.core.function.ArithmeticFunction.max;
import static io.sc.engine.rule.core.function.ArithmeticFunction.min; import static io.sc.engine.rule.core.function.ArithmeticFunction.min;
import static io.sc.engine.rule.core.function.ArithmeticFunction.mod;
import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt; import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt;
import static io.sc.engine.rule.core.function.ArithmeticFunction.root; import static io.sc.engine.rule.core.function.ArithmeticFunction.root;
import static io.sc.engine.rule.core.function.ArithmeticFunction.sum; import static io.sc.engine.rule.core.function.ArithmeticFunction.sum;

27
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/parameter_render.tpl

@ -1,6 +1,25 @@
#define renderParameter(model) #define renderParameter(model)
#for(parameter : model.allParameters) #for(parameter : model.parameters)
#if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) #if(("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) && ("io.sc.engine.rule.core.SingleRuleResult"==parameter.valueType || "io.sc.engine.rule.core.RuleSetResult"==parameter.valueType))
//参数处理器, #(parameter.name)(#(parameter.type))
private static void #(methodName(parameter.code))(Executor executor,Argument arg) {
if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");}
#for(processor : parameter.processors)
#if(processor.enable)
#switch (processor.type.toString())
#case ("SINGLE_RULE")
//单规则
#include("/io/sc/engine/rule/core/code/template/processor/single_rule.tpl")
if(log.isDebugEnabled()){log.debug(" 单规则运算结果 : {}",arg.#(fieldName(parameter.code)));}
#case ("RULE_SET")
//规则集
#include("/io/sc/engine/rule/core/code/template/processor/rule_set.tpl")
if(log.isDebugEnabled()){log.debug(" 规则集运算结果 : {}",arg.#(fieldName(parameter.code)));}
#end
#end
#end
}
#else if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString())
//参数处理器, #(parameter.name)(#(parameter.type)) //参数处理器, #(parameter.name)(#(parameter.type))
private static void #(methodName(parameter.code))(Executor executor,Argument arg) { private static void #(methodName(parameter.code))(Executor executor,Argument arg) {
if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");} if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");}
@ -26,7 +45,7 @@
#case ("DECISION_TREE") #case ("DECISION_TREE")
//决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成) //决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成)
#include("/io/sc/engine/rule/core/code/template/processor/decision_tree.tpl") #include("/io/sc/engine/rule/core/code/template/processor/decision_tree.tpl")
if(log.isDebugEnabled()){log.debug(" 决策树运算结果 : {}",,arg.#(fieldName(parameter.code)));} if(log.isDebugEnabled()){log.debug(" 决策树运算结果 : {}",arg.#(fieldName(parameter.code)));}
#case ("EXECUTION_FLOW") #case ("EXECUTION_FLOW")
//执行流(此处只是入口,真正的执行流计算逻辑在后面通过一系列方法完成) //执行流(此处只是入口,真正的执行流计算逻辑在后面通过一系列方法完成)
#include("/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl") #include("/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl")
@ -98,7 +117,7 @@
#for(processor : parameter.processors) #for(processor : parameter.processors)
#if("EXECUTION_FLOW"==processor.type.toString()) #if("EXECUTION_FLOW"==processor.type.toString())
//执行流函数: #(parameter.name)(#(parameter.type)) //执行流函数: #(parameter.name)(#(parameter.type))
#(ExecutionFlow.groovy(parameter,processor)) #(tabs(ExecutionFlow.groovy(parameter,processor),1))
#end #end
#end #end
#end #end

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/rule_set.tpl

@ -0,0 +1 @@
#(tabs(RuleSet.groovy(parameter,processor),2))

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/score_card.tpl

@ -0,0 +1 @@
#(tabs(ScoreCard.groovy(parameter,processor),2))

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/single_rule.tpl

@ -0,0 +1 @@
#(tabs(SingleRule.groovy(parameter,processor),2))

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ParameterType.java

@ -10,8 +10,6 @@ public enum ParameterType {
INDICATOR, //指标 INDICATOR, //指标
INTERMEDIATE, //中间值 INTERMEDIATE, //中间值
OUT, //输出 OUT, //输出
RULE_RESULT, //规则结果值
SINGLE_RULE_RESULT, //单规则结果值
CONSTANT; //常量 CONSTANT; //常量
public static boolean isInputType(ParameterType type) { public static boolean isInputType(ParameterType type) {

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ProcessorType.java

@ -18,7 +18,7 @@ public enum ProcessorType {
OBJECT_PROPERTIES, //对象属性, 处理对象的所有属性 OBJECT_PROPERTIES, //对象属性, 处理对象的所有属性
OPTION_VALUE, //选项值 OPTION_VALUE, //选项值
PMML, //pmml PMML, //pmml
RULE, //规则 RULE_SET, //规则
SCORE_CARD, //评分卡 SCORE_CARD, //评分卡
SINGLE_RULE, //单规则 SINGLE_RULE, //单规则
SQL, //sql SQL, //sql

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/ArithmeticFunction.java

@ -148,4 +148,6 @@ public class ArithmeticFunction {
public static Double div(Double x, Double y){ public static Double div(Double x, Double y){
return x/y; return x/y;
} }
public static Integer mod(Integer x, Integer y) { return x % y;}
} }

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/parser/ExecutionFlowParser.java

@ -199,7 +199,6 @@ public class ExecutionFlowParser {
xml = xml.replace("<Geometry", "<mxGeometry"); xml = xml.replace("<Geometry", "<mxGeometry");
xml = xml.replace("</Geometry>", "</mxGeometry>"); xml = xml.replace("</Geometry>", "</mxGeometry>");
return xml; return xml;
} }
return xml; return xml;

48
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/EdgeConditionBranchNode.java

@ -1,10 +1,8 @@
package io.sc.engine.rule.core.mxgraph.po; package io.sc.engine.rule.core.mxgraph.po;
public class EdgeConditionBranchNode extends GraphNode { public class EdgeConditionBranchNode extends EdgeNode {
private String valueType; //值类型 private String valueType; //值类型
private String value; //值 private String value; //值
private String sourceId; //源节点ID
private String targetId; //目标节点ID
private String commands; //命令 private String commands; //命令
/** /**
@ -39,38 +37,6 @@ public class EdgeConditionBranchNode extends GraphNode {
this.value = value; this.value = value;
} }
/**
* 获取源节点ID
* @return 源节点ID
*/
public String getSourceId() {
return sourceId;
}
/**
* 设置源节点ID
* @param sourceId 源节点ID
*/
public void setSourceId(String sourceId) {
this.sourceId = sourceId;
}
/**
* 获取目标节点ID
* @return 目标节点ID
*/
public String getTargetId() {
return targetId;
}
/**
* 设置目标节点ID
* @param targetId 目标节点ID
*/
public void setTargetId(String targetId) {
this.targetId = targetId;
}
/** /**
* 获取命令 * 获取命令
* @return 命令 * @return 命令
@ -86,16 +52,4 @@ public class EdgeConditionBranchNode extends GraphNode {
public void setCommands(String commands) { public void setCommands(String commands) {
this.commands = commands; this.commands = commands;
} }
@Override
public String toString() {
return "EdgeConditionBranchNode [id=" + id
+ ", label=" + label
+ ", valueType=" + valueType
+ ", value=" + value
+ ", sourceId=" + sourceId
+ ", targetId=" + targetId
+ ", commands=" + commands
+ ", outs=" + outs + "]";
}
} }

13
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/mxgraph/po/EdgeNode.java

@ -6,8 +6,8 @@ package io.sc.engine.rule.core.mxgraph.po;
* *
*/ */
public class EdgeNode extends GraphNode{ public class EdgeNode extends GraphNode{
private String sourceId; //源节点ID protected String sourceId; //源节点ID
private String targetId; //目标节点ID protected String targetId; //目标节点ID
/** /**
* 获取源节点ID * 获取源节点ID
@ -40,13 +40,4 @@ public class EdgeNode extends GraphNode{
public void setTargetId(String targetId) { public void setTargetId(String targetId) {
this.targetId = targetId; this.targetId = targetId;
} }
@Override
public String toString() {
return "EdgeNode [id=" + id
+ ", label=" + label
+ ", sourceId=" + sourceId
+ ", targetId=" + targetId
+ ", outs=" + outs + "]";
}
} }

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/Parameter.java

@ -18,8 +18,6 @@ import java.util.List;
@JsonSubTypes.Type(value=InOptionParameter.class), //输入选项 @JsonSubTypes.Type(value=InOptionParameter.class), //输入选项
@JsonSubTypes.Type(value=InSubOutParameter.class), //子模型输出 @JsonSubTypes.Type(value=InSubOutParameter.class), //子模型输出
@JsonSubTypes.Type(value=IntermediateParameter.class), //中间值 @JsonSubTypes.Type(value=IntermediateParameter.class), //中间值
@JsonSubTypes.Type(value=RuleResultParameter.class), //规则结果值
@JsonSubTypes.Type(value=SingleRuleResultParameter.class), //单规则结果值
@JsonSubTypes.Type(value=OutParameter.class) //结果值 @JsonSubTypes.Type(value=OutParameter.class) //结果值
}) })
public abstract class Parameter { public abstract class Parameter {

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterProcessor.java

@ -28,7 +28,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonSubTypes.Type(value=ObjectPropertiesParameterProcessor.class), //对象属性处理器 @JsonSubTypes.Type(value=ObjectPropertiesParameterProcessor.class), //对象属性处理器
@JsonSubTypes.Type(value=OptionValueParameterProcessor.class), //选项值处理器 @JsonSubTypes.Type(value=OptionValueParameterProcessor.class), //选项值处理器
@JsonSubTypes.Type(value=PmmlParameterProcessor.class), //PMML处理器 @JsonSubTypes.Type(value=PmmlParameterProcessor.class), //PMML处理器
@JsonSubTypes.Type(value=RuleParameterProcessor.class), //规则处理器 @JsonSubTypes.Type(value=RuleSetParameterProcessor.class), //规则处理器
@JsonSubTypes.Type(value=ScoreCardParameterProcessor.class), //评分卡处理器 @JsonSubTypes.Type(value=ScoreCardParameterProcessor.class), //评分卡处理器
@JsonSubTypes.Type(value=SingleRuleParameterProcessor.class), //单规则处理器 @JsonSubTypes.Type(value=SingleRuleParameterProcessor.class), //单规则处理器
@JsonSubTypes.Type(value=SqlParameterProcessor.class), //Sql处理器 @JsonSubTypes.Type(value=SqlParameterProcessor.class), //Sql处理器

17
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/RuleResultParameter.java

@ -1,17 +0,0 @@
package io.sc.engine.rule.core.po.model.parameter;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ParameterType;
/**
* 模型参数(规则结果)
*/
@JsonTypeName("RULE_RESULT")
@JsonIgnoreProperties(ignoreUnknown=true)
public class RuleResultParameter extends OutParameter {
@Override
public ParameterType getType() {
return ParameterType.RULE_RESULT;
}
}

17
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/SingleRuleResultParameter.java

@ -1,17 +0,0 @@
package io.sc.engine.rule.core.po.model.parameter;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ParameterType;
/**
* 模型参数(单规则结果)
*/
@JsonTypeName("SINGLE_RULE_RESULT")
@JsonIgnoreProperties(ignoreUnknown=true)
public class SingleRuleResultParameter extends OutParameter {
@Override
public ParameterType getType() {
return ParameterType.SINGLE_RULE_RESULT;
}
}

16
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/RuleParameterProcessor.java → io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/RuleSetParameterProcessor.java

@ -11,21 +11,21 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
* @author wangshaoping * @author wangshaoping
* *
*/ */
@JsonTypeName("RULE") @JsonTypeName("RULE_SET")
@JsonIgnoreProperties(ignoreUnknown=true) @JsonIgnoreProperties(ignoreUnknown=true)
public class RuleParameterProcessor extends ParameterProcessor{ public class RuleSetParameterProcessor extends ParameterProcessor{
private String rule; private String ruleSet;
@Override @Override
public ProcessorType getType() { public ProcessorType getType() {
return ProcessorType.RULE; return ProcessorType.RULE_SET;
} }
public String getRule() { public String getRuleSet() {
return rule; return ruleSet;
} }
public void setRule(String rule) { public void setRuleSet(String ruleSet) {
this.rule = rule; this.ruleSet = ruleSet;
} }
} }

9
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java

@ -37,19 +37,28 @@ public class IdReplacer {
* @return 合法的Java类名 * @return 合法的Java类名
*/ */
public static String className(String code) { public static String className(String code) {
if(!StringUtils.hasText(code)){
return "Object";
}
if(!code.contains(".")) {
return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code)); return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code));
} }
return code;
}
public static String className(String code,Integer version) { public static String className(String code,Integer version) {
if(!StringUtils.hasText(code)){ if(!StringUtils.hasText(code)){
return "Object"; return "Object";
} }
if(!code.contains(".")) {
if(version!=null){ if(version!=null){
return StringUtil.capitalize(code) + "_V" + version; return StringUtil.capitalize(code) + "_V" + version;
}else{ }else{
return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code)); return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code));
} }
} }
return code;
}
/** /**
* 将字符串转换成合法的Java方法名 * 将字符串转换成合法的Java方法名

63
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java

@ -1,31 +1,42 @@
package io.sc.engine.rule.core.util; package io.sc.engine.rule.core.util;
import io.sc.platform.util.DateUtil; import io.sc.platform.util.DateUtil;
import io.sc.platform.util.MapUtil;
import io.sc.platform.util.support.KV;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.*; import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class ValueTypeUtil { public class ValueTypeUtil {
private static final Map<String,Class<?>> BASE_CLASS_MAP = new HashMap<>(); private static final Map<String,Class<?>> BASE_CLASS_MAP = MapUtil.of(
new KV("boolean",Boolean.class),
static { new KV("byte",Byte.class),
BASE_CLASS_MAP.put(Boolean.class.getName(),Boolean.class); new KV("char",Character.class),
BASE_CLASS_MAP.put(Byte.class.getName(),Byte.class); new KV("short",Short.class),
BASE_CLASS_MAP.put(Character.class.getName(),Character.class); new KV("int",Integer.class),
BASE_CLASS_MAP.put(Short.class.getName(),Short.class); new KV("long",Long.class),
BASE_CLASS_MAP.put(Integer.class.getName(),Integer.class); new KV("float",Float.class),
BASE_CLASS_MAP.put(Long.class.getName(),Long.class); new KV("double",Double.class),
BASE_CLASS_MAP.put(Float.class.getName(),Float.class);
BASE_CLASS_MAP.put(Double.class.getName(),Double.class); new KV(Boolean.class.getName(),Boolean.class),
BASE_CLASS_MAP.put(BigInteger.class.getName(),BigInteger.class); new KV(Byte.class.getName(),Byte.class),
BASE_CLASS_MAP.put(BigDecimal.class.getName(),BigDecimal.class); new KV(Character.class.getName(),Character.class),
new KV(Short.class.getName(),Short.class),
BASE_CLASS_MAP.put(String.class.getName(),String.class); new KV(Integer.class.getName(),Integer.class),
BASE_CLASS_MAP.put(Date.class.getName(),Date.class); new KV(Long.class.getName(),Long.class),
BASE_CLASS_MAP.put(Calendar.class.getName(),Calendar.class); new KV(Float.class.getName(),Float.class),
new KV(Double.class.getName(),Double.class),
} new KV(BigInteger.class.getName(),BigInteger.class),
new KV(BigDecimal.class.getName(),BigDecimal.class),
new KV(String.class.getName(),String.class),
new KV(Date.class.getName(),Date.class),
new KV(Calendar.class.getName(),Calendar.class)
);
public static boolean isString(Class<?> type){ public static boolean isString(Class<?> type){
return isString(type.getName()); return isString(type.getName());
@ -39,6 +50,18 @@ public class ValueTypeUtil {
public static boolean isDecimal(String type) { return BigDecimal.class.getName().equals(type);} public static boolean isDecimal(String type) { return BigDecimal.class.getName().equals(type);}
public static boolean isEnum(Class<?> type){
return type.isEnum();
}
public static boolean isEnum(String type){
try {
return Class.forName(type).isEnum();
}catch (Exception e){
return false;
}
}
public static boolean isBase(Class<?> type){ public static boolean isBase(Class<?> type){
return isBase(type.getName()); return isBase(type.getName());
} }

6
io.sc.engine.rule.core/src/main/resources/META-INF/platform/plugins/rule-engine-dictionary.json

@ -9,8 +9,8 @@
{ "type": "JAVA_CLASS", "order": 700, "id": "java.util.List", "parent": "re.dictionary.category.base", "code": "java.util.List", "nameI18nKey": "java.util.List", "description": "列表类型", "version": null}, { "type": "JAVA_CLASS", "order": 700, "id": "java.util.List", "parent": "re.dictionary.category.base", "code": "java.util.List", "nameI18nKey": "java.util.List", "description": "列表类型", "version": null},
{ "type": "JAVA_CLASS", "order": 800, "id": "java.util.Map", "parent": "re.dictionary.category.base", "code": "java.util.Map", "nameI18nKey": "java.util.Map", "description": "字典类型", "version": null}, { "type": "JAVA_CLASS", "order": 800, "id": "java.util.Map", "parent": "re.dictionary.category.base", "code": "java.util.Map", "nameI18nKey": "java.util.Map", "description": "字典类型", "version": null},
{ "type": "FOLDER", "order": 2000, "id": "re.dictionary.category.engine", "parent": null, "code": "re.dictionary.category.engine", "nameI18nKey": "re.dictionary.category.engine", "description": "引擎内置类型", "version": null}, { "type": "FOLDER", "order": 2000, "id": "re.dictionary.category.engine", "parent": null, "code": "re.dictionary.category.engine", "nameI18nKey": "re.dictionary.category.engine", "description": "引擎内置类型", "version": null},
{ "type": "JAVA_CLASS", "order": 100, "id": "io.sc.engine.rule.core.classes.ResourceAbstract", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.classes.ResourceAbstract", "nameI18nKey": "io.sc.engine.rule.core.classes.ResourceAbstract", "description": "资源摘要", "version": null}, { "type": "JAVA_CLASS", "order": 100, "id": "io.sc.engine.rule.core.ResourceAbstract", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.ResourceAbstract", "nameI18nKey": "io.sc.engine.rule.core.ResourceAbstract", "description": "资源摘要", "version": null},
{ "type": "JAVA_CLASS", "order": 200, "id": "io.sc.engine.rule.core.classes.RuleResult", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.classes.RuleResult", "nameI18nKey": "io.sc.engine.rule.core.classes.RuleResult", "description": "规则结果", "version": null}, { "type": "JAVA_CLASS", "order": 200, "id": "io.sc.engine.rule.core.SingleRuleResult", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.SingleRuleResult", "nameI18nKey": "io.sc.engine.rule.core.SingleRuleResult", "description": "规则结果", "version": null},
{ "type": "JAVA_CLASS", "order": 300, "id": "io.sc.engine.rule.core.classes.SingleRuleResult", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.classes.SingleRuleResult", "nameI18nKey": "io.sc.engine.rule.core.classes.SingleRuleResult", "description": "规则结果", "version": null}, { "type": "JAVA_CLASS", "order": 300, "id": "io.sc.engine.rule.core.RuleSetResult", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.RuleSetResult", "nameI18nKey": "io.sc.engine.rule.core.RuleSetResult", "description": "规则结果", "version": null},
{ "type": "FOLDER", "order": 3000, "id": "re.dictionary.category.customization", "parent": null, "code": "re.dictionary.category.customization", "nameI18nKey": "re.dictionary.category.customization", "description": "用户自定义类型", "version": null} { "type": "FOLDER", "order": 3000, "id": "re.dictionary.category.customization", "parent": null, "code": "re.dictionary.category.customization", "nameI18nKey": "re.dictionary.category.customization", "description": "用户自定义类型", "version": null}
] ]

22
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary.properties

@ -1,3 +1,25 @@
re.dictionary.category.base=Base re.dictionary.category.base=Base
re.dictionary.category.engine=Engine re.dictionary.category.engine=Engine
re.dictionary.category.customization=User Customization re.dictionary.category.customization=User Customization
# \u57FA\u672C\u7C7B\u578B
java.lang.Boolean=Boolean
java.lang.Byte=Byte
java.lang.Character=Character
java.lang.Short=Short
java.lang.Integer=Integer
java.lang.Long=Long
java.lang.Float=Float
java.lang.Double=Double
java.math.BigInteger=Big Integer
java.math.BigDecimal=Decimal
java.lang.String=String
java.util.Date=Date
java.util.Calendar=Calendar
java.util.List=List
java.util.Map=Map
# \u5F15\u64CE\u5185\u7F6E\u7C7B\u578B
io.sc.engine.rule.core.ResourceAbstract=Resource Abstract
io.sc.engine.rule.core.SingleRuleResult=Single Rule Result
io.sc.engine.rule.core.RuleSetResult=Rule Set Result

22
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_tw_CN.properties

@ -1,3 +1,25 @@
re.dictionary.category.base=\u57FA\u672C\u985E\u578B re.dictionary.category.base=\u57FA\u672C\u985E\u578B
re.dictionary.category.engine=\u5F15\u64CE\u5167\u7F6E\u985E\u578B re.dictionary.category.engine=\u5F15\u64CE\u5167\u7F6E\u985E\u578B
re.dictionary.category.customization=\u7528\u6236\u81EA\u5B9A\u7FA9\u985E\u578B re.dictionary.category.customization=\u7528\u6236\u81EA\u5B9A\u7FA9\u985E\u578B
# \u57FA\u672C\u7C7B\u578B
java.lang.Boolean=\u5E03\u723E
java.lang.Byte=\u5B57\u7BC0
java.lang.Character=\u5B57\u7B26
java.lang.Short=\u77ED\u6574\u6578
java.lang.Integer=\u6574\u6578
java.lang.Long=\u6574\u6578
java.lang.Float=\u6D6E\u9EDE\u6578
java.lang.Double=\u96D9\u7CBE\u5EA6\u6578
java.math.BigInteger=\u5927\u6574\u6578
java.math.BigDecimal=\u5C0F\u6578
java.lang.String=\u5B57\u7B26\u4E32
java.util.Date=\u65E5\u671F
java.util.Calendar=\u65E5\u66C6
java.util.List=\u5217\u8868
java.util.Map=\u5B57\u5178
# \u5F15\u64CE\u5185\u7F6E\u7C7B\u578B
io.sc.engine.rule.core.ResourceAbstract=\u8CC7\u6E90\u6458\u8981
io.sc.engine.rule.core.SingleRuleResult=\u55AE\u898F\u5247\u7D50\u679C
io.sc.engine.rule.core.RuleSetResult=\u898F\u5247\u96C6\u7D50\u679C

22
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_zh_CN.properties

@ -1,3 +1,25 @@
re.dictionary.category.base=\u57FA\u672C\u7C7B\u578B re.dictionary.category.base=\u57FA\u672C\u7C7B\u578B
re.dictionary.category.engine=\u5F15\u64CE\u5185\u7F6E\u7C7B\u578B re.dictionary.category.engine=\u5F15\u64CE\u5185\u7F6E\u7C7B\u578B
re.dictionary.category.customization=\u7528\u6237\u81EA\u5B9A\u4E49\u7C7B\u578B re.dictionary.category.customization=\u7528\u6237\u81EA\u5B9A\u4E49\u7C7B\u578B
# \u57FA\u672C\u7C7B\u578B
java.lang.Boolean=\u5E03\u5C14
java.lang.Byte=\u5B57\u8282
java.lang.Character=\u5B57\u7B26
java.lang.Short=\u77ED\u6574\u6570
java.lang.Integer=\u6574\u6570
java.lang.Long=\u6574\u6570
java.lang.Float=\u6D6E\u70B9\u6570
java.lang.Double=\u53CC\u7CBE\u5EA6\u6570
java.math.BigInteger=\u5927\u6574\u6570
java.math.BigDecimal=\u5C0F\u6570
java.lang.String=\u5B57\u7B26\u4E32
java.util.Date=\u65E5\u671F
java.util.Calendar=\u65E5\u5386
java.util.List=\u5217\u8868
java.util.Map=\u5B57\u5178
# \u5F15\u64CE\u5185\u7F6E\u7C7B\u578B
io.sc.engine.rule.core.ResourceAbstract=\u8D44\u6E90\u6458\u8981
io.sc.engine.rule.core.SingleRuleResult=\u5355\u89C4\u5219\u7ED3\u679C
io.sc.engine.rule.core.RuleSetResult=\u89C4\u5219\u96C6\u7ED3\u679C

4
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties

@ -38,8 +38,6 @@ io.sc.engine.rule.core.enums.ParameterType.IN_OPTION=Input(Option)
io.sc.engine.rule.core.enums.ParameterType.IN_SUB_OUT=Sub Model Output io.sc.engine.rule.core.enums.ParameterType.IN_SUB_OUT=Sub Model Output
io.sc.engine.rule.core.enums.ParameterType.INDICATOR=Indicator io.sc.engine.rule.core.enums.ParameterType.INDICATOR=Indicator
io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=Intermediate io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=Intermediate
io.sc.engine.rule.core.enums.ParameterType.RULE_RESULT=Rule Out
io.sc.engine.rule.core.enums.ParameterType.SINGLE_RULE_RESULT=Single Rule Out
io.sc.engine.rule.core.enums.ParameterType.OUT=Out io.sc.engine.rule.core.enums.ParameterType.OUT=Out
io.sc.engine.rule.core.enums.ParameterType.CONSTANT=Constant io.sc.engine.rule.core.enums.ParameterType.CONSTANT=Constant
@ -66,7 +64,7 @@ io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=Number Range
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=Object Properties io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=Object Properties
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=Option Value io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=Option Value
io.sc.engine.rule.core.enums.ProcessorType.PMML=PMML io.sc.engine.rule.core.enums.ProcessorType.PMML=PMML
io.sc.engine.rule.core.enums.ProcessorType.RULE=Rule io.sc.engine.rule.core.enums.ProcessorType.RULE_SET=Rule Set
io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=Score Card io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=Score Card
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=Single Rule io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=Single Rule
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL Asignment Value io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL Asignment Value

4
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties

@ -38,8 +38,6 @@ io.sc.engine.rule.core.enums.ParameterType.IN_OPTION=\u8F38\u5165\u503C(\u9078\u
io.sc.engine.rule.core.enums.ParameterType.IN_SUB_OUT=\u5B50\u6A21\u578B\u7D50\u679C\u503C io.sc.engine.rule.core.enums.ParameterType.IN_SUB_OUT=\u5B50\u6A21\u578B\u7D50\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.INDICATOR=\u6307\u6A19 io.sc.engine.rule.core.enums.ParameterType.INDICATOR=\u6307\u6A19
io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=\u4E2D\u9593\u503C io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=\u4E2D\u9593\u503C
io.sc.engine.rule.core.enums.ParameterType.RULE_RESULT=\u898F\u5247\u7D50\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.SINGLE_RULE_RESULT=\u55AE\u898F\u5247\u7D50\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.OUT=\u7D50\u679C\u503C io.sc.engine.rule.core.enums.ParameterType.OUT=\u7D50\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF
@ -66,7 +64,7 @@ io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=\u6578\u503C\u5206\u6BB5
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5C0D\u8C61\u5C6C\u6027\u8CE6\u503C io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5C0D\u8C61\u5C6C\u6027\u8CE6\u503C
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9078\u9805\u503C io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9078\u9805\u503C
io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9810\u6E2C\u6A21\u578B\u6A19\u8A18\u8A9E\u8A00 io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9810\u6E2C\u6A21\u578B\u6A19\u8A18\u8A9E\u8A00
io.sc.engine.rule.core.enums.ProcessorType.RULE=\u898F\u5247 io.sc.engine.rule.core.enums.ProcessorType.RULE_SET=\u898F\u5247\u96C6
io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=\u8A55\u5206\u5361 io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=\u8A55\u5206\u5361
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u55AE\u898F\u5247 io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u55AE\u898F\u5247
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8CE6\u503C io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8CE6\u503C

4
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties

@ -38,8 +38,6 @@ io.sc.engine.rule.core.enums.ParameterType.IN_OPTION=\u8F93\u5165\u503C(\u9009\u
io.sc.engine.rule.core.enums.ParameterType.IN_SUB_OUT=\u5B50\u6A21\u578B\u7ED3\u679C\u503C io.sc.engine.rule.core.enums.ParameterType.IN_SUB_OUT=\u5B50\u6A21\u578B\u7ED3\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.INDICATOR=\u6307\u6807 io.sc.engine.rule.core.enums.ParameterType.INDICATOR=\u6307\u6807
io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=\u4E2D\u95F4\u503C io.sc.engine.rule.core.enums.ParameterType.INTERMEDIATE=\u4E2D\u95F4\u503C
io.sc.engine.rule.core.enums.ParameterType.RULE_RESULT=\u89C4\u5219\u7ED3\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.SINGLE_RULE_RESULT=\u5355\u89C4\u5219\u7ED3\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.OUT=\u7ED3\u679C\u503C io.sc.engine.rule.core.enums.ParameterType.OUT=\u7ED3\u679C\u503C
io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF
@ -66,7 +64,7 @@ io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=\u6570\u503C\u5206\u6BB5
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5BF9\u8C61\u5C5E\u6027\u8D4B\u503C io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5BF9\u8C61\u5C5E\u6027\u8D4B\u503C
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9009\u9879\u503C io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9009\u9879\u503C
io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9884\u6D4B\u6A21\u578B\u6807\u8BB0\u8BED\u8A00 io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9884\u6D4B\u6A21\u578B\u6807\u8BB0\u8BED\u8A00
io.sc.engine.rule.core.enums.ProcessorType.RULE=\u89C4\u5219 io.sc.engine.rule.core.enums.ProcessorType.RULE_SET=\u89C4\u5219\u96C6
io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=\u8BC4\u5206\u5361 io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=\u8BC4\u5206\u5361
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u5355\u89C4\u5219 io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u5355\u89C4\u5219
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8D4B\u503C io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8D4B\u503C

4
io.sc.engine.rule.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "io.sc.engine.rule.frontend", "name": "io.sc.engine.rule.frontend",
"version": "8.2.2", "version": "8.2.3",
"description": "", "description": "",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.8", "platform-core": "8.2.14",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

2
io.sc.engine.rule.frontend/src/i18n/messages.json

@ -119,7 +119,7 @@
"re.processor.grid.entity.objectProperties": "Object Properties", "re.processor.grid.entity.objectProperties": "Object Properties",
"re.processor.grid.entity.optionCode": "Option", "re.processor.grid.entity.optionCode": "Option",
"re.processor.grid.entity.pmml": "PMML", "re.processor.grid.entity.pmml": "PMML",
"re.processor.grid.entity.rule": "Rule", "re.processor.grid.entity.ruleSet": "Rule Set",
"re.processor.grid.entity.scoreCard": "Score Card", "re.processor.grid.entity.scoreCard": "Score Card",
"re.processor.grid.entity.singleRule": "Single Rule", "re.processor.grid.entity.singleRule": "Single Rule",
"re.processor.grid.entity.sqlDatasourceName": "Datasource Name", "re.processor.grid.entity.sqlDatasourceName": "Datasource Name",

2
io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json

@ -119,7 +119,7 @@
"re.processor.grid.entity.objectProperties": "對象屬性", "re.processor.grid.entity.objectProperties": "對象屬性",
"re.processor.grid.entity.optionCode": "選項", "re.processor.grid.entity.optionCode": "選項",
"re.processor.grid.entity.pmml": "PMML", "re.processor.grid.entity.pmml": "PMML",
"re.processor.grid.entity.rule": "規則", "re.processor.grid.entity.ruleSet": "規則",
"re.processor.grid.entity.scoreCard": "評分卡", "re.processor.grid.entity.scoreCard": "評分卡",
"re.processor.grid.entity.singleRule": "單規則", "re.processor.grid.entity.singleRule": "單規則",
"re.processor.grid.entity.sqlDatasourceName": "數據源名稱", "re.processor.grid.entity.sqlDatasourceName": "數據源名稱",

2
io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json

@ -119,7 +119,7 @@
"re.processor.grid.entity.objectProperties": "对象属性", "re.processor.grid.entity.objectProperties": "对象属性",
"re.processor.grid.entity.optionCode": "选项", "re.processor.grid.entity.optionCode": "选项",
"re.processor.grid.entity.pmml": "PMML", "re.processor.grid.entity.pmml": "PMML",
"re.processor.grid.entity.rule": "规则", "re.processor.grid.entity.ruleSet": "规则",
"re.processor.grid.entity.scoreCard": "评分卡", "re.processor.grid.entity.scoreCard": "评分卡",
"re.processor.grid.entity.singleRule": "单规则", "re.processor.grid.entity.singleRule": "单规则",
"re.processor.grid.entity.sqlDatasourceName": "数据源名称", "re.processor.grid.entity.sqlDatasourceName": "数据源名称",

2
io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue

@ -110,7 +110,7 @@
:columns="[ :columns="[
{ {
width: '100%', width: '100%',
name: 'namec', name: 'name',
label: $t('name'), label: $t('name'),
format: (value: any, row: any) => { format: (value: any, row: any) => {
return row.name; return row.name;

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

@ -5,7 +5,6 @@
ref="libTreeGridRef" ref="libTreeGridRef"
@row-click=" @row-click="
(args: any) => { (args: any) => {
console.log('>>>>>');
if (args.row.type === 'INDICATOR') { if (args.row.type === 'INDICATOR') {
currentSelectedLibRef = args.row; currentSelectedLibRef = args.row;
readOnlyRef = currentSelectedLibRef.status !== 'SKETCH'; readOnlyRef = currentSelectedLibRef.status !== 'SKETCH';

1
io.sc.engine.rule.frontend/src/views/resources/Resources.vue

@ -7,6 +7,7 @@
:config-button="true" :config-button="true"
selection="multiple" selection="multiple"
:checkbox-selection="false" :checkbox-selection="false"
dnd-mode="server"
:tree="true" :tree="true"
:tree-icon=" :tree-icon="
(row) => { (row) => {

2
io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue

@ -345,7 +345,7 @@ const open = async (parameterId, processorId) => {
processorIdRef.value = processorId; processorIdRef.value = processorId;
// //
const resourceAbstractResponse = await axios.get(Environment.apiContextPath('/api/re/resource/getAllReleasableResourceAbstract')); const resourceAbstractResponse = await axios.get(Environment.apiContextPath('/api/re/resource/getAllResourceAbstract'));
resourceAbstractsRef.value = resourceAbstractResponse?.data; resourceAbstractsRef.value = resourceAbstractResponse?.data;
// graph xml // graph xml

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

@ -286,7 +286,7 @@ const vertexDefines = [
}, },
dataUrl: Environment.apiContextPath('/api/re/resource'), dataUrl: Environment.apiContextPath('/api/re/resource'),
pageable: false, pageable: false,
sortBy: ['order', '-lastModifyDate'], sortBy: ['type', 'namec', '-lastModifyDate'],
toolbarConfigure: { noIcon: false }, toolbarConfigure: { noIcon: false },
toolbarActions: ['refresh', 'expand'], toolbarActions: ['refresh', 'expand'],
columns: [ columns: [
@ -398,7 +398,7 @@ const vertexDefines = [
}, },
dataUrl: Environment.apiContextPath('/api/re/resource'), dataUrl: Environment.apiContextPath('/api/re/resource'),
pageable: false, pageable: false,
sortBy: ['order', '-lastModifyDate'], sortBy: ['type', 'namec', '-lastModifyDate'],
toolbarConfigure: { noIcon: false }, toolbarConfigure: { noIcon: false },
toolbarActions: ['refresh', 'expand'], toolbarActions: ['refresh', 'expand'],
columns: [ columns: [
@ -522,7 +522,7 @@ const open = async (parameterId, processorId) => {
processorIdRef.value = processorId; processorIdRef.value = processorId;
// //
const resourceAbstractResponse = await axios.get(Environment.apiContextPath('/api/re/resource/getAllReleasableResourceAbstract')); const resourceAbstractResponse = await axios.get(Environment.apiContextPath('/api/re/resource/getAllResourceAbstract'));
resourceAbstractsRef.value = resourceAbstractResponse?.data; resourceAbstractsRef.value = resourceAbstractResponse?.data;
// //

19
io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue

@ -84,25 +84,6 @@
}, },
}, },
'separator', 'separator',
{
extend: 'add',
name: 'ruleResult',
label: $t('re.parameter.grid.toolbar.add.ruleResult'),
icon: 'bi-sliders',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'RULE_RESULT');
},
},
{
extend: 'add',
name: 'singleRuleResult',
label: $t('re.parameter.grid.toolbar.add.singleRuleResult'),
icon: 'bi-lightning',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'SINGLE_RULE_RESULT');
},
},
'separator',
{ {
name: 'importPmml', name: 'importPmml',
label: $t('re.parameter.grid.toolbar.add.importPmml'), label: $t('re.parameter.grid.toolbar.add.importPmml'),

23
io.sc.engine.rule.frontend/src/views/shared/ProcessorManager.ts

@ -14,7 +14,7 @@ import {
ObjectProperties, ObjectProperties,
OptionValue, OptionValue,
Pmml, Pmml,
Rule, RuleSet,
ScoreCard, ScoreCard,
SingleRule, SingleRule,
Sql, Sql,
@ -24,6 +24,9 @@ import {
class ProcessorManager { class ProcessorManager {
static PROCESSOR_TYPES_PARAMETER: string[] = [ static PROCESSOR_TYPES_PARAMETER: string[] = [
'SINGLE_RULE',
'RULE_SET',
'separator',
'OBJECT_PROPERTIES', 'OBJECT_PROPERTIES',
'OPTION_VALUE', 'OPTION_VALUE',
'MATH_FORMULA', 'MATH_FORMULA',
@ -41,8 +44,6 @@ class ProcessorManager {
'GROOVY_SCRIPT', 'GROOVY_SCRIPT',
'SQL', 'SQL',
'HTTP_REQUEST', 'HTTP_REQUEST',
'RULE',
'SINGLE_RULE',
]; ];
static PROCESSOR_TYPES_INDICATOR = [ static PROCESSOR_TYPES_INDICATOR = [
'OBJECT_PROPERTIES', 'OBJECT_PROPERTIES',
@ -62,6 +63,8 @@ class ProcessorManager {
constructor(targetType: string, context?: any) { constructor(targetType: string, context?: any) {
this.targetType = targetType; this.targetType = targetType;
this.processors = {}; this.processors = {};
this.processors.SINGLE_RULE = new SingleRule(this.targetType, context);
this.processors.RULE_SET = new RuleSet(this.targetType, context);
this.processors.ARITHMETIC = new Arithmetic(this.targetType, context); this.processors.ARITHMETIC = new Arithmetic(this.targetType, context);
this.processors.CONDITION_RANGE = new ConditionRange(this.targetType, context); this.processors.CONDITION_RANGE = new ConditionRange(this.targetType, context);
this.processors.DECISION_TABLE = new DecisionTable(this.targetType, context); this.processors.DECISION_TABLE = new DecisionTable(this.targetType, context);
@ -74,9 +77,7 @@ class ProcessorManager {
this.processors.OBJECT_PROPERTIES = new ObjectProperties(this.targetType, context); this.processors.OBJECT_PROPERTIES = new ObjectProperties(this.targetType, context);
this.processors.OPTION_VALUE = new OptionValue(this.targetType, context); this.processors.OPTION_VALUE = new OptionValue(this.targetType, context);
this.processors.PMML = new Pmml(this.targetType, context); this.processors.PMML = new Pmml(this.targetType, context);
this.processors.RULE = new Rule(this.targetType, context);
this.processors.SCORE_CARD = new ScoreCard(this.targetType, context); this.processors.SCORE_CARD = new ScoreCard(this.targetType, context);
this.processors.SINGLE_RULE = new SingleRule(this.targetType, context);
this.processors.SQL = new Sql(this.targetType, context); this.processors.SQL = new Sql(this.targetType, context);
this.processors.HTTP_REQUEST = new HttpRequest(this.targetType, context); this.processors.HTTP_REQUEST = new HttpRequest(this.targetType, context);
this.processors.TERNARY = new Ternary(this.targetType, context); this.processors.TERNARY = new Ternary(this.targetType, context);
@ -88,7 +89,11 @@ class ProcessorManager {
switch (this.targetType) { switch (this.targetType) {
case Processor.PARAMETER: case Processor.PARAMETER:
ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => { ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => {
if (name === 'separator') {
result.push('separator');
} else {
result.push(this.processors[name].getToolbarAction()); result.push(this.processors[name].getToolbarAction());
}
}); });
break; break;
case Processor.INDICATOR: case Processor.INDICATOR:
@ -112,12 +117,16 @@ class ProcessorManager {
switch (this.targetType) { switch (this.targetType) {
case Processor.PARAMETER: case Processor.PARAMETER:
ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => { ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => {
if (name !== 'separator') {
result.push(...this.processors[name].getEditorFields()); result.push(...this.processors[name].getEditorFields());
}
}); });
break; break;
case Processor.INDICATOR: case Processor.INDICATOR:
ProcessorManager.PROCESSOR_TYPES_INDICATOR.forEach((name) => { ProcessorManager.PROCESSOR_TYPES_INDICATOR.forEach((name) => {
if (name !== 'separator') {
result.push(...this.processors[name].getEditorFields()); result.push(...this.processors[name].getEditorFields());
}
}); });
break; break;
} }
@ -129,12 +138,16 @@ class ProcessorManager {
switch (this.targetType) { switch (this.targetType) {
case Processor.PARAMETER: case Processor.PARAMETER:
ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => { ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => {
if (name !== 'separator') {
result.push(...this.processors[name].getViewerFields()); result.push(...this.processors[name].getViewerFields());
}
}); });
break; break;
case Processor.INDICATOR: case Processor.INDICATOR:
ProcessorManager.PROCESSOR_TYPES_INDICATOR.forEach((name) => { ProcessorManager.PROCESSOR_TYPES_INDICATOR.forEach((name) => {
if (name !== 'separator') {
result.push(...this.processors[name].getViewerFields()); result.push(...this.processors[name].getViewerFields());
}
}); });
break; break;
} }

9
io.sc.engine.rule.frontend/src/views/shared/TestCaseGrid.vue

@ -81,15 +81,16 @@
panel: { panel: {
columnNum: 1, columnNum: 1,
fields: [ fields: [
{ name: 'id', label: $t('id') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'ownerId', label: $t('re.testcase.grid.entity.ownerId') },
{ name: 'ownerType', label: $t('re.testcase.grid.entity.ownerType'), format: Formater.none() }, { name: 'ownerType', label: $t('re.testcase.grid.entity.ownerType'), format: Formater.none() },
{ name: 'ownerId', label: $t('re.testcase.grid.entity.ownerId') },
{ name: 'ownerCode', label: $t('re.testcase.grid.entity.ownerCode') }, { name: 'ownerCode', label: $t('re.testcase.grid.entity.ownerCode') },
{ name: 'ownerName', label: $t('re.testcase.grid.entity.ownerName') }, { name: 'ownerName', label: $t('re.testcase.grid.entity.ownerName') },
{ name: 'ownerVersion', label: $t('re.testcase.grid.entity.ownerVersion') }, { name: 'ownerVersion', label: $t('re.testcase.grid.entity.ownerVersion') },
{ name: 'ownerStatus', label: $t('re.testcase.grid.entity.ownerStatus'), format: Formater.none() }, { name: 'ownerStatus', label: $t('re.testcase.grid.entity.ownerStatus'), format: Formater.none() },
{ name: 'id', label: $t('id') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
], ],
}, },
}" }"

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

@ -42,7 +42,7 @@
icon: 'bi-caret-right', icon: 'bi-caret-right',
click: (args: any) => { click: (args: any) => {
axios.post(Environment.apiContextPath('/api/re/testCase/execute/' + Tools.initialize(testCase?.id, '')), {}, { loading: true }).then(() => { axios.post(Environment.apiContextPath('/api/re/testCase/execute/' + Tools.initialize(testCase?.id, '')), {}, { loading: true }).then(() => {
testcaseParameterGridRef?.refresh(); gridRef?.refresh();
}); });
}, },
}, },
@ -160,6 +160,7 @@
toolbar: false, toolbar: false,
rows: 4, rows: 4,
lang: 'json', lang: 'json',
editable: true,
}, },
{ name: 'skipCheck', label: $t('re.testCaseParameter.grid.entity.skipCheck'), type: 'w-checkbox' }, { name: 'skipCheck', label: $t('re.testCaseParameter.grid.entity.skipCheck'), type: 'w-checkbox' },
], ],

2
io.sc.engine.rule.frontend/src/views/shared/UserDefinedFunctionsManager.ts

@ -13,7 +13,7 @@ class UserDefinedFunctionsManager {
} }
public async load() { public async load() {
const response = await axios.get(Environment.apiContextPath('/api/re/function?pageable=false')); const response = await axios.get(Environment.apiContextPath('/api/re/function?pageable=false&sortBy=name'));
this.#functions.value = Tools.objects2Objects(response.data?.content, null, (obj: any) => { this.#functions.value = Tools.objects2Objects(response.data?.content, null, (obj: any) => {
return obj.enable; return obj.enable;
}); });

4
io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts

@ -15,8 +15,8 @@ class Arithmetic extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-calculator', icon: 'bi-calculator',
enableIf: (args) => { enableIf: (args) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts

@ -16,8 +16,8 @@ class ConditionRange extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-card-checklist', icon: 'bi-card-checklist',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts

@ -19,8 +19,8 @@ class DecisionTable extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-grid-3x3', icon: 'bi-grid-3x3',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts

@ -18,8 +18,8 @@ class DecisionTable2C extends DecisionTable {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-grid-3x2', icon: 'bi-grid-3x2',
enableIf: (args) => { enableIf: (args) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts

@ -30,8 +30,8 @@ class DecisionTree extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-tree', icon: 'bi-tree',
enableIf: (args) => { enableIf: (args) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts

@ -31,8 +31,8 @@ class ExecutionFlow extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-bounding-box-circles', icon: 'bi-bounding-box-circles',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts

@ -15,8 +15,8 @@ class GroovyScript extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-code', icon: 'bi-code',
enableIf: (args) => { enableIf: (args) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts

@ -28,8 +28,8 @@ class HttpRequest extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'sync_alt', icon: 'sync_alt',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

19
io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts

@ -17,8 +17,8 @@ class MathFormula extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-superscript', icon: 'bi-superscript',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -83,12 +83,21 @@ class MathFormula extends Processor {
} }
public afterEditorOpen(args: any) { public afterEditorOpen(args: any) {
// 将 ${aaa}.${bbb}[n].${ccc} 替换成 aaa.bbb[n].ccc
// 这样可使在数学公式编辑器中不出现 ${}, 显示更友好
args.grid.getEditorForm().setFieldValue('mathFormula', ExpressionTools.replacePlaceholder(args.data.mathFormula));
args.grid.getEditorDialog().setWidth(this.EDITOR_DIALOG_WIDTH); args.grid.getEditorDialog().setWidth(this.EDITOR_DIALOG_WIDTH);
this.initAutoCompletionManager(); this.initAutoCompletionManager();
this.initUserDefinedFunctionsManager(); this.initUserDefinedFunctionsManager();
const form = args.grid.getEditorForm();
switch (form.getStatus()) {
case 'add': // 新增时清空表格内容
break;
case 'edit': // 编辑/复制时填充表格内容
case 'clone':
// 将 ${aaa}.${bbb}[n].${ccc} 替换成 aaa.bbb[n].ccc
// 这样可使在数学公式编辑器中不出现 ${}, 显示更友好
form.setFieldValue('mathFormula', ExpressionTools.replacePlaceholder(args.data.mathFormula));
break;
}
} }
} }

4
io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts

@ -16,8 +16,8 @@ class NumberRange extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-justify', icon: 'bi-justify',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

7
io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts

@ -17,7 +17,12 @@ class ObjectProperties extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-list-task', icon: 'bi-list-task',
enableIf: (args: any) => { enableIf: (args: any) => {
return !ValueTypeUtil.isBase(this.context.target.valueType); const valueType = this.context.target.valueType;
return (
!ValueTypeUtil.isBase(this.context.target.valueType) &&
valueType !== 'io.sc.engine.rule.core.SingleRuleResult' &&
valueType !== 'io.sc.engine.rule.core.RuleSetResult'
);
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts

@ -19,8 +19,8 @@ class OptionValue extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-card-list', icon: 'bi-card-list',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts

@ -15,8 +15,8 @@ class Pmml extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-filetype-xml', icon: 'bi-filetype-xml',
enableIf: (args) => { enableIf: (args) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

175
io.sc.engine.rule.frontend/src/views/shared/processors/Rule.ts → io.sc.engine.rule.frontend/src/views/shared/processors/RuleSet.ts

@ -2,22 +2,22 @@ import { $t, Tools, MarkupTableUtil } from 'platform-core';
import { Processor } from '../Processor'; import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder'; import { PlaceHolder } from '@/utils/PlaceHolder';
class Rule extends Processor { class RuleSet extends Processor {
constructor(targetType: string, context?: any) { constructor(targetType: string, context?: any) {
super(targetType, context); super(targetType, context);
this.PROCESSOR_TYPE = 'RULE'; this.PROCESSOR_TYPE = 'RULE_SET';
this.EDITOR_DIALOG_WIDTH = 800; this.EDITOR_DIALOG_WIDTH = 1024;
} }
public getToolbarAction(): any { public getToolbarAction(): any {
return { return {
extend: 'add', extend: 'add',
name: 'rule', name: 'ruleSet',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-shadows', icon: 'bi-shadows',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType === 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -26,12 +26,12 @@ class Rule extends Processor {
} }
public format(row: any): any { public format(row: any): any {
const objs: any[] = Tools.json2Object(row.rule); const objs: any[] = Tools.json2Object(row.ruleSet);
if (objs && Tools.isArray(objs) && objs.length > 0) { if (objs && Tools.isArray(objs) && objs.length > 0) {
let header: string = ''; let header: string = '';
header += '<tr>'; header += '<tr>';
header += ' <th>' + $t('category') + '</th>';
header += ' <th>' + $t('level') + '</th>'; header += ' <th>' + $t('level') + '</th>';
header += ' <th>' + $t('category') + '</th>';
header += ' <th>' + $t('code') + '</th>'; header += ' <th>' + $t('code') + '</th>';
header += ' <th>' + $t('name') + '</th>'; header += ' <th>' + $t('name') + '</th>';
header += ' <th>' + $t('condition') + '</th>'; header += ' <th>' + $t('condition') + '</th>';
@ -42,26 +42,26 @@ class Rule extends Processor {
let body: string = ''; let body: string = '';
objs.forEach((obj) => { objs.forEach((obj) => {
body += '<tr>'; body += '<tr>';
body += ' <td>' + $t(obj.category) + '</td>'; body += ' <td>' + obj.level + '</td>';
body += ' <td>' + $t(obj.level) + '</td>'; body += ' <td>' + obj.category + '</td>';
body += ' <td>' + $t(obj.code) + '</td>'; body += ' <td>' + obj.code + '</td>';
body += ' <td>' + $t(obj.name) + '</td>'; body += ' <td>' + obj.name + '</td>';
body += ' <td>' + $t(obj.condition) + '</td>'; body += ' <td>' + PlaceHolder.replace(obj.condition) + '</td>';
body += ' <td>' + $t(obj.value) + '</td>'; body += ' <td>' + PlaceHolder.replace(obj.value) + '</td>';
body += ' <td>' + $t(obj.message) + '</td>'; body += ' <td>' + PlaceHolder.replace(obj.message) + '</td>';
body += '</tr>'; body += '</tr>';
}); });
return MarkupTableUtil.markupTable(header, body, Tools.mergeObject({}, Processor.FORMAT_TABLE_STYLE)); return MarkupTableUtil.markupTable(header, body, Tools.mergeObject({}, Processor.FORMAT_TABLE_STYLE));
} }
return row.rule; return row.ruleSet;
} }
public getEditorFields(): any { public getEditorFields(): any {
return [ return [
{ {
colSpan: 12, colSpan: 12,
name: 'rule', name: 'ruleSet',
label: $t('re.processor.grid.entity.rule'), label: $t('re.processor.grid.entity.ruleSet'),
showIf: (args: any) => { showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE; return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
}, },
@ -70,102 +70,66 @@ class Rule extends Processor {
localMode: true, localMode: true,
dbClickOperation: 'edit', dbClickOperation: 'edit',
autoFetchData: false, autoFetchData: false,
denseBody: true, denseBody: false,
dndMode: 'local', dndMode: 'local',
pageable: false, pageable: false,
configButton: false, configButton: false,
toolbarConfigure: { noIcon: false }, toolbarConfigure: { noIcon: false },
toolbarActions: ['add', 'clone', 'edit', 'remove'], toolbarActions: [
columns: [ 'add',
{ 'clone',
name: 'category', 'edit',
label: $t('category'), 'remove',
align: 'left', 'separator',
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
},
{ {
name: 'level', name: 'example',
label: $t('level'), label: $t('example'),
align: 'left', icon: 'bi-balloon',
sortable: false, click: (args: any) => {
format: (value: any) => { const sampleData = [
return PlaceHolder.replace(value);
},
},
{ {
name: 'code', level: 1,
label: $t('code'), category: '财务预警',
align: 'left', code: '',
sortable: false, name: '',
format: (value: any) => { condition: '${资产负债率}>0.3',
return PlaceHolder.replace(value); value: '${资产负债率}',
}, message: '资产负债率: ${资产负债率}, 大于 0.3',
}, },
{ {
name: 'name', level: 1,
label: $t('name'), category: '财务预警',
align: 'left', code: '',
sortable: false, name: '',
format: (value: any) => { condition: '${净利润率}>0.3',
return PlaceHolder.replace(value); value: '${净利润率}',
}, message: '净利润率: ${净利润率}, 大于 0.3',
},
{
name: 'condition',
label: $t('condition'),
align: 'left',
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
},
{
name: 'value',
label: $t('value'),
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
}, },
}, ];
{ args.grid.setLocalData(sampleData);
name: 'message',
label: $t('message'),
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
}, },
}, },
], ],
columns: [
{ width: 60, name: 'level', label: $t('level') },
{ width: 100, name: 'category', label: $t('category') },
{ width: 100, name: 'code', label: $t('code') },
{ width: 100, name: 'name', label: $t('name') },
{ width: 250, name: 'condition', label: $t('condition') },
{ width: 200, name: 'value', label: $t('value') },
{ width: '100%', name: 'message', label: $t('message') },
],
editor: { editor: {
dialog: { cellDialog: {
width: '600px', width: '1024px',
}, },
form: { form: {
colsNum: 1, colsNum: 1,
fields: [ fields: [
{ { name: 'level', label: $t('level'), type: 'w-integer' },
name: 'category', { name: 'category', label: $t('category'), type: 'w-text' },
label: $t('category'), { name: 'code', label: $t('code'), type: 'w-text' },
type: 'w-text', { name: 'name', label: $t('name'), type: 'w-text' },
},
{
name: 'level',
label: $t('level'),
type: 'w-integer',
},
{
name: 'code',
label: $t('code'),
type: 'w-text',
},
{
name: 'name',
label: $t('name'),
type: 'w-text',
},
{ {
name: 'condition', name: 'condition',
label: $t('condition'), label: $t('condition'),
@ -205,17 +169,20 @@ class Rule extends Processor {
], ],
}, },
}, },
onBeforeEditorDataSubmit: (args: any) => {}, onAfterEditorOpen: (args: any) => {
this.initAutoCompletionManager();
this.initUserDefinedFunctionsManager();
},
}, },
]; ];
} }
public getViewerFields(): any { public getViewerFields(): any {
return [{ name: 'rule', label: $t('re.processor.grid.entity.rule') }]; return [{ name: 'ruleSet', label: $t('re.processor.grid.entity.ruleSet') }];
} }
public beforeEditorDataSubmit(args: any): void { public beforeEditorDataSubmit(args: any): void {
const grid = args.grid.getEditorForm().getFieldComponent('rule'); const grid = args.grid.getEditorForm().getFieldComponent('ruleSet');
const localData: any[] = grid.getRows(); const localData: any[] = grid.getRows();
const rules: any[] = []; const rules: any[] = [];
localData.forEach((item) => { localData.forEach((item) => {
@ -229,7 +196,7 @@ class Rule extends Processor {
message: item.message, message: item.message,
}); });
}); });
args.data.rule = Tools.object2Json(rules); args.data.ruleSet = Tools.object2Json(rules);
} }
public afterEditorOpen(args: any): void { public afterEditorOpen(args: any): void {
@ -238,18 +205,18 @@ class Rule extends Processor {
this.initUserDefinedFunctionsManager(); this.initUserDefinedFunctionsManager();
const form = args.grid.getEditorForm(); const form = args.grid.getEditorForm();
const grid = args.grid.getEditorForm().getFieldComponent('rule'); const grid = args.grid.getEditorForm().getFieldComponent('ruleSet');
switch (form.getStatus()) { switch (form.getStatus()) {
case 'add': // 新增时清空表格内容 case 'add': // 新增时清空表格内容
grid.setLocalData([]); grid.setLocalData([]);
break; break;
case 'edit': // 编辑/复制时填充表格内容 case 'edit': // 编辑/复制时填充表格内容
case 'clone': case 'clone':
const data = Tools.json2Object(args.data.rule); const data = Tools.json2Object(args.data.ruleSet);
grid.setLocalData(data); grid.setLocalData(data);
break; break;
} }
} }
} }
export { Rule }; export { RuleSet };

7
io.sc.engine.rule.frontend/src/views/shared/processors/ScoreCard.ts

@ -33,8 +33,8 @@ class ScoreCard extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-credit-card-2-front', icon: 'bi-credit-card-2-front',
enableIf: (args) => { enableIf: (args) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -48,8 +48,9 @@ class ScoreCard extends Processor {
let str = ''; let str = '';
objs.forEach((obj: any) => { objs.forEach((obj: any) => {
str += '<tr>'; str += '<tr>';
str += ' <td>' + $t('io.sc.engine.rule.core.enums.ProcessorType.' + obj.type) + '</td>';
str += ' <td>' + this.getParameterNameByCode(obj.code) + '</td>'; str += ' <td>' + this.getParameterNameByCode(obj.code) + '</td>';
str += ' <td>' + (Tools.isNill(obj.weight) ? '' : obj.weight) + '</td>';
str += ' <td>' + $t('io.sc.engine.rule.core.enums.ProcessorType.' + obj.type) + '</td>';
if (obj.type === 'CONDITION_RANGE') { if (obj.type === 'CONDITION_RANGE') {
str += ' <td>' + this.#conditionRange.format({ conditionRange: Tools.object2Json(obj.conditionRange) }) + '</td>'; str += ' <td>' + this.#conditionRange.format({ conditionRange: Tools.object2Json(obj.conditionRange) }) + '</td>';
} else if (obj.type === 'NUMBER_RANGE') { } else if (obj.type === 'NUMBER_RANGE') {

163
io.sc.engine.rule.frontend/src/views/shared/processors/SingleRule.ts

@ -1,11 +1,12 @@
import { $t } from 'platform-core'; import { $t, Tools, MarkupTableUtil } from 'platform-core';
import { Processor } from '../Processor'; import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
class SingleRule extends Processor { class SingleRule extends Processor {
constructor(targetType: string, context?: any) { constructor(targetType: string, context?: any) {
super(targetType, context); super(targetType, context);
this.PROCESSOR_TYPE = 'SINGLE_RULE'; this.PROCESSOR_TYPE = 'SINGLE_RULE';
this.EDITOR_DIALOG_WIDTH = 800; this.EDITOR_DIALOG_WIDTH = 1024;
} }
public getToolbarAction(): any { public getToolbarAction(): any {
@ -15,8 +16,8 @@ class SingleRule extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-noise-reduction', icon: 'bi-noise-reduction',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType === 'io.sc.engine.rule.core.SingleRuleResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -25,21 +26,171 @@ class SingleRule extends Processor {
} }
public format(row: any): any { public format(row: any): any {
const objs: any[] = Tools.json2Object(row.singleRule);
if (objs && Tools.isArray(objs) && objs.length > 0) {
let header: string = '';
header += '<tr>';
header += ' <th>' + $t('level') + '</th>';
header += ' <th>' + $t('category') + '</th>';
header += ' <th>' + $t('condition') + '</th>';
header += ' <th>' + $t('value') + '</th>';
header += ' <th>' + $t('message') + '</th>';
header += '</tr>';
let body: string = '';
objs.forEach((obj) => {
body += '<tr>';
body += ' <td>' + obj.level + '</td>';
body += ' <td>' + obj.category + '</td>';
body += ' <td>' + PlaceHolder.replace(obj.condition) + '</td>';
body += ' <td>' + PlaceHolder.replace(obj.value) + '</td>';
body += ' <td>' + PlaceHolder.replace(obj.message) + '</td>';
body += '</tr>';
});
return MarkupTableUtil.markupTable(header, body, Tools.mergeObject({}, Processor.FORMAT_TABLE_STYLE));
}
return row.singleRule; return row.singleRule;
} }
public getEditorFields(): any { public getEditorFields(): any {
return []; return [
{
colSpan: 12,
name: 'singleRule',
label: $t('re.processor.grid.entity.singleRule'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
type: 'w-grid',
height: 300,
localMode: true,
dbClickOperation: 'edit',
autoFetchData: false,
denseBody: false,
dndMode: 'local',
pageable: false,
configButton: false,
toolbarConfigure: { noIcon: false },
toolbarActions: [
'add',
'clone',
'edit',
'remove',
'separator',
{
name: 'example',
label: $t('example'),
icon: 'bi-balloon',
click: (args: any) => {
const sampleData = [
{ level: 1, category: '财务预警', condition: '${资产负债率}>0.3', value: '${资产负债率}', message: '资产负债率: ${资产负债率}, 大于 0.3' },
{ level: 1, category: '财务预警', condition: '${净利润率}>0.3', value: '${净利润率}', message: '净利润率: ${净利润率}, 大于 0.3' },
];
args.grid.setLocalData(sampleData);
},
},
],
columns: [
{ width: 60, name: 'level', label: $t('level') },
{ width: 100, name: 'category', label: $t('category') },
{ width: 250, name: 'condition', label: $t('condition') },
{ width: 200, name: 'value', label: $t('value') },
{ width: '100%', name: 'message', label: $t('message') },
],
editor: {
cellDialog: {
width: '1024px',
},
form: {
colsNum: 1,
fields: [
{ name: 'level', label: $t('level'), type: 'w-integer' },
{ name: 'category', label: $t('category'), type: 'w-text' },
{
name: 'condition',
label: $t('condition'),
type: 'w-code-mirror',
lang: 'java',
rows: 4,
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
},
{
name: 'value',
label: $t('value'),
type: 'w-code-mirror',
lang: 'java',
rows: 4,
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
},
{
name: 'message',
label: $t('message'),
type: 'w-code-mirror',
lang: 'java',
rows: 4,
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
},
],
},
},
onAfterEditorOpen: (args: any) => {
this.initAutoCompletionManager();
this.initUserDefinedFunctionsManager();
},
},
];
} }
public getViewerFields(): any { public getViewerFields(): any {
return [{ name: 'singleRule', label: $t('re.processor.grid.entity.singleRule') }]; return [{ name: 'singleRule', label: $t('re.processor.grid.entity.singleRule') }];
} }
public beforeEditorDataSubmit(args: any): void {} public beforeEditorDataSubmit(args: any): void {
const grid = args.grid.getEditorForm().getFieldComponent('singleRule');
const localData: any[] = grid.getRows();
const rules: any[] = [];
localData.forEach((item) => {
rules.push({
level: item.level,
category: item.category,
condition: item.condition,
value: item.value,
message: item.message,
});
});
args.data.singleRule = Tools.object2Json(rules);
}
public afterEditorOpen(args: any): void { public afterEditorOpen(args: any): void {
args.grid.getEditorDialog().setWidth(this.EDITOR_DIALOG_WIDTH); args.grid.getEditorDialog().setWidth(this.EDITOR_DIALOG_WIDTH);
this.initAutoCompletionManager();
this.initUserDefinedFunctionsManager();
const form = args.grid.getEditorForm();
const grid = args.grid.getEditorForm().getFieldComponent('singleRule');
switch (form.getStatus()) {
case 'add': // 新增时清空表格内容
grid.setLocalData([]);
break;
case 'edit': // 编辑/复制时填充表格内容
case 'clone':
const data = Tools.json2Object(args.data.singleRule);
grid.setLocalData(data);
break;
}
} }
} }

4
io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts

@ -24,8 +24,8 @@ class Sql extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-filetype-sql', icon: 'bi-filetype-sql',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/Ternary.ts

@ -16,8 +16,8 @@ class Ternary extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-question', icon: 'bi-question',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

4
io.sc.engine.rule.frontend/src/views/shared/processors/WhenThen.ts

@ -16,8 +16,8 @@ class WhenThen extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE), label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-sliders', icon: 'bi-sliders',
enableIf: (args: any) => { enableIf: (args: any) => {
const type = this.context.target.type; const valueType = this.context.target.valueType;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT'; return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
}, },
afterClick: (args: any) => { afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE); args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

5
io.sc.engine.rule.frontend/src/views/shared/processors/index.ts

@ -11,9 +11,10 @@ export { NumberRange } from './NumberRange';
export { ObjectProperties } from './ObjectProperties'; export { ObjectProperties } from './ObjectProperties';
export { OptionValue } from './OptionValue'; export { OptionValue } from './OptionValue';
export { Pmml } from './Pmml'; export { Pmml } from './Pmml';
export { Rule } from './Rule';
export { ScoreCard } from './ScoreCard'; export { ScoreCard } from './ScoreCard';
export { SingleRule } from './SingleRule';
export { Sql } from './Sql'; export { Sql } from './Sql';
export { Ternary } from './Ternary'; export { Ternary } from './Ternary';
export { WhenThen } from './WhenThen'; export { WhenThen } from './WhenThen';
export { SingleRule } from './SingleRule';
export { RuleSet } from './RuleSet';

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/AutoCompletionServiceImpl.java

@ -224,7 +224,7 @@ public class AutoCompletionServiceImpl implements AutoCompletionService {
} }
private void buildJavaClassValueTypes(AutoCompletion autoCompletion,Class<?> clazz,String valueTypeCode, String valueTypeName,Integer valueTypeVersion,Locale locale) throws Exception { private void buildJavaClassValueTypes(AutoCompletion autoCompletion,Class<?> clazz,String valueTypeCode, String valueTypeName,Integer valueTypeVersion,Locale locale) throws Exception {
if(ValueTypeUtil.isBase(clazz)) { if(ValueTypeUtil.isBase(clazz) || ValueTypeUtil.isEnum(clazz)) {
ValueType valueType =new ValueType(); ValueType valueType =new ValueType();
valueType.setCode(clazz.getName()); valueType.setCode(clazz.getName());
valueType.setName(messageSource.getMessage(clazz.getName(),null,locale)); valueType.setName(messageSource.getMessage(clazz.getName(),null,locale));

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java

@ -257,7 +257,7 @@ public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeSe
} }
private void buildJavaClassValueTypes(ParameterAndValueType parameterAndValueType,Class<?> clazz,String valueTypeCode, String valueTypeName,Integer valueTypeVersion,Locale locale) throws Exception { private void buildJavaClassValueTypes(ParameterAndValueType parameterAndValueType,Class<?> clazz,String valueTypeCode, String valueTypeName,Integer valueTypeVersion,Locale locale) throws Exception {
if(ValueTypeUtil.isBase(clazz)) { if(ValueTypeUtil.isBase(clazz) || ValueTypeUtil.isEnum(clazz)) {
ValueType valueType =new ValueType(); ValueType valueType =new ValueType();
valueType.setCode(clazz.getName()); valueType.setCode(clazz.getName());
valueType.setName(messageSource.getMessage(clazz.getName(),null,locale)); valueType.setName(messageSource.getMessage(clazz.getName(),null,locale));

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/function/controller/FunctionWebController.java

@ -31,8 +31,6 @@ import java.util.Locale;
public class FunctionWebController extends RestCrudController<FunctionVo, FunctionEntity,String, FunctionRepository, FunctionService> { public class FunctionWebController extends RestCrudController<FunctionVo, FunctionEntity,String, FunctionRepository, FunctionService> {
private static final Logger log = LoggerFactory.getLogger(FunctionWebController.class); private static final Logger log = LoggerFactory.getLogger(FunctionWebController.class);
@RequestMapping(value="import",method= {RequestMethod.POST}) @RequestMapping(value="import",method= {RequestMethod.POST})
@ResponseBody @ResponseBody
public void imports(@RequestParam(name="file",required=false) MultipartFile multipartFile, Locale locale) throws Exception{ public void imports(@RequestParam(name="file",required=false) MultipartFile multipartFile, Locale locale) throws Exception{

12
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java

@ -11,8 +11,6 @@ import io.sc.engine.rule.core.po.model.parameter.InSubOutParameter;
import io.sc.engine.rule.core.po.model.parameter.IndicatorParameter; import io.sc.engine.rule.core.po.model.parameter.IndicatorParameter;
import io.sc.engine.rule.core.po.model.parameter.IntermediateParameter; import io.sc.engine.rule.core.po.model.parameter.IntermediateParameter;
import io.sc.engine.rule.core.po.model.parameter.OutParameter; import io.sc.engine.rule.core.po.model.parameter.OutParameter;
import io.sc.engine.rule.core.po.model.parameter.RuleResultParameter;
import io.sc.engine.rule.core.po.model.parameter.SingleRuleResultParameter;
import io.sc.engine.rule.server.model.entity.ParameterEntity; import io.sc.engine.rule.server.model.entity.ParameterEntity;
import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity; import io.sc.engine.rule.server.model.entity.ParameterInOptionItemEntity;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity; import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
@ -24,8 +22,6 @@ import io.sc.engine.rule.server.model.entity.parameter.InSubOutParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.IndicatorParameterEntity; import io.sc.engine.rule.server.model.entity.parameter.IndicatorParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.IntermediateParameterEntity; import io.sc.engine.rule.server.model.entity.parameter.IntermediateParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.OutParameterEntity; import io.sc.engine.rule.server.model.entity.parameter.OutParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.RuleResultParameterEntity;
import io.sc.engine.rule.server.model.entity.parameter.SingleRuleResultParameterEntity;
/** /**
* 模型参数实体转换器 * 模型参数实体转换器
@ -59,10 +55,6 @@ public class ParameterEntityConverter {
po =new InSubOutParameter(); po =new InSubOutParameter();
}else if(entity instanceof IntermediateParameterEntity) { }else if(entity instanceof IntermediateParameterEntity) {
po =new IntermediateParameter(); po =new IntermediateParameter();
}else if(entity instanceof RuleResultParameterEntity) {//注意: RuleResultParameterEntity 继承 OutParameterEntity,需先处理 RuleResultParameterEntity
po =new RuleResultParameter();
}else if(entity instanceof SingleRuleResultParameterEntity) {//注意: SingleRuleResultParameterEntity 继承 OutParameterEntity,需先处理 SingleRuleResultParameterEntity
po =new SingleRuleResultParameter();
}else if(entity instanceof OutParameterEntity) { }else if(entity instanceof OutParameterEntity) {
po =new OutParameter(); po =new OutParameter();
}else { }else {
@ -138,10 +130,6 @@ public class ParameterEntityConverter {
entity =new InSubOutParameterEntity(); entity =new InSubOutParameterEntity();
}else if(po instanceof IntermediateParameter) { }else if(po instanceof IntermediateParameter) {
entity =new IntermediateParameterEntity(); entity =new IntermediateParameterEntity();
}else if(po instanceof RuleResultParameter) {//注意: RuleResultParameterEntity 继承 OutParameterEntity,需先处理 RuleResultParameterEntity
entity =new RuleResultParameterEntity();
}else if(po instanceof SingleRuleResultParameter) {//注意: SingleRuleResultParameter 继承 OutParameterEntity,需先处理 SingleRuleResultParameter
entity =new SingleRuleResultParameterEntity();
}else if(po instanceof OutParameter) { }else if(po instanceof OutParameter) {
entity =new OutParameterEntity(); entity =new OutParameterEntity();
}else { }else {

16
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterProcessorEntityConverter.java

@ -98,10 +98,10 @@ public class ParameterProcessorEntityConverter {
PmmlParameterProcessor _po =new PmmlParameterProcessor(); PmmlParameterProcessor _po =new PmmlParameterProcessor();
_po.setPmml(_entity.getPmml()); _po.setPmml(_entity.getPmml());
po =_po; po =_po;
}else if(entity instanceof RuleParameterProcessorEntity) { }else if(entity instanceof RuleSetParameterProcessorEntity) {
RuleParameterProcessorEntity _entity=(RuleParameterProcessorEntity)entity; RuleSetParameterProcessorEntity _entity=(RuleSetParameterProcessorEntity)entity;
RuleParameterProcessor _po =new RuleParameterProcessor(); RuleSetParameterProcessor _po =new RuleSetParameterProcessor();
_po.setRule(_entity.getRule()); _po.setRuleSet(_entity.getRuleSet());
po =_po; po =_po;
}else if(entity instanceof ScoreCardParameterProcessorEntity){ }else if(entity instanceof ScoreCardParameterProcessorEntity){
ScoreCardParameterProcessorEntity _entity=(ScoreCardParameterProcessorEntity)entity; ScoreCardParameterProcessorEntity _entity=(ScoreCardParameterProcessorEntity)entity;
@ -251,10 +251,10 @@ public class ParameterProcessorEntityConverter {
PmmlParameterProcessorEntity _entity =new PmmlParameterProcessorEntity(); PmmlParameterProcessorEntity _entity =new PmmlParameterProcessorEntity();
_entity.setPmml(_po.getPmml()); _entity.setPmml(_po.getPmml());
entity =_entity; entity =_entity;
}else if(po instanceof RuleParameterProcessor) { }else if(po instanceof RuleSetParameterProcessor) {
RuleParameterProcessor _po =(RuleParameterProcessor)po; RuleSetParameterProcessor _po =(RuleSetParameterProcessor)po;
RuleParameterProcessorEntity _entity =new RuleParameterProcessorEntity(); RuleSetParameterProcessorEntity _entity =new RuleSetParameterProcessorEntity();
_entity.setRule(_po.getRule()); _entity.setRuleSet(_po.getRuleSet());
entity =_entity; entity =_entity;
}else if(po instanceof ScoreCardParameterProcessor) { }else if(po instanceof ScoreCardParameterProcessor) {
ScoreCardParameterProcessor _po =(ScoreCardParameterProcessor)po; ScoreCardParameterProcessor _po =(ScoreCardParameterProcessor)po;

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

@ -36,8 +36,6 @@ import java.util.List;
@JsonSubTypes.Type(value=InOptionParameterEntity.class), //输入选项 @JsonSubTypes.Type(value=InOptionParameterEntity.class), //输入选项
@JsonSubTypes.Type(value=InSubOutParameterEntity.class), //子模型输出 @JsonSubTypes.Type(value=InSubOutParameterEntity.class), //子模型输出
@JsonSubTypes.Type(value=IntermediateParameterEntity.class), //中间值 @JsonSubTypes.Type(value=IntermediateParameterEntity.class), //中间值
@JsonSubTypes.Type(value=RuleResultParameterEntity.class), //规则结果
@JsonSubTypes.Type(value=SingleRuleResultParameterEntity.class), //单规则结果
@JsonSubTypes.Type(value=OutParameterEntity.class) //结果值 @JsonSubTypes.Type(value=OutParameterEntity.class) //结果值
}) })
public abstract class ParameterEntity extends CorporationAuditorEntity<ParameterVo> implements DeepClone, IdClearable, TestCaseParameterAble{ public abstract class ParameterEntity extends CorporationAuditorEntity<ParameterVo> implements DeepClone, IdClearable, TestCaseParameterAble{

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

@ -41,7 +41,7 @@ import javax.validation.constraints.Size;
@JsonSubTypes.Type(value=ObjectPropertiesParameterProcessorEntity.class), //对象属性处理器 @JsonSubTypes.Type(value=ObjectPropertiesParameterProcessorEntity.class), //对象属性处理器
@JsonSubTypes.Type(value=OptionValueParameterProcessorEntity.class), //选项值处理器 @JsonSubTypes.Type(value=OptionValueParameterProcessorEntity.class), //选项值处理器
@JsonSubTypes.Type(value=PmmlParameterProcessorEntity.class), //PMML处理器 @JsonSubTypes.Type(value=PmmlParameterProcessorEntity.class), //PMML处理器
@JsonSubTypes.Type(value=RuleParameterProcessorEntity.class), //规则处理器 @JsonSubTypes.Type(value=RuleSetParameterProcessorEntity.class), //规则处理器
@JsonSubTypes.Type(value=ScoreCardParameterProcessorEntity.class), //评分卡处理器 @JsonSubTypes.Type(value=ScoreCardParameterProcessorEntity.class), //评分卡处理器
@JsonSubTypes.Type(value=SingleRuleParameterProcessorEntity.class), //单规则处理器 @JsonSubTypes.Type(value=SingleRuleParameterProcessorEntity.class), //单规则处理器
@JsonSubTypes.Type(value=SqlParameterProcessorEntity.class), //Sql处理器 @JsonSubTypes.Type(value=SqlParameterProcessorEntity.class), //Sql处理器

14
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/InSubOutParameterEntity.java

@ -29,20 +29,6 @@ public class InSubOutParameterEntity extends ParameterEntity {
this.id =id; this.id =id;
} }
public InSubOutParameterEntity(RuleResultParameterEntity out) {
this.id=out.getId();
this.code =out.getCode();
this.name =out.getName();
this.description =out.getDescription();
this.order =out.getOrder();
this.valueType =out.getValueType();
this.valueTypeVersion =out.getValueTypeVersion();
this.valueScale =null;
this.valueRoundingMode =null;
this.valueTypeIsList =null;
this.defaultValue =null;
}
public InSubOutParameterEntity(OutParameterEntity out) { public InSubOutParameterEntity(OutParameterEntity out) {
this.id=out.getId(); this.id=out.getId();
this.code =out.getCode(); this.code =out.getCode();

61
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/RuleResultParameterEntity.java

@ -1,61 +0,0 @@
package io.sc.engine.rule.server.model.entity.parameter;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.server.model.vo.parameter.RuleResultParameterVo;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 模型参数(规则结果值)实体类
*/
@Entity
@DiscriminatorValue("RULE_RESULT")
@JsonTypeName("RULE_RESULT")
public class RuleResultParameterEntity extends OutParameterEntity {
@Override
public RuleResultParameterVo toVo() {
RuleResultParameterVo vo =new RuleResultParameterVo();
super.toVo(vo);
this.setType(this.getType());
return vo;
}
public RuleResultParameterEntity() {}
public RuleResultParameterEntity(String id) {
this.id =id;
}
public InSubOutParameterEntity toInSubOutParameterEntity() {
return new InSubOutParameterEntity(this);
}
@Override
public ParameterType getType() {
return ParameterType.RULE_RESULT;
}
@Override
public String toString() {
return "RuleResultParameterEntity ["
+ " type=" + type
+ " id=" + id
+ ", code=" + code
+ ", name=" + name
+ ", description=" + description
+ ", order=" + order
+ ", valueType" + valueType
+ ", valueScale" + valueScale
+ ", valueRoundingMode" + valueRoundingMode
+ ", valueTypeIsList" + valueTypeIsList
+ ", defaultValue=" + defaultValue
+ ", creator=" + creator
+ ", createDate=" + createDate
+ ", lastModifier=" + lastModifier
+ ", lastModifyDate=" + lastModifyDate
+ "]";
}
}

61
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/parameter/SingleRuleResultParameterEntity.java

@ -1,61 +0,0 @@
package io.sc.engine.rule.server.model.entity.parameter;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.server.model.vo.parameter.SingleRuleResultParameterVo;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 模型参数(单规则结果值)实体类
*/
@Entity
@DiscriminatorValue("SINGLE_RULE_RESULT")
@JsonTypeName("SINGLE_RULE_RESULT")
public class SingleRuleResultParameterEntity extends OutParameterEntity {
@Override
public SingleRuleResultParameterVo toVo() {
SingleRuleResultParameterVo vo =new SingleRuleResultParameterVo();
super.toVo(vo);
this.setType(this.getType());
return vo;
}
public SingleRuleResultParameterEntity() {}
public SingleRuleResultParameterEntity(String id) {
this.id =id;
}
public InSubOutParameterEntity toInSubOutParameterEntity() {
return new InSubOutParameterEntity(this);
}
@Override
public ParameterType getType() {
return ParameterType.SINGLE_RULE_RESULT;
}
@Override
public String toString() {
return "SingleRuleResultParameterEntity ["
+ " type=" + type
+ " id=" + id
+ ", code=" + code
+ ", name=" + name
+ ", description=" + description
+ ", order=" + order
+ ", valueType" + valueType
+ ", valueScale" + valueScale
+ ", valueRoundingMode" + valueRoundingMode
+ ", valueTypeIsList" + valueTypeIsList
+ ", defaultValue=" + defaultValue
+ ", creator=" + creator
+ ", createDate=" + createDate
+ ", lastModifier=" + lastModifier
+ ", lastModifyDate=" + lastModifyDate
+ "]";
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save