Browse Source

基础框架发布: 8.2.22

1) 规则引擎中, 修复大量 Java 执行引擎的 bug
  2)前端核心工程, 公式编辑器增加 equal 函数
main
wangshaoping 2 months ago
parent
commit
3b6d187ee0
  1. 5
      gradle.properties
  2. 2
      io.sc.engine.rule.client.spring/src/main/resources/META-INF/platform/plugins/parameters.json
  3. 5
      io.sc.engine.rule.client/build.gradle
  4. 8
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/java/JavaEngineServiceImpl.java
  5. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java
  6. 13
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java
  7. 5
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java
  8. 5
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java
  9. 18
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java
  10. 8
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java
  11. 56
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java
  12. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/WhenThen.java
  13. 20
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/ArithmeticFunction.java
  14. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/GroovyExpressionReplacer.java
  15. 64
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/impl/lib.tpl
  16. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/import_render.tpl
  17. 2
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/processor/sql.tpl
  18. 1
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl
  19. 1
      io.sc.engine.rule.frontend/src/views/shared/AutoCompletionManager.ts
  20. 37
      io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts
  21. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/impl/ExecuteUnitServiceImpl.java
  22. 19
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java
  23. 2
      io.sc.platform.core.frontend/package.json
  24. 13
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/String.vue
  25. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/string/Equal.vue
  26. 1
      io.sc.platform.core.frontend/src/platform/i18n/messages.json
  27. 1
      io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json
  28. 1
      io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json
  29. 4
      io.sc.platform.core.frontend/template-project/package.json
  30. 12
      io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/service/impl/ParameterServiceImpl.java
  31. 24
      io.sc.platform.util/src/main/java/io/sc/platform/util/ObjectUtil.java
  32. 1
      io.sc.platform.util/src/main/java/io/sc/platform/util/compiler/file/FileJavaCompiler.java

5
gradle.properties

@ -37,9 +37,9 @@ application_version=1.0.0
# platform
###########################################################
platform_group=io.sc
platform_version=8.2.22
platform_version=8.2.23
platform_plugin_version=8.2.10
platform_core_frontend_version=8.2.82
platform_core_frontend_version=8.2.83
###########################################################
# dependencies version
@ -75,6 +75,7 @@ jxls_jexcel_version=1.0.7
jxls_poi_version=1.0.15
jxls_version=2.4.6
kotlin_stdlib_version=1.9.25
manifold_version=2025.1.24
mybatis_version=3.5.14
mybatis_spring_boot_starter_version=2.3.2
nimbusds_version=9.22

2
io.sc.engine.rule.client.spring/src/main/resources/META-INF/platform/plugins/parameters.json

@ -53,7 +53,7 @@
"id" :"parameter.re.client.remoteApiUrl",
"parentId" :"parameter.re.client",
"code" :"parameter.re.client.remoteApiUrl",
"defaultValue" :"http://localhost:8080/api/re/resource",
"defaultValue" :"http://localhost:8080",
"order" : 400
},
///

5
io.sc.engine.rule.client/build.gradle

@ -12,7 +12,10 @@ dependencies {
* 2. io.sc.platform.util-xxx.jar
*/
tasks.register('copyDependenciesProjectJars') {
dependsOn ':io.sc.engine.rule.core:jar',':io.sc.platform.util:jar',':io.sc.creditreport.core:jar',':io.sc.engine.rule.client.spring:jar'
dependsOn ':io.sc.engine.rule.core:jar',
':io.sc.platform.util:jar',
':io.sc.creditreport.core:jar',
':io.sc.engine.rule.client.spring:jar'
doLast {
println('copy dependencies project jar ......');
def targetDir =file('src/main/resources/io/sc/engine/rule/client/jars/').absolutePath;

8
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/java/JavaEngineServiceImpl.java

@ -36,7 +36,7 @@ public class JavaEngineServiceImpl implements JavaEngineService {
@Override
public Object eval(SourceCode sourceCode, String key, Object value) throws Exception {
return getMethod(sourceCode).invoke(null,value);
return getMethod(sourceCode).invoke(null,(Map)value);
}
@Override
@ -46,10 +46,10 @@ public class JavaEngineServiceImpl implements JavaEngineService {
private Method getMethod(SourceCode sourceCode) throws Exception {
URLClassLoader classLoader =classLoaderMap.get(sourceCode.getSource());
if(classLoader==null){
//if(classLoader==null){
classLoader =compile(sourceCode);
classLoaderMap.put(sourceCode.getSource(),classLoader);
}
//}
Class<?> clazz =classLoader.loadClass(sourceCode.getQualifiedClassName());
return clazz.getDeclaredMethod("execute",Map.class);
}
@ -61,6 +61,6 @@ public class JavaEngineServiceImpl implements JavaEngineService {
new File(outputDir).mkdirs();
FileJavaCompiler fileJavaCompiler =new FileJavaCompiler(classPathDir);
fileJavaCompiler.compile(sourceCode.getQualifiedClassName(),sourceCode.getSource(),outputDir);
return new URLClassLoader(new URL[]{ new URL("file",null,outputDir) });
return new URLClassLoader(new URL[]{ new URL("file",null,outputDir) },this.getClass().getClassLoader());
}
}

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

@ -259,7 +259,8 @@ public class IndicatorGenerator {
if(IndicatorType.INDICATOR.equals(indicator.getType())){
if(ValueTypeUtil.isDecimal(indicator.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult(\"${code}\",\"${name}\",ParameterType.${type},\"${valueType}\",${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode}).toString()));";
String tpl ="result.addParameterResult(new ParameterResult(\"${code}\",\"${name}\",ParameterType.${type},\"java.lang.Double\",${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.toString()));";
//String tpl ="result.addParameterResult(new ParameterResult(\"${code}\",\"${name}\",ParameterType.${type},\"${valueType}\",${valueScale},RoundingMode.${valueRoundingMode},this.${fieldName}==null?null:this.${fieldName}.setScale(${valueScale},RoundingMode.${valueRoundingMode}).toString()));";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(ValueTypeUtil.isBase(indicator.getValueType())){
String tpl ="result.addParameterResult(new ParameterResult(\"${code}\",\"${name}\",ParameterType.${type},\"${valueType}\",null,null,this.${fieldName}==null?null:this.${fieldName}.toString()));";

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

@ -13,6 +13,7 @@ import io.sc.platform.util.StringUtil;
import org.springframework.util.StringUtils;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -45,11 +46,17 @@ public class ParameterGenerator {
String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(ValueTypeUtil.isLong(valueType)){
String tpl ="Long ${fieldName} =new Long(${defaultValue});"; //${name}";
String tpl ="Long ${fieldName} =new Long(${defaultValue}); //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
}else if(ValueTypeUtil.isDecimal(valueType)){
String tpl ="Double ${fieldName} =new Double(${defaultValue});"; //${name}";
sb.append(StringUtil.format(tpl,variables)).append("\n");
double doubleValue =Double.parseDouble(defaultValue);
if(doubleValue<Integer.MIN_VALUE || doubleValue>Integer.MAX_VALUE){
String tpl = "Double ${0} =new Double(${1}); //${2}";
sb.append(StringUtil.format(tpl, IdReplacer.fieldName(code), new DecimalFormat("0.0").format(doubleValue),name)).append("\n");
}else {
String tpl = "Double ${fieldName} =new Double(${defaultValue}); //${name}";
sb.append(StringUtil.format(tpl, variables)).append("\n");
}
} else { // 非字符串
variables.put("className", IdReplacer.className(valueType, valueTypeVersion));
String tpl = "${className} ${fieldName} =${defaultValue}; //${name}";

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

@ -5,6 +5,7 @@ import io.sc.engine.rule.core.mxgraph.po.*;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.DecisionTreeParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import java.util.ArrayList;
import java.util.HashMap;
@ -90,10 +91,10 @@ public class DecisionTree {
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
if(i==0) {
sb.append("\tif((").append(GroovyExpressionReplacer.groovy(conditionNode.getCondition(),null)).append(").equals(").append(GroovyExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append(")){").append("\n");
sb.append("\tif(ObjectUtil.equal((").append(GroovyExpressionReplacer.groovy(conditionNode.getCondition(), null)).append("),(").append(GroovyExpressionReplacer.groovy(edge.getValue(), edge.getValueType())).append("))){").append("\n");
}else {
if(edge.getValue()!=null && !edge.getValue().trim().isEmpty()) {
sb.append("else if((").append(GroovyExpressionReplacer.groovy(conditionNode.getCondition(),null)).append(").equals(").append(GroovyExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append(")){").append("\n");
sb.append("else if(ObjectUtil.equal((").append(GroovyExpressionReplacer.groovy(conditionNode.getCondition(),null)).append("),(").append(GroovyExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append("))){").append("\n");
}else {
sb.append("else {").append("\n");
isElse =true;

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

@ -5,6 +5,7 @@ import io.sc.engine.rule.core.mxgraph.po.*;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.ExecutionFlowParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.platform.util.StringUtil;
import java.util.ArrayList;
@ -109,10 +110,10 @@ public class ExecutionFlow {
EdgeConditionBranchNode edge =(EdgeConditionBranchNode)outs.get(i); //出口边
GraphNode nexNode =edge.getOuts().get(0); //出口边指向的节点
if(i==0) {
sb.append("\tif((").append(GroovyExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append(").equals(").append(GroovyExpressionReplacer.groovy(node.getCondition(),null)).append(")){").append("\n");
sb.append("\tif(ObjectUtil.equal((").append(GroovyExpressionReplacer.groovy(edge.getValue(), edge.getValueType())).append("),(").append(GroovyExpressionReplacer.groovy(node.getCondition(), null)).append("))){").append("\n");
}else {
if(edge.getValue()!=null && !edge.getValue().trim().isEmpty()) {
sb.append("else if((").append(GroovyExpressionReplacer.groovy(edge.getValue(),edge.getValueType())).append(").equals(").append(GroovyExpressionReplacer.groovy(node.getCondition(),null)).append(")){").append("\n");
sb.append("else if(ObjectUtil.equal((").append(GroovyExpressionReplacer.groovy(edge.getValue(), edge.getValueType())).append("),(").append(GroovyExpressionReplacer.groovy(node.getCondition(), null)).append("))){").append("\n");
}else {
sb.append("else {").append("\n");
}

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

@ -10,6 +10,7 @@ import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
@ -76,21 +77,38 @@ public class NumberRange {
sb.append(GroovyExpressionReplacer.groovy(var)).append("==null");
} else if (numberRange.min != null) {
if (numberRange.minIncluded != null && numberRange.minIncluded) {
if(numberRange.min.doubleValue()<Integer.MIN_VALUE || numberRange.min.doubleValue()>Integer.MIN_VALUE){
sb.append(GroovyExpressionReplacer.groovy(var)).append(">=").append(new DecimalFormat("0.0").format(numberRange.min.doubleValue()));
}else {
sb.append(GroovyExpressionReplacer.groovy(var)).append(">=").append(numberRange.min);
}
} else {
if(numberRange.min.doubleValue()<Integer.MIN_VALUE || numberRange.min.doubleValue()>Integer.MIN_VALUE) {
sb.append(GroovyExpressionReplacer.groovy(var)).append(">").append(new DecimalFormat("0.0").format(numberRange.min.doubleValue()));
}else {
sb.append(GroovyExpressionReplacer.groovy(var)).append(">").append(numberRange.min);
}
}
}
if (numberRange.min != null && numberRange.max != null) {
sb.append(" && ");
}
if (numberRange.max != null) {
if (numberRange.maxIncluded != null && numberRange.maxIncluded) {
if(numberRange.max.doubleValue()<Integer.MIN_VALUE || numberRange.max.doubleValue()>Integer.MIN_VALUE){
sb.append(GroovyExpressionReplacer.groovy(var)).append("<=").append(new DecimalFormat("0.0").format(numberRange.max.doubleValue()));
}else {
sb.append(GroovyExpressionReplacer.groovy(var)).append("<=").append(numberRange.max);
}
} else {
if(numberRange.max.doubleValue()<Integer.MIN_VALUE || numberRange.max.doubleValue()>Integer.MIN_VALUE){
sb.append(GroovyExpressionReplacer.groovy(var)).append("<").append(new DecimalFormat("0.0").format(numberRange.max.doubleValue()));
}else {
sb.append(GroovyExpressionReplacer.groovy(var)).append("<").append(numberRange.max);
}
}
}
sb.append(")").append("{").append("\n");
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(code).append(" =").append(GroovyExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n");
sb.append("}");

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

@ -31,8 +31,8 @@ public class OptionValue {
}else{
sb.append("\n").append("else if(");
}
sb.append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(inOptionParameter.getCode()));
sb.append(".equals(");
sb.append("ObjectUtil.equal(").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(inOptionParameter.getCode()));
sb.append(",");
if(ValueTypeUtil.isString(inOptionParameter.getValueType())){
sb.append(GroovyExpressionReplacer.groovy(item.getInputValue(),"java.lang.String"));
}else{
@ -40,9 +40,7 @@ public class OptionValue {
}
sb.append(")){ ");
sb.append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(parameter.getCode()));
sb.append(" =TypeConvertor.getValue(");
sb.append(GroovyExpressionReplacer.groovy(item.getValue(),parameter.getValueType()));
sb.append(",").append(parameter.getValueType()).append(".class);");
sb.append(" =").append(GroovyExpressionReplacer.groovy(item.getValue(),parameter.getValueType())).append(";");
sb.append(" }");
}
return sb.toString();

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

@ -9,6 +9,7 @@ import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.SqlParameterProcessor;
import io.sc.engine.rule.core.util.GroovyExpressionReplacer;
import io.sc.engine.rule.core.util.IdReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import io.sc.platform.util.CollectionUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.PlaceHolderExpressionUtil;
@ -19,33 +20,34 @@ import java.util.List;
public class SqlFieldMapping {
private String parameter;
private String parameterValueType;
private String field;
public List<SqlFieldMapping> parse(String json) throws Exception{
return ObjectMapperUtil.json().readValue(json, new TypeReference<List<SqlFieldMapping>>(){});
}
public String groovy(Parameter parameter, SqlParameterProcessor processor, Model model) throws Exception{
public String groovy(Parameter parameter, SqlParameterProcessor processor) throws Exception{
if(parameter==null || processor==null){ return null; }
try {
List<SqlFieldMapping> sqlFieldMappings =parse(processor.getSqlFieldMapping());
return groovyParameter(parameter.getCode(),parameter.getValueType(),processor.getSqlDatasourceName(),processor.getSql(),sqlFieldMappings,model);
return groovyParameter(parameter.getCode(),parameter.getValueType(),processor.getSqlDatasourceName(),processor.getSql(),sqlFieldMappings);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s SqlFieldMapping groovy source code.", e);
}
}
public String groovy(Indicator indicator, SqlIndicatorProcessor processor, IndicatorLib lib) throws Exception{
public String groovy(Indicator indicator, SqlIndicatorProcessor processor) throws Exception{
if(indicator==null || processor==null){ return null; }
try {
List<SqlFieldMapping> sqlFieldMappings =parse(processor.getSqlFieldMapping());
return groovyIndicator(indicator.getCode(),indicator.getValueType(),processor.getSqlDatasourceName(),processor.getSql(),sqlFieldMappings,lib);
return groovyIndicator(indicator.getCode(),indicator.getValueType(),processor.getSqlDatasourceName(),processor.getSql(),sqlFieldMappings);
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s SqlFieldMapping groovy source code.", e);
}
}
private String groovyParameter(String code, String valueType,String sqlDatasourceName,String sql,List<SqlFieldMapping> sqlFieldMappings,Model model){
private String groovyParameter(String code, String valueType,String sqlDatasourceName,String sql,List<SqlFieldMapping> sqlFieldMappings){
if(!StringUtils.hasText(sql) || !CollectionUtil.hasElements(sqlFieldMappings)){
return null;
}
@ -63,16 +65,19 @@ public class SqlFieldMapping {
sb.append(" ResultSet rs =ps.executeQuery();").append("\n");
sb.append("){").append("\n");
sb.append(" if (rs.next()) {").append("\n");
List<Parameter> parameters =model.getAllParameters();
for(SqlFieldMapping sqlFieldMapping : sqlFieldMappings) {
sb.append(" ");
sb.append(PlaceHolderExpressionUtil.replace(sqlFieldMapping.parameter, "arg.",""));
sb.append(" =");
for(Parameter parameter : parameters){
if(("${" + parameter.getCode() + "}").equals(sqlFieldMapping.parameter)){
sb.append(getValueExpression(sqlFieldMapping.getField(), parameter.getValueType()));
break;
}
if(ValueTypeUtil.isLong(sqlFieldMapping.getParameterValueType())){
String format =StringUtil.format("TypeConvertor.getValue(rs.getString(\"${0}\"),${1}.class);\n",sqlFieldMapping.getField(),"Long");
sb.append(format);
}else if(ValueTypeUtil.isDecimal(sqlFieldMapping.getParameterValueType())){
String format =StringUtil.format("TypeConvertor.getValue(rs.getString(\"${0}\"),${1}.class);\n",sqlFieldMapping.getField(),"Double");
sb.append(format);
}else{
String format =StringUtil.format("TypeConvertor.getValue(rs.getString(\"${0}\"),${1}.class);\n",sqlFieldMapping.getField(),sqlFieldMapping.getParameterValueType());
sb.append(format);
}
}
sb.append(" }").append("\n");
@ -80,7 +85,7 @@ public class SqlFieldMapping {
return sb.toString();
}
private String groovyIndicator(String code, String valueType,String sqlDatasourceName,String sql,List<SqlFieldMapping> sqlFieldMappings,IndicatorLib lib){
private String groovyIndicator(String code, String valueType,String sqlDatasourceName,String sql,List<SqlFieldMapping> sqlFieldMappings){
if(!StringUtils.hasText(sql) || !CollectionUtil.hasElements(sqlFieldMappings)){
return null;
}
@ -98,16 +103,19 @@ public class SqlFieldMapping {
sb.append(" ResultSet rs =ps.executeQuery();").append("\n");
sb.append("){").append("\n");
sb.append(" if (rs.next()) {").append("\n");
List<Indicator> indicators =lib.getIndicators();
for(SqlFieldMapping sqlFieldMapping : sqlFieldMappings) {
sb.append(" ");
sb.append(PlaceHolderExpressionUtil.replace(sqlFieldMapping.parameter, "arg.",""));
sb.append(" =");
for(Indicator indicator : indicators){
if(("${" + indicator.getCode() + "}").equals(sqlFieldMapping.parameter)){
sb.append(getValueExpression(sqlFieldMapping.getField(), indicator.getValueType()));
break;
}
if(ValueTypeUtil.isLong(sqlFieldMapping.getParameterValueType())){
String format =StringUtil.format("TypeConvertor.getValue(rs.getString(\"${0}\"),${1}.class);\n",sqlFieldMapping.getField(),"Long");
sb.append(format);
}else if(ValueTypeUtil.isDecimal(sqlFieldMapping.getParameterValueType())){
String format =StringUtil.format("TypeConvertor.getValue(rs.getString(\"${0}\"),${1}.class);\n",sqlFieldMapping.getField(),"Double");
sb.append(format);
}else{
String format =StringUtil.format("TypeConvertor.getValue(rs.getString(\"${0}\"),${1}.class);\n",sqlFieldMapping.getField(),sqlFieldMapping.getParameterValueType());
sb.append(format);
}
}
sb.append(" }").append("\n");
@ -115,10 +123,6 @@ public class SqlFieldMapping {
return sb.toString();
}
private String getValueExpression(String sqlFieldName,String valueType){
return StringUtil.format("TypeConvertor.getValue(rs.getString(\"${0}\"),${1}.class);\n",sqlFieldName,valueType);
}
public String getParameter() {
return parameter;
}
@ -127,6 +131,14 @@ public class SqlFieldMapping {
this.parameter = parameter;
}
public String getParameterValueType() {
return parameterValueType;
}
public void setParameterValueType(String parameterValueType) {
this.parameterValueType = parameterValueType;
}
public String getField() {
return field;
}

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

@ -41,7 +41,7 @@ public class WhenThen {
StringBuilder sb =new StringBuilder();
sb.append("if (").append(GroovyExpressionReplacer.groovy(when)).append(") {").append("\n");
sb.append("\t").append(GroovyExpressionReplacer.ARGUMENT_NAME).append(".").append(IdReplacer.fieldName(code));
sb.append(" = TypeConvertor.getValue(").append(GroovyExpressionReplacer.groovy(then,valueType)).append(",").append(valueType).append(".class);").append("\n");
sb.append(" = ").append(GroovyExpressionReplacer.groovy(then,valueType)).append(";").append("\n");
String debug =StringUtil.format("if(log.isDebugEnabled()){log.debug(\" WhenThen 运算结果 : {}\",${0});}",GroovyExpressionReplacer.ARGUMENT_NAME + "." + IdReplacer.fieldName(code));
sb.append("\t").append(debug).append("\n");
if(isShorted!=null && isShorted){

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

@ -14,6 +14,8 @@ import java.util.Random;
*
*/
public class ArithmeticFunction {
private static final int SCALE =16;
/**
* 求余数
* @param x 被除数
@ -105,7 +107,7 @@ public class ArithmeticFunction {
}
public static Double multiply(Number x,Number y) {
return multiply(x,y,8,RoundingMode.HALF_UP);
return multiply(x,y,SCALE,RoundingMode.HALF_UP);
}
public static Double multiply(Number x, Number y,int scale) {
@ -119,7 +121,7 @@ public class ArithmeticFunction {
}
public static Double divide(Number x,Number y) {
return divide(x,y,8,RoundingMode.HALF_UP);
return divide(x,y,SCALE,RoundingMode.HALF_UP);
}
public static Double divide(Number x, Number y,int scale) {
@ -133,7 +135,7 @@ public class ArithmeticFunction {
}
public static Double pow(Number x, Number y) {
return pow(x,y,8,RoundingMode.HALF_UP);
return pow(x,y,SCALE,RoundingMode.HALF_UP);
}
public static Double pow(Number x, Number y, int scale) {
@ -152,7 +154,7 @@ public class ArithmeticFunction {
}
public static Double exp(Number x) {
return exp(x,8,RoundingMode.HALF_UP);
return exp(x,SCALE,RoundingMode.HALF_UP);
}
public static Double exp(Number x, int scale) {
@ -165,7 +167,7 @@ public class ArithmeticFunction {
}
public static Double log(Number x, Number y) {
return log(x,y,8,RoundingMode.HALF_UP);
return log(x,y,SCALE,RoundingMode.HALF_UP);
}
public static Double log(Number x, Number y, int scale) {
@ -181,7 +183,7 @@ public class ArithmeticFunction {
}
public static Double lg(Number x) {
return lg(x,8,RoundingMode.HALF_UP);
return lg(x,SCALE,RoundingMode.HALF_UP);
}
public static Double lg(Number x, int scale) {
@ -194,7 +196,7 @@ public class ArithmeticFunction {
}
public static Double ln(Number x) {
return ln(x,8,RoundingMode.HALF_UP);
return ln(x,SCALE,RoundingMode.HALF_UP);
}
public static Double ln(Number x, int scale) {
@ -207,7 +209,7 @@ public class ArithmeticFunction {
}
public static Double square(Number x) {
return square(x,8,RoundingMode.HALF_UP);
return square(x,SCALE,RoundingMode.HALF_UP);
}
public static Double square(Number x, int scale) {
@ -220,7 +222,7 @@ public class ArithmeticFunction {
}
public static Double root(Number x,Number y) {
return root(x,y,8,RoundingMode.HALF_UP);
return root(x,y,SCALE,RoundingMode.HALF_UP);
}
public static Double root(Number x, Number y,int scale) {

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/GroovyExpressionReplacer.java

@ -61,7 +61,7 @@ public class GroovyExpressionReplacer {
}
// 再处理 xxx
content =PlaceHolderExpressionUtil.replace(content,"${arg.","}");
content =PlaceHolderEnumExpressionUtil.replace(content,"","");
content =PlaceHolderEnumExpressionUtil.replace(content,"${","}");
// 最后处理 `xxx`, 替换回正确的值
for(String key : sortedCache.keySet()){

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

@ -14,15 +14,6 @@
#@renderImport()
//******************************************************************************
// 自定义函数
//******************************************************************************
class UDF {
#for(function : executeUnit.functions)
#@renderFunction(function)
#end
}
//******************************************************************************
// 执行主体类
//******************************************************************************
@ -32,7 +23,7 @@ class UDF {
* name: #(lib.name),
* version: #(lib.version)
*/
class #(className(lib.code,lib.version)) {
public class #(className(lib.code,lib.version)) {
private static final Logger log =LoggerFactory.getLogger(#(className(lib.code,lib.version)).class);
/**
@ -41,18 +32,25 @@ class #(className(lib.code,lib.version)) {
* @return 执行结果
*/
public static ExecuteResult execute(Map<String,Object> map) throws Exception {
return execute(map["executor"],map["subModelCode"],map["argument"]);
return execute((Executor)map.get("executor"),(String)map.get("subModelCode"),map.get("argument"));
}
public static ExecuteResult execute(Executor executor,String subModelCode,Object data) throws Exception {
if(log.isDebugEnabled()){log.debug("开始执行指标库 : #(className(lib.code,lib.version))");}
boolean isInputMap =false;
if(data instanceof Map){
isInputMap =true;
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);
Argument arg =null;
if(isInputMap){
arg =Argument.convertArgument((Map)data);
}else{
arg =Argument.convertArgument(data.toString());
}
if(log.isDebugEnabled()){log.debug("开始检查指标库输入参数数据合法性");}
ValidateResult validateResult =new ValidateResult();
@ -81,7 +79,7 @@ class #(className(lib.code,lib.version)) {
#if("INDICATOR"==indicator.type.toString())
#set(parameter=indicator)
public static void #(methodName(indicator.code))(Executor executor,Argument arg) {
public static void #(methodName(indicator.code))(Executor executor,Argument arg) throws Exception {
#for(processor : indicator.processors)
if(log.isDebugEnabled()){log.debug(" {}","#(parameter.name)(#(parameter.type))");}
#switch (processor.type.toString())
@ -127,15 +125,14 @@ class #(className(lib.code,lib.version)) {
}
#end
#end
}
@JsonIgnoreProperties(ignoreUnknown=true)
class Argument {
#(tabs(IndicatorGenerator.generateFields(lib.indicators),1))
@JsonIgnoreProperties(ignoreUnknown=true)
static class Argument {
#(tabs(IndicatorGenerator.generateFields(lib.indicators),2))
public static Argument convertArgument(Map<String,Object> map) throws Exception {
if(map!=null){
Argument arg =new Argument();
#(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"arg"),3))
#(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"arg"),4))
return arg;
}
return null;
@ -144,28 +141,39 @@ class Argument {
public static Argument convertArgument(String json) throws Exception {
if(json!=null && !"".equals(json.trim())){
Argument arg =ObjectMapperUtil.json().readValue(json, Argument.class);
#(tabs(IndicatorGenerator.generateConvertorFromJson(lib.indicators),3))
#(tabs(IndicatorGenerator.generateConvertorFromJson(lib.indicators),4))
return arg;
}
return null;
}
public void validate(ValidateResult result) throws Exception {
#(tabs(IndicatorGenerator.generateValidator(lib.indicators),2))
#(tabs(IndicatorGenerator.generateValidator(lib.indicators),3))
}
public ExecuteResult toResult() throws Exception {
ExecuteResult result =new ExecuteResult();
#(tabs(IndicatorGenerator.generateToResult(lib.indicators),2))
#(tabs(IndicatorGenerator.generateToResult(lib.indicators),3))
return result;
}
}
}
//******************************************************************************
// 元数据定义类
//******************************************************************************
#for(dictionary : dictionaries)
#@renderDictionary(dictionary)
#end
//******************************************************************************
// 自定义函数
//******************************************************************************
static class UDF {
#for(function : executeUnit.functions)
#@renderFunction(function)
#end
}
//******************************************************************************
// 元数据定义类
//******************************************************************************
#for(dictionary : dictionaries)
#@renderDictionary(dictionary)
#end
}
#if(generatorType=="Groovy")
//******************************************************************************

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

@ -14,6 +14,7 @@ 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.ObjectUtil;
import io.sc.platform.util.DateUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.StringUtil;

2
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/processor/sql.tpl

@ -1 +1 @@
#(tabs(SqlFieldMapping.groovy(parameter,processor,model),2))
#(tabs(SqlFieldMapping.groovy(parameter,processor),2))

1
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl

@ -15,6 +15,7 @@ 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.ObjectUtil;
import io.sc.platform.util.DateUtil;
import io.sc.platform.util.ObjectMapperUtil;
import io.sc.platform.util.StringUtil;

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

@ -196,6 +196,7 @@ class AutoCompletionManager {
label: parameter.name,
apply: ParameterMapping.getPlaceholderPrefix(parameter.type) + '{' + parameter.name + '}' + (parameter.valueTypeIsList ? '[0]' : ''),
info: info,
valueType: valueType,
};
}
return null;

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

@ -284,7 +284,7 @@ class Sql extends Processor {
toolbar: false,
type: 'w-code-mirror',
lang: 'java',
rows: 1,
height: 30,
placeholder: true,
lineWrap: false,
lineBreak: false,
@ -328,7 +328,40 @@ class Sql extends Processor {
const sqlFieldMappingGrid = form.getFieldComponent('sqlFieldMapping');
const sqlFieldMappingLocalData: any[] = sqlFieldMappingGrid.getRows();
const sqlFieldMapping: any[] = Tools.objects2Objects(sqlFieldMappingLocalData, { field: 'field', parameter: 'parameter' });
// 设置参数值类型
for (const row of sqlFieldMappingLocalData) {
const parameter = row.parameter;
const lastIndexOf = parameter.lastIndexOf('.');
if (lastIndexOf > -1) {
const matchedText = parameter.substring(0, lastIndexOf + 1);
const subText = parameter.substring(lastIndexOf + 1);
const properties = this.autoCompletionManager.autoCompletionProperties(0, matchedText);
if (Tools.isUndefinedOrNull(properties)) {
continue;
}
for (const option of properties.options) {
if (option.apply === subText) {
row.parameterValueType = option.valueType.code;
break;
}
}
} else {
const options = this.autoCompletionManager.getParameterOptions();
for (const option of options) {
if (option.apply === parameter) {
row.parameterValueType = option.valueType.code;
break;
}
}
}
}
const sqlFieldMapping: any[] = Tools.objects2Objects(sqlFieldMappingLocalData, {
field: 'field',
parameter: 'parameter',
parameterValueType: 'parameterValueType',
});
args.data.sqlFieldMapping = Tools.object2Json(sqlFieldMapping);
}

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/impl/ExecuteUnitServiceImpl.java

@ -166,7 +166,7 @@ public class ExecuteUnitServiceImpl implements ExecuteUnitService {
executeUnit.setLibs(LibEntityConverter.toPo(libEntities));
executeUnit.getResource().setTestCases(null);//在获取定义时,不返回测试用例
executeUnit.replaceParameterPropertiesEnum();
executeUnit.optimize();
//executeUnit.optimize();
return executeUnit;
}
@ -182,7 +182,7 @@ public class ExecuteUnitServiceImpl implements ExecuteUnitService {
executeUnit.setLib(LibEntityConverter.toPo(libEntity));
executeUnit.getLib().setTestCases(null);//在获取定义时,不返回测试用例
executeUnit.optimize();
//executeUnit.optimize();
return executeUnit;
}
}

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

@ -2,13 +2,17 @@ package io.sc.engine.rule.server.testcase.service.impl;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.client.runtime.impl.java.JavaEngineService;
import io.sc.engine.rule.client.runtime.impl.java.JavaEngineServiceImpl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.*;
import io.sc.engine.rule.core.client.Executor;
import io.sc.engine.rule.core.client.GeneratorType;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.code.generator.JavaSourceCodeGenerator;
import io.sc.engine.rule.core.enums.DeployStatus;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.TestCaseOwnerType;
@ -88,6 +92,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private MessageSource messageSource;
private GroovyScriptEngineService groovyScriptEngineService =new GroovyScriptEngineServiceImpl();
private JavaEngineService javaEngineService =new JavaEngineServiceImpl();
@Override
@SuppressWarnings("unchecked")
@ -521,7 +526,12 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
cell.setCellStyle(styleBuilder.clean().backgroundColor(IndexedColors.RED).build());
}else{
ExecuteUnit resourceWrapper =executor.getLoader().load(resourceId);
SourceCode groovySourceCode =new GroovySourceCodeGenerator().generate(resourceId,resourceWrapper);
SourceCode groovySourceCode =null;
if(GeneratorType.GROOVY.equals(executor.getGeneratorType())) {
groovySourceCode = new GroovySourceCodeGenerator().generate(resourceId, resourceWrapper);
}else{
groovySourceCode = new JavaSourceCodeGenerator().generate(resourceId, resourceWrapper);
}
if(resourceWrapper==null){
Cell cell =row.getCell(1);
@ -601,7 +611,12 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
executeParameter.put("executor", executor);
executeParameter.put("subModelCode", null);
executeParameter.put("argument", parameters);
ExecuteResult result =(ExecuteResult)groovyScriptEngineService.eval(groovySourceCode,"INPUT_PARAMETER",executeParameter);
ExecuteResult result =null;
if(GeneratorType.GROOVY.equals(executor.getGeneratorType())) {
result = (ExecuteResult) groovyScriptEngineService.eval(groovySourceCode, "INPUT_PARAMETER", executeParameter);
}else{
result = (ExecuteResult) javaEngineService.eval(groovySourceCode, "INPUT_PARAMETER", executeParameter);
}
if(result!=null){
for(int i =2;i<names.size();i++) {
String name = names.get(i);

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

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

13
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/String.vue

@ -8,6 +8,17 @@
</q-item-section>
<q-menu anchor="top end" self="top start">
<q-list dense>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.string.equal')"
draggable="true"
@dragstart="equalRef?.dragstart"
@click="equalRef?.append"
>
<q-item-section><Equal ref="equalRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></Equal></q-item-section>
</q-item>
<q-separator inset spaced />
<q-item
v-close-popup
clickable
@ -116,6 +127,7 @@
</template>
<script setup lang="ts">
import { ref } from 'vue';
import Equal from './string/Equal.vue';
import Length from './string/Length.vue';
import Trim from './string/Trim.vue';
import UpperCase from './string/UpperCase.vue';
@ -132,6 +144,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const equalRef = ref();
const lengthRef = ref();
const trimRef = ref();
const upperCaseRef = ref();

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/string/Equal.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>equal</mo>
<mi>(</mi>
<mi>x</mi>
<mo>,</mo>
<mi>y</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>equal</mo>
<mi>(</mi>
<mspace></mspace>
<mi>x</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>y</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('equal(x,y)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

1
io.sc.platform.core.frontend/src/platform/i18n/messages.json

@ -221,6 +221,7 @@
"math.toolbar.functions.number.mod": "Remainder of x/y, x and y are integer",
"math.toolbar.functions.number.remainder": "Remainder of x/y, x and y are double",
"math.toolbar.functions.string": "String",
"math.toolbar.functions.string.equal": "Equals",
"math.toolbar.functions.string.length": "Length of string",
"math.toolbar.functions.string.trim": "Trim",
"math.toolbar.functions.string.upperCase": "Upper case",

1
io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json

@ -221,6 +221,7 @@
"math.toolbar.functions.number.mod": "x/y 的餘數, 其中 x 和 y 均為整數",
"math.toolbar.functions.number.remainder": "x/y 的餘數, 其中 x 和 y 為小數",
"math.toolbar.functions.string": "字符串處理函數",
"math.toolbar.functions.string.equal": "相等",
"math.toolbar.functions.string.length": "字符串長度",
"math.toolbar.functions.string.trim": "去除首尾空白字符",
"math.toolbar.functions.string.upperCase": "轉大寫",

1
io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json

@ -221,6 +221,7 @@
"math.toolbar.functions.number.mod": "x/y 的余数, 其中 x 和 y 均为整数",
"math.toolbar.functions.number.remainder": "x/y 的余数, 其中 x 和 y 为小数",
"math.toolbar.functions.string": "字符串处理函数",
"math.toolbar.functions.string.equal": "相等",
"math.toolbar.functions.string.length": "字符串长度",
"math.toolbar.functions.string.trim": "去除首尾空白字符",
"math.toolbar.functions.string.upperCase": "转大写",

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

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.2.82",
"version": "8.2.83",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -111,7 +111,7 @@
"mockjs": "1.1.0",
"node-sql-parser": "5.3.6",
"pinia": "2.3.0",
"platform-core": "8.2.82",
"platform-core": "8.2.83",
"quasar": "2.17.6",
"sort-array": "5.0.0",
"svg-path-commander": "2.1.7",

12
io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/service/impl/ParameterServiceImpl.java

@ -7,6 +7,8 @@ import io.sc.platform.system.parameter.jpa.entity.ParameterEntity;
import io.sc.platform.system.parameter.jpa.repository.ParameterRepository;
import io.sc.platform.system.parameter.service.ParameterService;
import io.sc.platform.util.TreeBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -15,6 +17,8 @@ import java.util.*;
@Service("io.sc.platform.system.parameter.service.impl.ParameterServiceImpl")
public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String, ParameterRepository> implements ParameterService {
@Autowired private Environment environment;
@Override
@Transactional
public void init() throws Exception {
@ -54,7 +58,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
if(StringUtils.hasText(code)) {
ParameterEntity entity = repository.getByCode(code);
if(entity!=null) {
return entity.getValue();
return environment.resolvePlaceholders(entity.getValue());
}
}
return null;
@ -65,7 +69,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
if(StringUtils.hasText(code)) {
ParameterEntity entity = repository.getByCode(code);
if(entity!=null) {
return StringUtils.hasText(entity.getValue())?entity.getValue():defaultValue;
return StringUtils.hasText(entity.getValue())?environment.resolvePlaceholders(entity.getValue()):environment.resolvePlaceholders(defaultValue);
}
}
return defaultValue;
@ -78,7 +82,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
if(entities!=null && !entities.isEmpty()){
Map<String, String> result =new HashMap<>();
for(ParameterEntity entity : entities){
result.put(entity.getCode(),entity.getValue());
result.put(entity.getCode(),environment.resolvePlaceholders(entity.getValue()));
}
return result;
}
@ -92,7 +96,7 @@ public class ParameterServiceImpl extends DaoServiceImpl<ParameterEntity, String
if(entities!=null && !entities.isEmpty()){
Map<String, String> result =new HashMap<>();
for(ParameterEntity entity : entities){
result.put(entity.getCode(),entity.getValue());
result.put(entity.getCode(),environment.resolvePlaceholders(entity.getValue()));
}
return result;
}

24
io.sc.platform.util/src/main/java/io/sc/platform/util/ObjectUtil.java

@ -1,6 +1,7 @@
package io.sc.platform.util;
import java.io.*;
import java.util.Objects;
public class ObjectUtil {
/**
@ -39,4 +40,27 @@ public class ObjectUtil {
}
return cloneObj;
}
public static boolean equal(Number n1, Number n2){
if(n1==n2) { return true; }
if(n1==null || n2==null) { return false; }
if(n1 instanceof Double || n2 instanceof Double){
return n1.doubleValue()==n2.doubleValue();
}else if(n1 instanceof Long || n2 instanceof Long){
return n1.longValue()==n2.longValue();
}else if(n1 instanceof Float || n2 instanceof Float){
return n1.floatValue()==n2.floatValue();
}else if(n1 instanceof Integer || n2 instanceof Integer){
return n1.intValue()==n2.intValue();
}else if(n1 instanceof Short || n2 instanceof Short){
return n1.shortValue()==n2.shortValue();
}else if(n1 instanceof Byte || n2 instanceof Byte){
return n1.byteValue()==n2.byteValue();
}
return false;
}
public static boolean equal(Object o1, Object o2){
return Objects.equals(o1,o2);
}
}

1
io.sc.platform.util/src/main/java/io/sc/platform/util/compiler/file/FileJavaCompiler.java

@ -26,6 +26,7 @@ public class FileJavaCompiler {
String classpath =getClassPath();
// 编译选项
List<String> options =new ArrayList<>();
//options.add("-Xplugin:Manifold");
options.add("-d");
options.add(targetDir);
if(StringUtils.hasText(classpath)){

Loading…
Cancel
Save