diff --git a/app.platform/README.adoc b/app.platform/README.adoc
index e69de29b..3b938b23 100644
--- a/app.platform/README.adoc
+++ b/app.platform/README.adoc
@@ -0,0 +1,3 @@
+2025-01-03:
+1. 替换 mysql 驱动,支持 mysql-5,以便默认支持 TDSQL
+2. 修复部分 bug
\ No newline at end of file
diff --git a/app.platform/Wsp.class b/app.platform/Wsp.class
deleted file mode 100644
index 548d6497..00000000
Binary files a/app.platform/Wsp.class and /dev/null differ
diff --git a/app.platform/build.gradle b/app.platform/build.gradle
index b5802a49..e7a99eb5 100644
--- a/app.platform/build.gradle
+++ b/app.platform/build.gradle
@@ -63,7 +63,7 @@ processResources {
bootWar{
mainClass = "${project.name}.Application"
- launchScript()
+ //launchScript()
manifest {
attributes 'Implementation-Version': archiveVersion,
'Implementation-Title': project.name
diff --git a/build-version.gradle b/build-version.gradle
index a7637fc3..6a5f9c5a 100755
--- a/build-version.gradle
+++ b/build-version.gradle
@@ -6,15 +6,15 @@ ext['PlatformDependencyVersions'] =[
"org.ow2.asm:asm" : "${asm_version}",
"org.checkerframework:checker-qual" : "${checker_version}",
"com.google.guava:guava" : "${guava_version}",
- "com.nimbusds:nimbus-jose-jwt" : "9.22",
+ "com.nimbusds:nimbus-jose-jwt" : "${nimbusds_version}",
"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",
- "org.codehaus.groovy:groovy-dateutil" : "3.0.19",
- "org.codehaus.groovy:groovy-json" : "3.0.19",
- "org.codehaus.groovy:groovy-sql" : "3.0.19",
- "org.codehaus.groovy:groovy-xml" : "3.0.19",
+ "org.codehaus.groovy:groovy" : "${groovy_version}",
+ "org.codehaus.groovy:groovy-jsr223" : "${groovy_version}",
+ "org.codehaus.groovy:groovy-datetime" : "${groovy_version}",
+ "org.codehaus.groovy:groovy-dateutil" : "${groovy_version}",
+ "org.codehaus.groovy:groovy-json" : "${groovy_version}",
+ "org.codehaus.groovy:groovy-sql" : "${groovy_version}",
+ "org.codehaus.groovy:groovy-xml" : "${groovy_version}",
];
/***********************************************************************
diff --git a/build.gradle b/build.gradle
index f3947a0b..e272a38f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -59,6 +59,7 @@ subprojects {
// exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j"
// exclude group: "org.slf4j", module: "slf4j-jdk14"
exclude group: "org.slf4j", module: "slf4j-nop"
+ exclude group: "com.mysql", module: "mysql-connector-j"
if(PlatformDependencyVersions!=null && PlatformDependencyVersions.size()>0) {
resolutionStrategy.eachDependency { DependencyResolveDetails detail ->
diff --git a/erm.frontend/package.json b/erm.frontend/package.json
index 2447002b..72b7b1c5 100644
--- a/erm.frontend/package.json
+++ b/erm.frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "erm.frontend",
- "version": "8.2.3",
+ "version": "8.2.4",
"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.19",
+ "platform-core": "8.2.20",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",
diff --git a/gradle.properties b/gradle.properties
index c55936c3..c2150b97 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -36,9 +36,9 @@ application_version=1.0.0
# platform
######################################gra#####################
platform_group=io.sc
-platform_version=8.2.3
-platform_plugin_version=8.2.3
-platform_core_frontend_version=8.2.19
+platform_version=8.2.4
+platform_plugin_version=8.2.4
+platform_core_frontend_version=8.2.20
###########################################################
# dependencies version
@@ -53,6 +53,7 @@ cxf_version=3.2.7
dm_hibernate_version=8.1.2.192
enjoy_version=5.2.2
flowable_version=6.8.0
+groovy_version=3.0.22
guava_version=31.1-jre
ipaddress_version=5.4.0
jackson_version=2.13.5
@@ -61,12 +62,14 @@ jasypt_version=2.1.2
jboss_logging_version=3.3.2.Final
jcommander_version=1.82
jdbc_dm_version=8.1.2.192
+jdbc_mysql_version=5.1.49
jib_version=3.3.2
jjwt_version=0.9.1
jxls_jexcel_version=1.0.7
jxls_poi_version=1.0.15
jxls_version=2.4.6
mybatis_version=3.5.10
+nimbusds_version=9.22
opencsv_version=5.7.1
oshi_version=6.6.1
p6spy_version=3.9.1
diff --git a/io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json b/io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
index 0bbc37d4..e2864c72 100644
--- a/io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
+++ b/io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
@@ -1,18 +1,18 @@
[
{
"name" : "parseCompanyCreditReport",
- "signature" : "parseCompanyCreditReport(xml)",
+ "signature" : "UDF.parseCompanyCreditReport(xml)",
"description" : "将 xml 解析成征信报告对象(企业)",
"enable" : true,
- "mathXml" : "\n\n parseCompanyCreditReport\n (\n \n xml\n \n )\n\n",
- "body" : "def parseCompanyCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parseCompanyCreditReport(xml);\n}"
+ "mathXml" : "\n\n UDF.parseCompanyCreditReport\n (\n \n xml\n \n )\n\n",
+ "body" : "def static parseCompanyCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parseCompanyCreditReport(xml);\n}"
},
{
"name" : "parsePersonCreditReport",
- "signature" : "parsePersonCreditReport(xml)",
+ "signature" : "UDF.parsePersonCreditReport(xml)",
"description" : "将 xml 解析成征信报告对象(个人)",
"enable" : true,
- "mathXml" : "\n\n parsePersonCreditReport\n (\n \n xml\n \n )\n\n",
- "body" : "def parsePersonCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parsePersonCreditReport(xml);\n}"
+ "mathXml" : "\n\n UDF.parsePersonCreditReport\n (\n \n xml\n \n )\n\n",
+ "body" : "def static parsePersonCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parsePersonCreditReport(xml);\n}"
}
]
\ No newline at end of file
diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json
index 1e51c8be..fbe93280 100644
--- a/io.sc.engine.mv.frontend/package.json
+++ b/io.sc.engine.mv.frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "io.sc.engine.mv.frontend",
- "version": "8.2.3",
+ "version": "8.2.4",
"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.19",
+ "platform-core": "8.2.20",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",
diff --git a/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java b/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java
index 152c0c56..e6822f52 100644
--- a/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java
+++ b/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java
@@ -84,7 +84,7 @@ public class AutoCompileDeployedModelInitializer implements ApplicationInitializ
for(ResourceAbstract resource : resources) {
if(DeployStatus.ON_LINE.equals(resource.getStatus())) {
log.info("auto compile deployed resource {}_V{}({}) ......",resource.getCode(),resource.getVersion(),resource.getName());
- executor.compile(resource.getCode(), resource.getVersion());
+ executor.compileByCode(resource.getCode(), resource.getVersion());
}
}
}
@@ -108,7 +108,7 @@ public class AutoCompileDeployedModelInitializer implements ApplicationInitializ
for(Entry entry : last.entrySet()) {
ResourceAbstract resource =entry.getValue();
log.info("auto compile deployed resource {}_V{}({}) ......",resource.getCode(),resource.getVersion(),resource.getName());
- executor.compile(resource.getCode(), resource.getVersion());
+ executor.compileByCode(resource.getCode(), resource.getVersion());
}
}
}
diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java
index 8f6c8960..a1264a81 100644
--- a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java
+++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java
@@ -15,19 +15,19 @@ public interface Executor {
*/
public Loader getLoader();
- public void compile(String resourceId) throws Exception;
- public void compile(String resourceCode,Integer version) throws Exception;
+ public void compileById(String resourceId) throws Exception;
+ public void compileByCode(String resourceCode, Integer version) throws Exception;
- public ResourceResult execute(String resourceId,Map map) throws Exception;
- public ResourceResult execute(String resourceId, String json) throws Exception;
+ public ResourceResult executeById(String resourceId,Map map) throws Exception;
+ public ResourceResult executeById(String resourceId, String json) throws Exception;
- public ResourceResult execute(String resourceId,String subModelCode,Map map) throws Exception;
- public ResourceResult execute(String resourceId,String subModelCode,String json) throws Exception;
+ public ResourceResult executeById(String resourceId,String subModelCode,Map map) throws Exception;
+ public ResourceResult executeById(String resourceId,String subModelCode,String json) throws Exception;
- public ResourceResult execute(String resourceCode,Integer version,Map map) throws Exception;
- public ResourceResult execute(String resourceCode,Integer version,String json) throws Exception;
+ public ResourceResult executeByCode(String resourceCode,Integer version,Map map) throws Exception;
+ public ResourceResult executeByCode(String resourceCode,Integer version,String json) throws Exception;
- public ResourceResult execute(String resourceCode,Integer version,String subModelCode,Map map) throws Exception;
- public ResourceResult execute(String resourceCode,Integer version,String subModelCode,String json) throws Exception;
+ public ResourceResult executeByCode(String resourceCode,Integer version,String subModelCode,Map map) throws Exception;
+ public ResourceResult executeByCode(String resourceCode,Integer version,String subModelCode,String json) throws Exception;
}
diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
index e7a124af..12ba914d 100644
--- a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
+++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
@@ -27,61 +27,61 @@ public class LocalExecutor implements Executor {
}
@Override
- public void compile(String resourceId) throws Exception {
+ public void compileById(String resourceId) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
EngineRuntime.getInstance().compile(resourceId,executeUnit);
}
@Override
- public void compile(String resourceCode, Integer version) throws Exception {
+ public void compileByCode(String resourceCode, Integer version) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode,version);
EngineRuntime.getInstance().compile(resourceCode,version,executeUnit);
}
@Override
- public ResourceResult execute(String resourceId, Map map) throws Exception {
+ public ResourceResult executeById(String resourceId, Map map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, map);
}
@Override
- public ResourceResult execute(String resourceId, String json) throws Exception {
+ public ResourceResult executeById(String resourceId, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, json);
}
@Override
- public ResourceResult execute(String resourceId, String subModelCode, Map map) throws Exception {
+ public ResourceResult executeById(String resourceId, String subModelCode, Map map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,map);
}
@Override
- public ResourceResult execute(String resourceId, String subModelCode, String json) throws Exception {
+ public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,json);
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, Map map) throws Exception {
+ public ResourceResult executeByCode(String resourceCode, Integer version, Map map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit, map);
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, String json) throws Exception {
+ public ResourceResult executeByCode(String resourceCode, Integer version, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit, json);
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, String subModelCode, Map map) throws Exception {
+ public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit,subModelCode,map);
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
+ public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit,subModelCode,json);
}
diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java
index a579ab62..46582cbe 100644
--- a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java
+++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java
@@ -27,55 +27,55 @@ public class RemoteExecutor implements Executor{
}
@Override
- public void compile(String resourceId) throws Exception {
+ public void compileById(String resourceId) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported compile!");
}
@Override
- public void compile(String resourceCode, Integer version) throws Exception {
+ public void compileByCode(String resourceCode, Integer version) throws Exception {
throw new RuntimeException("Remote Executor NOT Supported compile!");
}
@Override
- public ResourceResult execute(String resourceId, Map map) throws Exception {
- return execute(resourceId,ObjectMapperUtil.json().writeValueAsString(map));
+ public ResourceResult executeById(String resourceId, Map map) throws Exception {
+ return executeById(resourceId,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
- public ResourceResult execute(String resourceId, String json) throws Exception {
+ public ResourceResult executeById(String resourceId, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
- public ResourceResult execute(String resourceId, String subModelCode, Map map) throws Exception {
- return execute(resourceId, subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
+ public ResourceResult executeById(String resourceId, String subModelCode, Map map) throws Exception {
+ return executeById(resourceId, subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
- public ResourceResult execute(String resourceId, String subModelCode, String json) throws Exception {
+ public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId,subModelCode), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, Map map) throws Exception {
- return execute(resourceCode,version,ObjectMapperUtil.json().writeValueAsString(map));
+ public ResourceResult executeByCode(String resourceCode, Integer version, Map map) throws Exception {
+ return executeByCode(resourceCode,version,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, String json) throws Exception {
+ public ResourceResult executeByCode(String resourceCode, Integer version, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,null), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, String subModelCode, Map map) throws Exception {
- return execute(resourceCode,version,subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
+ public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map map) throws Exception {
+ return executeByCode(resourceCode,version,subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
- public ResourceResult execute(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
+ public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,subModelCode), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
}
diff --git a/io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java b/io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java
index 848c967b..b19f6206 100644
--- a/io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java
+++ b/io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java
@@ -36,7 +36,7 @@ public class Test {
//第一次执行,消除缓存对性能对比测试的影响
//executor.executeByCode(MODEL_CODE, MODEL_VERSION,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(prepareData()));
- ResourceResult result =executor.execute(MODEL_CODE, MODEL_VERSION,prepareData());
+ ResourceResult result =executor.executeByCode(MODEL_CODE, MODEL_VERSION,prepareData());
List parameters =result.getData();
for(ParameterResult parameter : parameters) {
System.out.println(parameter);
@@ -57,7 +57,7 @@ public class Test {
//准备执行的数据(输入参数)
Map data =prepareData();
//executor.getLoader().getResourceByCode(MODEL_CODE, MODEL_VERSION);
- executor.execute(MODEL_CODE, MODEL_VERSION,data);
+ executor.executeByCode(MODEL_CODE, MODEL_VERSION,data);
}
tracer.info("执行完毕(采用 map 对象作为参数)");
tracer.info("采用 map 对象作为输入参数将执行效率提高 20+ 倍!!!");
diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java
index bda83f55..943d1a8b 100644
--- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java
+++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java
@@ -1,8 +1,6 @@
package io.sc.engine.rule.core;
-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.math.RoundingMode;
@@ -46,7 +44,7 @@ public class ParameterResult {
this.type =type;
this.ruleSetResult =ruleSetResult;
}
-
+
public ParameterResult(String code,String name,ParameterType type,String valueType,Integer valueScale,RoundingMode valueRoundingMode,String value) {
this.code =code;
this.name =name;
diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
index 7aaacd29..46736ac0 100644
--- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
+++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
@@ -216,7 +216,7 @@ public class IndicatorGenerator {
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");
}else if(ValueTypeUtil.isBase(indicator.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})));";
diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
index 155a174d..081b5a86 100644
--- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
+++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
@@ -62,6 +62,9 @@ public class ParameterGenerator {
}
StringBuilder sb = new StringBuilder("");
for (Parameter parameter : parameters) {
+ if(ParameterType.CONSTANT.equals(parameter.getType())){
+ continue;
+ }
String code = parameter.getCode();
String name = parameter.getName();
String valueType = parameter.getValueType();
diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java
index 38dcab80..668edb70 100644
--- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java
+++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java
@@ -68,7 +68,7 @@ public class DecisionTree {
methodNameCache.put(methodName, null);
}
}
- return StringUtil.tabs(sb.toString(),2);
+ return sb.toString();
}
/**
@@ -81,7 +81,7 @@ public class DecisionTree {
*/
private String generateConditionGroovyCode(Map methodNameCache,Parameter parameter,ConditionNode conditionNode,String methodName) {
StringBuilder sb =new StringBuilder();
- sb.append("\tprivate static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//条件判断").append("\n");
+ sb.append("private static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//条件判断").append("\n");
List branches =conditionNode.getOuts(); //获取条件的所有出口边
if(branches!=null && branches.size()>0) {
List outs =orderEdges(branches); //对出口边进行排序,有条件的放前面,无条件的放后面
@@ -90,7 +90,7 @@ public class DecisionTree {
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
if(i==0) {
- sb.append("\t\tif((").append(ExpressionReplacer.groovy(conditionNode.getCondition(),null)).append(")==").append(ExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append("){").append("\n");
+ sb.append("\tif((").append(ExpressionReplacer.groovy(conditionNode.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(conditionNode.getCondition(),null)).append(")==").append(ExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append("){").append("\n");
@@ -107,10 +107,10 @@ public class DecisionTree {
}
}
}
- sb.append("\t\t\t").append("return Tree_").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("return Tree_").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)));
@@ -129,14 +129,14 @@ public class DecisionTree {
*/
private String generateExpressionGroovyCode(Map methodNameCache,Parameter parameter,ExpressionNode expressionNode,String methodName) {
StringBuilder sb =new StringBuilder();
- sb.append("\tprivate static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//表达式").append("\n");
+ sb.append("private static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//表达式").append("\n");
String expression =expressionNode.getExpression();
String commands =expressionNode.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");
}
- sb.append("\t\t").append("return ").append(ExpressionReplacer.groovy(expression,parameter.getValueType())).append(";\n");
- sb.append("\t}").append("\n\n");
+ sb.append("\t").append("return ").append(ExpressionReplacer.groovy(expression,parameter.getValueType())).append(";\n");
+ sb.append("}").append("\n\n");
return sb.toString();
}
@@ -151,14 +151,14 @@ public class DecisionTree {
*/
private String generateResourceAbstractGroovyCode(Map methodNameCache,Parameter parameter,ResourceAbstractNode expressionNode,String methodName) {
StringBuilder sb =new StringBuilder();
- sb.append("\tprivate static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n");
+ sb.append("private static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n");
String code =ExpressionReplacer.groovy(expressionNode.getCode(),String.class.getName());
String version =ExpressionReplacer.groovy(expressionNode.getVersion(),Long.class.getName());
if(version==null || version.trim().isEmpty()) {
version ="null";
}
- sb.append("\t\t").append("return new ").append(parameter.getValueType()).append("(").append(code).append(",").append(version).append(")").append(";\n");
- sb.append("\t}").append("\n\n");
+ sb.append("\t").append("return new ").append(parameter.getValueType()).append("(").append(code).append(",").append(version).append(")").append(";\n");
+ sb.append("}").append("\n\n");
return sb.toString();
}
diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java
index 01a02fd6..6840953e 100644
--- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java
+++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java
@@ -110,7 +110,7 @@ public class IdReplacer {
if(isKeywords(code)) {
return FIELD_NAME_PREFIX + code;
}else {
- return StringUtil.unCapitalize(code);
+ return code.trim();
}
}
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/argument_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/argument_render.tpl
new file mode 100644
index 00000000..c46af8bf
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/argument_render.tpl
@@ -0,0 +1,49 @@
+#define renderArgument(model)
+@JsonIgnoreProperties(ignoreUnknown=true)
+class Argument {
+ #(tabs(ParameterGenerator.generateFields(model.getAllParameters()),1))
+
+ public static Argument convertArgument(Map map){
+ if(map!=null){
+ Argument arg =new Argument();
+ #(tabs(ParameterGenerator.generateConvertorFromMap(model.getAllParameters()),3))
+ return arg;
+ }
+ return null;
+ }
+
+ public static Argument convertArgument(String json){
+ if(json!=null && !"".equals(json.trim())){
+ Argument arg =ObjectMapperUtil.json().readValue(json, Argument.class);
+ #(tabs(ParameterGenerator.generateConvertorFromJson(model.getAllParameters()),3))
+ return arg;
+ }
+ }
+
+ public void validate(ValidateResult result) {
+ #(tabs(ParameterGenerator.generateValidator(model.getAllParameters()),2))
+ }
+
+ public void mergeParameterValueFromIndicatorLib(Map libs){
+ #(tabs(ParameterGenerator.generateMergeParameterValueFromIndicatorLib(model.getAllParameters()),2))
+ }
+
+ public ResourceResult toResult(){
+ ResourceResult result =new ResourceResult();
+ #(tabs(ParameterGenerator.generateToResult(model.getAllParameters()),2))
+ return result;
+ }
+
+ public Map toMap(){
+ Map map =new HashMap();
+ #(tabs(ParameterGenerator.generateToMap(model.getAllParameters()),2))
+ return map;
+ }
+
+ public void mergeResult(ResourceResult result){
+ if(result!=null){
+ #(tabs(ParameterGenerator.generateMergeResult(model.getAllParameters()),3))
+ }
+ }
+}
+#end
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl
new file mode 100644
index 00000000..bd3b307b
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl
@@ -0,0 +1,13 @@
+#define renderDictionary(dictionary)
+/**
+ * #(dictionary.name)
+ */
+@JsonIgnoreProperties(ignoreUnknown=true)
+class #(className(dictionary.code,dictionary.version)) {
+ #(tabs(DictionaryGenerator.generateFields(dictionary.getFields()),1))
+
+ public void init(){
+ #(tabs(DictionaryGenerator.generateInits(dictionary.getFields()),2))
+ }
+}
+#end
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/functions_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/functions_render.tpl
new file mode 100644
index 00000000..a6443382
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/functions_render.tpl
@@ -0,0 +1,7 @@
+#define renderFunction(function)
+
+ /**
+ * #(function.description)
+ */
+ #(tabs(function.body,1))
+#end
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl
new file mode 100644
index 00000000..8f633187
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl
@@ -0,0 +1,173 @@
+#set(dictionaries =executeUnit.dictionaries)
+#set(lib =executeUnit.lib)
+
+#######################################
+### 模版函数
+#######################################
+#include("/io/sc/engine/rule/core/code/template/package_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/import_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/functions_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/dictionary_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/lib_render.tpl")
+
+#@renderPackage(packageName)
+
+#@renderImport()
+
+//******************************************************************************
+// 自定义函数
+//******************************************************************************
+class UDF {
+#for(function : executeUnit.functions)
+ #@renderFunction(function)
+#end
+}
+
+//******************************************************************************
+// 执行主体类
+//******************************************************************************
+/**
+ * type: #(executeUnit.type)
+ * code: #(lib.code),
+ * name: #(lib.name),
+ * version: #(lib.version)
+ */
+class #(className(lib.code,lib.version)) {
+ private static final Logger log =LoggerFactory.getLogger(#(className(lib.code,lib.version)).class);
+
+ /**
+ * 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数)
+ * @param map 输入参数封装器
+ * @return 执行结果
+ */
+ public static ResourceResult execute(Map map) throws Exception {
+ return execute(map["executor"],map["subModelCode"],map["argument"]);
+ }
+
+ public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception {
+ if(log.isDebugEnabled()){log.debug("开始执行指标库 : #(className(lib.code,lib.version))");}
+ if(data instanceof Map){
+ if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",ObjectMapperUtil.json().writeValueAsString(data));}
+ }else if(data instanceof String){
+ if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);}
+ }
+ if(log.isDebugEnabled()){log.debug("初始化指标库参数");}
+ Argument arg =Argument.convertArgument(data);
+
+ if(log.isDebugEnabled()){log.debug("开始检查指标库输入参数数据合法性");}
+ ValidateResult validateResult =new ValidateResult();
+ arg.validate(validateResult);
+ if(validateResult.hasError()){
+ if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");}
+ ResourceResult result =new ResourceResult();
+ result.setValidateResult(validateResult);
+ return result;
+ }
+ if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");}
+
+ #for(indicator : lib.indicators)
+ #if("INDICATOR"==indicator.type.toString())
+ #(methodName(indicator.code))(executor,arg);//#(indicator.name),#(indicator.type)
+ #end
+ #end
+
+ //返回结果
+ ResourceResult result =arg.toResult();
+ if(log.isDebugEnabled()){log.debug("指标库调用成功,返回结果:\n{}",ObjectMapperUtil.json().writeValueAsString(result));}
+ return result;
+ }
+
+#for(indicator : lib.indicators)
+ #if("INDICATOR"==indicator.type.toString())
+ #set(parameter=indicator)
+
+ public static void #(methodName(indicator.code))(Executor executor,Argument arg) {
+ #for(processor : indicator.processors)
+ if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");}
+ #switch (processor.type.toString())
+ #case ("ARITHMETIC")
+ //算数运算
+ #include("/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl")
+ if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("CONDITION_RANGE")
+ //条件分段函数
+ #include("/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl")
+ if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("GROOVY_SCRIPT")
+ //Groovy 脚本
+ #include("/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl")
+ #case ("HTTP_REQUEST")
+ //Http 请求
+ #include("/io/sc/engine/rule/core/code/template/processor/http_request.tpl")
+ #case ("MATH_FORMULA")
+ //数学公式
+ #include("/io/sc/engine/rule/core/code/template/processor/math_formula.tpl")
+ if(log.isDebugEnabled()){log.debug(" 数学公式运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("NUMBER_RANGE")
+ //数值分段函数
+ #include("/io/sc/engine/rule/core/code/template/processor/numberRange.tpl")
+ if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("OBJECT_PROPERTIES")
+ //对象属性赋值函数
+ #include("/io/sc/engine/rule/core/code/template/processor/object_properties.tpl")
+ if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("SQL")
+ //SQL 运算
+ #include("/io/sc/engine/rule/core/code/template/processor/sql.tpl")
+ #case ("TERNARY")
+ //三元运算
+ #include("/io/sc/engine/rule/core/code/template/processor/ternary.tpl")
+ if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("WHEN_THEN")
+ //WhenThen 运算
+ #include("/io/sc/engine/rule/core/code/template/processor/when_then.tpl")
+ if(log.isDebugEnabled()){log.debug(" WhenThen 运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #end
+ #end
+ }
+ #end
+#end
+}
+
+@JsonIgnoreProperties(ignoreUnknown=true)
+class Argument {
+ #(tabs(IndicatorGenerator.generateFields(lib.indicators),1))
+ public static Argument convertArgument(Map map){
+ if(map!=null){
+ Argument arg =new Argument();
+ #(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"arg"),3))
+ return arg;
+ }
+ return null;
+ }
+
+ public static Argument convertArgument(String json){
+ if(json!=null && !"".equals(json.trim())){
+ Argument arg =ObjectMapperUtil.json().readValue(json, Argument.class);
+ #(tabs(IndicatorGenerator.generateConvertorFromJson(lib.indicators),3))
+ return arg;
+ }
+ }
+
+ public void validate(ValidateResult result) {
+ #(tabs(IndicatorGenerator.generateValidator(lib.indicators),2))
+ }
+
+ public ResourceResult toResult(){
+ ResourceResult result =new ResourceResult();
+ #(tabs(IndicatorGenerator.generateToResult(lib.indicators),2))
+ return result;
+ }
+}
+
+//******************************************************************************
+// 元数据定义类
+//******************************************************************************
+#for(dictionary : dictionaries)
+#@renderDictionary(dictionary)
+#end
+
+//******************************************************************************
+// 执行并返回结果
+//******************************************************************************
+#(className(lib.code,lib.version)).execute(INPUT_PARAMETER);
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl
new file mode 100644
index 00000000..28e5ee99
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl
@@ -0,0 +1,160 @@
+#set(resource = executeUnit.resource)
+#set(dictionaries =executeUnit.dictionaries)
+#set(libs =executeUnit.libs)
+#set(model = resource.model)
+
+#######################################
+### 模版函数
+#######################################
+#include("/io/sc/engine/rule/core/code/template/package_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/import_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/functions_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/parameter_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/model_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/argument_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/dictionary_render.tpl")
+#include("/io/sc/engine/rule/core/code/template/lib_render.tpl")
+
+#@renderPackage(packageName)
+
+#@renderImport()
+
+//******************************************************************************
+// 自定义函数
+//******************************************************************************
+class UDF {
+#for(function : executeUnit.functions)
+ #@renderFunction(function)
+#end
+}
+
+//******************************************************************************
+// 执行主体类
+//******************************************************************************
+/**
+ * type: #(executeUnit.type)
+ * code: #(resource.code),
+ * name: #(resource.name),
+ * version: #(resource.version)
+ */
+class #(className(resource.code,resource.version)) {
+ private static final Logger log =LoggerFactory.getLogger(#(className(resource.code,resource.version)).class);
+
+ /**
+ * 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数)
+ * @param map 输入参数封装器
+ * @return 执行结果
+ */
+ public static ResourceResult execute(Map map) throws Exception{
+ return execute(map["executor"],map["subModelCode"],map["argument"]);
+ }
+
+ /**
+ * 执行方法
+ * @param executor 执行器对象
+ * @param subModelCode 子模型代码
+ * @param data 输入参数
+ * @return 执行结果
+ */
+ public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{
+ if(log.isDebugEnabled()){log.debug("开始执行: #(resource.name)");}
+ if(data instanceof Map){
+ if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",ObjectMapperUtil.json().writeValueAsString(data));}
+ }else if(data instanceof String){
+ if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);}
+ }
+
+ //初始化指标库
+#for(lib : libs)
+ if(log.isDebugEnabled()){log.debug("初始化指标库 : #(lib.name)_V#(lib.version)");}
+
+ #(className(lib.code,lib.version)) #(varName(lib.code,lib.version)) =new #(className(lib.code,lib.version))();
+ #(varName(lib.code,lib.version)).convertArgument(data);
+#end
+
+ //初始化模型参数
+ if(log.isDebugEnabled()){log.debug("从 {} 初始化模型参数",String.class==data.class?"Json":"Map");}
+ Argument arg =Argument.convertArgument(data);
+
+ //输入参数合法性检查
+ ValidateResult validateResult =new ValidateResult();
+
+ //输入参数合法性检查(指标库)
+#for(lib : libs)
+ if(log.isDebugEnabled()){log.debug("开始检查输入参数数据合法性(指标库: #(lib.name)_V#(lib.version))");}
+ #(varName(lib.code,lib.version)).validate(validateResult);
+ if(validateResult.hasError()){
+ if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");}
+ ResourceResult result =new ResourceResult();
+ result.setValidateResult(validateResult);
+ return result;
+ }
+ if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");}
+#end
+
+ //输入参数合法性检查(模型)
+ if(log.isDebugEnabled()){log.debug("开始检查模型输入参数数据合法性");}
+ arg.validate(validateResult);
+ if(validateResult.hasError()){
+ if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");}
+ ResourceResult result =new ResourceResult();
+ result.setValidateResult(validateResult);
+ return result;
+ }
+ if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");}
+
+ //执行指标库
+#for(lib : executeUnit.getLibs())
+ if(log.isDebugEnabled()){log.debug("开始执行指标库: #(lib.name)_V#(lib.version)");}
+ #(varName(lib.code,lib.version)).execute();
+#end
+
+ //合并指标库指标
+ if(log.isDebugEnabled()){log.debug("开始合并指标库指标");}
+ Map indicatorLibs =new HashMap();
+#for(lib : executeUnit.getLibs())
+ indicatorLibs.put("#(varName(lib.code,lib.version))",#(varName(lib.code,lib.version)));
+#end
+ arg.mergeParameterValueFromIndicatorLib(indicatorLibs);
+ if(log.isDebugEnabled()){log.debug("显示合并后输入参数:\n{}",ObjectMapperUtil.json().writeValueAsString(arg));}
+
+ //执行模型
+ if(subModelCode){
+ subModelCode =IdReplacer.methodName(subModelCode);
+ "${subModelCode}"(executor,arg);//调用子模型
+ }else{
+ #(methodName(model.code))(executor,arg);//调用顶级模型(#(model.name))
+ }
+
+ //返回结果
+ ResourceResult result =arg.toResult();
+ if(log.isDebugEnabled()){log.debug("模型调用成功,返回结果:\n{}",ObjectMapperUtil.json().writeValueAsString(result));}
+ return result;
+ }
+
+ #@renderModel(model)
+}
+
+//******************************************************************************
+// 模型参数定义类
+//******************************************************************************
+#@renderArgument(model)
+
+//******************************************************************************
+// 元数据定义类
+//******************************************************************************
+#for(dictionary : dictionaries)
+#@renderDictionary(dictionary)
+#end
+
+//******************************************************************************
+// 指标库定义类
+//******************************************************************************
+#for(lib : libs )
+#@renderLib(lib)
+#end
+
+//******************************************************************************
+// 执行并返回结果
+//******************************************************************************
+#(className(resource.code,resource.version)).execute(INPUT_PARAMETER);
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl
new file mode 100644
index 00000000..03a5d341
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl
@@ -0,0 +1,97 @@
+#define renderImport()
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+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.RuleSetResult;
+import io.sc.engine.rule.core.SingleRuleResult;
+import io.sc.engine.rule.core.FieldValidator;
+import io.sc.engine.rule.core.ParameterResult;
+import io.sc.engine.rule.core.ResourceResult;
+import io.sc.engine.rule.core.ValidateResult;
+import io.sc.engine.rule.core.enums.ParameterType;
+import io.sc.engine.rule.core.enums.RuntimeInputParameterType;
+import io.sc.engine.rule.core.function.JpmmlEvaluator;
+import io.sc.engine.rule.core.util.IdReplacer;
+import io.sc.engine.rule.core.util.ESql;
+import io.sc.platform.util.DateUtil;
+import io.sc.platform.util.ObjectMapperUtil;
+import io.sc.platform.util.StringUtil;
+import io.sc.platform.util.TypeConvertor;
+import java.math.*;
+import java.util.Map;
+import java.util.Random;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import static io.sc.engine.rule.core.function.ArithmeticFunction.div;
+import static io.sc.engine.rule.core.function.ArithmeticFunction.lg;
+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;
+import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing;
+import static io.sc.engine.rule.core.function.DateFunction.now;
+import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd;
+import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd;
+import static io.sc.engine.rule.core.function.NormalDistributionFunction.G;
+import static io.sc.engine.rule.core.function.NormalDistributionFunction.iG;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.infinite;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.isInfinite;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.isNan;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.isNil;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.isZero;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.nan;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.nil;
+import static io.sc.engine.rule.core.function.SpecialValueFunction.zero;
+import static io.sc.engine.rule.core.function.StringFunction.contains;
+import static io.sc.engine.rule.core.function.StringFunction.endsWith;
+import static io.sc.engine.rule.core.function.StringFunction.join;
+import static io.sc.engine.rule.core.function.StringFunction.length;
+import static io.sc.engine.rule.core.function.StringFunction.lowerCase;
+import static io.sc.engine.rule.core.function.StringFunction.startsWith;
+import static io.sc.engine.rule.core.function.StringFunction.trim;
+import static io.sc.engine.rule.core.function.StringFunction.upperCase;
+import static io.sc.platform.util.CollectionUtil.hasElements;
+import static io.sc.platform.util.DateUtil.yearsBetween;
+import static io.sc.platform.util.DateUtil.monthsBetween;
+import static io.sc.platform.util.DateUtil.weeksBetween;
+import static io.sc.platform.util.DateUtil.daysBetween;
+import static io.sc.platform.util.DateUtil.hoursBetween;
+import static io.sc.platform.util.DateUtil.minutesBetween;
+import static io.sc.platform.util.DateUtil.secondsBetween;
+import static io.sc.platform.util.NumberUtil.comma;
+import static io.sc.platform.util.NumberUtil.decimal;
+import static io.sc.platform.util.NumberUtil.money;
+import static io.sc.platform.util.NumberUtil.percent;
+import static java.lang.Math.E;
+import static java.lang.Math.IEEEremainder;
+import static java.lang.Math.PI;
+import static java.lang.Math.abs;
+import static java.lang.Math.acos;
+import static java.lang.Math.asin;
+import static java.lang.Math.atan;
+import static java.lang.Math.atan2;
+import static java.lang.Math.cbrt;
+import static java.lang.Math.ceil;
+import static java.lang.Math.cos;
+import static java.lang.Math.cosh;
+import static java.lang.Math.exp;
+import static java.lang.Math.expm1;
+import static java.lang.Math.floor;
+import static java.lang.Math.pow;
+import static java.lang.Math.random;
+import static java.lang.Math.rint;
+import static java.lang.Math.round;
+import static java.lang.Math.sin;
+import static java.lang.Math.sinh;
+import static java.lang.Math.sqrt;
+import static java.lang.Math.tan;
+import static java.lang.Math.tanh;
+import static java.lang.Math.toDegrees;
+import static java.lang.Math.toRadians;
+#end
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl
new file mode 100644
index 00000000..084d83d7
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl
@@ -0,0 +1,79 @@
+#define renderLib(lib)
+@JsonIgnoreProperties(ignoreUnknown=true)
+class #(className(lib.code,lib.version)) {
+ private static final Logger log =LoggerFactory.getLogger(#(className(lib.code,lib.version)).class);
+ #(tabs(IndicatorGenerator.generateFields(lib.indicators),1))
+
+ //通过输入参数构建指标库对象
+ public void convertArgument(Map map){
+ #(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"this"),2))
+ }
+
+ public void convertArgument(String json){
+ #(tabs(IndicatorGenerator.generateConvertorFromJson(lib.indicators),2))
+ }
+
+ public void execute() throws Exception{
+ #for(indicator : lib.indicators)
+ #if(indicator.type.toString()=="INDICATOR" && indicator.processors!=null && indicator.processors.size()>0)
+ #(methodName(indicator.code))();//#(indicator.name),#(indicator.type)
+ #end
+ #end
+ }
+
+ public void validate(ValidateResult result) {
+ #(tabs(IndicatorGenerator.generateValidator(lib.indicators),2))
+ }
+
+#for(indicator : lib.indicators)
+ #if(indicator.type.toString()=="INDICATOR" && indicator.processors!=null && indicator.processors.size()>0)
+ #set(parameter=indicator)
+ public void #(methodName(indicator.code))(){
+ #(className(lib.code,lib.version)) arg =this;
+ #for(processor : indicator.processors)
+ if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");}
+ #switch (processor.type.toString())
+ #case ("ARITHMETIC")
+ //算数运算
+ #include("/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl")
+ if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("CONDITION_RANGE")
+ //条件分段函数
+ #include("/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl")
+ if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("GROOVY_SCRIPT")
+ //Groovy 脚本
+ #include("/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl")
+ #case ("HTTP_REQUEST")
+ //Http 请求
+ #include("/io/sc/engine/rule/core/code/template/processor/http_request.tpl")
+ #case ("MATH_FORMULA")
+ //数学公式
+ #include("/io/sc/engine/rule/core/code/template/processor/math_formula.tpl")
+ if(log.isDebugEnabled()){log.debug(" 数学公式运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("NUMBER_RANGE")
+ //数值分段函数
+ #include("/io/sc/engine/rule/core/code/template/processor/numberRange.tpl")
+ if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("OBJECT_PROPERTIES")
+ //对象属性赋值函数
+ #include("/io/sc/engine/rule/core/code/template/processor/object_properties.tpl")
+ if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("SQL")
+ //SQL 运算
+ #include("/io/sc/engine/rule/core/code/template/processor/sql.tpl")
+ #case ("TERNARY")
+ //三元运算
+ #include("/io/sc/engine/rule/core/code/template/processor/ternary.tpl")
+ if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("WHEN_THEN")
+ //WhenThen 运算
+ #include("/io/sc/engine/rule/core/code/template/processor/when_then.tpl")
+ if(log.isDebugEnabled()){log.debug(" WhenThen 运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #end
+ #end
+ }
+ #end
+#end
+}
+#end
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/model_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/model_render.tpl
new file mode 100644
index 00000000..bdb70d31
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/model_render.tpl
@@ -0,0 +1,30 @@
+#define renderModel(model)
+ //#(model.fullName.contains("/")?"子":"主")模型(#(model.fullName))
+ private static void #(methodName(model.code))(Executor executor,Argument arg){
+ if(log.isDebugEnabled()){log.debug("开始调用模型: {}({})","#(model.fullName)","#(model.executeMode)");}
+
+ #if(!model.enable)
+ if(log.isDebugEnabled()){log.debug("开始调用模型: enable==false");}
+ #end
+ #if(model.executeMode.toString()=="DOWN_UP")
+ //调用子模型
+ #for(subModel : model.children)
+ #(methodName(subModel.code))(executor,arg);//#(subModel.name)
+ #end
+ #end
+
+ //计算中间值和结果值
+ #for(parameter : model.parameters)
+ #if(parameter.type.toString()=="INTERMEDIATE" || parameter.type.toString()=="OUT")
+ #(methodName(parameter.code))(executor,arg);//#(parameter.type), #(parameter.name)
+ #end
+ #end
+ }
+
+ ### 递归调用生成子模式代码
+ #for(subModel : model.children)
+ #@renderModel(subModel)
+ #end
+
+ #@renderParameter(model)
+#end
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/package_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/package_render.tpl
new file mode 100644
index 00000000..c50ae80f
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/package_render.tpl
@@ -0,0 +1,3 @@
+#define renderPackage(packageName)
+package #(packageName);
+#end
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl
new file mode 100644
index 00000000..53015736
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl
@@ -0,0 +1,125 @@
+#define renderParameter(model)
+#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))");}
+ #for(processor : parameter.processors)
+ #if(processor.enable)
+ #switch (processor.type.toString())
+ #case ("ARITHMETIC")
+ //算数运算
+ #include("/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl")
+ if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("CONDITION_RANGE")
+ //条件分段函数
+ #include("/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl")
+ if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("DECISION_TABLE")
+ //决策表
+ #include("/io/sc/engine/rule/core/code/template/processor/decision_table.tpl")
+ if(log.isDebugEnabled()){log.debug(" 决策表运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("DECISION_TABLE_2C")
+ //简单决策表
+ #include("/io/sc/engine/rule/core/code/template/processor/decision_table_2c.tpl")
+ if(log.isDebugEnabled()){log.debug(" 简单决策表运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("DECISION_TREE")
+ //决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成)
+ #include("/io/sc/engine/rule/core/code/template/processor/decision_tree.tpl")
+ if(log.isDebugEnabled()){log.debug(" 决策树运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("EXECUTION_FLOW")
+ //执行流(此处只是入口,真正的执行流计算逻辑在后面通过一系列方法完成)
+ #include("/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl")
+ if(log.isDebugEnabled()){log.debug(" 执行流运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("GROOVY_SCRIPT")
+ //Groovy 脚本
+ #include("/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl")
+ #case ("HTTP_REQUEST")
+ //Http 请求
+ #include("/io/sc/engine/rule/core/code/template/processor/http_request.tpl")
+ #case ("MATH_FORMULA")
+ //数学公式
+ #include("/io/sc/engine/rule/core/code/template/processor/math_formula.tpl")
+ if(log.isDebugEnabled()){log.debug(" 数学公式运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("NUMBER_RANGE")
+ //数值分段函数
+ #include("/io/sc/engine/rule/core/code/template/processor/numberRange.tpl")
+ if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("OBJECT_PROPERTIES")
+ //对象属性赋值函数
+ #include("/io/sc/engine/rule/core/code/template/processor/object_properties.tpl")
+ if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("OPTION_VALUE")
+ //选项值运算
+ #include("/io/sc/engine/rule/core/code/template/processor/option_value.tpl")
+ if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("PMML")
+ //PMML
+ #include("/io/sc/engine/rule/core/code/template/processor/pmml.tpl")
+ #case ("RULE")
+ #case ("SCORE_CARD")
+ //评分卡
+ #include("/io/sc/engine/rule/core/code/template/processor/score_card.tpl")
+ #case ("SINGLE_RULE")
+ #case ("SQL")
+ //SQL 运算
+ #include("/io/sc/engine/rule/core/code/template/processor/sql.tpl")
+ #case ("TERNARY")
+ //三元运算
+ #include("/io/sc/engine/rule/core/code/template/processor/ternary.tpl")
+ if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #case ("WHEN_THEN")
+ //WhenThen 运算
+ #include("/io/sc/engine/rule/core/code/template/processor/when_then.tpl")
+ if(log.isDebugEnabled()){log.debug(" WhenThen 运算结果 : {}",arg.#(fieldName(parameter.code)));}
+ #end
+ #end
+ #end
+
+ if(log.isDebugEnabled()){log.debug(" 参数结果值 : {}",arg.#(fieldName(parameter.code)));}
+ }
+
+#end
+#end
+ ### 决策树函数
+ #for(parameter : model.allParameters)
+ #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString())
+ #for(processor : parameter.processors)
+ #if("DECISION_TREE"==processor.type.toString())
+ //决策树函数: #(parameter.name)(#(parameter.type))
+ #(tabs(DecisionTree.groovy(parameter,processor),1))
+ #end
+ #end
+ #end
+ #end
+ ### 执行流函数
+ #for(parameter : model.allParameters)
+ #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString())
+ #for(processor : parameter.processors)
+ #if("EXECUTION_FLOW"==processor.type.toString())
+ //执行流函数: #(parameter.name)(#(parameter.type))
+ #(tabs(ExecutionFlow.groovy(parameter,processor),1))
+ #end
+ #end
+ #end
+ #end
+#end
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl
new file mode 100644
index 00000000..76ad3cbf
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl
@@ -0,0 +1 @@
+arg.#(fieldName(parameter.code)) =#(Arithmetic.groovy(parameter,processor));
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl
new file mode 100644
index 00000000..df3f6ba8
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl
@@ -0,0 +1 @@
+#(tabs(ConditionRange.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table.tpl
new file mode 100644
index 00000000..0aac00c9
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table.tpl
@@ -0,0 +1 @@
+#(tabs(DecisionTable.groovy(parameter,processor,model.allParameters),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table_2c.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table_2c.tpl
new file mode 100644
index 00000000..eaec55ec
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table_2c.tpl
@@ -0,0 +1 @@
+#(tabs(DecisionTable2C.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_tree.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_tree.tpl
new file mode 100644
index 00000000..adc08687
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_tree.tpl
@@ -0,0 +1 @@
+arg.#(fieldName(parameter.code)) =Tree_#(fieldName(parameter.code))_#(DecisionTree.parse(processor.decisionTree).id)(executor,arg);
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl
new file mode 100644
index 00000000..c987cb11
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl
@@ -0,0 +1 @@
+Flow_#(fieldName(parameter.code))_#(ExecutionFlow.parse(processor.executionFlow).id)(executor,arg);
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl
new file mode 100644
index 00000000..7e3a0b40
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl
@@ -0,0 +1 @@
+#(tabs(io.sc.engine.rule.core.util.GroovyExpressionReplacer::groovy(processor.groovyScript),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl
new file mode 100644
index 00000000..e69de29b
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/math_formula.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/math_formula.tpl
new file mode 100644
index 00000000..287307a4
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/math_formula.tpl
@@ -0,0 +1 @@
+arg.#(fieldName(parameter.code)) =#(MathFormula.groovy(parameter,processor));
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/numberRange.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/numberRange.tpl
new file mode 100644
index 00000000..44e2df37
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/numberRange.tpl
@@ -0,0 +1 @@
+#(tabs(NumberRange.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/object_properties.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/object_properties.tpl
new file mode 100644
index 00000000..5f5907f5
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/object_properties.tpl
@@ -0,0 +1 @@
+#(tabs(ObjectProperty.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/option_value.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/option_value.tpl
new file mode 100644
index 00000000..fa0592b6
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/option_value.tpl
@@ -0,0 +1 @@
+#(tabs(OptionValue.groovy(parameter,processor,model),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/pmml.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/pmml.tpl
new file mode 100644
index 00000000..8a9ba03b
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/pmml.tpl
@@ -0,0 +1,4 @@
+arg.#(fieldName(parameter.code)) =JpmmlEvaluator.evaluate(
+ '#(parameter.id)_#(processor.id)',
+ '''#(tabs(processor.pmml,3))'''
+ ,arg.toMap());
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/rule_set.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/rule_set.tpl
new file mode 100644
index 00000000..f7e97293
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/rule_set.tpl
@@ -0,0 +1 @@
+#(tabs(RuleSet.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/score_card.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/score_card.tpl
new file mode 100644
index 00000000..5564e645
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/score_card.tpl
@@ -0,0 +1 @@
+#(tabs(ScoreCard.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/single_rule.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/single_rule.tpl
new file mode 100644
index 00000000..6d3b5d94
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/single_rule.tpl
@@ -0,0 +1 @@
+#(tabs(SingleRule.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/sql.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/sql.tpl
new file mode 100644
index 00000000..784203e7
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/sql.tpl
@@ -0,0 +1 @@
+#(tabs(SqlFieldMapping.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/ternary.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/ternary.tpl
new file mode 100644
index 00000000..d3ba932d
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/ternary.tpl
@@ -0,0 +1 @@
+#(tabs(Ternary.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/when_then.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/when_then.tpl
new file mode 100644
index 00000000..67c2fcad
--- /dev/null
+++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/when_then.tpl
@@ -0,0 +1 @@
+#(tabs(WhenThen.groovy(parameter,processor),2))
\ No newline at end of file
diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json
index 7f6c0d4a..678b244c 100644
--- a/io.sc.engine.rule.frontend/package.json
+++ b/io.sc.engine.rule.frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "io.sc.engine.rule.frontend",
- "version": "8.2.3",
+ "version": "8.2.4",
"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.19",
+ "platform-core": "8.2.20",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",
diff --git a/io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue b/io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue
index 7a8dfefa..6417bdfd 100644
--- a/io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue
+++ b/io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue
@@ -66,7 +66,8 @@
name: 'content',
label: $t('re.processor.grid.entity.content'),
sortable: false,
- format: (value, row) => {
+ title: () => {},
+ format: (value: any, row: any) => {
return processorManager.format(value, row);
},
},
diff --git a/io.sc.engine.rule.frontend/src/views/resources/ImportSampleDialog.vue b/io.sc.engine.rule.frontend/src/views/resources/ImportSampleDialog.vue
index 451e45cd..79d45df8 100644
--- a/io.sc.engine.rule.frontend/src/views/resources/ImportSampleDialog.vue
+++ b/io.sc.engine.rule.frontend/src/views/resources/ImportSampleDialog.vue
@@ -43,7 +43,7 @@
foreign-key="parentId"
:columns="[
{
- width: 200,
+ width: 400,
name: 'name',
label: $t('name'),
format: (value, row) => {
diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue
index 66b7c20e..61cb74b9 100644
--- a/io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue
+++ b/io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue
@@ -153,8 +153,6 @@
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false;
- // currentSelectedTestCaseRef = {};
- // testCaseParameterGridRef?.refresh();
}
"
>
@@ -180,7 +178,7 @@
@@ -191,7 +189,7 @@