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. 6
      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. 25
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java
  10. 38
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java
  11. 36
      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. 9
      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. 18
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/RuleSetParameterProcessor.java
  48. 19
      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. 24
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary.properties
  52. 24
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_tw_CN.properties
  53. 24
      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. 33
      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. 183
      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}",
"com.google.guava:guava" : "${guava_version}",
"com.nimbusds:nimbus-jose-jwt" : "9.22",
"org.javassist:javassist" : "${javassist_version}",
"org.codehaus.groovy:groovy" : "3.0.19",
"org.codehaus.groovy:groovy-jsr223" : "3.0.19",
"org.codehaus.groovy:groovy-datetime" : "3.0.19",

4
erm.frontend/package.json

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

9
gradle.properties

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

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

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

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

@ -1,28 +1,14 @@
package io.sc.creditreport.core;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import io.sc.platform.util.ObjectMapperUtil;
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 {
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 {
return mapper.readValue(xml, io.sc.creditreport.core.company.Document.class);
return ObjectMapperUtil.xml().readValue(xml, io.sc.creditreport.core.company.Document.class);
}
}

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

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

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
public void compile(String resourceId) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
EngineRuntime.getInstance().compileById(resourceId,executeUnit);
EngineRuntime.getInstance().compile(resourceId,executeUnit);
}
@Override
public void compile(String resourceCode, Integer version) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode,version);
EngineRuntime.getInstance().compileByCode(resourceCode,version,executeUnit);
EngineRuntime.getInstance().compile(resourceCode,version,executeUnit);
}
@Override
public ResourceResult execute(String resourceId, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit, map);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, map);
}
@Override
public ResourceResult execute(String resourceId, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit, json);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, json);
}
@Override
public ResourceResult execute(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit,subModelCode,map);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,map);
}
@Override
public ResourceResult execute(String resourceId, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().executeById(this,resourceId,executeUnit,subModelCode,json);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,json);
}
@Override
public ResourceResult execute(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
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
public ResourceResult execute(String resourceCode, Integer version, String json) throws Exception {
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
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
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
public ResourceResult execute(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
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);
}
}

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

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

38
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
public void compileById(String resourceId, ExecuteUnit executeUnit) throws Exception {
public void compile(String resourceId, ExecuteUnit executeUnit) throws Exception {
SourceCode code = generator.generate(resourceId, executeUnit);
String resourceName =null;
if("RESOURCE".equals(executeUnit.getType())){
@ -49,7 +49,7 @@ public class GroovyEngineRuntime extends EngineRuntime{
}
@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);
String resourceName =null;
if("RESOURCE".equals(wrapper.getType())){
@ -69,31 +69,31 @@ public class GroovyEngineRuntime extends EngineRuntime{
}
@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);
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));
return result;
}
@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);
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;
}
@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);
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;
}
@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);
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));
@ -101,7 +101,7 @@ public class GroovyEngineRuntime extends EngineRuntime{
}
@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);
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));
@ -109,23 +109,23 @@ public class GroovyEngineRuntime extends EngineRuntime{
}
@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);
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));
//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));
return result;
}
@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);
//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));
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));
return result;
}
@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);
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));

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

@ -21,9 +21,9 @@ public class ParameterResult {
private RoundingMode valueRoundingMode; //参数值四舍五入模式
private String defaultValue; //默认值
private String value; //结果值
private RuleResult ruleResult; //规则结果值
private SingleRuleResult singleRuleResult; //单规则结果值
private RuleSetResult ruleSetResult; //规则集结果值
public ParameterResult() {}
public ParameterResult(String code,String name,ParameterType type,String valueType,String value) {
this.code =code;
@ -32,19 +32,19 @@ public class ParameterResult {
this.valueType =valueType;
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.name =name;
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.name =name;
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) {
@ -117,26 +117,16 @@ public class ParameterResult {
public void setValue(String value) {
this.value = value;
}
public RuleResult getRuleResult() {
return ruleResult;
}
public void setRuleResult(RuleResult ruleResult) {
this.ruleResult = ruleResult;
}
public SingleRuleResult getSingleRuleResult() {
return singleRuleResult;
}
public void setSingleRuleResult(SingleRuleResult singleRuleResult) {
this.singleRuleResult = singleRuleResult;
}
@Override
public String toString() {
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 RuleSetResult getRuleResult() {
return ruleSetResult;
}
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.platform.util.ObjectMapperUtil;
import java.math.BigDecimal;
import java.util.ArrayList;
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 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) {
Rule rule =new Rule(isTriggered,level,code,name,category,value,message);
@ -85,7 +85,7 @@ public class RuleResult {
return false;
if (getClass() != obj.getClass())
return false;
RuleResult other = (RuleResult) obj;
RuleSetResult other = (RuleSetResult) obj;
if (triggered != other.triggered)
return false;
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 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 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("Ternary",new Ternary());
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<>();
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
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;
import io.sc.engine.rule.core.enums.IndicatorType;
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.IndicatorValidator;
@ -200,7 +201,7 @@ public class IndicatorGenerator {
variables.put("valueRoundingMode",valueRoundingMode==null?RoundingMode.HALF_UP:valueRoundingMode);
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())){
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");

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;
import io.sc.engine.rule.core.RuleSetResult;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.ParameterValidator;
@ -199,10 +200,10 @@ public class ParameterGenerator {
if(ParameterType.INDICATOR.equals(parameter.getType()) || ParameterType.OUT.equals(parameter.getType()) || ParameterType.INTERMEDIATE.equals(parameter.getType())){
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");
}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");
}else{
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; }
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);
}
}
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) {
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(); //获取条件的所有出口边
if(branches!=null && branches.size()>0) {
List<GraphNode> outs =orderEdges(branches); //对出口边进行排序,有条件的放前面,无条件的放后面
for(int i=0;i<outs.size();i++) {
EdgeConditionBranchNode edge =(EdgeConditionBranchNode)outs.get(i); //出口边
GraphNode nexNode =edge.getOuts().get(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 {
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");
@ -123,14 +122,14 @@ public class ExecutionFlow {
String[] commandSplits =commands.split("\n");
if(commandSplits!=null && commandSplits.length>0) {
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}");
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}");
}
sb.append("\n\t}\n\n");
sb.append("\n}\n\n");
//继续生成后续方法
for(GraphNode out :outs) {
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) {
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(); //获取条件的所有出口边
if(outs!=null && outs.size()>0) {
for(int i=0;i<outs.size();i++) {
EdgeNode edge =(EdgeNode)outs.get(i); //出口边
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) {
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) {
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();
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(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) {
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(); //获取条件的所有出口边
@ -213,23 +212,23 @@ public class ExecutionFlow {
*/
private String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode node,String methodName) {
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 version =node.getVersion();
if(version==null || version.trim().equals("")) {
version ="null";
}
sb.append("\t\t").append("ResourceResult result =executor.executeByCode(\"").append(code).append("\",").append(version).append(",arg.toMap())").append(";\n");
sb.append("\t\t").append("arg.mergeResult(result);").append("\n");
sb.append("\t").append("ResourceResult result =executor.execute(\"").append(code).append("\",").append(version).append(",arg.toMap())").append(";\n");
sb.append("\t").append("arg.mergeResult(result);").append("\n");
//继续调用后续方法
List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) {
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(); //获取条件的所有出口边
@ -252,7 +251,7 @@ public class ExecutionFlow {
*/
private String generateConfigurableResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ConfigurableResourceAbstractNode node,String methodName) {
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 version =node.getVersion();
String inputCommands =node.getInputCommands();
@ -261,24 +260,24 @@ public class ExecutionFlow {
version ="null";
}
sb.append("\t\t//准备调用资源的输入参数\n");
sb.append("\t\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//准备调用资源的输入参数\n");
sb.append("\t").append("Map<String,Object> map =new HashMap<String,Object>();").append("\n");
sb.append("\t").append(StringUtil.tabs(ExpressionReplacer.groovy(inputCommands,null),1)).append("\n");
sb.append("\n");
sb.append("\t\t//调用资源\n");
sb.append("\t\t").append("ResourceResult result =executor.executeByCode(\"").append(code).append("\",").append(version).append(",map);").append("\n");
sb.append("\t//调用资源\n");
sb.append("\t").append("ResourceResult result =executor.execute(\"").append(code).append("\",").append(version).append(",map);").append("\n");
sb.append("\n");
sb.append("\t\t//处理资源调用完毕后的输出值\n");
sb.append("\t\t").append(ExpressionReplacer.groovy(outputCommands,null).replace("\n", "\n\t\t")).append("\n");
sb.append("\t//处理资源调用完毕后的输出值\n");
sb.append("\t").append(ExpressionReplacer.groovy(outputCommands,null).replace("\n", "\n\t\t")).append("\n");
//继续调用后续方法
List<GraphNode> edges =node.getOuts(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) {
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(); //获取条件的所有出口边
@ -301,18 +300,18 @@ public class ExecutionFlow {
*/
private String generateModelAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,SubModelAbstractNode node,String methodName) {
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();
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(); //获取条件的所有出口边
if(edges!=null && edges.size()>0) {
for(GraphNode edge : edges) {
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(); //获取条件的所有出口边

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;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
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.model.Parameter;
@ -18,7 +17,6 @@ import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayDeque;
@JsonIgnoreProperties(ignoreUnknown=true)
public class MathFormula {
public String groovy(Parameter parameter, MathFormulaParameterProcessor processor) throws Exception{
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;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
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.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class NumberRange {
private Boolean minIncluded;
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.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class ObjectProperty {
private String code;
private String name;
@ -74,7 +73,7 @@ public class ObjectProperty {
sb.append("if (true) {").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");
int size =_objectProperties.size();
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("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode()));
sb.append("=");
sb.append(GroovyExpressionReplacer.groovy(item.getInputValue(),parameter.getValueType()));
sb.append(GroovyExpressionReplacer.groovy(item.getValue(),parameter.getValueType()));
sb.append("\n");
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;
@JsonIgnoreProperties(ignoreUnknown=true)
public class SqlFieldMapping {
private String parameter;
private String field;

9
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)
/**
* #(function.description)
*/
#(function.body)
/**
* #(function.description)
*/
#(tabs(function.body,1))
#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)
#@renderFunction(function)
#@renderFunction(function)
#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)
#@renderFunction(function)
#@renderFunction(function)
#end
}
//******************************************************************************
// 执行主体类
@ -44,7 +46,7 @@ class #(className(resource.code,resource.version)) {
* @return 执行结果
*/
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
//初始化模型参数
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);
//输入参数合法性检查

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 io.sc.engine.rule.client.Executor;
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.FieldValidator;
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.max;
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.root;
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)
#for(parameter : model.allParameters)
#if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString())
#for(parameter : model.parameters)
#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))
private static void #(methodName(parameter.code))(Executor executor,Argument arg) {
if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");}
@ -26,7 +45,7 @@
#case ("DECISION_TREE")
//决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成)
#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")
//执行流(此处只是入口,真正的执行流计算逻辑在后面通过一系列方法完成)
#include("/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl")
@ -98,7 +117,7 @@
#for(processor : parameter.processors)
#if("EXECUTION_FLOW"==processor.type.toString())
//执行流函数: #(parameter.name)(#(parameter.type))
#(ExecutionFlow.groovy(parameter,processor))
#(tabs(ExecutionFlow.groovy(parameter,processor),1))
#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, //指标
INTERMEDIATE, //中间值
OUT, //输出
RULE_RESULT, //规则结果值
SINGLE_RULE_RESULT, //单规则结果值
CONSTANT; //常量
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, //对象属性, 处理对象的所有属性
OPTION_VALUE, //选项值
PMML, //pmml
RULE, //规则
RULE_SET, //规则
SCORE_CARD, //评分卡
SINGLE_RULE, //单规则
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){
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>");
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;
public class EdgeConditionBranchNode extends GraphNode {
public class EdgeConditionBranchNode extends EdgeNode {
private String valueType; //值类型
private String value; //值
private String sourceId; //源节点ID
private String targetId; //目标节点ID
private String commands; //命令
/**
@ -39,38 +37,6 @@ public class EdgeConditionBranchNode extends GraphNode {
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 命令
@ -86,16 +52,4 @@ public class EdgeConditionBranchNode extends GraphNode {
public void setCommands(String 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{
private String sourceId; //源节点ID
private String targetId; //目标节点ID
protected String sourceId; //源节点ID
protected String targetId; //目标节点ID
/**
* 获取源节点ID
@ -40,13 +40,4 @@ public class EdgeNode extends GraphNode{
public void setTargetId(String 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=InSubOutParameter.class), //子模型输出
@JsonSubTypes.Type(value=IntermediateParameter.class), //中间值
@JsonSubTypes.Type(value=RuleResultParameter.class), //规则结果值
@JsonSubTypes.Type(value=SingleRuleResultParameter.class), //单规则结果值
@JsonSubTypes.Type(value=OutParameter.class) //结果值
})
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=OptionValueParameterProcessor.class), //选项值处理器
@JsonSubTypes.Type(value=PmmlParameterProcessor.class), //PMML处理器
@JsonSubTypes.Type(value=RuleParameterProcessor.class), //规则处理器
@JsonSubTypes.Type(value=RuleSetParameterProcessor.class), //规则处理器
@JsonSubTypes.Type(value=ScoreCardParameterProcessor.class), //评分卡处理器
@JsonSubTypes.Type(value=SingleRuleParameterProcessor.class), //单规则处理器
@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;
}
}

18
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
*
*/
@JsonTypeName("RULE")
@JsonTypeName("RULE_SET")
@JsonIgnoreProperties(ignoreUnknown=true)
public class RuleParameterProcessor extends ParameterProcessor{
private String rule;
public class RuleSetParameterProcessor extends ParameterProcessor{
private String ruleSet;
@Override
public ProcessorType getType() {
return ProcessorType.RULE;
return ProcessorType.RULE_SET;
}
public String getRule() {
return rule;
public String getRuleSet() {
return ruleSet;
}
public void setRule(String rule) {
this.rule = rule;
public void setRuleSet(String ruleSet) {
this.ruleSet = ruleSet;
}
}

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

@ -37,18 +37,27 @@ public class IdReplacer {
* @return 合法的Java类名
*/
public static String className(String code) {
return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code));
if(!StringUtils.hasText(code)){
return "Object";
}
if(!code.contains(".")) {
return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code));
}
return code;
}
public static String className(String code,Integer version) {
if(!StringUtils.hasText(code)){
return "Object";
}
if(version!=null){
return StringUtil.capitalize(code) + "_V" + version;
}else{
return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code));
if(!code.contains(".")) {
if(version!=null){
return StringUtil.capitalize(code) + "_V" + version;
}else{
return StringUtil.capitalize(ValueTypeUtil.getSimpleName(code));
}
}
return code;
}
/**

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;
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.BigInteger;
import java.util.*;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class ValueTypeUtil {
private static final Map<String,Class<?>> BASE_CLASS_MAP = new HashMap<>();
static {
BASE_CLASS_MAP.put(Boolean.class.getName(),Boolean.class);
BASE_CLASS_MAP.put(Byte.class.getName(),Byte.class);
BASE_CLASS_MAP.put(Character.class.getName(),Character.class);
BASE_CLASS_MAP.put(Short.class.getName(),Short.class);
BASE_CLASS_MAP.put(Integer.class.getName(),Integer.class);
BASE_CLASS_MAP.put(Long.class.getName(),Long.class);
BASE_CLASS_MAP.put(Float.class.getName(),Float.class);
BASE_CLASS_MAP.put(Double.class.getName(),Double.class);
BASE_CLASS_MAP.put(BigInteger.class.getName(),BigInteger.class);
BASE_CLASS_MAP.put(BigDecimal.class.getName(),BigDecimal.class);
BASE_CLASS_MAP.put(String.class.getName(),String.class);
BASE_CLASS_MAP.put(Date.class.getName(),Date.class);
BASE_CLASS_MAP.put(Calendar.class.getName(),Calendar.class);
}
private static final Map<String,Class<?>> BASE_CLASS_MAP = MapUtil.of(
new KV("boolean",Boolean.class),
new KV("byte",Byte.class),
new KV("char",Character.class),
new KV("short",Short.class),
new KV("int",Integer.class),
new KV("long",Long.class),
new KV("float",Float.class),
new KV("double",Double.class),
new KV(Boolean.class.getName(),Boolean.class),
new KV(Byte.class.getName(),Byte.class),
new KV(Character.class.getName(),Character.class),
new KV(Short.class.getName(),Short.class),
new KV(Integer.class.getName(),Integer.class),
new KV(Long.class.getName(),Long.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){
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 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){
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": 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": "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": 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": 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": 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.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.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}
]

24
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.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

24
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.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

24
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.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.INDICATOR=Indicator
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.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.OPTION_VALUE=Option Value
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.SINGLE_RULE=Single Rule
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.INDICATOR=\u6307\u6A19
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.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.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.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.SINGLE_RULE=\u55AE\u898F\u5247
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.INDICATOR=\u6307\u6807
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.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.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.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.SINGLE_RULE=\u5355\u89C4\u5219
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",
"version": "8.2.2",
"version": "8.2.3",
"description": "",
"private": false,
"keywords": [],
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"pinia-undo": "0.2.4",
"platform-core": "8.2.8",
"platform-core": "8.2.14",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"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.optionCode": "Option",
"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.singleRule": "Single Rule",
"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.optionCode": "選項",
"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.singleRule": "單規則",
"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.optionCode": "选项",
"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.singleRule": "单规则",
"re.processor.grid.entity.sqlDatasourceName": "数据源名称",

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

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

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

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

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

@ -7,6 +7,7 @@
:config-button="true"
selection="multiple"
:checkbox-selection="false"
dnd-mode="server"
:tree="true"
:tree-icon="
(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;
//
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;
// 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'),
pageable: false,
sortBy: ['order', '-lastModifyDate'],
sortBy: ['type', 'namec', '-lastModifyDate'],
toolbarConfigure: { noIcon: false },
toolbarActions: ['refresh', 'expand'],
columns: [
@ -398,7 +398,7 @@ const vertexDefines = [
},
dataUrl: Environment.apiContextPath('/api/re/resource'),
pageable: false,
sortBy: ['order', '-lastModifyDate'],
sortBy: ['type', 'namec', '-lastModifyDate'],
toolbarConfigure: { noIcon: false },
toolbarActions: ['refresh', 'expand'],
columns: [
@ -522,7 +522,7 @@ const open = async (parameterId, 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;
//

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

@ -84,25 +84,6 @@
},
},
'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',
label: $t('re.parameter.grid.toolbar.add.importPmml'),

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

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

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

@ -81,15 +81,16 @@
panel: {
columnNum: 1,
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: 'ownerId', label: $t('re.testcase.grid.entity.ownerId') },
{ name: 'ownerCode', label: $t('re.testcase.grid.entity.ownerCode') },
{ name: 'ownerName', label: $t('re.testcase.grid.entity.ownerName') },
{ name: 'ownerVersion', label: $t('re.testcase.grid.entity.ownerVersion') },
{ 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',
click: (args: any) => {
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,
rows: 4,
lang: 'json',
editable: true,
},
{ 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() {
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) => {
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),
icon: 'bi-calculator',
enableIf: (args) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-card-checklist',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-grid-3x3',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-grid-3x2',
enableIf: (args) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-tree',
enableIf: (args) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-bounding-box-circles',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-code',
enableIf: (args) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'sync_alt',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-superscript',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -83,12 +83,21 @@ class MathFormula extends Processor {
}
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);
this.initAutoCompletionManager();
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),
icon: 'bi-justify',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-list-task',
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) => {
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),
icon: 'bi-card-list',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-filetype-xml',
enableIf: (args) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);

183
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 { PlaceHolder } from '@/utils/PlaceHolder';
class Rule extends Processor {
class RuleSet extends Processor {
constructor(targetType: string, context?: any) {
super(targetType, context);
this.PROCESSOR_TYPE = 'RULE';
this.EDITOR_DIALOG_WIDTH = 800;
this.PROCESSOR_TYPE = 'RULE_SET';
this.EDITOR_DIALOG_WIDTH = 1024;
}
public getToolbarAction(): any {
return {
extend: 'add',
name: 'rule',
name: 'ruleSet',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-shadows',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType === 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -26,12 +26,12 @@ class Rule extends Processor {
}
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) {
let header: string = '';
header += '<tr>';
header += ' <th>' + $t('category') + '</th>';
header += ' <th>' + $t('level') + '</th>';
header += ' <th>' + $t('category') + '</th>';
header += ' <th>' + $t('code') + '</th>';
header += ' <th>' + $t('name') + '</th>';
header += ' <th>' + $t('condition') + '</th>';
@ -42,26 +42,26 @@ class Rule extends Processor {
let body: string = '';
objs.forEach((obj) => {
body += '<tr>';
body += ' <td>' + $t(obj.category) + '</td>';
body += ' <td>' + $t(obj.level) + '</td>';
body += ' <td>' + $t(obj.code) + '</td>';
body += ' <td>' + $t(obj.name) + '</td>';
body += ' <td>' + $t(obj.condition) + '</td>';
body += ' <td>' + $t(obj.value) + '</td>';
body += ' <td>' + $t(obj.message) + '</td>';
body += ' <td>' + obj.level + '</td>';
body += ' <td>' + obj.category + '</td>';
body += ' <td>' + obj.code + '</td>';
body += ' <td>' + obj.name + '</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.rule;
return row.ruleSet;
}
public getEditorFields(): any {
return [
{
colSpan: 12,
name: 'rule',
label: $t('re.processor.grid.entity.rule'),
name: 'ruleSet',
label: $t('re.processor.grid.entity.ruleSet'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -70,102 +70,66 @@ class Rule extends Processor {
localMode: true,
dbClickOperation: 'edit',
autoFetchData: false,
denseBody: true,
denseBody: false,
dndMode: 'local',
pageable: false,
configButton: false,
toolbarConfigure: { noIcon: false },
toolbarActions: ['add', 'clone', 'edit', 'remove'],
columns: [
{
name: 'category',
label: $t('category'),
align: 'left',
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
},
{
name: 'level',
label: $t('level'),
align: 'left',
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
},
{
name: 'code',
label: $t('code'),
align: 'left',
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
},
{
name: 'name',
label: $t('name'),
align: 'left',
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
},
{
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);
},
},
toolbarActions: [
'add',
'clone',
'edit',
'remove',
'separator',
{
name: 'message',
label: $t('message'),
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
name: 'example',
label: $t('example'),
icon: 'bi-balloon',
click: (args: any) => {
const sampleData = [
{
level: 1,
category: '财务预警',
code: '',
name: '',
condition: '${资产负债率}>0.3',
value: '${资产负债率}',
message: '资产负债率: ${资产负债率}, 大于 0.3',
},
{
level: 1,
category: '财务预警',
code: '',
name: '',
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: 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: {
dialog: {
width: '600px',
cellDialog: {
width: '1024px',
},
form: {
colsNum: 1,
fields: [
{
name: 'category',
label: $t('category'),
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: 'level', label: $t('level'), type: 'w-integer' },
{ name: 'category', label: $t('category'), type: 'w-text' },
{ name: 'code', label: $t('code'), type: 'w-text' },
{ name: 'name', label: $t('name'), type: 'w-text' },
{
name: '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 {
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 {
const grid = args.grid.getEditorForm().getFieldComponent('rule');
const grid = args.grid.getEditorForm().getFieldComponent('ruleSet');
const localData: any[] = grid.getRows();
const rules: any[] = [];
localData.forEach((item) => {
@ -229,7 +196,7 @@ class Rule extends Processor {
message: item.message,
});
});
args.data.rule = Tools.object2Json(rules);
args.data.ruleSet = Tools.object2Json(rules);
}
public afterEditorOpen(args: any): void {
@ -238,18 +205,18 @@ class Rule extends Processor {
this.initUserDefinedFunctionsManager();
const form = args.grid.getEditorForm();
const grid = args.grid.getEditorForm().getFieldComponent('rule');
const grid = args.grid.getEditorForm().getFieldComponent('ruleSet');
switch (form.getStatus()) {
case 'add': // 新增时清空表格内容
grid.setLocalData([]);
break;
case 'edit': // 编辑/复制时填充表格内容
case 'clone':
const data = Tools.json2Object(args.data.rule);
const data = Tools.json2Object(args.data.ruleSet);
grid.setLocalData(data);
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),
icon: 'bi-credit-card-2-front',
enableIf: (args) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -48,8 +48,9 @@ class ScoreCard extends Processor {
let str = '';
objs.forEach((obj: any) => {
str += '<tr>';
str += ' <td>' + $t('io.sc.engine.rule.core.enums.ProcessorType.' + obj.type) + '</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') {
str += ' <td>' + this.#conditionRange.format({ conditionRange: Tools.object2Json(obj.conditionRange) }) + '</td>';
} 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 { PlaceHolder } from '@/utils/PlaceHolder';
class SingleRule extends Processor {
constructor(targetType: string, context?: any) {
super(targetType, context);
this.PROCESSOR_TYPE = 'SINGLE_RULE';
this.EDITOR_DIALOG_WIDTH = 800;
this.EDITOR_DIALOG_WIDTH = 1024;
}
public getToolbarAction(): any {
@ -15,8 +16,8 @@ class SingleRule extends Processor {
label: $t('io.sc.engine.rule.core.enums.ProcessorType.' + this.PROCESSOR_TYPE),
icon: 'bi-noise-reduction',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType === 'io.sc.engine.rule.core.SingleRuleResult';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', this.PROCESSOR_TYPE);
@ -25,21 +26,171 @@ class SingleRule extends Processor {
}
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;
}
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 {
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 {
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),
icon: 'bi-filetype-sql',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-question',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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),
icon: 'bi-sliders',
enableIf: (args: any) => {
const type = this.context.target.type;
return type !== 'RULE_RESULT' && type !== 'SINGLE_RULE_RESULT';
const valueType = this.context.target.valueType;
return valueType !== 'io.sc.engine.rule.core.SingleRuleResult' && valueType !== 'io.sc.engine.rule.core.RuleSetResult';
},
afterClick: (args: any) => {
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 { OptionValue } from './OptionValue';
export { Pmml } from './Pmml';
export { Rule } from './Rule';
export { ScoreCard } from './ScoreCard';
export { SingleRule } from './SingleRule';
export { Sql } from './Sql';
export { Ternary } from './Ternary';
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 {
if(ValueTypeUtil.isBase(clazz)) {
if(ValueTypeUtil.isBase(clazz) || ValueTypeUtil.isEnum(clazz)) {
ValueType valueType =new ValueType();
valueType.setCode(clazz.getName());
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 {
if(ValueTypeUtil.isBase(clazz)) {
if(ValueTypeUtil.isBase(clazz) || ValueTypeUtil.isEnum(clazz)) {
ValueType valueType =new ValueType();
valueType.setCode(clazz.getName());
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> {
private static final Logger log = LoggerFactory.getLogger(FunctionWebController.class);
@RequestMapping(value="import",method= {RequestMethod.POST})
@ResponseBody
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.IntermediateParameter;
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.ParameterInOptionItemEntity;
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.IntermediateParameterEntity;
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();
}else if(entity instanceof IntermediateParameterEntity) {
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) {
po =new OutParameter();
}else {
@ -138,10 +130,6 @@ public class ParameterEntityConverter {
entity =new InSubOutParameterEntity();
}else if(po instanceof IntermediateParameter) {
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) {
entity =new OutParameterEntity();
}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();
_po.setPmml(_entity.getPmml());
po =_po;
}else if(entity instanceof RuleParameterProcessorEntity) {
RuleParameterProcessorEntity _entity=(RuleParameterProcessorEntity)entity;
RuleParameterProcessor _po =new RuleParameterProcessor();
_po.setRule(_entity.getRule());
}else if(entity instanceof RuleSetParameterProcessorEntity) {
RuleSetParameterProcessorEntity _entity=(RuleSetParameterProcessorEntity)entity;
RuleSetParameterProcessor _po =new RuleSetParameterProcessor();
_po.setRuleSet(_entity.getRuleSet());
po =_po;
}else if(entity instanceof ScoreCardParameterProcessorEntity){
ScoreCardParameterProcessorEntity _entity=(ScoreCardParameterProcessorEntity)entity;
@ -251,10 +251,10 @@ public class ParameterProcessorEntityConverter {
PmmlParameterProcessorEntity _entity =new PmmlParameterProcessorEntity();
_entity.setPmml(_po.getPmml());
entity =_entity;
}else if(po instanceof RuleParameterProcessor) {
RuleParameterProcessor _po =(RuleParameterProcessor)po;
RuleParameterProcessorEntity _entity =new RuleParameterProcessorEntity();
_entity.setRule(_po.getRule());
}else if(po instanceof RuleSetParameterProcessor) {
RuleSetParameterProcessor _po =(RuleSetParameterProcessor)po;
RuleSetParameterProcessorEntity _entity =new RuleSetParameterProcessorEntity();
_entity.setRuleSet(_po.getRuleSet());
entity =_entity;
}else if(po instanceof ScoreCardParameterProcessor) {
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=InSubOutParameterEntity.class), //子模型输出
@JsonSubTypes.Type(value=IntermediateParameterEntity.class), //中间值
@JsonSubTypes.Type(value=RuleResultParameterEntity.class), //规则结果
@JsonSubTypes.Type(value=SingleRuleResultParameterEntity.class), //单规则结果
@JsonSubTypes.Type(value=OutParameterEntity.class) //结果值
})
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=OptionValueParameterProcessorEntity.class), //选项值处理器
@JsonSubTypes.Type(value=PmmlParameterProcessorEntity.class), //PMML处理器
@JsonSubTypes.Type(value=RuleParameterProcessorEntity.class), //规则处理器
@JsonSubTypes.Type(value=RuleSetParameterProcessorEntity.class), //规则处理器
@JsonSubTypes.Type(value=ScoreCardParameterProcessorEntity.class), //评分卡处理器
@JsonSubTypes.Type(value=SingleRuleParameterProcessorEntity.class), //单规则处理器
@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;
}
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) {
this.id=out.getId();
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