Browse Source

1. 替换 mysql 驱动,支持 mysql-5,以便默认支持 TDSQL

2. 修复部分 bug
main
wangshaoping 2 months ago
parent
commit
2ffa518509
  1. 3
      app.platform/README.adoc
  2. BIN
      app.platform/Wsp.class
  3. 2
      app.platform/build.gradle
  4. 16
      build-version.gradle
  5. 1
      build.gradle
  6. 4
      erm.frontend/package.json
  7. 9
      gradle.properties
  8. 12
      io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
  9. 4
      io.sc.engine.mv.frontend/package.json
  10. 4
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java
  11. 20
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java
  12. 20
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
  13. 28
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java
  14. 4
      io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java
  15. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ParameterResult.java
  16. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
  17. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
  18. 26
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java
  19. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/IdReplacer.java
  20. 49
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/argument_render.tpl
  21. 13
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl
  22. 7
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/functions_render.tpl
  23. 173
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl
  24. 160
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl
  25. 97
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl
  26. 79
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl
  27. 30
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/model_render.tpl
  28. 3
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/package_render.tpl
  29. 125
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl
  30. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/arithmetic.tpl
  31. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/conditionRange.tpl
  32. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table.tpl
  33. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_table_2c.tpl
  34. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/decision_tree.tpl
  35. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/execution_flow.tpl
  36. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/groovy_script.tpl
  37. 0
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl
  38. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/math_formula.tpl
  39. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/numberRange.tpl
  40. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/object_properties.tpl
  41. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/option_value.tpl
  42. 4
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/pmml.tpl
  43. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/rule_set.tpl
  44. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/score_card.tpl
  45. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/single_rule.tpl
  46. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/sql.tpl
  47. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/ternary.tpl
  48. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/when_then.tpl
  49. 4
      io.sc.engine.rule.frontend/package.json
  50. 3
      io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue
  51. 2
      io.sc.engine.rule.frontend/src/views/resources/ImportSampleDialog.vue
  52. 8
      io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue
  53. 2
      io.sc.engine.rule.frontend/src/views/resources/designer/Processor.vue
  54. 4
      io.sc.engine.rule.frontend/src/views/shared/TestcaseParameterGrid.vue
  55. 1
      io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts
  56. 5080
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/app/irs/shns/SHNS非零售内评(元数据).json
  57. 19271
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/app/irs/shns/SHNS非零售内评(模型).json
  58. 704
      io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/app/irs/shns/SHNS非零售内评(特征库).json
  59. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java
  60. 6
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java
  61. 6
      io.sc.engine.rule.server/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
  62. 8934
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(元数据)_old.json
  63. 1476
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(特征库).json
  64. 8045
      io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例.json
  65. 4
      io.sc.engine.st.frontend/package.json
  66. 2
      io.sc.platform.core.frontend/package.json
  67. 2
      io.sc.platform.core.frontend/src/platform/components/workflow/WSelectAssigneeDialog.vue
  68. 4
      io.sc.platform.core.frontend/template-project/package.json
  69. 4
      io.sc.platform.developer.doc/package.json
  70. 4
      io.sc.platform.developer.frontend/package.json
  71. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessOperationServiceImpl.java
  72. 6
      io.sc.platform.gradle/templates/pgp/setup/gradle.properties
  73. 3
      io.sc.platform.jdbc.driver.mysql/build.gradle
  74. 4
      io.sc.platform.jdbc.driver.mysql/src/main/resources/META-INF/platform/plugins/jdbc-connection-template.json
  75. 2
      io.sc.platform.jdbc.driver.oceanbase-mysql/build.gradle
  76. 2
      io.sc.platform.jdbc.driver.oceanbase-oracle/build.gradle
  77. 3
      io.sc.platform.jdbc.driver.sqlite/build.gradle
  78. 3
      io.sc.platform.jdbc.driver.tidb/build.gradle
  79. 4
      io.sc.platform.lcdp.frontend/package.json
  80. 4
      io.sc.platform.license.keygen.frontend/package.json
  81. 4
      io.sc.platform.mvc.frontend/package.json
  82. 4
      io.sc.platform.scheduler.manager.frontend/package.json
  83. 4
      io.sc.platform.system.frontend/package.json
  84. 14
      io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java
  85. 4
      io.sc.standard.frontend/package.json
  86. 4
      io.sc.website/package.json

3
app.platform/README.adoc

@ -0,0 +1,3 @@
2025-01-03:
1. 替换 mysql 驱动,支持 mysql-5,以便默认支持 TDSQL
2. 修复部分 bug

BIN
app.platform/Wsp.class

Binary file not shown.

2
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

16
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}",
];
/***********************************************************************

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

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

9
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

12
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" : "<mspace></mspace>\n<mrow>\n <mo>parseCompanyCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def parseCompanyCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parseCompanyCreditReport(xml);\n}"
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>UDF.parseCompanyCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"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" : "<mspace></mspace>\n<mrow>\n <mo>parsePersonCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def parsePersonCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parsePersonCreditReport(xml);\n}"
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>UDF.parsePersonCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def static parsePersonCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parsePersonCreditReport(xml);\n}"
}
]

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

4
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<String, ResourceAbstract> 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());
}
}
}

20
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<String,Object> map) throws Exception;
public ResourceResult execute(String resourceId, String json) throws Exception;
public ResourceResult executeById(String resourceId,Map<String,Object> map) throws Exception;
public ResourceResult executeById(String resourceId, String json) throws Exception;
public ResourceResult execute(String resourceId,String subModelCode,Map<String,Object> map) throws Exception;
public ResourceResult execute(String resourceId,String subModelCode,String json) throws Exception;
public ResourceResult executeById(String resourceId,String subModelCode,Map<String,Object> map) throws Exception;
public ResourceResult executeById(String resourceId,String subModelCode,String json) throws Exception;
public ResourceResult execute(String resourceCode,Integer version,Map<String,Object> map) throws Exception;
public ResourceResult execute(String resourceCode,Integer version,String json) throws Exception;
public ResourceResult executeByCode(String resourceCode,Integer version,Map<String,Object> map) throws Exception;
public ResourceResult executeByCode(String resourceCode,Integer version,String json) throws Exception;
public ResourceResult execute(String resourceCode,Integer version,String subModelCode,Map<String,Object> 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<String,Object> map) throws Exception;
public ResourceResult executeByCode(String resourceCode,Integer version,String subModelCode,String json) throws Exception;
}

20
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<String, Object> map) throws Exception {
public ResourceResult executeById(String resourceId, Map<String, Object> 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<String, Object> map) throws Exception {
public ResourceResult executeById(String resourceId, String subModelCode, Map<String, Object> 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<String, Object> map) throws Exception {
public ResourceResult executeByCode(String resourceCode, Integer version, Map<String, Object> 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<String, Object> map) throws Exception {
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> 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);
}

28
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<String, Object> map) throws Exception {
return execute(resourceId,ObjectMapperUtil.json().writeValueAsString(map));
public ResourceResult executeById(String resourceId, Map<String, Object> 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<String, Object> map) throws Exception {
return execute(resourceId, subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
public ResourceResult executeById(String resourceId, String subModelCode, Map<String, Object> 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<String, Object> map) throws Exception {
return execute(resourceCode,version,ObjectMapperUtil.json().writeValueAsString(map));
public ResourceResult executeByCode(String resourceCode, Integer version, Map<String, Object> 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<String, Object> map) throws Exception {
return execute(resourceCode,version,subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> 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);
}

4
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<ParameterResult> parameters =result.getData();
for(ParameterResult parameter : parameters) {
System.out.println(parameter);
@ -57,7 +57,7 @@ public class Test {
//准备执行的数据(输入参数)
Map<String,Object> 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+ 倍!!!");

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

2
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})));";

3
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();

26
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<String,String> 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<GraphNode> branches =conditionNode.getOuts(); //获取条件的所有出口边
if(branches!=null && branches.size()>0) {
List<GraphNode> 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<String,String> 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<String,String> 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();
}

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

49
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<String,Object> 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<String,Object> libs){
#(tabs(ParameterGenerator.generateMergeParameterValueFromIndicatorLib(model.getAllParameters()),2))
}
public ResourceResult toResult(){
ResourceResult result =new ResourceResult();
#(tabs(ParameterGenerator.generateToResult(model.getAllParameters()),2))
return result;
}
public Map<String,Object> toMap(){
Map<String,Object> map =new HashMap<String,Object>();
#(tabs(ParameterGenerator.generateToMap(model.getAllParameters()),2))
return map;
}
public void mergeResult(ResourceResult result){
if(result!=null){
#(tabs(ParameterGenerator.generateMergeResult(model.getAllParameters()),3))
}
}
}
#end

13
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

7
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

173
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<String,Object> 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<String,Object> 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);

160
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<String,Object> 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<String,Object> indicatorLibs =new HashMap<String,Object>();
#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);

97
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

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

30
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

3
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

125
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

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

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

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

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

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

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

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

0
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl

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

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

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

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

4
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());

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

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

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

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

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

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

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

3
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);
},
},

2
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) => {

8
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();
}
"
></TestcaseGrid>
@ -180,7 +178,7 @@
<Option v-if="statusReactive.isShowOption" ref="optionGridRef" :read-only="readOnlyRef" :parameter="currentSelectedParameterRef"></Option>
<TestcaseParameterGrid
v-if="statusReactive.isShowTestCaseParameter"
ref="testcaseParameterGridRef"
ref="testCaseParameterGridRef"
:test-case="currentSelectedTestCaseRef"
></TestcaseParameterGrid>
</div>
@ -191,7 +189,7 @@
</w-dialog>
</template>
<script setup lang="ts">
import { ref, nextTick, reactive } from 'vue';
import { ref, reactive } from 'vue';
import { Environment } from 'platform-core';
import Model from './Model.vue';
import Parameter from './Parameter.vue';
@ -235,7 +233,7 @@ const statusReactive = reactive({
isShowTestCaseParameter: false,
});
const open = (resource) => {
const open = (resource: any) => {
currentSelectedResourceRef.value = resource;
readOnlyRef.value = currentSelectedResourceRef.value.status !== 'SKETCH';
dialogRef.value.show();

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

@ -101,7 +101,7 @@
label: $t('re.processor.grid.entity.content'),
sortable: false,
title: () => {},
format: (value, row) => {
format: (value: any, row: any) => {
return processorManager.format(value, row);
},
},

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

@ -20,7 +20,7 @@
"
db-click-operation="edit"
:tree-default-expand-all="true"
:fetch-data-url="Environment.apiContextPath('/api/re/testCaseParameter/findByTestCase?testCaseId=' + Tools.initialize(testCase?.id, ''))"
:fetch-data-url="Environment.apiContextPath('/api/re/testCaseParameter/findByTestCase?testCaseId=' + (testCase?.id == null ? '' : testCase.id))"
:data-url="Environment.apiContextPath('/api/re/testCaseParameter')"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
@ -240,7 +240,7 @@
</template>
<script setup lang="ts">
import { ref, useAttrs, computed } from 'vue';
import { ref, useAttrs, onUpdated } from 'vue';
import { axios, Environment, Formater, Tools } from 'platform-core';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';

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

@ -58,6 +58,7 @@ class ObjectProperties extends Processor {
type: 'w-code-mirror',
lang: 'java',
rows: 3,
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: this.autoCompletionManager.autoCompletion(),

5080
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/app/irs/shns/SHNS非零售内评(元数据).json

File diff suppressed because it is too large

19271
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/app/irs/shns/SHNS非零售内评(模型).json

File diff suppressed because it is too large

704
io.sc.engine.rule.sample/src/main/resources/io/sc/engine/rule/sample/app/irs/shns/SHNS非零售内评(特征库).json

File diff suppressed because one or more lines are too long

8
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java

@ -95,9 +95,9 @@ public class ResourceWebController extends RestCrudController<ResourceVo, Resour
@RequestBody String json
) throws Exception{
if(StringUtils.hasText(subModelCode)) {
return executorFactoryService.getExecutor().execute(resourceId, subModelCode, json);
return executorFactoryService.getExecutor().executeById(resourceId, subModelCode, json);
}else {
return executorFactoryService.getExecutor().execute(resourceId, json);
return executorFactoryService.getExecutor().executeById(resourceId, json);
}
}
@ -110,9 +110,9 @@ public class ResourceWebController extends RestCrudController<ResourceVo, Resour
@RequestBody String json
) throws Exception{
if(StringUtils.hasText(subModelCode)) {
return executorFactoryService.getExecutor().execute(resourceCode, version, subModelCode, json);
return executorFactoryService.getExecutor().executeByCode(resourceCode, version, subModelCode, json);
}else {
return executorFactoryService.getExecutor().execute(resourceCode, version, json);
return executorFactoryService.getExecutor().executeByCode(resourceCode, version, json);
}
}

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

@ -650,7 +650,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
}
Executor executor =executorFactoryService.getExecutor();
if(executor!=null) {
ResourceResult result =executor.execute(resourceEntity.getId(), map);
ResourceResult result =executor.executeById(resourceEntity.getId(), map);
if(result!=null) {
ValidateResult validateResult =result.getValidateResult();
if(validateResult!=null && validateResult.hasError()){
@ -712,7 +712,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
}
Executor executor =executorFactoryService.getExecutor();
if(executor!=null) {
ResourceResult result =executor.execute(resourceEntity.getId(), map);
ResourceResult result =executor.executeById(resourceEntity.getId(), map);
if(result!=null) {
List<ParameterResult> datas =result.getData();
if(datas!=null && datas.size()>0) {
@ -769,7 +769,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
}
Executor executor =executorFactoryService.getExecutor();
if(executor!=null) {
ResourceResult result =executor.execute(libEntity.getId(), map);
ResourceResult result =executor.executeById(libEntity.getId(), map);
if(result!=null) {
List<ParameterResult> datas =result.getData();
if(datas!=null && datas.size()>0) {

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

@ -1,10 +1,10 @@
[
{
"name" : "DIV",
"signature" : "DIV(a,b)",
"signature" : "UDF.DIV(a,b)",
"description" : "特殊除法, a 除以 b, 用于处理分母为零",
"enable" : true,
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>DIV</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>a</mi>\n <mspace></mspace>\n <mo>,</mo>\n <mspace></mspace>\n <mi>b</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def DIV(Double a, Double b){\n if(b==0){\n if(a>0){\n return 999;\n }else if(a<0){\n return -999;\n }else{\n return 0;\n }\n }\n}"
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>UDF.DIV</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>a</mi>\n <mspace></mspace>\n <mo>,</mo>\n <mspace></mspace>\n <mi>b</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def static DIV(Double a, Double b){\n if(b==0){\n if(a>0){\n return 999;\n }else if(a<0){\n return -999;\n }else{\n return 0;\n }\n }\n}"
}
]

8934
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(元数据)_old.json

File diff suppressed because it is too large

1476
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例(特征库).json

File diff suppressed because one or more lines are too long

8045
io.sc.engine.rule.server/src/main/resources/io/sc/engine/rule/server/sample/引擎示例.json

File diff suppressed because one or more lines are too long

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

@ -1,6 +1,6 @@
{
"name": "io.sc.engine.st.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",

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

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

2
io.sc.platform.core.frontend/src/platform/components/workflow/WSelectAssigneeDialog.vue

@ -21,7 +21,7 @@
<w-form
ref="formRef"
:cols-num="1"
:fields="[{ name: 'assignee', label: $t('lcdp.bpm.selectAssignee.entity.assignee'), type: 'select', options: assigneeOptionsRef }]"
:fields="[{ name: 'assignee', label: $t('lcdp.bpm.selectAssignee.entity.assignee'), type: 'w-select', options: assigneeOptionsRef }]"
>
</w-form>
</w-dialog>

4
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.2.19",
"version": "8.2.20",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -110,7 +110,7 @@
"mockjs": "1.1.0",
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"platform-core": "8.2.19",
"platform-core": "8.2.20",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

4
io.sc.platform.developer.doc/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.developer.doc",
"version": "8.2.3",
"version": "8.2.4",
"description": "",
"main": "index.js",
"scripts": {
@ -28,7 +28,7 @@
"vuepress": "2.0.0-rc.15"
},
"dependencies": {
"platform-core": "8.2.19",
"platform-core": "8.2.20",
"quasar": "2.17.4",
"vue": "3.5.13",
"vue-i18n": "10.0.4"

4
io.sc.platform.developer.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.developer.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",

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessOperationServiceImpl.java

@ -50,7 +50,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
public class ProcessOperationServiceImpl implements ProcessOperationService {
private static final Logger log =LoggerFactory.getLogger(ProcessOperationServiceImpl.class);
private static final Pattern GO_BACK_VARIABLE_PATTERN = Pattern.compile(FrameworkVariableNames.GO_BACK + "\\s*==\\s*([-]?\\d*)");
private static final String DEFAULT_ASSIGNMENT_STRATEGY_SPRING_BEAN_NAME ="platformAssigneeQueryService";
private static final String DEFAULT_ASSIGNMENT_STRATEGY_SPRING_BEAN_NAME ="io.sc.platform.flowable.service.impl.AssigneeQueryServiceImpl";
private static final String ASSIGNMENT_STRATEGY_DATA_OBJECT_ID ="assignment-strategy";
@Autowired private RuntimeService runtimeService;
@Autowired private HistoryService historyService;

6
io.sc.platform.gradle/templates/pgp/setup/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.18
platform_version=8.2.4
platform_plugin_version=8.2.4
platform_core_frontend_version=8.2.20
###########################################################
# dependencies version

3
io.sc.platform.jdbc.driver.mysql/build.gradle

@ -1,5 +1,6 @@
dependencies {
api(
"com.mysql:mysql-connector-j",
//"com.mysql:mysql-connector-j",
"mysql:mysql-connector-java:${jdbc_mysql_version}"
)
}

4
io.sc.platform.jdbc.driver.mysql/src/main/resources/META-INF/platform/plugins/jdbc-connection-template.json

@ -1,8 +1,8 @@
{
"installerEnable" : true,
"type" : "MySQL",
"version" : "8.0",
"driver" : "com.mysql.cj.jdbc.Driver",
"version" : "5.0",
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://${host}:${port}/${database}",
"urlSample" : "jdbc:mysql://localhost:3306/platform?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
"hibernateDialect" : "org.hibernate.dialect.MySQLDialect",

2
io.sc.platform.jdbc.driver.oceanbase-mysql/build.gradle

@ -1,5 +1,5 @@
dependencies {
api(
"com.oceanbase:oceanbase-client:2.4.0",
"com.oceanbase:oceanbase-client:2.4.0",
)
}

2
io.sc.platform.jdbc.driver.oceanbase-oracle/build.gradle

@ -1,5 +1,5 @@
dependencies {
api(
"com.oceanbase:oceanbase-client:2.4.0",
"com.oceanbase:oceanbase-client:2.4.0",
)
}

3
io.sc.platform.jdbc.driver.sqlite/build.gradle

@ -1,5 +1,6 @@
dependencies {
api(
"com.mysql:mysql-connector-j",
//"com.mysql:mysql-connector-j",
"mysql:mysql-connector-java:${jdbc_mysql_version}"
)
}

3
io.sc.platform.jdbc.driver.tidb/build.gradle

@ -1,5 +1,6 @@
dependencies {
api(
"com.mysql:mysql-connector-j",
//"com.mysql:mysql-connector-j",
"mysql:mysql-connector-java:${jdbc_mysql_version}"
)
}

4
io.sc.platform.lcdp.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.lcdp.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",

4
io.sc.platform.license.keygen.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.license.keygen.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",

4
io.sc.platform.mvc.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.mvc.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",

4
io.sc.platform.scheduler.manager.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.scheduler.manager.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",

4
io.sc.platform.system.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.system.frontend",
"version": "8.2.3",
"version": "8.2.4",
"description": "",
"private": false,
"keywords": [],
@ -110,7 +110,7 @@
"mockjs": "1.1.0",
"node-sql-parser": "5.3.4",
"pinia": "2.2.6",
"platform-core": "8.2.19",
"platform-core": "8.2.20",
"quasar": "2.17.4",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.5",

14
io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java

@ -351,7 +351,7 @@ public class DateUtil {
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
d2 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
@ -381,7 +381,7 @@ public class DateUtil {
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
d2 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
@ -411,7 +411,7 @@ public class DateUtil {
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
d2 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
@ -441,7 +441,7 @@ public class DateUtil {
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
d2 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
@ -471,7 +471,7 @@ public class DateUtil {
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
d2 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
@ -501,7 +501,7 @@ public class DateUtil {
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
d2 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
@ -531,7 +531,7 @@ public class DateUtil {
if(o2 instanceof String){
try { d2 = tryParseDate(o2.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o2 instanceof Date){
d1 =(Date)o2;
d2 =(Date)o2;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}

4
io.sc.standard.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.standard.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",

4
io.sc.website/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.website",
"version": "8.2.3",
"version": "8.2.4",
"description": "",
"main": "index.js",
"scripts": {
@ -28,6 +28,6 @@
},
"dependencies": {
"vue": "3.5.13",
"platform-core": "8.2.19"
"platform-core": "8.2.20"
}
}
Loading…
Cancel
Save