From 3b6d187ee063515157bebadf196683d216680019 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Wed, 9 Jul 2025 16:07:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A1=86=E6=9E=B6=E5=8F=91?= =?UTF-8?q?=E5=B8=83:=208.2.22=20=20=201)=20=E8=A7=84=E5=88=99=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E4=B8=AD,=20=E4=BF=AE=E5=A4=8D=E5=A4=A7=E9=87=8F=20Ja?= =?UTF-8?q?va=20=E6=89=A7=E8=A1=8C=E5=BC=95=E6=93=8E=E7=9A=84=20bug=20=20?= =?UTF-8?q?=202=EF=BC=89=E5=89=8D=E7=AB=AF=E6=A0=B8=E5=BF=83=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B,=20=E5=85=AC=E5=BC=8F=E7=BC=96=E8=BE=91=E5=99=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20equal=20=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 5 +- .../META-INF/platform/plugins/parameters.json | 2 +- io.sc.engine.rule.client/build.gradle | 5 +- .../impl/java/JavaEngineServiceImpl.java | 8 +- .../generator/impl/IndicatorGenerator.java | 3 +- .../generator/impl/ParameterGenerator.java | 13 ++- .../impl/processor/DecisionTree.java | 5 +- .../impl/processor/ExecutionFlow.java | 5 +- .../generator/impl/processor/NumberRange.java | 26 ++++- .../generator/impl/processor/OptionValue.java | 8 +- .../impl/processor/SqlFieldMapping.java | 56 ++++++----- .../generator/impl/processor/WhenThen.java | 2 +- .../core/function/ArithmeticFunction.java | 20 ++-- .../core/util/GroovyExpressionReplacer.java | 2 +- .../rule/core/code/java/template/impl/lib.tpl | 94 ++++++++++--------- .../core/code/java/template/import_render.tpl | 1 + .../core/code/java/template/processor/sql.tpl | 2 +- .../rule/core/code/template/import_render.tpl | 1 + .../src/views/shared/AutoCompletionManager.ts | 1 + .../src/views/shared/processors/Sql.ts | 37 +++++++- .../service/impl/ExecuteUnitServiceImpl.java | 4 +- .../service/impl/TestCaseServiceImpl.java | 19 +++- io.sc.platform.core.frontend/package.json | 2 +- .../math/toolbar/functions/String.vue | 13 +++ .../math/toolbar/functions/string/Equal.vue | 52 ++++++++++ .../src/platform/i18n/messages.json | 1 + .../src/platform/i18n/messages_tw_CN.json | 1 + .../src/platform/i18n/messages_zh_CN.json | 1 + .../template-project/package.json | 4 +- .../service/impl/ParameterServiceImpl.java | 12 ++- .../java/io/sc/platform/util/ObjectUtil.java | 24 +++++ .../util/compiler/file/FileJavaCompiler.java | 1 + 32 files changed, 315 insertions(+), 115 deletions(-) create mode 100644 io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/string/Equal.vue diff --git a/gradle.properties b/gradle.properties index ae3dbb3e..79d8939c 100644 --- a/gradle.properties +++ b/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 diff --git a/io.sc.engine.rule.client.spring/src/main/resources/META-INF/platform/plugins/parameters.json b/io.sc.engine.rule.client.spring/src/main/resources/META-INF/platform/plugins/parameters.json index b6067e94..6379b5e0 100644 --- a/io.sc.engine.rule.client.spring/src/main/resources/META-INF/platform/plugins/parameters.json +++ b/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 }, //模型引擎客户端/系统启动时自动编译模式 diff --git a/io.sc.engine.rule.client/build.gradle b/io.sc.engine.rule.client/build.gradle index e0e26ae9..3f1e4605 100644 --- a/io.sc.engine.rule.client/build.gradle +++ b/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; diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/java/JavaEngineServiceImpl.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/java/JavaEngineServiceImpl.java index 89042632..5168f08c 100644 --- a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/java/JavaEngineServiceImpl.java +++ b/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()); } } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java index 22504af9..47cdfe0c 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/IndicatorGenerator.java @@ -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()));"; diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java index 7e6cf5f8..3dc21180 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/ParameterGenerator.java @@ -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(doubleValueInteger.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}"; diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java index 6f72c754..a76e7658 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/DecisionTree.java @@ -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; diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java index b3465a20..05eab243 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/ExecutionFlow.java +++ b/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"); } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java index 31fb6fd5..98a4f884 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/NumberRange.java +++ b/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,9 +77,18 @@ public class NumberRange { sb.append(GroovyExpressionReplacer.groovy(var)).append("==null"); } else if (numberRange.min != null) { if (numberRange.minIncluded != null && numberRange.minIncluded) { - sb.append(GroovyExpressionReplacer.groovy(var)).append(">=").append(numberRange.min); + if(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 { - sb.append(GroovyExpressionReplacer.groovy(var)).append(">").append(numberRange.min); + if(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) { @@ -86,9 +96,17 @@ public class NumberRange { } if (numberRange.max != null) { if (numberRange.maxIncluded != null && numberRange.maxIncluded) { - sb.append(GroovyExpressionReplacer.groovy(var)).append("<=").append(numberRange.max); + if(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 { - sb.append(GroovyExpressionReplacer.groovy(var)).append("<").append(numberRange.max); + if(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"); diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java index 40bc0ca0..b5005f6a 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/OptionValue.java +++ b/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(); diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java index 0d36b82a..63831ed5 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/SqlFieldMapping.java +++ b/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 parse(String json) throws Exception{ return ObjectMapperUtil.json().readValue(json, new TypeReference>(){}); } - 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 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 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 sqlFieldMappings,Model model){ + private String groovyParameter(String code, String valueType,String sqlDatasourceName,String sql,List 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 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 sqlFieldMappings,IndicatorLib lib){ + private String groovyIndicator(String code, String valueType,String sqlDatasourceName,String sql,List 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 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; } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/WhenThen.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/WhenThen.java index 61ea00c9..7601842e 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/WhenThen.java +++ b/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){ diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/ArithmeticFunction.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/ArithmeticFunction.java index 81422d99..24f28979 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/ArithmeticFunction.java +++ b/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) { diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/GroovyExpressionReplacer.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/GroovyExpressionReplacer.java index 10205f5f..c531d959 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/GroovyExpressionReplacer.java +++ b/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()){ diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/impl/lib.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/impl/lib.tpl index 2cfc147b..91319892 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/impl/lib.tpl +++ b/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 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,45 +125,55 @@ class #(className(lib.code,lib.version)) { } #end #end -} -@JsonIgnoreProperties(ignoreUnknown=true) -class Argument { - #(tabs(IndicatorGenerator.generateFields(lib.indicators),1)) - public static Argument convertArgument(Map map) throws Exception { - if(map!=null){ - Argument arg =new Argument(); - #(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"arg"),3)) - return arg; + @JsonIgnoreProperties(ignoreUnknown=true) + static class Argument { + #(tabs(IndicatorGenerator.generateFields(lib.indicators),2)) + public static Argument convertArgument(Map map) throws Exception { + if(map!=null){ + Argument arg =new Argument(); + #(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"arg"),4)) + return arg; + } + return null; } - return null; - } - 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)) - return arg; + 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),4)) + return arg; + } + return null; + } + + public void validate(ValidateResult result) throws Exception { + #(tabs(IndicatorGenerator.generateValidator(lib.indicators),3)) } - } - public void validate(ValidateResult result) throws Exception { - #(tabs(IndicatorGenerator.generateValidator(lib.indicators),2)) + public ExecuteResult toResult() throws Exception { + ExecuteResult result =new ExecuteResult(); + #(tabs(IndicatorGenerator.generateToResult(lib.indicators),3)) + return result; + } } - public ExecuteResult toResult() throws Exception { - ExecuteResult result =new ExecuteResult(); - #(tabs(IndicatorGenerator.generateToResult(lib.indicators),2)) - return result; + //****************************************************************************** + // 自定义函数 + //****************************************************************************** + static class UDF { + #for(function : executeUnit.functions) + #@renderFunction(function) + #end } -} -//****************************************************************************** -// 元数据定义类 -//****************************************************************************** -#for(dictionary : dictionaries) -#@renderDictionary(dictionary) -#end + //****************************************************************************** + // 元数据定义类 + //****************************************************************************** + #for(dictionary : dictionaries) + #@renderDictionary(dictionary) + #end +} #if(generatorType=="Groovy") //****************************************************************************** diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/import_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/import_render.tpl index 1841f358..e43884a2 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/import_render.tpl +++ b/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; diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/processor/sql.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/processor/sql.tpl index c2fe3f62..784203e7 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/java/template/processor/sql.tpl +++ b/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)) \ No newline at end of file +#(tabs(SqlFieldMapping.groovy(parameter,processor),2)) \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl index cf15d49d..934643ec 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl @@ -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; diff --git a/io.sc.engine.rule.frontend/src/views/shared/AutoCompletionManager.ts b/io.sc.engine.rule.frontend/src/views/shared/AutoCompletionManager.ts index d791e41a..9abc916d 100644 --- a/io.sc.engine.rule.frontend/src/views/shared/AutoCompletionManager.ts +++ b/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; diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts index fc4bef41..32a2ebf5 100644 --- a/io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts +++ b/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); } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/impl/ExecuteUnitServiceImpl.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/impl/ExecuteUnitServiceImpl.java index 71381d3d..4243398e 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/impl/ExecuteUnitServiceImpl.java +++ b/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; } } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java index 838692b4..87e216fa 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java +++ b/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 + + + + diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages.json b/io.sc.platform.core.frontend/src/platform/i18n/messages.json index 50ca979a..94b5aeec 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages.json +++ b/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", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json index 5682c940..bad4aa2a 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json +++ b/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": "轉大寫", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json index 66d4973d..aa82c912 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json +++ b/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": "转大写", diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index 69d28b6c..586b04c5 100644 --- a/io.sc.platform.core.frontend/template-project/package.json +++ b/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", diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/service/impl/ParameterServiceImpl.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/service/impl/ParameterServiceImpl.java index 3d8064d5..25c7fbec 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/service/impl/ParameterServiceImpl.java +++ b/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 implements ParameterService { + @Autowired private Environment environment; + @Override @Transactional public void init() throws Exception { @@ -54,7 +58,7 @@ public class ParameterServiceImpl extends DaoServiceImpl 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 result =new HashMap<>(); for(ParameterEntity entity : entities){ - result.put(entity.getCode(),entity.getValue()); + result.put(entity.getCode(),environment.resolvePlaceholders(entity.getValue())); } return result; } diff --git a/io.sc.platform.util/src/main/java/io/sc/platform/util/ObjectUtil.java b/io.sc.platform.util/src/main/java/io/sc/platform/util/ObjectUtil.java index 124fbccb..7f0db70e 100644 --- a/io.sc.platform.util/src/main/java/io/sc/platform/util/ObjectUtil.java +++ b/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); + } } diff --git a/io.sc.platform.util/src/main/java/io/sc/platform/util/compiler/file/FileJavaCompiler.java b/io.sc.platform.util/src/main/java/io/sc/platform/util/compiler/file/FileJavaCompiler.java index 4decff68..ca5c9d4c 100644 --- a/io.sc.platform.util/src/main/java/io/sc/platform/util/compiler/file/FileJavaCompiler.java +++ b/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 options =new ArrayList<>(); + //options.add("-Xplugin:Manifold"); options.add("-d"); options.add(targetDir); if(StringUtils.hasText(classpath)){