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 @@