diff --git a/app.engine.rule/build.gradle b/app.engine.rule/build.gradle index e3a22dc9..c4ea35b2 100644 --- a/app.engine.rule/build.gradle +++ b/app.engine.rule/build.gradle @@ -13,6 +13,7 @@ dependencies { implementation ( project(":io.sc.platform.app"), project(":io.sc.platform.developer"), + project(":io.sc.standard"), project(":io.sc.platform.scheduler.manager"), project(":io.sc.platform.scheduler.executor"), @@ -26,6 +27,8 @@ dependencies { project(":io.sc.engine.rule.core"), project(":io.sc.engine.rule.server"), project(":io.sc.engine.rule.sample"), + + project(":io.sc.platform.ai"), ) } diff --git a/erm.frontend/package.json b/erm.frontend/package.json index dcf0039c..505035ac 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -1,6 +1,6 @@ { "name": "erm.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/erm.frontend/webpack.config.mf.cjs b/erm.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/erm.frontend/webpack.config.mf.cjs +++ b/erm.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/gradle.properties b/gradle.properties index eb0447a1..e7241df6 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.11 +platform_version=8.2.13 platform_plugin_version=8.2.10 -platform_core_frontend_version=8.2.65 +platform_core_frontend_version=8.2.70 ########################################################### # dependencies version diff --git a/io.sc.creditreport.core/src/main/java/io/sc/creditreport/core/CreditReportParser.java b/io.sc.creditreport.core/src/main/java/io/sc/creditreport/core/CreditReportParser.java index 3f758cc6..2f3c836d 100644 --- a/io.sc.creditreport.core/src/main/java/io/sc/creditreport/core/CreditReportParser.java +++ b/io.sc.creditreport.core/src/main/java/io/sc/creditreport/core/CreditReportParser.java @@ -2,13 +2,21 @@ package io.sc.creditreport.core; import com.fasterxml.jackson.core.JsonProcessingException; import io.sc.platform.util.ObjectMapperUtil; +import org.springframework.util.StringUtils; public class CreditReportParser { public static io.sc.creditreport.core.person.Document parsePersonCreditReport(String xml) throws JsonProcessingException { - return ObjectMapperUtil.xml().readValue(xml, io.sc.creditreport.core.person.Document.class); + if(StringUtils.hasText(xml)) { + return ObjectMapperUtil.xml().readValue(xml, io.sc.creditreport.core.person.Document.class); + } + return null; } public static io.sc.creditreport.core.company.Document parseCompanyCreditReport(String xml) throws JsonProcessingException { - return ObjectMapperUtil.xml().readValue(xml, io.sc.creditreport.core.company.Document.class); + System.out.println(">>>>>>>>>>>>" + xml); + if(StringUtils.hasText(xml)) { + return ObjectMapperUtil.xml().readValue(xml, io.sc.creditreport.core.company.Document.class); + } + return null; } } diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index f7177423..f1c24d15 100644 --- a/io.sc.engine.mv.frontend/package.json +++ b/io.sc.engine.mv.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.mv.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.engine.mv.frontend/webpack.config.mf.cjs b/io.sc.engine.mv.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.engine.mv.frontend/webpack.config.mf.cjs +++ b/io.sc.engine.mv.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.engine.rule.core/build.gradle b/io.sc.engine.rule.core/build.gradle index 57b26216..5824d02d 100644 --- a/io.sc.engine.rule.core/build.gradle +++ b/io.sc.engine.rule.core/build.gradle @@ -28,5 +28,6 @@ dependencies { "org.jpmml:pmml-evaluator:${jpmml_version}", "org.jpmml:pmml-evaluator-extension:${jpmml_version}", "com.belerweb:pinyin4j:${pinyin4j_version}", + "com.squareup.okhttp3:okhttp:${okhttp_version}" ) } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/WebRequest.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/WebRequest.java new file mode 100644 index 00000000..2510b05e --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/WebRequest.java @@ -0,0 +1,88 @@ +package io.sc.engine.rule.core; + +import io.sc.engine.rule.core.enums.HttpAuthorizationType; +import io.sc.engine.rule.core.enums.HttpMethodType; + +public class WebRequest { + private HttpMethodType httpMethod; + private String httpUrl; + private HttpAuthorizationType httpAuthType; + private String httpAuthApikey; + private String httpAuthApiValue; + private String httpAuthBasicUsername; + private String httpAuthBasicPassword; + private String httpAuthBearerToken; + private String httpRequestBody; + + public HttpMethodType getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(HttpMethodType httpMethod) { + this.httpMethod = httpMethod; + } + + public String getHttpUrl() { + return httpUrl; + } + + public void setHttpUrl(String httpUrl) { + this.httpUrl = httpUrl; + } + + public HttpAuthorizationType getHttpAuthType() { + return httpAuthType; + } + + public void setHttpAuthType(HttpAuthorizationType httpAuthType) { + this.httpAuthType = httpAuthType; + } + + public String getHttpAuthApikey() { + return httpAuthApikey; + } + + public void setHttpAuthApikey(String httpAuthApikey) { + this.httpAuthApikey = httpAuthApikey; + } + + public String getHttpAuthApiValue() { + return httpAuthApiValue; + } + + public void setHttpAuthApiValue(String httpAuthApiValue) { + this.httpAuthApiValue = httpAuthApiValue; + } + + public String getHttpAuthBasicUsername() { + return httpAuthBasicUsername; + } + + public void setHttpAuthBasicUsername(String httpAuthBasicUsername) { + this.httpAuthBasicUsername = httpAuthBasicUsername; + } + + public String getHttpAuthBasicPassword() { + return httpAuthBasicPassword; + } + + public void setHttpAuthBasicPassword(String httpAuthBasicPassword) { + this.httpAuthBasicPassword = httpAuthBasicPassword; + } + + public String getHttpAuthBearerToken() { + return httpAuthBearerToken; + } + + public void setHttpAuthBearerToken(String httpAuthBearerToken) { + this.httpAuthBearerToken = httpAuthBearerToken; + } + + public String getHttpRequestBody() { + return httpRequestBody; + } + + public void setHttpRequestBody(String httpRequestBody) { + this.httpRequestBody = httpRequestBody; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/WebResponse.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/WebResponse.java new file mode 100644 index 00000000..52a8f9a4 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/WebResponse.java @@ -0,0 +1,40 @@ +package io.sc.engine.rule.core; + +public class WebResponse { + private boolean successful; + private int status; + private String error; + private String content; + + public boolean getSuccessful() { + return successful; + } + + public void setSuccessful(boolean successful) { + this.successful = successful; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4LibGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4LibGenerator.java index d3f7bd1e..0f772519 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4LibGenerator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4LibGenerator.java @@ -53,6 +53,7 @@ public class ExecuteUnit4LibGenerator extends ExecuteUnitGenerator { engine.addSharedObject("ObjectProperty",new ObjectProperty()); engine.addSharedObject("OptionValue",new OptionValue()); engine.addSharedObject("SqlFieldMapping",new SqlFieldMapping()); + engine.addSharedObject("HttpRequest",new HttpRequest()); engine.addSharedObject("Ternary",new Ternary()); engine.addSharedObject("WhenThen",new WhenThen()); diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java index cdfa7798..ee5ce0f6 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/ExecuteUnit4ResourceGenerator.java @@ -24,6 +24,7 @@ public class ExecuteUnit4ResourceGenerator extends ExecuteUnitGenerator { if(resource instanceof ModelResource){ ((ModelResource)resource).getModel().buildFullName(); } + } @Override @@ -58,6 +59,7 @@ public class ExecuteUnit4ResourceGenerator extends ExecuteUnitGenerator { engine.addSharedObject("ObjectProperty",new ObjectProperty()); engine.addSharedObject("OptionValue",new OptionValue()); engine.addSharedObject("SqlFieldMapping",new SqlFieldMapping()); + engine.addSharedObject("HttpRequest",new HttpRequest()); engine.addSharedObject("Ternary",new Ternary()); engine.addSharedObject("WhenThen",new WhenThen()); engine.addSharedObject("ScoreCard",new ScoreCard()); 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 bc115c0a..ba4db021 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 @@ -29,29 +29,43 @@ public class IndicatorGenerator { String name =indicator.getName(); String valueType =indicator.getValueType(); Integer valueTypeVersion =indicator.getValueTypeVersion(); + Boolean valueTypeIsList =indicator.getValueTypeIsList(); String defaultValue =indicator.getDefaultValue(); Map variables =new HashMap<>(); variables.put("name",name); variables.put("fieldName", IdReplacer.fieldName(code)); variables.put("defaultValue",defaultValue); - if(ValueTypeUtil.isString(valueType)){ - if(StringUtils.hasText(defaultValue)){ - String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); - }else{ - String tpl ="String ${fieldName}; //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); + + if(StringUtils.hasText(defaultValue)) { // 有默认值 + if (valueTypeIsList != null && valueTypeIsList) { //列表 + variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); + String tpl = "List<${className}> ${fieldName} =ObjectMapperUtil.json().readValue(\"\"\"${defaultValue}\"\"\",new TypeReference>(){}); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + } else { //非列表 + if (ValueTypeUtil.isBase(valueType)) { // 基本类型 + if (ValueTypeUtil.isString(valueType)) { // 字符串 + String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}"; + sb.append(StringUtil.format(tpl,variables)).append("\n"); + } else { // 非字符串 + variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); + String tpl = "${className} ${fieldName} =${defaultValue}; //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + } + } else { // 非基本类型 + variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); + String tpl = "${className} ${fieldName} =ObjectMapperUtil.json().readValue(\"\"\"${defaultValue}\"\"\",${className}.class); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + } } - }else{ - if(StringUtils.hasText(defaultValue)){ - variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); - String tpl ="${className} ${fieldName} =${defaultValue}; //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); + }else{ // 无默认值 + variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); + if (ValueTypeUtil.isBase(valueType)) { // 基本类型 + String tpl = "${className} ${fieldName}; //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); }else{ - variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); - String tpl ="${className} ${fieldName}; //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); + String tpl = "${className} ${fieldName} =new ${className}(); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); } } } @@ -70,22 +84,25 @@ public class IndicatorGenerator { Integer valueTypeVersion = indicator.getValueTypeVersion(); Map variables =new HashMap<>(); - variables.put("prefix",prefix); variables.put("code",code); variables.put("name",name); variables.put("fieldName",IdReplacer.fieldName(code)); variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); if (indicator.getValueTypeIsList()) { - String tpl ="${prefix}.${fieldName} =TypeConvertor.getValue(map.get('${code}'),new TypeReference>(){}); //${name}"; + sb.append(StringUtil.format("if (map.get('${code}')!=null) {\n",variables)); + String tpl ="\targ.${fieldName} =ObjectMapperUtil.json().readValue(map.get('${code}'),new TypeReference>(){}); //${name}"; sb.append(StringUtil.format(tpl,variables)).append("\n"); + sb.append("}").append("\n"); } else { - String tpl ="${prefix}.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); - } - if (!ValueTypeUtil.isBase(valueType)) { - String tpl ="if(${prefix}.${fieldName}!=null) { ${prefix}.${fieldName}.init(); }"; + sb.append(StringUtil.format("if (map.get('${code}')!=null) {\n",variables)); + String tpl ="\targ.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}"; sb.append(StringUtil.format(tpl,variables)).append("\n"); + sb.append("}").append("\n"); } +// if (!ValueTypeUtil.isBase(valueType)) { +// String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); }"; +// sb.append(StringUtil.format(tpl,variables)).append("\n"); +// } } return sb.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 488f4708..565e6a40 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 @@ -33,29 +33,41 @@ public class ParameterGenerator { variables.put("name",name); variables.put("fieldName",IdReplacer.fieldName(code)); variables.put("defaultValue",defaultValue); - if(ValueTypeUtil.isString(valueType)){ - if(StringUtils.hasText(defaultValue)){ - String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); - }else{ - String tpl ="String ${fieldName}; //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); - } - }else{ - if(StringUtils.hasText(defaultValue)){ - if(valueTypeIsList!=null && valueTypeIsList){ - variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); - String tpl = "List<${className}> ${fieldName} =ObjectMapperUtil.json().readValue(\"\"\"${defaultValue}\"\"\",new TypeReference>(){}); //${name}"; - sb.append(StringUtil.format(tpl, variables)).append("\n"); - }else { + + if(StringUtils.hasText(defaultValue)) { // 有默认值 + if (valueTypeIsList != null && valueTypeIsList) { //列表 + variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); + String tpl = "List<${className}> ${fieldName} =ObjectMapperUtil.json().readValue(\"\"\"${defaultValue}\"\"\",new TypeReference>(){}); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + } else { //非列表 + if (ValueTypeUtil.isBase(valueType)) { // 基本类型 + if (ValueTypeUtil.isString(valueType)) { // 字符串 + String tpl ="String ${fieldName} =\"\"\"${defaultValue}\"\"\"; //${name}"; + sb.append(StringUtil.format(tpl,variables)).append("\n"); + } else { // 非字符串 + variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); + String tpl = "${className} ${fieldName} =${defaultValue}; //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + } + } else { // 非基本类型 variables.put("className", IdReplacer.className(valueType, valueTypeVersion)); - String tpl = "${className} ${fieldName} =${defaultValue}; //${name}"; + String tpl = "${className} ${fieldName} =ObjectMapperUtil.json().readValue(\"\"\"${defaultValue}\"\"\",${className}.class); //${name}"; sb.append(StringUtil.format(tpl, variables)).append("\n"); } + } + }else{ // 无默认值 + variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); + if (ValueTypeUtil.isBase(valueType)) { // 基本类型 + String tpl = "${className} ${fieldName}; //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); }else{ - variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); - String tpl ="${className} ${fieldName}; //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); + if(ValueTypeUtil.isMap(valueType)) { + String tpl = "${className} ${fieldName} =new java.util.HashMap(); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + }else{ + String tpl = "${className} ${fieldName} =new ${className}(); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + } } } } @@ -82,16 +94,26 @@ public class ParameterGenerator { variables.put("fieldName",IdReplacer.fieldName(code)); variables.put("className",IdReplacer.className(valueType,valueTypeVersion)); if (parameter.getValueTypeIsList()) { - String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),new TypeReference>(){}); //${name}"; + sb.append(StringUtil.format("if (map.get('${code}')!=null) {\n",variables)); + String tpl ="\targ.${fieldName} =ObjectMapperUtil.json().readValue(map.get('${code}'),new TypeReference>(){}); //${name}"; sb.append(StringUtil.format(tpl,variables)).append("\n"); + sb.append("}").append("\n"); } else { - String tpl ="arg.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); - } - if (!ValueTypeUtil.isBase(valueType)) { - String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); }"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); + sb.append(StringUtil.format("if (map.get('${code}')!=null) {\n",variables)); + if (ValueTypeUtil.isBase(valueType)) { + String tpl = "\targ.${fieldName} =TypeConvertor.getValue(map.get('${code}'),${className}.class); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + sb.append("}").append("\n"); + }else{ + String tpl = "\targ.${fieldName} =ObjectMapperUtil.json().readValue(map.get('${code}'),${className}.class); //${name}"; + sb.append(StringUtil.format(tpl, variables)).append("\n"); + sb.append("}").append("\n"); + } } +// if (!ValueTypeUtil.isBase(valueType)) { +// String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); }"; +// sb.append(StringUtil.format(tpl,variables)).append("\n"); +// } } return sb.toString(); } @@ -110,8 +132,8 @@ public class ParameterGenerator { variables.put("fieldName",IdReplacer.fieldName(code)); variables.put("name",name); if (!ValueTypeUtil.isBase(valueType)) { - String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); } //${name}"; - sb.append(StringUtil.format(tpl,variables)).append("\n"); +// String tpl ="if(arg.${fieldName}!=null) { arg.${fieldName}.init(); } //${name}"; +// sb.append(StringUtil.format(tpl,variables)).append("\n"); } } return sb.toString(); diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/HttpRequest.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/HttpRequest.java new file mode 100644 index 00000000..1d16732f --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/generator/impl/processor/HttpRequest.java @@ -0,0 +1,77 @@ +package io.sc.engine.rule.core.code.generator.impl.processor; + +import io.sc.engine.rule.core.enums.HttpAuthorizationType; +import io.sc.engine.rule.core.po.lib.Indicator; +import io.sc.engine.rule.core.po.lib.processor.HttpRequestIndicatorProcessor; +import io.sc.engine.rule.core.po.model.Parameter; +import io.sc.engine.rule.core.po.model.processor.HttpRequestParameterProcessor; +import io.sc.engine.rule.core.util.GroovyExpressionReplacer; +import io.sc.platform.util.StringUtil; + +public class HttpRequest { + public String groovy(Parameter parameter, HttpRequestParameterProcessor processor) throws Exception{ + if(parameter==null || processor==null){ return null; } + try { + StringBuilder sb =new StringBuilder(); + sb.append("{").append("\n"); + sb.append("\tio.sc.engine.rule.core.WebRequest request =new io.sc.engine.rule.core.WebRequest();\n"); + sb.append("\trequest.setHttpMethod(").append("io.sc.engine.rule.core.enums.HttpMethodType.").append(processor.getHttpMethod()).append(");\n"); + sb.append("\trequest.setHttpUrl(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpUrl(),String.class.getName()))).append(");\n"); + if(processor.getHttpAuthType()!=null) { + sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.").append(processor.getHttpAuthType()).append(");\n"); + if(HttpAuthorizationType.BASIC_AUTH.equals(processor.getHttpAuthType())){ + sb.append("\trequest.setHttpAuthBasicUsername(").append(processor.getHttpAuthBasicUsername()).append(");\n"); + sb.append("\trequest.setHttpAuthBasicPassword(").append(processor.getHttpAuthBasicPassword()).append(");\n"); + }else if(HttpAuthorizationType.API_KEY.equals(processor.getHttpAuthType())){ + sb.append("\trequest.setHttpAuthApikey(").append(processor.getHttpAuthApikey()).append(");\n"); + sb.append("\trequest.setHttpAuthApiValue(").append(processor.getHttpAuthApiValue()).append(");\n"); + }else if(HttpAuthorizationType.BEARER.equals(processor.getHttpAuthType())){ + sb.append("\trequest.setHttpAuthBearerToken(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpAuthBearerToken(),String.class.getName()))).append(");\n"); + } + }else{ + sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.NONE);\n"); + } + sb.append("\tio.sc.engine.rule.core.WebResponse response =io.sc.engine.rule.core.util.WebRequestUtil.sendWebRequest(request);\n"); + String groovy =StringUtil.tabs(processor.getHttpResponseMapping().replace("${response}","response"),1); + groovy =GroovyExpressionReplacer.groovy(groovy); + sb.append("\t").append(groovy).append("\n"); + sb.append("}").append("\n"); + return sb.toString(); + }catch(Exception e) { + throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s HttpRequest groovy source code.", e); + } + } + + public String groovy(Indicator indicator, HttpRequestIndicatorProcessor processor) throws Exception{ + if(indicator==null || processor==null){ return null; } + try { + StringBuilder sb =new StringBuilder(); + sb.append("{").append("\n"); + sb.append("\tio.sc.engine.rule.core.WebRequest request =new io.sc.engine.rule.core.WebRequest();\n"); + sb.append("\trequest.setHttpMethod(").append("io.sc.engine.rule.core.enums.HttpMethodType.").append(processor.getHttpMethod()).append(");\n"); + sb.append("\trequest.setHttpUrl(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpUrl(),String.class.getName()))).append(");\n"); + if(processor.getHttpAuthType()!=null) { + sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.").append(processor.getHttpAuthType()).append(");\n"); + if(HttpAuthorizationType.BASIC_AUTH.equals(processor.getHttpAuthType())){ + sb.append("\trequest.setHttpAuthBasicUsername(").append(processor.getHttpAuthBasicUsername()).append(");\n"); + sb.append("\trequest.setHttpAuthBasicPassword(").append(processor.getHttpAuthBasicPassword()).append(");\n"); + }else if(HttpAuthorizationType.API_KEY.equals(processor.getHttpAuthType())){ + sb.append("\trequest.setHttpAuthApikey(").append(processor.getHttpAuthApikey()).append(");\n"); + sb.append("\trequest.setHttpAuthApiValue(").append(processor.getHttpAuthApiValue()).append(");\n"); + }else if(HttpAuthorizationType.BEARER.equals(processor.getHttpAuthType())){ + sb.append("\trequest.setHttpAuthBearerToken(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpAuthBearerToken(),String.class.getName()))).append(");\n"); + } + }else{ + sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.NONE);\n"); + } + sb.append("\tio.sc.engine.rule.core.WebResponse response =io.sc.engine.rule.core.util.WebRequestUtil.sendWebRequest(request);\n"); + String groovy =StringUtil.tabs(processor.getHttpResponseMapping().replace("${response}","response"),1); + groovy =GroovyExpressionReplacer.groovy(groovy); + sb.append("\t").append(groovy).append("\n"); + sb.append("}").append("\n"); + return sb.toString(); + }catch(Exception e) { + throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s HttpRequest groovy source code.", e); + } + } +} 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 5343bec9..3775d60d 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 @@ -11,6 +11,7 @@ import io.sc.engine.rule.core.util.GroovyExpressionReplacer; import io.sc.engine.rule.core.util.IdReplacer; import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.ObjectMapperUtil; +import io.sc.platform.util.PlaceHolderExpressionUtil; import io.sc.platform.util.StringUtil; import org.springframework.util.StringUtils; @@ -59,10 +60,10 @@ public class SqlFieldMapping { sb.append("\t").append("db.query(sql) { rs ->").append("\n"); sb.append("\t\t").append("if (rs.next()) {").append("\n"); for(SqlFieldMapping sqlFieldMapping : sqlFieldMappings) { - sb.append("\t\t\t") - .append(ExpressionReplacer.groovy(IdReplacer.fieldName(sqlFieldMapping.parameter), null)) - .append(" =") - .append("rs.getObject(\"").append(sqlFieldMapping.getField()).append("\");").append("\n"); + sb.append("\t\t\t"); + sb.append(PlaceHolderExpressionUtil.replace(sqlFieldMapping.parameter, "arg.","")); + sb.append(" ="); + sb.append("rs.getObject(\"").append(sqlFieldMapping.getField()).append("\");").append("\n"); } sb.append("\t\t}").append("\n"); sb.append("\t}").append("\n"); diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl index 28e5ee99..9d058241 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/impl/resource.tpl @@ -133,6 +133,29 @@ class #(className(resource.code,resource.version)) { } #@renderModel(model) + + ### 决策树函数 + #for(parameter : model.allParameters) + #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) + #for(processor : parameter.processors) + #if("DECISION_TREE"==processor.type.toString()) + //决策树函数: #(parameter.name)(#(parameter.type)) + #(DecisionTree.groovy(parameter,processor)) + #end + #end + #end + #end + ### 执行流函数 + #for(parameter : model.allParameters) + #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) + #for(processor : parameter.processors) + #if("EXECUTION_FLOW"==processor.type.toString()) + //执行流函数: #(parameter.name)(#(parameter.type)) + #(tabs(ExecutionFlow.groovy(parameter,processor),1)) + #end + #end + #end + #end } //****************************************************************************** diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl index 084d83d7..d821e3d3 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/lib_render.tpl @@ -6,6 +6,7 @@ class #(className(lib.code,lib.version)) { //通过输入参数构建指标库对象 public void convertArgument(Map map){ + #(className(lib.code,lib.version)) arg =this; #(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"this"),2)) } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/parameter_render.tpl b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/parameter_render.tpl index e322eb74..b7b6986e 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/parameter_render.tpl +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/parameter_render.tpl @@ -100,26 +100,4 @@ #end #end - ### 决策树函数 - #for(parameter : model.allParameters) - #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) - #for(processor : parameter.processors) - #if("DECISION_TREE"==processor.type.toString()) - //决策树函数: #(parameter.name)(#(parameter.type)) - #(DecisionTree.groovy(parameter,processor)) - #end - #end - #end - #end - ### 执行流函数 - #for(parameter : model.allParameters) - #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) - #for(processor : parameter.processors) - #if("EXECUTION_FLOW"==processor.type.toString()) - //执行流函数: #(parameter.name)(#(parameter.type)) - #(tabs(ExecutionFlow.groovy(parameter,processor),1)) - #end - #end - #end - #end #end \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/http_request.tpl b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/http_request.tpl index e69de29b..2c139ef3 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/http_request.tpl +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/template/processor/http_request.tpl @@ -0,0 +1 @@ +#(tabs(HttpRequest.groovy(parameter,processor),2)) \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java index 1f16f3d1..c085e21d 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java @@ -74,10 +74,23 @@ public class ValueTypeUtil { return List.class.isAssignableFrom(clazz); } + public static boolean isList(String type){ + try { + return List.class.isAssignableFrom(Class.forName(type)); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + public static boolean isMap(Class clazz){ return Map.class.isAssignableFrom(clazz); } + public static boolean isMap(String type){ + return "java.util.Map".equals(type) || "java.util.HashMap".equals(type); + } + + public static String getSimpleName(Class type) { return getSimpleName(type.getName()); } diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/WebRequestUtil.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/WebRequestUtil.java new file mode 100644 index 00000000..a372a4e6 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/WebRequestUtil.java @@ -0,0 +1,89 @@ +package io.sc.engine.rule.core.util; + +import groovy.json.JsonSlurper; +import io.sc.engine.rule.core.WebRequest; +import io.sc.engine.rule.core.WebResponse; +import io.sc.engine.rule.core.enums.HttpAuthorizationType; +import io.sc.engine.rule.core.enums.HttpMethodType; +import io.sc.platform.util.StringUtil; +import okhttp3.*; + +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.Base64; +import java.util.Map; + +public class WebRequestUtil { + public static WebResponse sendWebRequest(WebRequest webRequest) { + try { + Headers.Builder headerBuilder = new Headers.Builder().add("Content-Type: application/json"); + HttpAuthorizationType httpAuthType =webRequest.getHttpAuthType(); + if(httpAuthType==null){ + httpAuthType =HttpAuthorizationType.NONE; + } + switch (httpAuthType) { + case NONE: + break; + case API_KEY: + headerBuilder.add(webRequest.getHttpAuthApikey() + "=" + webRequest.getHttpAuthApiValue()); + break; + case BASIC_AUTH: + headerBuilder.add("Authorization:Basic " + Base64.getEncoder().encodeToString(webRequest.getHttpAuthBasicUsername().getBytes(StandardCharsets.UTF_8)) + Base64.getEncoder().encodeToString(webRequest.getHttpAuthBasicPassword().getBytes(StandardCharsets.UTF_8))); + break; + case BEARER: + headerBuilder.add("Authorization: Bearer " + webRequest.getHttpAuthBearerToken()); + break; + } + Headers headers = headerBuilder.build(); + + okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder().url(webRequest.getHttpUrl()).headers(headers); + if (HttpMethodType.GET.equals(webRequest.getHttpMethod())) { + requestBuilder.get(); + }else if(HttpMethodType.POST.equals(webRequest.getHttpMethod())){ + RequestBody body = RequestBody.create(webRequest.getHttpRequestBody(), MediaType.parse("application/json; charset=utf-8")); + requestBuilder.post(body); + } + Request request = requestBuilder.build(); + OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(Duration.ofSeconds(60)) + .readTimeout(Duration.ofSeconds(60)) + .writeTimeout(Duration.ofSeconds(60)) + .build(); + client.dispatcher().setMaxRequests(64); + client.dispatcher().setMaxRequestsPerHost(6); + Call call = client.newCall(request); + Response response = call.execute(); + WebResponse result = new WebResponse(); + if(response.isSuccessful()) { + result.setSuccessful(response.isSuccessful()); + result.setStatus(response.code()); + result.setError(null); + result.setContent(response.body().string()); + return result; + }else{ + result.setSuccessful(response.isSuccessful()); + result.setStatus(response.code()); + result.setError("Error occured!"); + return result; + } + }catch (Exception e){ + WebResponse result = new WebResponse(); + result.setSuccessful(false); + result.setStatus(500); + result.setError(StringUtil.getStackTrace(e)); + return result; + } + } + + public static void main(String[] args) { + WebRequest webRequest =new WebRequest(); + webRequest.setHttpMethod(HttpMethodType.GET); + webRequest.setHttpUrl("http://localhost:8090/api/re/resource/getDefineByCode?code=M1744084117959"); + webRequest.setHttpAuthType(HttpAuthorizationType.BEARER); + webRequest.setHttpAuthBearerToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJjb3Jwb3JhdGlvbkNvZGUiOiJfUFJJTUFSWV8iLCJjb3Jwb3JhdGlvbk5hbWUiOiLmsqrooaPllYbmnZHplYfpk7booYwiLCJkZWZhdWx0Um9sZUNvZGUiOiJhZG1pbiIsInVzZXJOYW1lIjoi57O757uf566h55CG5ZGYIiwidXNlcklkIjoiZWYyNTMzYzUtODZiYi00YzI2LTgyYWEtNGFhYTA1NGJkYzk4IiwiYXV0aG9yaXRpZXMiOlt7ImNvZGUiOiJhZG1pbiIsIm5hbWUiOiLns7vnu5_nrqHnkIblkZgiLCJpZCI6IjhiMWM4YTAwLTk4MDEtNDAyMC05ODY1LTA0ZDU2ODcxY2ZiOSJ9XSwiZGVmYXVsdFJvbGVOYW1lIjoi57O757uf566h55CG5ZGYIiwibG9naW5OYW1lIjoiYWRtaW4iLCJleHAiOjE3NDQ3MzkxMzEsImlhdCI6MTc0NDcxMDMzMSwianRpIjoiZWQxNzMwOTMtZTIzMi00OWQ1LWI2ZjItNTRkZDRlYjM5ZmEwIiwiZGVmYXVsdFJvbGVJZCI6IjhiMWM4YTAwLTk4MDEtNDAyMC05ODY1LTA0ZDU2ODcxY2ZiOSJ9.C1pDjMUyf5DAZXTzoys9YfDlXbvPkENIe-XIuSoh1QYJ4SYzaX9n5WaQRvZ793cmcVqyTMNFQKlp5F8sWZZnMft-XmrBtH5FTpo2jxGnoexuGUudPCsdRiFzyNMKCgohIkEs-8lWzG_jcJ-otk7UxmBSQQkOAZU3JkVE-rhDiMRzKa9RIJGiqicQ24-Q5ihGJ9aXX_5CgbvKSdqG59pfNHta0u33gxfqwhozU1L8276f07RrrW4lxoF1rB95_OqEObvzOCpZHqWETf6MAo3rqAfEIPOJFENgjX7wXu6PDla85K9cJHbjKFV_dbjT2DmZn98uPlU_2-iimFrxA4Hp3g"); + WebResponse response =sendWebRequest(webRequest); + System.out.println(response.getContent()); + Map o =(Map)new JsonSlurper().parseText(response.getContent()); + System.out.println(o.get("resource").getClass().getName()); + } +} diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl index 9715e1f8..bd3b307b 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/dictionary_render.tpl @@ -2,16 +2,12 @@ /** * #(dictionary.name) */ -#if("UD_JAVA_CLASS"==dictionary.type.toString()) @JsonIgnoreProperties(ignoreUnknown=true) -#end class #(className(dictionary.code,dictionary.version)) { - #(tabs(DictionaryGenerator.generateFields(dictionary),1)) - #if("UD_JAVA_CLASS"==dictionary.type.toString()) + #(tabs(DictionaryGenerator.generateFields(dictionary.getFields()),1)) + public void init(){ - #(tabs(DictionaryGenerator.generateFieldInits(dictionary),2)) + #(tabs(DictionaryGenerator.generateInits(dictionary.getFields()),2)) } - #end } - #end \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/dictionary/dictionary.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/dictionary/dictionary.ftl deleted file mode 100644 index 44f0b77e..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/dictionary/dictionary.ftl +++ /dev/null @@ -1,33 +0,0 @@ -<#assign dictionaries=($wrapper.dictionaries)!> -<#list (dictionaries)! as dictionary> -/** - * 数据字典类 - * @author auto generated by engine - */ -@JsonIgnoreProperties(ignoreUnknown=true) -class ${CodeReplacer.className(dictionary.code)}_V${dictionary.version}{ -<#list (dictionary.getFields())! as field> - <#if field.defaultValue??> - <#if "java.lang.String"==(field.valueType)!> - String ${CodeReplacer.fieldName(field.code)} ="${field.defaultValue}";//${field.name} - <#else> - ${ValueType.getSimpleJavaType(field.valueType)} ${CodeReplacer.fieldName(field.code)} =${field.defaultValue};//${field.name} - - <#else> - <#if (field.valueTypeIsList)!> - List<${ValueType.getSimpleJavaType(field.valueType)}> ${CodeReplacer.fieldName(field.code)};//${field.name} - <#else> - ${ValueType.getSimpleJavaType(field.valueType)} ${CodeReplacer.fieldName(field.code)};//${field.name} - - - - - public void init(){ -<#list (dictionary.getFields())! as field> - <#if field?? && field.valueCalculation?? && field.valueCalculation!=""> - ${CodeReplacer.fieldName(field.code)} =(${ExpressionReplacer.groovyWithNoArgumentName(field.valueCalculation,null)}); - - - } -} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/functions.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/functions.ftl deleted file mode 100644 index 5643779b..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/functions.ftl +++ /dev/null @@ -1,6 +0,0 @@ -<#assign functions=$wrapper.functions!> -<#list functions! as function> - <#if (function.enable)!> -${function.body} - - diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/groovy.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/groovy.ftl deleted file mode 100644 index 15665be8..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/groovy.ftl +++ /dev/null @@ -1,115 +0,0 @@ -<#ftl strip_whitespace=true> -package io.sc.engine.rule.core.code; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.core.type.TypeReference; - -import groovy.transform.Canonical; - -import java.math.*; - -import java.util.Random; -import java.util.Map; - -import io.sc.engine.rule.core.classes.RuleResult; -import io.sc.engine.rule.core.classes.SingleRuleResult; -import io.sc.engine.rule.core.classes.ResourceAbstract; - -import io.sc.engine.rule.core.code.impl.support.ResourceResult; -import io.sc.engine.rule.core.code.impl.support.ParameterResult; -import io.sc.engine.rule.core.code.impl.support.FieldValidator; -import io.sc.engine.rule.core.code.impl.support.ValidateResult; -import io.sc.engine.rule.core.enums.ParameterType; -import io.sc.engine.rule.core.enums.RuntimeInputParameterType; -import io.sc.engine.rule.core.util.DateUtil; -import io.sc.engine.rule.core.util.DataTypeConvertor; -import io.sc.engine.rule.core.util.ESql; -import io.sc.engine.rule.core.util.JacksonObjectMapper; -import io.sc.engine.rule.core.util.IdReplacer; -import io.sc.engine.rule.core.util.Strings; - -import io.sc.engine.rule.client.Executor; - -import static java.lang.Math.PI; -import static java.lang.Math.E; - -import static java.lang.Math.abs; -import static java.lang.Math.atan2; -import static java.lang.Math.cbrt; -import static java.lang.Math.ceil; -import static java.lang.Math.exp; -import static java.lang.Math.expm1; -import static java.lang.Math.floor; -import static java.lang.Math.IEEEremainder; -import static java.lang.Math.pow; -import static java.lang.Math.random; -import static java.lang.Math.rint; -import static java.lang.Math.round; -import static java.lang.Math.sqrt; -import static java.lang.Math.toDegrees; -import static java.lang.Math.toRadians; - -import static java.lang.Math.sin; -import static java.lang.Math.cos; -import static java.lang.Math.tan; - -import static java.lang.Math.asin; -import static java.lang.Math.acos; -import static java.lang.Math.atan; - -import static java.lang.Math.sinh; -import static java.lang.Math.cosh; -import static java.lang.Math.tanh; - - -import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt; -import static io.sc.engine.rule.core.function.ArithmeticFunction.max; -import static io.sc.engine.rule.core.function.ArithmeticFunction.min; -import static io.sc.engine.rule.core.function.ArithmeticFunction.sum; -import static io.sc.engine.rule.core.function.ArithmeticFunction.log; -import static io.sc.engine.rule.core.function.ArithmeticFunction.ln; -import static io.sc.engine.rule.core.function.ArithmeticFunction.lg; -import static io.sc.engine.rule.core.function.ArithmeticFunction.root; -import static io.sc.engine.rule.core.function.ArithmeticFunction.div; - -import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing; -import static io.sc.engine.rule.core.function.DateFunction.now; -import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd; -import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd; -import static io.sc.engine.rule.core.function.StringFunction.length; -import static io.sc.engine.rule.core.function.StringFunction.trim; -import static io.sc.engine.rule.core.function.StringFunction.upperCase; -import static io.sc.engine.rule.core.function.StringFunction.lowerCase; -import static io.sc.engine.rule.core.function.StringFunction.contains; -import static io.sc.engine.rule.core.function.StringFunction.startsWith; -import static io.sc.engine.rule.core.function.StringFunction.endsWith; -import static io.sc.engine.rule.core.function.StringFunction.join; - -import static io.sc.engine.rule.core.function.NormalDistributionFunction.G; -import static io.sc.engine.rule.core.function.NormalDistributionFunction.iG; -import static io.sc.engine.rule.core.function.SpecialValueFunction.isNil; -import static io.sc.engine.rule.core.function.SpecialValueFunction.isZero; -import static io.sc.engine.rule.core.function.SpecialValueFunction.isNan; -import static io.sc.engine.rule.core.function.SpecialValueFunction.isInfinite; -import static io.sc.engine.rule.core.function.SpecialValueFunction.nil; -import static io.sc.engine.rule.core.function.SpecialValueFunction.zero; -import static io.sc.engine.rule.core.function.SpecialValueFunction.nan; -import static io.sc.engine.rule.core.function.SpecialValueFunction.infinite; - -import static io.sc.engine.rule.core.util.NumberFormater.decimal; -import static io.sc.engine.rule.core.util.NumberFormater.comma; -import static io.sc.engine.rule.core.util.NumberFormater.money; -import static io.sc.engine.rule.core.util.NumberFormater.percent; - -import io.sc.engine.rule.core.function.JpmmlEvaluator; - -<#include "/functions.ftl"/> - -<#if $wrapper.type=="RESOURCE"> - <#include "/resource_groovy.ftl"/> -<#elseif $wrapper.type=="LIB"> - <#include "/lib_groovy.ftl"/> - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/lib/lib.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/lib/lib.ftl deleted file mode 100644 index 20079a4a..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/lib/lib.ftl +++ /dev/null @@ -1,115 +0,0 @@ -<#assign libs=($wrapper.libs)!> -<#list (libs)! as lib> -/** - * 库类 - * @author auto generated by engine - */ -@JsonIgnoreProperties(ignoreUnknown=true) -class ${CodeReplacer.className(lib.code,lib.version)}{ - private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(lib.code,lib.version)}.class); -<#list (lib.indicators)! as indicator> - ${indicator.forArgumentField($wrapper)} - - - //通过输入参数构建指标库对象 - public void convertArgument(Map map){ - Object obj =null; - <#list (lib.indicators)! as indicator> - ${indicator.forConvertArgumentFromMap($wrapper,"this")} - - } - - public void convertArgument(String json){ - ${CodeReplacer.className(lib.code)}_V${lib.version} result =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, ${CodeReplacer.className(lib.code,lib.version)}.class); - <#list (lib.indicators)! as indicator> - <#if "INTERFACE"==(indicator.type)!> - this.${CodeReplacer.fieldName(indicator.code)} =result.${CodeReplacer.fieldName(indicator.code)}; - <#if ValueType.isBaseType(indicator.valueType)> - <#else> - this.${CodeReplacer.fieldName(indicator.code)}.init(); - - - - } - - public void execute() throws Exception{ - <#-- 处理指标值 --> - <#list (lib.indicators)! as indicator> - <#if "INDICATOR"==(indicator.type)!> - ${CodeReplacer.fieldName(indicator.code)}();//${indicator.name},${indicator.type} - - - } - - public void validate(ValidateResult result) { -<#list (lib.indicators)! as indicator> - <#list (indicator.validators)! as validator> - <#if "EMPTY"==(validator.type)!> - FieldValidator.empty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "NOT_EMPTY"==(validator.type)!> - FieldValidator.notEmpty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "TRUE"==(validator.type)!> - FieldValidator.trueValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "FALSE"==(validator.type)!> - FieldValidator.falseValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "INTEGER_RANGE"==(validator.type)!> - FieldValidator.integerRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null,<#if validator.maxValue??>${validator.maxValue}<#else>null,result); - <#elseif "DECIMAL_RANGE"==(validator.type)!> - FieldValidator.decimalRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>new Double(${validator.minValue})<#else>null,<#if validator.maxValue??>new Double(${validator.maxValue})<#else>null,result); - <#elseif "LENGTH_RANGE"==(validator.type)!> - FieldValidator.lengthRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null,<#if validator.maxValue??>${validator.maxValue}<#else>null,result); - <#elseif "DATE_RANGE"==(validator.type)!> - FieldValidator.dateRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>DateUtil.parseDate("${validator.minValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null,<#if validator.maxValue??>DateUtil.parseDate("${validator.maxValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null,result); - <#elseif "EMAIL"==(validator.type)!> - FieldValidator.mail("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "PATTERN"==(validator.type)!> - FieldValidator.pattern("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},"${validator.pattern}",result); - - - - } - -<#list (lib.indicators)! as indicator> - <#if "INDICATOR"==(indicator.type)!> - <#assign parameter=indicator> - public void ${CodeReplacer.fieldName(indicator.code)}(){ - ${CodeReplacer.className(lib.code)}_V${lib.version} arg =this; - <#list (indicator.processors)! as processor> - if(log.isDebugEnabled()){log.debug(" {}","${parameter.name}(${parameter.type})");} - <#if "OBJECT_PROPERTIES"==(processor.type)!> - <#include "/processor/OBJECT_PROPERTIES.ftl"/> - <#elseif "OPTION_VALUE"==(processor.type)!> - <#include "/processor/OPTION_VALUE.ftl"/> - <#elseif "MATH_FORMULA"==(processor.type)!> - <#include "/processor/MATH_FORMULA.ftl"/> - <#elseif "ARITHMETIC"==(processor.type)!> - <#include "/processor/ARITHMETIC.ftl"/> - <#elseif "TERNARY"==(processor.type)!> - <#include "/processor/TERNARY.ftl"/> - <#elseif "WHEN_THEN"==(processor.type)!> - <#include "/processor/WHEN_THEN.ftl"/> - <#elseif "NUMBER_RANGE"==(processor.type)!> - <#include "/processor/NUMBER_RANGE.ftl"/> - <#elseif "CONDITION_RANGE"==(processor.type)!> - <#include "/processor/CONDITION_RANGE.ftl"/> - <#elseif "DECISION_TABLE_2C"==(processor.type)!> - <#include "/processor/DECISION_TABLE_2C.ftl"/> - <#elseif "DECISION_TABLE"==(processor.type)!> - <#include "/processor/DECISION_TABLE.ftl"/> - <#elseif "DECISION_TREE"==(processor.type)!> - <#include "/processor/DECISION_TREE.ftl"/> - <#elseif "EXECUTION_FLOW"==(processor.type)!> - <#include "/processor/EXECUTION_FLOW.ftl"/> - <#elseif "PMML"==(processor.type)!> - <#include "/processor/PMML.ftl"/> - <#elseif "GROOVY_SCRIPT"==(processor.type)!> - <#include "/processor/GROOVY_SCRIPT.ftl"/> - <#elseif "SQL"==(processor.type)!> - <#include "/processor/SQL.ftl"/> - - - } - - -} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/lib_groovy.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/lib_groovy.ftl deleted file mode 100644 index a44aae95..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/lib_groovy.ftl +++ /dev/null @@ -1,201 +0,0 @@ -<#assign lib=$wrapper.lib> -/** - * 指标库类(name:${lib.name}, code:${lib.code}, version:${lib.version}) - * ${(lib.description)!} - * @author auto generated by engine - */ -class ${CodeReplacer.className(lib.code,lib.version)}{ - private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(lib.code,lib.version)}.class); - - /** - * 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) - * @param map 输入参数封装器 - * @return 执行结果 - */ - public static ResourceResult execute(Map map) throws Exception{ - return execute(map["executor"],map["subModelCode"],map["argument"]); - } - - <#-- 执行方法(Map作为输入参数) --> - /** - * 执行方法 - * @param executor 执行器对象 - * @param subModelCode 子模型代码 - * @param data 输入参数 - * @return 执行结果 - */ - public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{ - if(log.isDebugEnabled()){log.debug("开始执行指标库 : ${CodeReplacer.className(lib.code,lib.version)}");} - if(data instanceof Map){ - if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(data));} - }else if(data instanceof String){ - if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);} - } - //初始化模型参数 - if(log.isDebugEnabled()){log.debug("初始化指标库参数");} - Argument argument =Argument.convertArgument(data); - - //输入参数合法性检查(指标库) - ValidateResult validateResult =new ValidateResult(); - - //输入参数合法性检查(模型) - if(log.isDebugEnabled()){log.debug("开始检查指标库输入参数数据合法性");} - argument.validate(validateResult); - if(validateResult.hasError()){ - if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} - ResourceResult result =new ResourceResult(); - result.setValidateResult(validateResult); - return result; - } - if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} - - //执行指标库中的所有指标 - <#list (lib.indicators)! as indicator> - <#if "INDICATOR"==(indicator.type)!> - ${CodeReplacer.methodName(indicator.code)}(executor,argument);//${indicator.name},${indicator.type} - - - - //返回结果 - ResourceResult result =argument.toResult(); - if(log.isDebugEnabled()){log.debug("指标库调用成功,返回结果:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(result));} - return result; - } - -<#list (lib.indicators)! as indicator> - <#if "INDICATOR"==(indicator.type)!> - public static void ${CodeReplacer.methodName(indicator.code)}(Executor executor,Argument arg){ - <#list (indicator.processors)! as processor> - <#assign parameter=indicator> - if(log.isDebugEnabled()){log.debug(" {}","${parameter.name}(${parameter.type})");} - <#if "OBJECT_PROPERTIES"==(processor.type)!> - <#include "/processor/OBJECT_PROPERTIES.ftl"/> - <#elseif "OPTION_VALUE"==(processor.type)!> - <#include "/processor/OPTION_VALUE.ftl"/> - <#elseif "MATH_FORMULA"==(processor.type)!> - <#include "/processor/MATH_FORMULA.ftl"/> - <#elseif "ARITHMETIC"==(processor.type)!> - <#include "/processor/ARITHMETIC.ftl"/> - <#elseif "TERNARY"==(processor.type)!> - <#include "/processor/TERNARY.ftl"/> - <#elseif "WHEN_THEN"==(processor.type)!> - <#include "/processor/WHEN_THEN.ftl"/> - <#elseif "NUMBER_RANGE"==(processor.type)!> - <#include "/processor/NUMBER_RANGE.ftl"/> - <#elseif "CONDITION_RANGE"==(processor.type)!> - <#include "/processor/CONDITION_RANGE.ftl"/> - <#elseif "DECISION_TABLE_2C"==(processor.type)!> - <#include "/processor/DECISION_TABLE_2C.ftl"/> - <#elseif "DECISION_TABLE"==(processor.type)!> - <#include "/processor/DECISION_TABLE.ftl"/> - <#elseif "DECISION_TREE"==(processor.type)!> - <#include "/processor/DECISION_TREE.ftl"/> - <#elseif "EXECUTION_FLOW"==(processor.type)!> - <#include "/processor/EXECUTION_FLOW.ftl"/> - <#elseif "PMML"==(processor.type)!> - <#include "/processor/PMML.ftl"/> - <#elseif "GROOVY_SCRIPT"==(processor.type)!> - <#include "/processor/GROOVY_SCRIPT.ftl"/> - <#elseif "SQL"==(processor.type)!> - <#include "/processor/SQL.ftl"/> - - - } - - -} - -/** - * 模型参数类 - * @author auto generated by engine - */ -@JsonIgnoreProperties(ignoreUnknown=true) -class Argument{ -<#list (lib.indicators)! as indicator> - ${indicator.forArgumentField($wrapper)} - - - <#-- 参数转换 --> - public static Argument convertArgument(Map map){ - if(map!=null){ - Argument argument =new Argument(); - Object obj =null; - - <#list (lib.indicators)! as indicator> - ${indicator.forConvertArgumentFromMap($wrapper,"argument")} - - - return argument; - } - return null; - } - - <#-- 参数转换 --> - public static Argument convertArgument(String json){ - if(json!=null && !"".equals(json.trim())){ - Argument argument =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, Argument.class); - - <#list (lib.indicators)! as indicator> - ${indicator.forConvertArgumentFromJson($wrapper,"argument")} - - - return argument; - } - return null; - } - - public void validate(ValidateResult result) { -<#list (lib.indicators)! as indicator> - <#list (indicator.validators)! as validator> - <#if "EMPTY"==(validator.type)!> - FieldValidator.empty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "NOT_EMPTY"==(validator.type)!> - FieldValidator.notEmpty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "TRUE"==(validator.type)!> - FieldValidator.trueValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "FALSE"==(validator.type)!> - FieldValidator.falseValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "INTEGER_RANGE"==(validator.type)!> - FieldValidator.integerRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null,<#if validator.maxValue??>${validator.maxValue}<#else>null,result); - <#elseif "DECIMAL_RANGE"==(validator.type)!> - FieldValidator.decimalRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>new Double(${validator.minValue})<#else>null,<#if validator.maxValue??>new Double(${validator.maxValue})<#else>null,result); - <#elseif "LENGTH_RANGE"==(validator.type)!> - FieldValidator.lengthRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null,<#if validator.maxValue??>${validator.maxValue}<#else>null,result); - <#elseif "DATE_RANGE"==(validator.type)!> - FieldValidator.dateRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>DateUtil.parseDate("${validator.minValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null,<#if validator.maxValue??>DateUtil.parseDate("${validator.maxValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null,result); - <#elseif "EMAIL"==(validator.type)!> - FieldValidator.mail("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); - <#elseif "PATTERN"==(validator.type)!> - FieldValidator.pattern("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},"${validator.pattern}",result); - - - - } - - public ResourceResult toResult(){ - ResourceResult result =new ResourceResult(); -<#list (lib.indicators)! as indicator> - <#if "INDICATOR"==(indicator.type)!> - <#if indicator.valueType==ValueType.Decimal.getJavaType()> - result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${indicator.type},"${indicator.valueType}",${indicator.valueScale!"8"},RoundingMode.${indicator.valueRoundingMode!"HALF_UP"},this.${CodeReplacer.fieldName(indicator.code)}==null?null:${CodeReplacer.fieldName(indicator.code)}.setScale(${indicator.valueScale!"8"},RoundingMode.${indicator.valueRoundingMode!"HALF_UP"}).toString())); - <#elseif - indicator.valueType==ValueType.Boolean.getJavaType() - || indicator.valueType==ValueType.Long.getJavaType() - || indicator.valueType==ValueType.String.getJavaType() - || indicator.valueType==ValueType.Date.getJavaType() - > - result.addParameterResult(new ParameterResult("${indicator.code}","""${indicator.name}""",ParameterType.${indicator.type},"${indicator.valueType}",${indicator.valueScale!"null"},<#if indicator.valueRoundingMode??>RoundingMode.${indicator.valueRoundingMode}<#else>null,this.${CodeReplacer.fieldName(indicator.code)}==null?null:this.${CodeReplacer.fieldName(indicator.code)}.toString())); - <#else> - result.addParameterResult(new ParameterResult("${indicator.code}","""${indicator.name}""",ParameterType.${indicator.type},"${indicator.valueType}",${indicator.valueScale!"null"},<#if indicator.valueRoundingMode??>RoundingMode.${indicator.valueRoundingMode}<#else>null,this.${CodeReplacer.fieldName(indicator.code)}==null?null:JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this.${CodeReplacer.fieldName(indicator.code)}))); - - - - return result; - } -} - -<#-- 数据字典类 --> -<#include "/dictionary/dictionary.ftl"/> - -//执行并返回 -${CodeReplacer.className(lib.code)}_V${lib.version}.execute(INPUT_PARAMETER); diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/argument.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/argument.ftl deleted file mode 100644 index 9f257887..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/argument.ftl +++ /dev/null @@ -1,153 +0,0 @@ -/** - * 模型参数类 - * @author auto generated by engine - */ -@JsonIgnoreProperties(ignoreUnknown=true) -class Argument{ -<#list (model.getAllParameters())! as parameter> - ${parameter.forArgumentField($wrapper)} - - -<#-- 参数转换 --> - public static Argument convertArgument(Map map){ - if(map!=null){ - Argument argument =new Argument(); - - Object obj =null; - - <#list (model.getAllParameters())! as parameter> - ${parameter.forConvertArgumentFromMap($wrapper,"argument")} - - - return argument; - } - return null; - } - - <#-- 参数转换 --> - public static Argument convertArgument(String json){ - if(json!=null && !"".equals(json.trim())){ - Argument argument =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, Argument.class); - - <#list (model.getAllParameters())! as parameter> - ${parameter.forConvertArgumentFromJson($wrapper,"argument")} - - - return argument; - } - return null; - } - - public void validate(ValidateResult result) { -<#list (model.getAllParameters())! as parameter> - <#list (parameter.getValidators())! as validator> - ${validator.type!} - <#if "EMPTY"==(validator.type)!> - FieldValidator.empty("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); - <#elseif "NOT_EMPTY"==(validator.type)!> - FieldValidator.notEmpty("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); - <#elseif "TRUE"==(validator.type)!> - FieldValidator.trueValue("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); - <#elseif "FALSE"==(validator.type)!> - FieldValidator.falseValue("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); - <#elseif "INTEGER_RANGE"==(validator.type)!> - FieldValidator.integerRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>${validator.minValue}<#else>null,<#if validator.maxValue??>${validator.maxValue}<#else>null,result); - <#elseif "DECIMAL_RANGE"==(validator.type)!> - FieldValidator.decimalRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>new Double(${validator.minValue})<#else>null,<#if validator.maxValue??>new Double(${validator.maxValue})<#else>null,result); - <#elseif "LENGTH_RANGE"==(validator.type)!> - FieldValidator.lengthRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>${validator.minValue}<#else>null,<#if validator.maxValue??>${validator.maxValue}<#else>null,result); - <#elseif "DATE_RANGE"==(validator.type)!> - FieldValidator.dateRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>DateUtil.parseDate("${validator.minValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null,<#if validator.maxValue??>DateUtil.parseDate("${validator.maxValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null,result); - <#elseif "EMAIL"==(validator.type)!> - FieldValidator.mail("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); - <#elseif "PATTERN"==(validator.type)!> - FieldValidator.pattern("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},"${validator.pattern}",result); - - - - } - - public void mergeParameterValueFromIndicatorLib(Map libs){ - <#list (model.getAllParameters())! as parameter> - <#if "INDICATOR"==(parameter.type)!> - <#-- 如果直接给模型参数(类型为指标)设置过非空值,则直接采用设置过的值,否则采用指标库计算结果值 --> - <#if $wrapper.isExecuteTestCase> - if(this.${CodeReplacer.fieldName(parameter.code)}==null){this.${CodeReplacer.fieldName(parameter.code)} =libs.get("${CodeReplacer.varName(parameter.libCode,parameter.libVersion)}").${CodeReplacer.fieldName(parameter.indicatorCode)};}//${parameter.name} - <#else> - this.${CodeReplacer.fieldName(parameter.code)} =libs.get("${CodeReplacer.varName(parameter.libCode,parameter.libVersion)}").${CodeReplacer.fieldName(parameter.indicatorCode)};//${parameter.name} - - - - } - - public ResourceResult toResult(){ - ResourceResult result =new ResourceResult(); -<#list model.getAllParameters() as parameter> - <#if 'OUT'==(parameter.type)! || 'INTERMEDIATE'==(parameter.type)!> - <#if parameter.valueType==ValueType.Decimal.getJavaType()> - result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},"${parameter.valueType}",${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"},this.${CodeReplacer.fieldName(parameter.code)}==null?null:${CodeReplacer.fieldName(parameter.code)}.setScale(${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"}).toString())); - <#elseif - parameter.valueType==ValueType.Boolean.getJavaType() - || parameter.valueType==ValueType.Long.getJavaType() - || parameter.valueType==ValueType.String.getJavaType() - || parameter.valueType==ValueType.Date.getJavaType() - > - result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:this.${CodeReplacer.fieldName(parameter.code)}.toString())); - <#else> - result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this.${CodeReplacer.fieldName(parameter.code)}))); - - <#elseif 'INDICATOR'==(parameter.type)!> - <#assign indicator=LibUtil.findIndicator($wrapper.libs,parameter.libCode,parameter.libVersion,parameter.indicatorCode)> - <#if "INDICATOR"==(indicator.type)!> - <#if parameter.valueType==ValueType.Decimal.getJavaType()> - result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${parameter.type},"${parameter.valueType}",${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"},this.${CodeReplacer.fieldName(parameter.code)}==null?null:${CodeReplacer.fieldName(parameter.code)}.setScale(${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"}).toString())); - <#elseif - parameter.valueType==ValueType.Boolean.getJavaType() - || parameter.valueType==ValueType.Long.getJavaType() - || parameter.valueType==ValueType.String.getJavaType() - || parameter.valueType==ValueType.Date.getJavaType() - > - result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:this.${CodeReplacer.fieldName(parameter.code)}.toString())); - <#else> - result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this.${CodeReplacer.fieldName(parameter.code)}))); - - - <#elseif 'RULE_RESULT'==(parameter.type)!> - result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},this.${CodeReplacer.fieldName(parameter.code)})); - <#elseif 'SINGLE_RULE_RESULT'==(parameter.type)!> - result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},this.${CodeReplacer.fieldName(parameter.code)})); - - - return result; - } - - public Map toMap(){ - Map map =new HashMap(); - <#list model.getAllParameters() as parameter> - map.put("${parameter.code}",this.${CodeReplacer.fieldName(parameter.code)});//${parameter.type}, ${parameter.name} - - return map; - } - - public void mergeResult(ResourceResult result){ - if(result!=null){ -<#list model.getAllParameters() as parameter> - <#if - parameter.valueType==ValueType.Boolean.getJavaType() - || parameter.valueType==ValueType.Long.getJavaType() - || parameter.valueType==ValueType.Decimal.getJavaType() - || parameter.valueType==ValueType.String.getJavaType() - || parameter.valueType==ValueType.Date.getJavaType() - > - if(result.exists("${parameter.code}")){ - this.${CodeReplacer.fieldName(parameter.code)} =DataTypeConvertor.convert(result.getValueByParameterCode("${parameter.code}"),${ValueType.getSimpleJavaType(parameter.valueType)}.class); - } - <#else> - if(result.exists("${parameter.code}")){ - this.${CodeReplacer.fieldName(parameter.code)} =result.getValueByParameterCode("${parameter.code}"); - } - - - } - } -} \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/model.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/model.ftl deleted file mode 100644 index bf90e96c..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/model.ftl +++ /dev/null @@ -1,228 +0,0 @@ -<#assign model=resource.model> -/** - * 资源类(name:${resource.name}, code:${resource.code}, version:${resource.version}) - * @author auto generated by engine - */ -class ${CodeReplacer.className(resource.code,resource.version)} { - private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(resource.code,resource.version)}.class); - - /** - * 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) - * @param map 输入参数封装器 - * @return 执行结果 - */ - public static ResourceResult execute(Map map) throws Exception{ - return execute(map["executor"],map["subModelCode"],map["argument"]); - } - - <#-- 执行方法(Map作为输入参数) --> - /** - * 执行方法 - * @param executor 执行器对象 - * @param subModelCode 子模型代码 - * @param data 输入参数 - * @return 执行结果 - */ - public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{ - if(log.isDebugEnabled()){log.debug("开始执行模型 : ${CodeReplacer.className(resource.code,resource.version)}");} - if(data instanceof Map){ - if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(data));} - }else if(data instanceof String){ - if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);} - } - - <#if $wrapper.isExecuteTestCase> - <#else> - <#list ($wrapper.libs)! as lib> - if(log.isDebugEnabled()){log.debug("初始化指标库 : ${lib.name}_V${lib.version}");} - ${CodeReplacer.className(lib.code,lib.version)} ${CodeReplacer.varName(lib.code,lib.version)} =new ${CodeReplacer.className(lib.code,lib.version)}(); - ${CodeReplacer.varName(lib.code,lib.version)}.convertArgument(data); - - - - //初始化模型参数 - if(log.isDebugEnabled()){log.debug("从 {} 初始化模型参数","java.lang.String"==data.class?"Json":"Map");} - Argument argument =Argument.convertArgument(data); - - //输入参数合法性检查 - ValidateResult validateResult =new ValidateResult(); - - <#if $wrapper.isExecuteTestCase> - <#else> - //输入参数合法性检查(指标库) - <#list ($wrapper.libs)! as lib> - if(log.isDebugEnabled()){log.debug("开始检查输入参数数据合法性(指标库: ${lib.name}_V${lib.version})");} - ${CodeReplacer.varName(lib.code,lib.version)}.validate(validateResult); - if(validateResult.hasError()){ - if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} - ResourceResult result =new ResourceResult(); - result.setValidateResult(validateResult); - return result; - } - if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} - - - //输入参数合法性检查(模型) - if(log.isDebugEnabled()){log.debug("开始检查模型输入参数数据合法性");} - argument.validate(validateResult); - if(validateResult.hasError()){ - if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} - ResourceResult result =new ResourceResult(); - result.setValidateResult(validateResult); - return result; - } - if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} - - <#if $wrapper.isExecuteTestCase> - <#else> - //执行指标库 - <#list ($wrapper.libs)! as lib> - if(log.isDebugEnabled()){log.debug("开始执行指标库: ${lib.name}_V${lib.version}");} - ${CodeReplacer.varName(lib.code,lib.version)}.execute(); - - - - <#if $wrapper.isExecuteTestCase> - <#else> - //合并指标库指标 - if(log.isDebugEnabled()){log.debug("开始合并指标库指标");} - Map indicatorLibs =new HashMap(); - <#list ($wrapper.libs)! as lib> - indicatorLibs.put("${CodeReplacer.varName(lib.code,lib.version)}",${CodeReplacer.varName(lib.code,lib.version)}); - - argument.mergeParameterValueFromIndicatorLib(indicatorLibs); - if(log.isDebugEnabled()){log.debug("显示合并后输入参数:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(argument));} - - - //执行模型 - if(subModelCode){ - subModelCode =CodeReplacer.methodName(subModelCode); - "${r'${subModelCode}'}"(executor,argument);//调用子模型 - }else{ - ${CodeReplacer.methodName(model.code)}(executor,argument);//调用顶级模型(${model.name}) - } - - //返回结果 - ResourceResult result =argument.toResult(); - if(log.isDebugEnabled()){log.debug("模型调用成功,返回结果:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(result));} - return result; - } - - //顶级模型(${model.fullName}) - private static void ${CodeReplacer.methodName(model.code)}(Executor executor,Argument argument){ - if(log.isDebugEnabled()){log.debug("开始调用顶级模型: {}","${model.name}");} - <#if (model.enable)!> - <#else> - if(log.isDebugEnabled()){log.debug("开始调用顶级模型: enable==false");} - return; - - <#if "DOWN_TOP"==(model.executeMode)!> - <#-- 模型的执行模式为:自下而上,首先执行子模型 --> - <#list (model.children)! as subModel> - ${CodeReplacer.methodName(subModel.code)}(executor,argument);//${subModel.name} - - - <#-- 处理顶级模型的中间值和结果值 --> - <#list (model.parameters)! as parameter> - <#if "INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!> - ${CodeReplacer.methodName(parameter.code)}(executor,argument);//${parameter.name},${parameter.type} - - - } - - <#-- 递归生成所有子模型执行方法 --> - <#list (model.children)! as subModel> - //子模型(${subModel.fullName}) - private static void ${CodeReplacer.methodName(subModel.code)}(Executor executor,Argument argument){ - if(log.isDebugEnabled()){log.debug("开始调用子模型: {}","${subModel.fullName}");} - <#if (subModel.enable)!> - <#else> - if(log.isDebugEnabled()){log.debug("开始调用子模型: enable==false");} - return; - - <#if "DOWN_TOP"==(subModel.executeMode)!> - <#-- 子模型的执行模式为:自下而上,首先执行子模型的子模型 --> - <#list (subModel.children)! as _subModel> - ${CodeReplacer.methodName(_subModel.code)}(executor,argument);//${_subModel.name} - - - <#-- 处理子模型的中间值和结果值 --> - <#list (subModel.getParameters())! as parameter> - <#if "INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!> - ${CodeReplacer.methodName(parameter.code)}(executor,argument);//${parameter.name},${parameter.type} - - - } - - <#include "/model/sub-model.ftl"/> - - <#-- 生成所有参数处理器方法 --> - - <#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> - <#if ("INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!)> - //参数处理器, ${parameter.name}(${parameter.type}) - private static void ${CodeReplacer.methodName(parameter.code)}(Executor executor,Argument ${ExpressionReplacer.ARGUMENT_NAME}){ - if(log.isDebugEnabled()){log.debug(" {}","${parameter.name}(${parameter.type})");} - <#list (parameter.processors)! as processor><#-- 循环将每个处理器转换成 java 语句 --> - <#if (processor.enable)!> - <#if "OBJECT_PROPERTIES"==(processor.type)!> - <#include "/processor/OBJECT_PROPERTIES.ftl"/> - <#elseif "OPTION_VALUE"==(processor.type)!> - <#include "/processor/OPTION_VALUE.ftl"/> - <#elseif "MATH_FORMULA"==(processor.type)!> - <#include "/processor/MATH_FORMULA.ftl"/> - <#elseif "ARITHMETIC"==(processor.type)!> - <#include "/processor/ARITHMETIC.ftl"/> - <#elseif "TERNARY"==(processor.type)!> - <#include "/processor/TERNARY.ftl"/> - <#elseif "WHEN_THEN"==(processor.type)!> - <#include "/processor/WHEN_THEN.ftl"/> - <#elseif "RULE"==(processor.type)!> - <#include "/processor/RULE.ftl"/> - <#elseif "SINGLE_RULE"==(processor.type)!> - <#include "/processor/SINGLE_RULE.ftl"/> - <#elseif "NUMBER_RANGE"==(processor.type)!> - <#include "/processor/NUMBER_RANGE.ftl"/> - <#elseif "CONDITION_RANGE"==(processor.type)!> - <#include "/processor/CONDITION_RANGE.ftl"/> - <#elseif "DECISION_TABLE_2C"==(processor.type)!> - <#include "/processor/DECISION_TABLE_2C.ftl"/> - <#elseif "DECISION_TABLE"==(processor.type)!> - <#include "/processor/DECISION_TABLE.ftl"/> - <#elseif "DECISION_TREE"==(processor.type)!> - <#include "/processor/DECISION_TREE.ftl"/> - <#elseif "EXECUTION_FLOW"==(processor.type)!> - <#include "/processor/EXECUTION_FLOW.ftl"/> - <#elseif "PMML"==(processor.type)!> - <#include "/processor/PMML.ftl"/> - <#elseif "GROOVY_SCRIPT"==(processor.type)!> - <#include "/processor/GROOVY_SCRIPT.ftl"/> - <#elseif "SQL"==(processor.type)!> - <#include "/processor/SQL.ftl"/> - - - - if(log.isDebugEnabled()){log.debug(" 参数结果值 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - } - - - - - <#-- 决策树函数 --> - <#include "/processor/DECISION_TREE_FUNCTION.ftl"/> - - <#-- 执行流函数 --> - <#include "/processor/EXECUTION_FLOW_FUNCTION.ftl"/> -} - -<#-- 参数类 --> -<#include "/model/argument.ftl"/> - -<#-- 库类 --> -<#include "/lib/lib.ftl"/> - -<#-- 数据字典类 --> -<#include "/dictionary/dictionary.ftl"/> - -//执行并返回 -${CodeReplacer.className(resource.code)}_V${resource.version}.execute(INPUT_PARAMETER); diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/sub-model.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/sub-model.ftl deleted file mode 100644 index 81b31995..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/model/sub-model.ftl +++ /dev/null @@ -1,25 +0,0 @@ -<#list (subModel.children)! as subModel> - //子模型(${subModel.fullName}) - private static void ${subModel.code}(Executor executor,Argument argument){ - if(log.isDebugEnabled()){log.debug("开始调用子模型: {}","${subModel.fullName}");} - <#if (subModel.enable)!> - <#else> - if(log.isDebugEnabled()){log.debug("开始调用子模型: enable==false");} - return; - - <#if "DOWN_TOP"==(subModel.executeMode)!> - <#-- 子模型的执行模式为:自下而上,首先执行子模型的子模型 --> - <#list (subModel.children)! as _subModel> - ${_subModel.code}(executor,argument);//${_subModel.name} - - - <#-- 处理子模型的中间值和结果值 --> - <#list (subModel.getParameters())! as parameter> - <#if "INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!> - ${parameter.code}(executor,argument);//${parameter.name},${parameter.type} - - - } - - <#include "/model/sub-model.ftl"/> - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/ARITHMETIC.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/ARITHMETIC.ftl deleted file mode 100644 index b187a71b..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/ARITHMETIC.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //算数运算 - ${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${ExpressionReplacer.groovy(processor.arithmetic,parameter.valueType<#-- 算数运算,需要进行相关逻辑处理,即使参数类型为字符串也需要执行算数运算表达式 -->)};//${parameter.type}, ${parameter.name} - if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/CONDITION_RANGE.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/CONDITION_RANGE.ftl deleted file mode 100644 index d61b9e78..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/CONDITION_RANGE.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //条件分段函数 - ${ConditionRange.generateGroovyCode(parameter,processor)} - if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TABLE.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TABLE.ftl deleted file mode 100644 index afd56363..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TABLE.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //决策表 - ${DecisionTable.generateGroovyCode(parameter,processor)} - if(log.isDebugEnabled()){log.debug(" 决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TABLE_2C.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TABLE_2C.ftl deleted file mode 100644 index ac42970b..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TABLE_2C.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //简单决策表 - ${DecisionTable2C.generateGroovyCode(parameter,processor)} - if(log.isDebugEnabled()){log.debug(" 简单决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TREE.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TREE.ftl deleted file mode 100644 index 6a873b76..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TREE.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成) - ${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =Tree_${CodeReplacer.fieldName(parameter.code)}_${DecisionTree.parse(processor.decisionTree).id}(executor,${ExpressionReplacer.ARGUMENT_NAME}); - if(log.isDebugEnabled()){log.debug(" 决策树运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TREE_FUNCTION.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TREE_FUNCTION.ftl deleted file mode 100644 index cc765d79..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/DECISION_TREE_FUNCTION.ftl +++ /dev/null @@ -1,13 +0,0 @@ - /*-------------------------------------------------------------------------------* - * 决策树函数 * - *-------------------------------------------------------------------------------*/ -<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> - <#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)> - <#list (parameter.processors)! as processor> - <#if "DECISION_TREE"==processor.type> - //${parameter.name}(${parameter.type}) -${DecisionTree.generateGroovyCode(parameter,processor)} - - - - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/EXECUTION_FLOW.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/EXECUTION_FLOW.ftl deleted file mode 100644 index 70f67752..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/EXECUTION_FLOW.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //执行流(此处只是入口,真正的执行流计算逻辑在后面通过一系列方法完成) - Flow_${CodeReplacer.fieldName(parameter.code)}_${ExecutionFlow.parse(processor.executionFlow).id}(executor,${ExpressionReplacer.ARGUMENT_NAME}); - if(log.isDebugEnabled()){log.debug(" 执行流运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/EXECUTION_FLOW_FUNCTION.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/EXECUTION_FLOW_FUNCTION.ftl deleted file mode 100644 index 70cbd867..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/EXECUTION_FLOW_FUNCTION.ftl +++ /dev/null @@ -1,13 +0,0 @@ - /*-------------------------------------------------------------------------------* - * 执行流函数 * - *-------------------------------------------------------------------------------*/ -<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> - <#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)> - <#list (parameter.processors)! as processor> - <#if "EXECUTION_FLOW"==processor.type> - //${parameter.name}(${parameter.type}) -${ExecutionFlow.generateGroovyCode(parameter,processor)} - - - - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/GROOVY_SCRIPT.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/GROOVY_SCRIPT.ftl deleted file mode 100644 index 62637aa0..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/GROOVY_SCRIPT.ftl +++ /dev/null @@ -1,3 +0,0 @@ -<#if processor.groovyScript??> -${ExpressionReplacer.groovy(processor.groovyScript,null)} - diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/MATH_FORMULA.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/MATH_FORMULA.ftl deleted file mode 100644 index 2cd23cee..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/MATH_FORMULA.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //数学公式 - ${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${MathFormula.generateGroovyCode(parameter,processor)}; - if(log.isDebugEnabled()){log.debug(" 数学公式运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/NUMBER_RANGE.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/NUMBER_RANGE.ftl deleted file mode 100644 index 02b92a41..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/NUMBER_RANGE.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //数值分段函数 - ${NumberRange.generateGroovyCode(parameter,processor)} - if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/OBJECT_PROPERTIES.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/OBJECT_PROPERTIES.ftl deleted file mode 100644 index fa4ef3cc..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/OBJECT_PROPERTIES.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //对象属性函数 - ${ObjectProperty.generateGroovyCode(parameter,processor)} - if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/OPTION_VALUE.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/OPTION_VALUE.ftl deleted file mode 100644 index 15e866e2..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/OPTION_VALUE.ftl +++ /dev/null @@ -1,34 +0,0 @@ - //选项值运算 -<#assign optionParameter=model.getParameterByOptionParameterCode(processor.optionCode)> -<#if optionParameter??> - if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}!=null){ - <#list model.getParameterOptionsByOptionParameterCode(processor.optionCode) as option> - <#if option_index==0> - <#if optionParameter.valueType=='java.lang.String'> - if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}=="""${option.inputValue}"""){ - <#else> - if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}==${option.inputValue}){ - - <#else> - <#if optionParameter.valueType=='java.lang.String'> - }else if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}=="""${option.inputValue}"""){ - <#else> - }else if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}==${option.inputValue}){ - - - <#if parameter.valueType=='java.lang.String'> - ${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} ="""${option.value}"""; - if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - <#else> - ${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${option.value}; - if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - - - }else{ - if(log.isDebugEnabled()){log.debug(" !!!未匹配到选项列表,选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - } - }else{ - if(log.isDebugEnabled()){log.debug(" !!!未提供选项输入值,选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - } - - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/PMML.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/PMML.ftl deleted file mode 100644 index f60f6669..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/PMML.ftl +++ /dev/null @@ -1,3 +0,0 @@ -<#if processor.pmml??> - arg.${CodeReplacer.fieldName(parameter.code)} =JpmmlEvaluator.evaluate('${parameter.id}_${processor.id}','''${processor.pmml}''',arg.toMap()); - diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/RULE.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/RULE.ftl deleted file mode 100644 index c91b7048..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/RULE.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //规则运算 -${Rule.generateGroovyCode(parameter,processor)} - if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/SINGLE_RULE.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/SINGLE_RULE.ftl deleted file mode 100644 index e0e1b549..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/SINGLE_RULE.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //单规则运算 -${SingleRule.generateGroovyCode(parameter,processor)} - if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/SQL.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/SQL.ftl deleted file mode 100644 index f454710e..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/SQL.ftl +++ /dev/null @@ -1,17 +0,0 @@ - //SQL 运算 -<#if processor.sqlDatasourceName??> - javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDataSource('${processor.sqlDatasourceName}'); -<#else> - javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDefaultDataSource(); - - String sql =${ExpressionReplacer.groovy("\n"+processor.sql,"java.lang.String")}; -<#if processor.sql??> - ESql.withInstance(ds){ db-> - db.query(sql) { rs -> - if (rs.next()) { -${SqlFieldMapping.generateGroovyCode(parameter,processor)} - } - } - } - - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/TERNARY.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/TERNARY.ftl deleted file mode 100644 index 1e46ea04..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/TERNARY.ftl +++ /dev/null @@ -1,4 +0,0 @@ - //三元运算 - ${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =(${ExpressionReplacer.groovy(processor.ternaryCondition,null)}) ? (${ExpressionReplacer.groovy(processor.ternaryTrue,parameter.valueType)}) : (${ExpressionReplacer.groovy(processor.ternaryFalse,parameter.valueType)}); - if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/WHEN_THEN.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/WHEN_THEN.ftl deleted file mode 100644 index 3938e50a..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/processor/WHEN_THEN.ftl +++ /dev/null @@ -1,12 +0,0 @@ - //WhenThen 运算 - if(${ExpressionReplacer.groovy(processor.when,null)}){ - ${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${ExpressionReplacer.groovy(processor.then,parameter.valueType)}; - if(log.isDebugEnabled()){log.debug(" WhenThen 运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - <#-- 如果是短路操作,直接结束处理 --> - <#if processor.isWhenThenShorted> - if(log.isDebugEnabled()){log.debug(" WhenThen 短路!!!");} - if(log.isDebugEnabled()){log.debug(" 参数结果值 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} - return; - - } - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/resource_groovy.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/resource_groovy.ftl deleted file mode 100644 index e8dd5c4d..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/resource_groovy.ftl +++ /dev/null @@ -1,11 +0,0 @@ -<#assign resource=$wrapper.resource> -//外部引入------------------------------------------------------- -<#if resource.imports??> -${resource.imports} - - -<#if resource.type=="MODEL"> - <#include "/model/model.ftl"/> -<#elseif resource.type=="SCORE_CARD"> - <#include "/scorecard/score_card.ftl"/> - \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/scorecard/argument.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/scorecard/argument.ftl deleted file mode 100644 index d7b5baa6..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/scorecard/argument.ftl +++ /dev/null @@ -1,89 +0,0 @@ -/********************************************************************************** - * 评分卡参数类 * - **********************************************************************************/ -@JsonIgnoreProperties(ignoreUnknown=true) -class Argument{ -<#list (resource.scoreCardVars)! as scoreCardVar> - <#if 'NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_VALUE'==(scoreCardVar.type)!> - BigDecimal ${CodeReplacer.fieldName(scoreCardVar.code)};//${scoreCardVar.name}, ${scoreCardVar.type} - <#elseif 'OPTION'==(scoreCardVar.type)! || 'INDICATOR_OPTION'==(scoreCardVar.type)!> - String ${CodeReplacer.fieldName(scoreCardVar.code)};//${scoreCardVar.name}, ${scoreCardVar.type} - - - -<#list (resource.scoreCardVars)! as scoreCardVar> - BigDecimal R_${scoreCardVar.code};//${scoreCardVar.name}得分, OUT - - - /* 最终得分 -------------------------------*/ - BigDecimal _SCORE_;//最终得分 - - <#-- 参数转换(Map) --> - public static Argument convertArgument(Map map){ - if(map!=null){ - Argument argument =new Argument(); - - Object obj =null; - <#list (resource.scoreCardVars)! as scoreCardVar> - <#if 'NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_VALUE'==(scoreCardVar.type)!> - obj =DataTypeConvertor.convert(map.get("${scoreCardVar.code}"),BigDecimal.class);if(obj!=null){argument.${CodeReplacer.fieldName(scoreCardVar.code)} =obj;}//${scoreCardVar.name} - <#elseif 'OPTION'==(scoreCardVar.type)! || 'INDICATOR_OPTION'==(scoreCardVar.type)!> - obj =DataTypeConvertor.convert(map.get("${scoreCardVar.code}"),String.class);if(obj!=null){argument.${CodeReplacer.fieldName(scoreCardVar.code)} =obj;}//${scoreCardVar.name} - - - return argument; - } - return null; - } - - <#-- 参数转换(json) --> - public static Argument convertArgument(String json){ - if(json!=null && !"".equals(json.trim())){ - return JacksonObjectMapper.getDefaultObjectMapper().readValue(json, Argument.class); - } - return null; - } - - public void validate(ValidateResult result) { - - } - - public void mergeParameterValueFromIndicatorLib(Map libs){ - <#list (resource.scoreCardVars)! as scoreCardVar> - <#if 'INDICATOR_OPTION'==(scoreCardVar.type)! || 'INDICATOR_NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_VALUE'==(scoreCardVar.type)!> - <#-- 如果直接给模型参数(类型为指标)设置过非空值,则直接采用设置过的值,否则采用指标库计算结果值 --> - <#if $wrapper.isExecuteTestCase> - if(this.${CodeReplacer.fieldName(scoreCardVar.code)}==null){this.${CodeReplacer.fieldName(scoreCardVar.code)} =libs.get("${scoreCardVar.libCode}_${scoreCardVar.libVersion}").${CodeReplacer.fieldName(scoreCardVar.indicatorCode)};}//${scoreCardVar.name} - <#else> - this.${CodeReplacer.fieldName(scoreCardVar.code)} =libs.get("${scoreCardVar.libCode}_${scoreCardVar.libVersion}").${CodeReplacer.fieldName(scoreCardVar.indicatorCode)};//${scoreCardVar.name} - - - - } - - public ResourceResult toResult(){ - ResourceResult resourceResult =new ResourceResult(); - - <#list (resource.scoreCardVars)! as scoreCardVar> - resourceResult.addParameterResult(new ParameterResult("R_${scoreCardVar.code}","""${scoreCardVar.name}""",ParameterType.OUT,"java.math.BigDecimal",this.R_${scoreCardVar.code}==null?null:this.R_${scoreCardVar.code}.toString())); - - - resourceResult.addParameterResult(new ParameterResult("_SCORE_","最终得分",ParameterType.OUT,"java.math.BigDecimal",this._SCORE_==null?null:this._SCORE_.toString())); - return resourceResult; - } - - public Map toMap(){ - Map map =new HashMap(); - - <#list (resource.scoreCardVars)! as scoreCardVar> - map.put("${scoreCardVar.code}",this.${scoreCardVar.code}); - - - <#list (resource.scoreCardVars)! as scoreCardVar> - map.put("R_${scoreCardVar.code}",this.R_${scoreCardVar.code}); - - - map.put("_SCORE_",this._SCORE_); - return map; - } -} \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/scorecard/score_card.ftl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/scorecard/score_card.ftl deleted file mode 100644 index 8d9c8cc0..00000000 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/groovy/scorecard/score_card.ftl +++ /dev/null @@ -1,147 +0,0 @@ -/** - * 资源类(name:${resource.name}, code:${resource.code}, version:${resource.version}) - * ${(resource.description)!} - * @author auto generated by engine - */ -class ${CodeReplacer.className(resource.code)}_V${resource.version}{ - private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(resource.code)}_V${resource.version}.class); - - /** - * 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) - * @param map 输入参数封装器 - * @return 执行结果 - */ - public static ResourceResult execute(Map map) throws Exception{ - return execute(map["executor"],map["subModelCode"],map["argument"]); - } - - <#-- 执行方法(Map作为输入参数) --> - /** - * 执行方法 - * @param executor 执行器对象 - * @param subModelCode 子模型代码 - * @param data 输入参数 - * @return 执行结果 - */ - public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{ - if(log.isDebugEnabled()){log.debug("开始执行评分卡 : ${resource.name}_${resource.version}");} - if(data instanceof Map){ - if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(data));} - }else if(data instanceof String){ - if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);} - } - - <#list ($wrapper.libs)! as lib> - //初始化指标库[name:${lib.name}, code:${lib.code}, version:${lib.version}] - if(log.isDebugEnabled()){log.debug("初始化指标库 : ${lib.name}_${lib.version}");} - ${CodeReplacer.className(lib.code,lib.version)} ${CodeReplacer.varName(lib.code,lib.version)} =new ${CodeReplacer.className(lib.code,lib.version)}(); - ${CodeReplacer.varName(lib.code,lib.version)}.convertArgument(data); - - - //初始化评分卡变量 - if(log.isDebugEnabled()){log.debug("初始化评分卡变量");} - Argument argument =Argument.convertArgument(data); - - //输入参数合法性检查(指标库) - ValidateResult validateResult =new ValidateResult(); - <#list ($wrapper.libs)! as lib> - if(log.isDebugEnabled()){log.debug("开始检查输入参数数据合法性(指标库: ${lib.name}_${lib.version})");} - ${CodeReplacer.varName(lib.code,lib.version)}.validate(validateResult); - if(validateResult.hasError()){ - if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} - ResourceResult result =new ResourceResult(); - result.setValidateResult(validateResult); - return result; - } - if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} - - - //输入参数合法性检查(评分卡) - if(log.isDebugEnabled()){log.debug("开始检查评分卡输入参数数据合法性");} - argument.validate(validateResult); - if(validateResult.hasError()){ - if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} - ResourceResult result =new ResourceResult(); - result.setValidateResult(validateResult); - return result; - } - if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} - - //执行指标库 - <#if $wrapper.isExecuteTestCase> - <#else> - <#list ($wrapper.libs)! as lib> - if(log.isDebugEnabled()){log.debug("开始执行指标库: ${lib.name}_${lib.version}");} - ${CodeReplacer.varName(lib.code,lib.version)}.execute(); - - - - //合并指标库指标 - if(log.isDebugEnabled()){log.debug("开始合并指标库指标");} - Map indicatorLibs =new HashMap(); - <#list ($wrapper.libs)! as lib> - indicatorLibs.put("${lib.code}_${lib.version}",${CodeReplacer.varName(lib.code,lib.version)}); - - argument.mergeParameterValueFromIndicatorLib(indicatorLibs); - if(log.isDebugEnabled()){log.debug("显示合并后输入参数:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(argument));} - - //调用评分卡 - ${CodeReplacer.fieldName(resource.code)}(executor,argument);//调用评分卡(${resource.name}) - - //返回结果 - ResourceResult result =argument.toResult(); - if(log.isDebugEnabled()){log.debug("评分卡调用成功,返回结果:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(result));} - return result; - } - - //${resource.name} - public static void ${CodeReplacer.fieldName(resource.code)}(Executor executor,Argument ${ExpressionReplacer.ARGUMENT_NAME}){ - if(log.isDebugEnabled()){log.debug("开始调用评分卡: {}","${resource.name}");} - <#list (resource.scoreCardVars)! as scoreCardVar> - //${scoreCardVar.name} - ${CodeReplacer.fieldName(scoreCardVar.code)}(executor,${ExpressionReplacer.ARGUMENT_NAME}); - - - //计算最终得分 - ${ExpressionReplacer.ARGUMENT_NAME}._SCORE_ =0; - <#list (resource.scoreCardVars)! as scoreCardVar> - ${ExpressionReplacer.ARGUMENT_NAME}._SCORE_ +=${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code}==null?0:${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code}; - - if(log.isDebugEnabled()){log.debug("评分卡结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}._SCORE_);} - } - - <#list (resource.scoreCardVars)! as scoreCardVar> - //计算评分卡变量得分(${scoreCardVar.name}) - public static void ${CodeReplacer.fieldName(scoreCardVar.code)}(Executor executor,Argument arg){ - <#if "OPTION"==(scoreCardVar.type)! || "INDICATOR_OPTION"==(scoreCardVar.type)!> - //选项 - if(log.isDebugEnabled()){log.debug(" {}","${scoreCardVar.name}(OUT)");} - ${Option.generateGroovyCode(scoreCardVar)} - if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code});} - <#elseif "NUMBER_RANGE"==(scoreCardVar.type)! || "INDICATOR_NUMBER_RANGE"==(scoreCardVar.type)!> - //数值分段函数 - if(log.isDebugEnabled()){log.debug(" {}","${scoreCardVar.name}(OUT)");} - ${NumberRange.generateGroovyCode(scoreCardVar)} - if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code});} - <#elseif "INDICATOR_VALUE"==(scoreCardVar.type)!> - //指标值 - if(log.isDebugEnabled()){log.debug(" {}","${scoreCardVar.name}(OUT)");} - ${ExpressionReplacer.ARGUMENT_NAME}.R_${CodeReplacer.fieldName(scoreCardVar.code)} =${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(scoreCardVar.code)}; - if(log.isDebugEnabled()){log.debug(" 指标值运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.R_${CodeReplacer.fieldName(scoreCardVar.code)});} - - } - - -} - -<#-- 参数类 --> -<#include "/scorecard/argument.ftl"/> - -<#-- 库类 --> -<#include "/lib/lib.ftl"/> - -<#-- 数据字典类 --> -<#include "/dictionary/dictionary.ftl"/> - -//执行并返回 -${CodeReplacer.className(resource.code)}_V${resource.version}.execute(INPUT_PARAMETER); diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl index 553a2388..8f633187 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/lib.tpl @@ -4,11 +4,11 @@ ####################################### ### 模版函数 ####################################### -#include("/io/sc/engine/rule/core/code/template/dictionary_render.tpl") -#include("/io/sc/engine/rule/core/code/template/functions_render.tpl") +#include("/io/sc/engine/rule/core/code/template/package_render.tpl") #include("/io/sc/engine/rule/core/code/template/import_render.tpl") +#include("/io/sc/engine/rule/core/code/template/functions_render.tpl") +#include("/io/sc/engine/rule/core/code/template/dictionary_render.tpl") #include("/io/sc/engine/rule/core/code/template/lib_render.tpl") -#include("/io/sc/engine/rule/core/code/template/package_render.tpl") #@renderPackage(packageName) diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl index 28086574..9d058241 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl @@ -6,14 +6,14 @@ ####################################### ### 模版函数 ####################################### +#include("/io/sc/engine/rule/core/code/template/package_render.tpl") +#include("/io/sc/engine/rule/core/code/template/import_render.tpl") +#include("/io/sc/engine/rule/core/code/template/functions_render.tpl") +#include("/io/sc/engine/rule/core/code/template/parameter_render.tpl") +#include("/io/sc/engine/rule/core/code/template/model_render.tpl") #include("/io/sc/engine/rule/core/code/template/argument_render.tpl") #include("/io/sc/engine/rule/core/code/template/dictionary_render.tpl") -#include("/io/sc/engine/rule/core/code/template/functions_render.tpl") -#include("/io/sc/engine/rule/core/code/template/import_render.tpl") #include("/io/sc/engine/rule/core/code/template/lib_render.tpl") -#include("/io/sc/engine/rule/core/code/template/model_render.tpl") -#include("/io/sc/engine/rule/core/code/template/package_render.tpl") -#include("/io/sc/engine/rule/core/code/template/parameter_render.tpl") #@renderPackage(packageName) @@ -133,6 +133,29 @@ class #(className(resource.code,resource.version)) { } #@renderModel(model) + + ### 决策树函数 + #for(parameter : model.allParameters) + #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) + #for(processor : parameter.processors) + #if("DECISION_TREE"==processor.type.toString()) + //决策树函数: #(parameter.name)(#(parameter.type)) + #(DecisionTree.groovy(parameter,processor)) + #end + #end + #end + #end + ### 执行流函数 + #for(parameter : model.allParameters) + #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) + #for(processor : parameter.processors) + #if("EXECUTION_FLOW"==processor.type.toString()) + //执行流函数: #(parameter.name)(#(parameter.type)) + #(tabs(ExecutionFlow.groovy(parameter,processor),1)) + #end + #end + #end + #end } //****************************************************************************** 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 484886a6..03a5d341 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 @@ -35,21 +35,9 @@ import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt; import static io.sc.engine.rule.core.function.ArithmeticFunction.root; import static io.sc.engine.rule.core.function.ArithmeticFunction.sum; import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing; -import static io.sc.engine.rule.core.function.CollectionFunction.hasElements; -import static io.sc.engine.rule.core.function.CollectionFunction.collectionSize; -import static io.sc.engine.rule.core.function.CollectionFunction.collectionMax; -import static io.sc.engine.rule.core.function.CollectionFunction.collectionMin; import static io.sc.engine.rule.core.function.DateFunction.now; -import static io.sc.engine.rule.core.function.DateFunction.formatDate; -import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm_ss_SSS; -import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm_ss; -import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm; -import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH; -import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd; import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd; -import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM; -import static io.sc.engine.rule.core.function.DateFunction.yyyyMM; -import static io.sc.engine.rule.core.function.DateFunction.yyyy; +import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd; import static io.sc.engine.rule.core.function.NormalDistributionFunction.G; import static io.sc.engine.rule.core.function.NormalDistributionFunction.iG; import static io.sc.engine.rule.core.function.SpecialValueFunction.infinite; @@ -68,6 +56,7 @@ import static io.sc.engine.rule.core.function.StringFunction.lowerCase; import static io.sc.engine.rule.core.function.StringFunction.startsWith; import static io.sc.engine.rule.core.function.StringFunction.trim; import static io.sc.engine.rule.core.function.StringFunction.upperCase; +import static io.sc.platform.util.CollectionUtil.hasElements; import static io.sc.platform.util.DateUtil.yearsBetween; import static io.sc.platform.util.DateUtil.monthsBetween; import static io.sc.platform.util.DateUtil.weeksBetween; @@ -75,13 +64,6 @@ import static io.sc.platform.util.DateUtil.daysBetween; import static io.sc.platform.util.DateUtil.hoursBetween; import static io.sc.platform.util.DateUtil.minutesBetween; import static io.sc.platform.util.DateUtil.secondsBetween; -import static io.sc.platform.util.DateUtil.plusYears; -import static io.sc.platform.util.DateUtil.plusMonths; -import static io.sc.platform.util.DateUtil.plusWeeks; -import static io.sc.platform.util.DateUtil.plusDays; -import static io.sc.platform.util.DateUtil.plusHours; -import static io.sc.platform.util.DateUtil.plusMinutes; -import static io.sc.platform.util.DateUtil.plusSeconds; import static io.sc.platform.util.NumberUtil.comma; import static io.sc.platform.util.NumberUtil.decimal; import static io.sc.platform.util.NumberUtil.money; diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl index 084d83d7..d821e3d3 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/lib_render.tpl @@ -6,6 +6,7 @@ class #(className(lib.code,lib.version)) { //通过输入参数构建指标库对象 public void convertArgument(Map map){ + #(className(lib.code,lib.version)) arg =this; #(tabs(IndicatorGenerator.generateConvertorFromMap(lib.indicators,"this"),2)) } diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl index 53015736..b7b6986e 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/parameter_render.tpl @@ -100,26 +100,4 @@ #end #end - ### 决策树函数 - #for(parameter : model.allParameters) - #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) - #for(processor : parameter.processors) - #if("DECISION_TREE"==processor.type.toString()) - //决策树函数: #(parameter.name)(#(parameter.type)) - #(tabs(DecisionTree.groovy(parameter,processor),1)) - #end - #end - #end - #end - ### 执行流函数 - #for(parameter : model.allParameters) - #if("INTERMEDIATE"==parameter.type.toString() || "OUT"==parameter.type.toString()) - #for(processor : parameter.processors) - #if("EXECUTION_FLOW"==processor.type.toString()) - //执行流函数: #(parameter.name)(#(parameter.type)) - #(tabs(ExecutionFlow.groovy(parameter,processor),1)) - #end - #end - #end - #end #end \ No newline at end of file diff --git a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl index e69de29b..2c139ef3 100644 --- a/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl +++ b/io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/processor/http_request.tpl @@ -0,0 +1 @@ +#(tabs(HttpRequest.groovy(parameter,processor),2)) \ No newline at end of file diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json index a4e22895..43d807f8 100644 --- a/io.sc.engine.rule.frontend/package.json +++ b/io.sc.engine.rule.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.rule.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts b/io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts index b8297a63..65785904 100644 --- a/io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts +++ b/io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts @@ -4,7 +4,9 @@ import { Processor } from '../Processor'; import { PlaceHolder } from '@/utils/PlaceHolder'; class HttpRequest extends Processor { - #HttpMethodTypeEnum: any; + #editorForm: any; + #httpResponseBodyRef = ref(undefined); + #httpMethodTypeEnum: any; #httpMethodTypeOptionsRef = ref([]); #HttpAuthorizationTypeEnum: any; #httpAuthorizationTypeOptionsRef = ref([]); @@ -13,12 +15,6 @@ class HttpRequest extends Processor { super(targetType, context); this.PROCESSOR_TYPE = 'HTTP_REQUEST'; this.EDITOR_DIALOG_WIDTH = 1024; - EnumTools.fetch(['io.sc.engine.rule.core.enums.HttpMethodType', 'io.sc.engine.rule.core.enums.HttpAuthorizationType']).then((value) => { - this.#HttpMethodTypeEnum = value.HttpMethodType; - this.#httpMethodTypeOptionsRef = Options.enum(this.#HttpMethodTypeEnum); - this.#HttpAuthorizationTypeEnum = value.HttpAuthorizationType; - this.#httpAuthorizationTypeOptionsRef = Options.enum(this.#HttpAuthorizationTypeEnum); - }); } public getToolbarAction(): any { @@ -44,7 +40,7 @@ class HttpRequest extends Processor { public getEditorFields(): any { return [ { - colSpan: 3, + colSpan: 2, name: 'httpMethod', label: $t('re.processor.grid.entity.httpMethod'), type: 'w-select', @@ -55,16 +51,7 @@ class HttpRequest extends Processor { }, }, { - colSpan: 9, - name: 'httpUrl', - label: $t('re.processor.grid.entity.httpUrl'), - type: 'w-text', - showIf: (args: any) => { - return args.form.getFieldValue('type') === this.PROCESSOR_TYPE; - }, - }, - { - colSpan: 3, + colSpan: 2, name: 'httpAuthType', label: $t('re.processor.grid.entity.httpAuthType'), type: 'w-select', @@ -74,7 +61,7 @@ class HttpRequest extends Processor { }, }, { - colSpan: 3, + colSpan: 4, name: 'httpAuthApikey', label: $t('re.processor.grid.entity.httpAuthApikey'), type: 'w-text', @@ -83,7 +70,7 @@ class HttpRequest extends Processor { }, }, { - colSpan: 6, + colSpan: 4, name: 'httpAuthApiValue', label: $t('re.processor.grid.entity.httpAuthApiValue'), type: 'w-text', @@ -92,7 +79,7 @@ class HttpRequest extends Processor { }, }, { - colSpan: 3, + colSpan: 4, name: 'httpAuthBasicUsername', label: $t('re.processor.grid.entity.httpAuthBasicUsername'), type: 'w-text', @@ -101,7 +88,7 @@ class HttpRequest extends Processor { }, }, { - colSpan: 6, + colSpan: 4, name: 'httpAuthBasicPassword', label: $t('re.processor.grid.entity.httpAuthBasicPassword'), type: 'w-text', @@ -110,7 +97,7 @@ class HttpRequest extends Processor { }, }, { - colSpan: 9, + colSpan: 8, name: 'httpAuthBearerToken', label: $t('re.processor.grid.entity.httpAuthBearerToken'), type: 'w-text', @@ -119,14 +106,134 @@ class HttpRequest extends Processor { }, }, { - colSpan: 12, + colSpan: 6, + firstCol: true, + name: 'httpUrl', + label: $t('re.processor.grid.entity.httpUrl'), + type: 'w-code-mirror', + lang: 'javascript', + rows: 7, + toolbar: false, + placeholder: true, + lineWrap: true, + lineBreak: true, + lineHeight: '1.3rem', + fontSize: '0.75rem', + autoCompletion: this.autoCompletionManager.autoCompletion(), + showIf: (args: any) => { + return args.form.getFieldValue('type') === this.PROCESSOR_TYPE; + }, + }, + { + colSpan: 6, + name: 'urlParameterValues', + label: $t('re.processor.grid.entity.sqlParameterValues'), + showIf: (args: any) => { + return args.form.getFieldValue('type') === this.PROCESSOR_TYPE; + }, + type: 'w-grid', + height: 110, + title: $t('re.processor.grid.entity.sqlParameterValues'), + localMode: true, + autoFetchData: false, + dense: true, + dbClickOperation: 'edit', + dndMode: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + { + name: 'analyze', + label: $t('analyze'), + icon: 'bi-tag', + click: (args: any) => { + const sql = this.#editorForm.getFieldValue('httpUrl'); + const regex = /\$\{[\u0000-\uFFFF]+?\}/g; + const array: any[] = sql.match(regex); + const rows: any[] = []; + array.forEach((item) => { + rows.push({ name: item, value: '' }); + }); + const grid = this.#editorForm.getFieldComponent('urlParameterValues'); + grid.setLocalData(rows); + }, + }, + 'separator', + 'add', + 'edit', + [ + { + extend: 'remove', + click: (args: any) => { + const grid = args.grid.getEditorForm().getFieldComponent('urlParameterValues'); + grid.removeRows(args.selecteds); + }, + }, + { + extend: 'remove', + name: 'removeAll', + label: $t('deleteAll'), + click: (args: any) => { + const grid = args.grid.getEditorForm().getFieldComponent('urlParameterValues'); + grid.setLocalData([]); + }, + }, + ], + ], + columns: [ + { + width: '50%', + name: 'name', + label: $t('name'), + align: 'left', + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }, + { + width: '100%', + name: 'value', + label: $t('value'), + sortable: false, + }, + ], + editor: { + dialog: { + width: '600px', + }, + form: { + colsNum: 1, + fields: [ + { + name: 'name', + label: $t('name'), + type: 'w-code-mirror', + toolbar: false, + lang: 'java', + rows: 1, + placeholder: true, + autoCompletion: this.autoCompletionManager.autoCompletion(), + }, + { + name: 'value', + label: $t('value'), + type: 'w-text', + }, + ], + }, + }, + }, + { + colSpan: 6, name: 'httpRequestBody', label: $t('re.processor.grid.entity.httpRequestBody'), showIf: (args: any) => { return args.form.getFieldValue('type') === this.PROCESSOR_TYPE; }, type: 'w-code-mirror', - rows: 4, + rows: 7, toolbar: false, lineNumber: false, lang: 'json', @@ -136,6 +243,145 @@ class HttpRequest extends Processor { autoCompletion: this.autoCompletionManager.autoCompletion(), userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(), }, + { + colSpan: 6, + name: 'bodyParameterValues', + label: $t('re.processor.grid.entity.sqlParameterValues'), + showIf: (args: any) => { + return args.form.getFieldValue('type') === this.PROCESSOR_TYPE; + }, + type: 'w-grid', + height: 110, + title: $t('re.processor.grid.entity.sqlParameterValues'), + localMode: true, + autoFetchData: false, + dense: true, + dbClickOperation: 'edit', + dndMode: 'local', + pageable: false, + configButton: false, + toolbarConfigure: { noIcon: false }, + toolbarActions: [ + { + name: 'send', + label: $t('send'), + icon: 'bi-send', + click: (args: any) => { + const httpMethod = this.#editorForm.getFieldValue('httpMethod'); + const httpUrl = this.#editorForm.getFieldValue('httpUrl'); + const httpAuthType = this.#editorForm.getFieldValue('httpAuthType'); + const httpAuthApikey = this.#editorForm.getFieldValue('httpAuthApikey'); + const httpAuthApiValue = this.#editorForm.getFieldValue('httpAuthApiValue'); + const httpAuthBasicUsername = this.#editorForm.getFieldValue('httpAuthBasicUsername'); + const httpAuthBasicPassword = this.#editorForm.getFieldValue('httpAuthBasicPassword'); + const httpAuthBearerToken = this.#editorForm.getFieldValue('httpAuthBearerToken'); + const httpRequestBody = this.#editorForm.getFieldValue('httpRequestBody'); + + axios + .post(Environment.apiContextPath('/api/re/indicator/processor/sendWebRequest'), { + httpMethod, + httpUrl, + httpAuthType, + httpAuthApikey, + httpAuthApiValue, + httpAuthBasicUsername, + httpAuthBasicPassword, + httpAuthBearerToken, + httpRequestBody, + }) + .then((response) => { + const result = response.data; + if (result.successful) { + this.#httpResponseBodyRef.value = result.content; + } else { + this.#httpResponseBodyRef.value = result.status + ',' + result.error; + } + }); + }, + }, + 'separator', + { + name: 'analyze', + label: $t('analyze'), + icon: 'bi-tag', + click: (args: any) => { + const sql = this.#editorForm.getFieldValue('httpRequestBody'); + const regex = /\$\{[\u0000-\uFFFF]+?\}/g; + const array: any[] = sql.match(regex); + const rows: any[] = []; + array.forEach((item) => { + rows.push({ name: item, value: '' }); + }); + const grid = this.#editorForm.getFieldComponent('bodyParameterValues'); + grid.setLocalData(rows); + }, + }, + 'separator', + 'add', + 'edit', + [ + { + extend: 'remove', + click: (args: any) => { + const grid = args.grid.getEditorForm().getFieldComponent('bodyParameterValues'); + grid.removeRows(args.selecteds); + }, + }, + { + extend: 'remove', + name: 'removeAll', + label: $t('deleteAll'), + click: (args: any) => { + const grid = args.grid.getEditorForm().getFieldComponent('bodyParameterValues'); + grid.setLocalData([]); + }, + }, + ], + ], + columns: [ + { + width: '50%', + name: 'name', + label: $t('name'), + align: 'left', + sortable: false, + format: (value: any) => { + return PlaceHolder.replace(value); + }, + }, + { + width: '100%', + name: 'value', + label: $t('value'), + sortable: false, + }, + ], + editor: { + dialog: { + width: '600px', + }, + form: { + colsNum: 1, + fields: [ + { + name: 'name', + label: $t('name'), + type: 'w-code-mirror', + toolbar: false, + lang: 'java', + rows: 1, + placeholder: true, + autoCompletion: this.autoCompletionManager.autoCompletion(), + }, + { + name: 'value', + label: $t('value'), + type: 'w-text', + }, + ], + }, + }, + }, { colSpan: 12, name: 'httpResponseBody', @@ -145,11 +391,14 @@ class HttpRequest extends Processor { }, type: 'w-code-mirror', lang: 'json', - rows: 5, + rows: 4, + lineHeight: '1.3rem', + fontSize: '0.75rem', toolbar: false, lineNumber: false, lineWrap: false, lineBreak: true, + modelValue: this.#httpResponseBodyRef.value, }, { colSpan: 12, @@ -159,15 +408,19 @@ class HttpRequest extends Processor { return args.form.getFieldValue('type') === this.PROCESSOR_TYPE; }, type: 'w-code-mirror', - rows: 8, + rows: 5, toolbar: false, lineNumber: false, - lang: 'json', + lineHeight: '1.3rem', + fontSize: '0.75rem', + lang: 'java', lineWrap: false, lineBreak: true, placeholder: true, autoCompletion: this.autoCompletionManager.autoCompletion(), userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(), + defaultValue: + 'if(${response}.getSuccessful()){\n\t//def object =new groovy.xml.XmlParser().parse(${response}.getContent());\n\tdef object = new groovy.json.JsonSlurper().parseText(${response}.getContent());\n}', }, ]; } @@ -193,6 +446,14 @@ class HttpRequest extends Processor { args.grid.getEditorDialog().setWidth(this.EDITOR_DIALOG_WIDTH); this.initAutoCompletionManager(); this.initUserDefinedFunctionsManager(); + + this.#editorForm = args.grid.getEditorForm(); + EnumTools.fetch(['io.sc.engine.rule.core.enums.HttpMethodType', 'io.sc.engine.rule.core.enums.HttpAuthorizationType']).then((value) => { + this.#httpMethodTypeEnum = value.HttpMethodType; + this.#httpMethodTypeOptionsRef.value = Options.enum(this.#httpMethodTypeEnum); + this.#HttpAuthorizationTypeEnum = value.HttpAuthorizationType; + this.#httpAuthorizationTypeOptionsRef.value = Options.enum(this.#HttpAuthorizationTypeEnum); + }); } } 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 aa726222..453c581b 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 @@ -198,6 +198,7 @@ class Sql extends Processor { label: $t('execute'), icon: 'bi-caret-right', click: (args: any) => { + const datasourceName = this.#editorForm.getFieldValue('sqlDatasourceName'); const sql = this.#editorForm.getFieldValue('sql'); const grid = this.#editorForm.getFieldComponent('sqlParameterValues'); const sqlParameterValues = grid?.getRows(); @@ -209,6 +210,7 @@ class Sql extends Processor { } noErrorAxios .post(Environment.apiContextPath(url), { + datasourceName: datasourceName, sql: sql, sqlParameterValues: sqlParameterValues, }) @@ -302,8 +304,17 @@ class Sql extends Processor { { name: 'parameter', label: $t('parameterName'), - type: 'w-select', - options: this.#parameterOptionsRef.value, + //type: 'w-select', + //options: this.#parameterOptionsRef.value, + toolbar: false, + type: 'w-code-mirror', + lang: 'java', + rows: 1, + placeholder: true, + lineWrap: false, + lineBreak: false, + autoCompletion: this.autoCompletionManager.autoCompletion(), + userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(), }, { name: 'field', diff --git a/io.sc.engine.rule.frontend/webpack.config.mf.cjs b/io.sc.engine.rule.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.engine.rule.frontend/webpack.config.mf.cjs +++ b/io.sc.engine.rule.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/controller/ParameterAndValueTypeWebController.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/controller/ParameterAndValueTypeWebController.java index 99d39498..32468b95 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/controller/ParameterAndValueTypeWebController.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/controller/ParameterAndValueTypeWebController.java @@ -42,7 +42,7 @@ public class ParameterAndValueTypeWebController { } @GetMapping("findByDictionaryCodeAndVersion/{code}/{version}") - public ParameterAndValueType findByDictionaryCodeAndVersion(@PathVariable(name="code",required=true)String code, @PathVariable(name="version",required=true)Integer version,Locale locale) throws Exception{ + public ParameterAndValueType findByDictionaryCodeAndVersion(@PathVariable(name="code",required=true)String code, @PathVariable(name="version",required=false)Integer version,Locale locale) throws Exception{ return service.findByDictionaryCodeAndVersion(code,version,locale); } } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/controller/IndicatorProcessorWebController.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/controller/IndicatorProcessorWebController.java index 236db9cf..776fda0e 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/controller/IndicatorProcessorWebController.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/controller/IndicatorProcessorWebController.java @@ -1,5 +1,9 @@ package io.sc.engine.rule.server.lib.controller; +import io.sc.engine.rule.core.WebRequest; +import io.sc.engine.rule.core.WebResponse; +import io.sc.engine.rule.core.enums.HttpAuthorizationType; +import io.sc.engine.rule.core.enums.HttpMethodType; import io.sc.engine.rule.core.enums.ReplaceMode; import io.sc.engine.rule.server.common.service.ParameterAndValueTypeService; import io.sc.engine.rule.server.common.service.support.ParameterAndValueType; @@ -17,15 +21,22 @@ import io.sc.platform.mvc.controller.support.RestCrudController; import io.sc.platform.orm.entity.BaseEntity; import io.sc.platform.orm.service.support.QueryParameter; import io.sc.platform.orm.service.support.QueryResult; +import io.sc.platform.util.ObjectMapperUtil; +import okhttp3.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.RequestBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.time.Duration; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 指标处理器 Controller @@ -68,4 +79,9 @@ public class IndicatorProcessorWebController extends RestCrudController{ public List listObejctPropertiesByProcessorId(String processorId) throws Exception; public List autoMatch(AutoMatchObjectProperties autoMatchObjectProperties) throws Exception; - public SqlQueryResult executeSql(SqlQueryRequest request); + public SqlQueryResult executeSql(SqlQueryRequest request) throws Exception; + public WebResponse sendWebRequest(WebRequest webRequest) throws Exception; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java index 8142e2de..adbe7f40 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/IndicatorProcessorServiceImpl.java @@ -1,11 +1,15 @@ package io.sc.engine.rule.server.lib.service.impl; import com.fasterxml.jackson.core.type.TypeReference; +import io.sc.engine.rule.core.WebRequest; +import io.sc.engine.rule.core.WebResponse; import io.sc.engine.rule.core.enums.ReplaceMode; import io.sc.engine.rule.core.util.ExpressionReplacer; import io.sc.engine.rule.core.util.ValueTypeUtil; +import io.sc.engine.rule.core.util.WebRequestUtil; import io.sc.engine.rule.server.common.service.ParameterAndValueTypeService; import io.sc.engine.rule.server.common.service.support.ParameterAndValueType; +import io.sc.engine.rule.server.common.util.VariableCodeAndNameReplacer; import io.sc.engine.rule.server.dictionary.entity.DictionaryEntity; import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassDictionaryEntity; import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassFieldEntity; @@ -24,9 +28,9 @@ import io.sc.engine.rule.server.model.service.support.AutoMatchObjectProperties; import io.sc.engine.rule.server.model.service.support.ObjectProperty; import io.sc.engine.rule.server.model.support.processor.SqlQueryRequest; import io.sc.engine.rule.server.model.support.processor.SqlQueryResult; -import io.sc.engine.rule.server.common.util.VariableCodeAndNameReplacer; import io.sc.platform.core.response.ValidationErrorBuilder; import io.sc.platform.core.util.ValidatorUtil; +import io.sc.platform.jdbc.service.DatasourceService; import io.sc.platform.jdbc.util.SqlValidator; import io.sc.platform.orm.entity.support.EntityChangedEventType; import io.sc.platform.orm.service.impl.DaoServiceImpl; @@ -40,6 +44,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; @@ -49,6 +54,7 @@ public class IndicatorProcessorServiceImpl extends DaoServiceImpl mapping =request.getSqlParameterValueMap(); String replacedSql = ExpressionReplacer.replace(sql, mapping); - return jdbcTemplate.query(replacedSql, new ResultSetExtractor() { - @Override - public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { - return SqlQueryResult.from(rs); + if(StringUtils.hasText(request.getDatasourceName())){ + DataSource ds =datasourceService.getDatasource(request.getDatasourceName()); + if(ds!=null){ + JdbcTemplate jd =new JdbcTemplate(ds); + return jd.query(replacedSql, new ResultSetExtractor() { + @Override + public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { + return SqlQueryResult.from(rs); + } + }, new Object[]{}); } - },new Object[] {}); + }else { + return jdbcTemplate.query(replacedSql, new ResultSetExtractor() { + @Override + public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { + return SqlQueryResult.from(rs); + } + }, new Object[]{}); + } } } return null; } + + @Override + public WebResponse sendWebRequest(WebRequest webRequest) throws Exception { + return WebRequestUtil.sendWebRequest(webRequest); + } } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/HttpRequestParameterProcessorEntity.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/HttpRequestParameterProcessorEntity.java index f6ff8da9..bbe3d741 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/HttpRequestParameterProcessorEntity.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/HttpRequestParameterProcessorEntity.java @@ -55,6 +55,7 @@ public class HttpRequestParameterProcessorEntity extends ParameterProcessorEntit @Column(name="HTTP_PARAMS_") private String httpParams; + @Column(name="HTTP_REQUEST_BODY_") private String httpRequestBody; @@ -220,6 +221,20 @@ public class HttpRequestParameterProcessorEntity extends ParameterProcessorEntit result =true; } this.httpResponseMapping =replaced; + + replaced =parameterAndValueType.replace(this.httpUrl, mode); + replaced =(replaced==null?"":replaced); + if(!replaced.equals(this.httpUrl)) { + result =true; + } + this.httpUrl =replaced; + + replaced =parameterAndValueType.replace(this.httpRequestBody, mode); + replaced =(replaced==null?"":replaced); + if(!replaced.equals(this.httpRequestBody)) { + result =true; + } + this.httpRequestBody =replaced; return result; } } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterProcessorService.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterProcessorService.java index 3f63b063..33b67267 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterProcessorService.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/ParameterProcessorService.java @@ -28,5 +28,5 @@ public interface ParameterProcessorService extends DaoService listObejctPropertiesByProcessorId(String processorId) throws Exception; public List autoMatch(AutoMatchObjectProperties autoMatchObjectProperties) throws Exception; public void importFromCsv(String parameterId,String csvContent, String splitChar) throws Exception; - public SqlQueryResult executeSql(SqlQueryRequest request); + public SqlQueryResult executeSql(SqlQueryRequest request) throws Exception; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java index 90bf422c..707cf392 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java @@ -29,6 +29,7 @@ import io.sc.engine.rule.server.model.support.processor.SqlQueryResult; import io.sc.engine.rule.server.model.vo.ParameterProcessorVo; import io.sc.engine.rule.server.model.vo.processor.ObjectPropertiesParameterProcessorVo; import io.sc.engine.rule.server.common.util.VariableCodeAndNameReplacer; +import io.sc.platform.jdbc.service.DatasourceService; import io.sc.platform.jdbc.util.SqlValidator; import io.sc.platform.orm.entity.support.EntityChangedEventType; import io.sc.platform.orm.service.impl.DaoServiceImpl; @@ -44,6 +45,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import javax.sql.DataSource; import java.io.ByteArrayInputStream; import java.sql.ResultSet; import java.sql.SQLException; @@ -57,6 +59,7 @@ public class ParameterProcessorServiceImpl @Autowired private ParameterService parameterService; @Autowired private DictionaryService dictionaryService; @Autowired private ParameterAndValueTypeService parameterAndValueTypeService; + @Autowired private DatasourceService datasourceService; @Autowired private JdbcTemplate jdbcTemplate; @Override @@ -355,18 +358,31 @@ public class ParameterProcessorServiceImpl } } - public SqlQueryResult executeSql(SqlQueryRequest request) { + public SqlQueryResult executeSql(SqlQueryRequest request) throws Exception { if(request!=null) { String sql =request.getSql(); if(StringUtils.hasText(sql)) { Map mapping =request.getSqlParameterValueMap(); String replacedSql =ExpressionReplacer.replace(sql, mapping); - return jdbcTemplate.query(replacedSql, new ResultSetExtractor() { - @Override - public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { - return SqlQueryResult.from(rs); + if(StringUtils.hasText(request.getDatasourceName())){ + DataSource ds =datasourceService.getDatasource(request.getDatasourceName()); + if(ds!=null){ + JdbcTemplate jd =new JdbcTemplate(ds); + return jd.query(replacedSql, new ResultSetExtractor() { + @Override + public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { + return SqlQueryResult.from(rs); + } + }, new Object[]{}); } - },new Object[] {}); + }else { + return jdbcTemplate.query(replacedSql, new ResultSetExtractor() { + @Override + public SqlQueryResult extractData(ResultSet rs) throws SQLException, DataAccessException { + return SqlQueryResult.from(rs); + } + }, new Object[]{}); + } } } return null; diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/support/processor/SqlQueryRequest.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/support/processor/SqlQueryRequest.java index 69c72bf2..699deced 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/support/processor/SqlQueryRequest.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/support/processor/SqlQueryRequest.java @@ -8,6 +8,7 @@ import java.util.Map; import org.springframework.util.StringUtils; public class SqlQueryRequest { + private String datasourceName; private String sql; private List sqlParameterValues =new ArrayList(); @@ -22,7 +23,13 @@ public class SqlQueryRequest { } return null; } - + + public String getDatasourceName() { + return datasourceName; + } + public void setDatasourceName(String datasourceName) { + this.datasourceName = datasourceName; + } public String getSql() { return sql; } diff --git a/io.sc.engine.st.frontend/package.json b/io.sc.engine.st.frontend/package.json index 9347181e..90582eb3 100644 --- a/io.sc.engine.st.frontend/package.json +++ b/io.sc.engine.st.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.st.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.engine.st.frontend/webpack.config.mf.cjs b/io.sc.engine.st.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.engine.st.frontend/webpack.config.mf.cjs +++ b/io.sc.engine.st.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.ai.frontend/package.json b/io.sc.platform.ai.frontend/package.json index 4bbbb99a..2ba901df 100644 --- a/io.sc.platform.ai.frontend/package.json +++ b/io.sc.platform.ai.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.ai.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.ai.frontend/webpack.config.mf.cjs b/io.sc.platform.ai.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.ai.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.ai.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.core.frontend/.bin/sync.js b/io.sc.platform.core.frontend/.bin/sync.js index 938493b4..cd620a01 100644 --- a/io.sc.platform.core.frontend/.bin/sync.js +++ b/io.sc.platform.core.frontend/.bin/sync.js @@ -8,7 +8,7 @@ Object.defineProperty(exports, '__esModule', { value: true }); * 同步 platform-core 定义的前端项目配置 * 从 platform-core 库的 template-project 目录中复制前端项目文件到本地项目 */ -const { rm, cp, mergeJsonFile, parseJson, sortObject } = require('./util.js'); +const { mkdir, rm, cp, mergeJsonFile, parseJson, sortObject, isFileExisted } = require('./util.js'); const sync = () => { if (isFrontendProject()) { @@ -51,6 +51,13 @@ const syncFrontendProject = () => { const sourceDir = process.cwd() + '/node_modules/platform-core/template-project/'; const targetDir = process.cwd() + '/'; + if (!isFileExisted(targetDir + 'src/remote-components')) { + mkdir(targetDir + 'src/remote-components'); + } + if (!isFileExisted(targetDir + 'src/remote-components/remote-components.json')) { + cp(sourceDir + 'src/remote-components/remote-components.json', targetDir + 'src/remote-components/remote-components.json'); + } + cp(sourceDir + 'src/boostrap.ts', targetDir + 'src/boostrap.ts'); cp(sourceDir + '.browserslistrc', targetDir + '.browserslistrc'); cp(sourceDir + '.editorconfig', targetDir + '.editorconfig'); diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json index 779cd6fb..25556dd1 100644 --- a/io.sc.platform.core.frontend/package.json +++ b/io.sc.platform.core.frontend/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.2.65", + "version": "8.2.70", "description": "前端核心包,用于快速构建前端的脚手架", "//main": "库的主文件", "main": "dist/platform-core.js", diff --git a/io.sc.platform.core.frontend/src/components/index.ts b/io.sc.platform.core.frontend/src/components/index.ts index 2255b98d..06947387 100644 --- a/io.sc.platform.core.frontend/src/components/index.ts +++ b/io.sc.platform.core.frontend/src/components/index.ts @@ -2,7 +2,7 @@ * 此文件为自动生成文件,请勿修改 */ -import component_testcase_globalRoute from '@/views/testcase/global-route/GlobalRoute.vue'; +import component_testcase_remoteComponent from '@/views/testcase/remote-component/RemoteComponent.vue'; import component_testcase_openNoMenuRoute from '@/views/testcase/route/OpenNoMenuRoute.vue'; import component_testcase_noMenuRoute from '@/views/testcase/route/NoMenuRoute.vue'; import component_testcase_mathEditor from '@/views/testcase/math/MathEditor.vue'; @@ -24,7 +24,7 @@ import component_testcase_gridLayout from '@/views/likm/GridLayout.vue'; import component_testcase_likmTreeGrid from '@/views/likm/TreeGrid.vue'; const localComponents = { - 'component.testcase.globalRoute': component_testcase_globalRoute, + 'component.testcase.remoteComponent': component_testcase_remoteComponent, 'component.testcase.openNoMenuRoute': component_testcase_openNoMenuRoute, 'component.testcase.noMenuRoute': component_testcase_noMenuRoute, 'component.testcase.mathEditor': component_testcase_mathEditor, diff --git a/io.sc.platform.core.frontend/src/i18n/messages.json b/io.sc.platform.core.frontend/src/i18n/messages.json index fe95bf80..bae37506 100644 --- a/io.sc.platform.core.frontend/src/i18n/messages.json +++ b/io.sc.platform.core.frontend/src/i18n/messages.json @@ -1,5 +1,6 @@ { "menu.testcase": "Test Case", + "menu.testcase.remoteComponent": "Remote Component", "menu.testcase.openUrl": "Open At New Tab", "menu.testcase.openNoMenuRoute": "Open No Menu Route", "menu.testcase.mathEditor": "Math Formual Editor", diff --git a/io.sc.platform.core.frontend/src/i18n/messages_tw_CN.json b/io.sc.platform.core.frontend/src/i18n/messages_tw_CN.json index 69d958b0..44e60ea3 100644 --- a/io.sc.platform.core.frontend/src/i18n/messages_tw_CN.json +++ b/io.sc.platform.core.frontend/src/i18n/messages_tw_CN.json @@ -1,5 +1,6 @@ { "menu.testcase": "測試用例", + "menu.testcase.remoteComponent": "遠程組件", "menu.testcase.openUrl": "在新標籤頁打開", "menu.testcase.openNoMenuRoute": "打開無關聯菜單的路由", "menu.testcase.mathEditor": "數學公式編輯器", diff --git a/io.sc.platform.core.frontend/src/i18n/messages_zh_CN.json b/io.sc.platform.core.frontend/src/i18n/messages_zh_CN.json index 15de1e60..6acb675d 100644 --- a/io.sc.platform.core.frontend/src/i18n/messages_zh_CN.json +++ b/io.sc.platform.core.frontend/src/i18n/messages_zh_CN.json @@ -1,5 +1,6 @@ { "menu.testcase": "测试用例", + "menu.testcase.remoteComponent": "远程组件", "menu.testcase.openUrl": "在新标签页打开", "menu.testcase.openNoMenuRoute": "打开无关联菜单的路由示例", "menu.testcase.mathEditor": "数学公式编辑器", diff --git a/io.sc.platform.core.frontend/src/menus/menus.json b/io.sc.platform.core.frontend/src/menus/menus.json index a4713657..b05d7a9d 100644 --- a/io.sc.platform.core.frontend/src/menus/menus.json +++ b/io.sc.platform.core.frontend/src/menus/menus.json @@ -18,6 +18,15 @@ [ { "type": "GROUP", "order": 20000, "id": "menu.testcase", "titleI18nKey": "menu.testcase", "icon": "bi-gear" }, + { + "type": "ROUTE", + "order": 25, + "parentId": "menu.testcase", + "id": "menu.testcase.remoteComponent", + "titleI18nKey": "menu.testcase.remoteComponent", + "icon": "bi-palette", + "routeName": "route.testcase.remoteComponent" + }, { "type": "URL", "order": 50, diff --git a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue b/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue index ba62b83b..32da357e 100644 --- a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue +++ b/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue @@ -62,28 +62,47 @@ - - - - - - {{ item.businessDescription }} - {{ item.processDefinitionName }} [{{ item.name }}] - + + @@ -219,7 +238,6 @@ - @@ -234,7 +252,6 @@ import LoginDialog from '@/platform/views/LoginDialog'; import AboutDialog from './AboutDialog.vue'; import ChangePasswordDialog from './ChangePasswordDialog.vue'; import ChangeRoleDialog from './ChangeRoleDialog.vue'; -import ViewTaskDialog from './ViewTaskDialog.vue'; import ViewNotificationDialog from './ViewNotificationDialog.vue'; import ViewAnnouncementDialog from './ViewAnnouncementDialog.vue'; @@ -247,7 +264,6 @@ const loginDialog = ref(); const aboutDialog = ref(); const changePasswordDialog = ref(); const changeRoleDialog = ref(); -const viewTaskDialog = ref(); const viewNotificationDialog = ref(); const viewAnnouncementDialog = ref(); const { t } = useI18n(); @@ -349,9 +365,7 @@ const findUnReadedAnnouncements = () => { }); }; -const viewTask = (item) => { - viewNotificationDialog.value.open(item); -}; +const handleTask = (item) => {}; const viewNotification = (item) => { viewNotificationDialog.value.open(item); @@ -374,9 +388,12 @@ findUnCompletedTasks(); findUnReadedNotifications(); findUnReadedAnnouncements(); -registerInterval(() => { - findUnCompletedTasks(); - findUnReadedNotifications(); - findUnReadedAnnouncements(); -}, 60 * 1000); +registerInterval( + () => { + findUnCompletedTasks(); + findUnReadedNotifications(); + findUnReadedAnnouncements(); + }, + 3 * 60 * 1000, +); diff --git a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/ViewTaskDialog.vue b/io.sc.platform.core.frontend/src/platform/layout/sub-layout/ViewTaskDialog.vue deleted file mode 100644 index a6b051fb..00000000 --- a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/ViewTaskDialog.vue +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json b/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json index d1744e95..4a620692 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json +++ b/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json @@ -1,129 +1,130 @@ { - "oauth2" : { - "clientId" : "platform-oidc", - "clientSecret" : "secret", - "redirectUri" : "http://localhost:3000" + "oauth2": { + "clientId": "platform-oidc", + "clientSecret": "secret", + "redirectUri": "http://localhost:3000" }, - "setting" : { - "homePage" : "/home", - "i18n" : { - "availableLocales" : [ "en", "zh_CN", "tw_CN" ], - "locale" : "zh_CN", - "fallbackLocale" : "en", - "fallbackWarn" : false, - "missingWarn" : false, - "changeNotify" : true + "setting": { + "homePage": "/home", + "notifierTaskNavigateFrontendRoutePath": null, + "i18n": { + "availableLocales": ["en", "zh_CN", "tw_CN"], + "locale": "zh_CN", + "fallbackLocale": "en", + "fallbackWarn": false, + "missingWarn": false, + "changeNotify": true } }, - "theme" : { - "dark" : false, - "minWidth" : 600, - "favicon" : "favicon.svg", - "navigateMenuPosition" : "sider", - "brand" : { - "dark" : "#1d1d1d", - "primary" : "#14234a", - "secondary" : "#26a69a", - "accent" : "#9c27b0", - "positive" : "#21ba45", - "negative" : "#c10015", - "info" : "#31ccec", - "warning" : "#f2c037", - "dark-page" : "#121212" + "theme": { + "dark": false, + "minWidth": 600, + "favicon": "favicon.svg", + "navigateMenuPosition": "sider", + "brand": { + "dark": "#1d1d1d", + "primary": "#14234a", + "secondary": "#26a69a", + "accent": "#9c27b0", + "positive": "#21ba45", + "negative": "#c10015", + "info": "#31ccec", + "warning": "#f2c037", + "dark-page": "#121212" }, - "loadingBar" : { - "color" : "positive", - "size" : 3, - "position" : "top", - "reverse" : false + "loadingBar": { + "color": "positive", + "size": 3, + "position": "top", + "reverse": false }, - "topper" : { - "height" : 48, - "color" : "white", - "bgColor" : "#14234a", - "logo" : "logo.svg", - "logoWidth" : 36, - "logoHeight" : 36, - "showTitle" : true, - "titleColor" : "white", - "actions" : { - "full-screen" : { - "enable" : true + "topper": { + "height": 48, + "color": "white", + "bgColor": "#14234a", + "logo": "logo.svg", + "logoWidth": 36, + "logoHeight": 36, + "showTitle": true, + "titleColor": "white", + "actions": { + "full-screen": { + "enable": true }, - "searcher" : { - "enable" : true + "searcher": { + "enable": true }, - "notifier" : { - "enable" : true + "notifier": { + "enable": true } } }, - "sider" : { - "position" : "left", + "sider": { + "position": "left", "isSiderExpaned": false, - "dense" : true, - "border" : true, - "width" : 300, - "miniWidth" : 100, - "iconSize" : 22, - "miniIconSize" : 30, - "iconColor" : "#000000", - "activeIconColor" : "#14234a", - "bgColor" : "#ffffff", - "activeBgColor" : "#ffffff", - "color" : "#000000", - "activeColor" : "#14234a" + "dense": true, + "border": true, + "width": 300, + "miniWidth": 100, + "iconSize": 22, + "miniIconSize": 30, + "iconColor": "#000000", + "activeIconColor": "#14234a", + "bgColor": "#ffffff", + "activeBgColor": "#ffffff", + "color": "#000000", + "activeColor": "#14234a" }, - "tagViewBar" : { - "height" : 50, - "homeTagViewCloseable" : false, - "collapserIconSize" : 20, - "collapserIconColor" : "#000", - "moreIconColor" : "#000", - "bgColor" : "#FFF", - "borderSize" : 1, - "borderColor" : "#E5E7EB" + "tagViewBar": { + "height": 50, + "homeTagViewCloseable": false, + "collapserIconSize": 20, + "collapserIconColor": "#000", + "moreIconColor": "#000", + "bgColor": "#FFF", + "borderSize": 1, + "borderColor": "#E5E7EB" }, - "main" : { - "bgColor" : "#FFFFFF", - "paddingTop" : 5, - "paddingRight" : 5, - "paddingBottom" : 0, - "paddingLeft" : 5, - "containerPaddingTop" : 5, - "containerPaddingRight" : 5, - "containerPaddingBottom" : 5, - "containerPaddingLeft" : 5, - "containerBgColor" : "#EEEEEE" + "main": { + "bgColor": "#FFFFFF", + "paddingTop": 5, + "paddingRight": 5, + "paddingBottom": 0, + "paddingLeft": 5, + "containerPaddingTop": 5, + "containerPaddingRight": 5, + "containerPaddingBottom": 5, + "containerPaddingLeft": 5, + "containerBgColor": "#EEEEEE" }, - "footer" : { - "show" : false, - "height" : 40, - "color" : "#ffffff", - "bgColor" : "#14234a" + "footer": { + "show": false, + "height": 40, + "color": "#ffffff", + "bgColor": "#14234a" }, - "login" : { - "bgImage" : "login-bg.jpg", - "encodePassword" : true, - "logoutConfirm" : true + "login": { + "bgImage": "login-bg.jpg", + "encodePassword": true, + "logoutConfirm": true }, - "scroller" : { - "enable" : true, - "position" : "bottom-right", - "showTitle" : true, - "color" : "#ffffff", - "bgColor" : "#14234a", - "offsetX" : 80, - "offsetY" : 100 + "scroller": { + "enable": true, + "position": "bottom-right", + "showTitle": true, + "color": "#ffffff", + "bgColor": "#14234a", + "offsetX": 80, + "offsetY": 100 }, - "notifier" : { - "position" : "top", - "timeout" : 2000 + "notifier": { + "position": "top", + "timeout": 2000 }, - "grid" : { - "headBgColor" : "#f5f7fa", - "stickyBgColor" : "#ffffff", - "borderColor" : "rgba(0, 0, 0, 0.12)" + "grid": { + "headBgColor": "#f5f7fa", + "stickyBgColor": "#ffffff", + "borderColor": "rgba(0, 0, 0, 0.12)" } } -} \ No newline at end of file +} diff --git a/io.sc.platform.core.frontend/src/platform/types/ConfigureType.ts b/io.sc.platform.core.frontend/src/platform/types/ConfigureType.ts index da618c66..f8445d6d 100644 --- a/io.sc.platform.core.frontend/src/platform/types/ConfigureType.ts +++ b/io.sc.platform.core.frontend/src/platform/types/ConfigureType.ts @@ -54,6 +54,7 @@ export type ConfigureType = { sessionTimeout: number; //会话过期时间,单位:秒 notifyTimeout: number; // 通知提示框显示时间单位:毫秒 homePage: string; // 首页路由 path + notifierTaskNavigateFrontendRoutePath: string; //顶部通知栏任务导航前端路由路径 i18n: { availableLocales: string[]; // 支持的国际化多语言数组 locale: string; // 默认区域 diff --git a/io.sc.platform.core.frontend/src/routes/routes.json b/io.sc.platform.core.frontend/src/routes/routes.json index 7dd075b3..4683a359 100644 --- a/io.sc.platform.core.frontend/src/routes/routes.json +++ b/io.sc.platform.core.frontend/src/routes/routes.json @@ -1,11 +1,11 @@ [ { - "name": "route.testcase.globalRoute", - "path": "/testcase/globalRoute", - "parent": null, + "name": "route.testcase.remoteComponent", + "path": "/testcase/remoteComponent", + "parent": "/", "priority": 0, - "component": "component.testcase.globalRoute", - "componentPath": "@/views/testcase/global-route/GlobalRoute.vue", + "component": "component.testcase.remoteComponent", + "componentPath": "@/views/testcase/remote-component/RemoteComponent.vue", "redirect": null, "meta": { "permissions": ["/testcase/loading/**/*"] diff --git a/io.sc.platform.core.frontend/src/views/testcase/global-route/GlobalRoute.vue b/io.sc.platform.core.frontend/src/views/testcase/global-route/GlobalRoute.vue deleted file mode 100644 index 2b0f72ae..00000000 --- a/io.sc.platform.core.frontend/src/views/testcase/global-route/GlobalRoute.vue +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index 8449fb97..6c569248 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.65", + "version": "8.2.70", "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.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.core.frontend/template-project/src/components/index.ts b/io.sc.platform.core.frontend/template-project/src/components/index.ts index 5e95116b..06947387 100644 --- a/io.sc.platform.core.frontend/template-project/src/components/index.ts +++ b/io.sc.platform.core.frontend/template-project/src/components/index.ts @@ -2,6 +2,7 @@ * 此文件为自动生成文件,请勿修改 */ +import component_testcase_remoteComponent from '@/views/testcase/remote-component/RemoteComponent.vue'; import component_testcase_openNoMenuRoute from '@/views/testcase/route/OpenNoMenuRoute.vue'; import component_testcase_noMenuRoute from '@/views/testcase/route/NoMenuRoute.vue'; import component_testcase_mathEditor from '@/views/testcase/math/MathEditor.vue'; @@ -23,6 +24,7 @@ import component_testcase_gridLayout from '@/views/likm/GridLayout.vue'; import component_testcase_likmTreeGrid from '@/views/likm/TreeGrid.vue'; const localComponents = { + 'component.testcase.remoteComponent': component_testcase_remoteComponent, 'component.testcase.openNoMenuRoute': component_testcase_openNoMenuRoute, 'component.testcase.noMenuRoute': component_testcase_noMenuRoute, 'component.testcase.mathEditor': component_testcase_mathEditor, diff --git a/io.sc.platform.core.frontend/template-project/src/i18n/messages.json b/io.sc.platform.core.frontend/template-project/src/i18n/messages.json index fe95bf80..bae37506 100644 --- a/io.sc.platform.core.frontend/template-project/src/i18n/messages.json +++ b/io.sc.platform.core.frontend/template-project/src/i18n/messages.json @@ -1,5 +1,6 @@ { "menu.testcase": "Test Case", + "menu.testcase.remoteComponent": "Remote Component", "menu.testcase.openUrl": "Open At New Tab", "menu.testcase.openNoMenuRoute": "Open No Menu Route", "menu.testcase.mathEditor": "Math Formual Editor", diff --git a/io.sc.platform.core.frontend/template-project/src/i18n/messages_tw_CN.json b/io.sc.platform.core.frontend/template-project/src/i18n/messages_tw_CN.json index 69d958b0..44e60ea3 100644 --- a/io.sc.platform.core.frontend/template-project/src/i18n/messages_tw_CN.json +++ b/io.sc.platform.core.frontend/template-project/src/i18n/messages_tw_CN.json @@ -1,5 +1,6 @@ { "menu.testcase": "測試用例", + "menu.testcase.remoteComponent": "遠程組件", "menu.testcase.openUrl": "在新標籤頁打開", "menu.testcase.openNoMenuRoute": "打開無關聯菜單的路由", "menu.testcase.mathEditor": "數學公式編輯器", diff --git a/io.sc.platform.core.frontend/template-project/src/i18n/messages_zh_CN.json b/io.sc.platform.core.frontend/template-project/src/i18n/messages_zh_CN.json index 15de1e60..6acb675d 100644 --- a/io.sc.platform.core.frontend/template-project/src/i18n/messages_zh_CN.json +++ b/io.sc.platform.core.frontend/template-project/src/i18n/messages_zh_CN.json @@ -1,5 +1,6 @@ { "menu.testcase": "测试用例", + "menu.testcase.remoteComponent": "远程组件", "menu.testcase.openUrl": "在新标签页打开", "menu.testcase.openNoMenuRoute": "打开无关联菜单的路由示例", "menu.testcase.mathEditor": "数学公式编辑器", diff --git a/io.sc.platform.core.frontend/template-project/src/menus/menus.json b/io.sc.platform.core.frontend/template-project/src/menus/menus.json index a4713657..b05d7a9d 100644 --- a/io.sc.platform.core.frontend/template-project/src/menus/menus.json +++ b/io.sc.platform.core.frontend/template-project/src/menus/menus.json @@ -18,6 +18,15 @@ [ { "type": "GROUP", "order": 20000, "id": "menu.testcase", "titleI18nKey": "menu.testcase", "icon": "bi-gear" }, + { + "type": "ROUTE", + "order": 25, + "parentId": "menu.testcase", + "id": "menu.testcase.remoteComponent", + "titleI18nKey": "menu.testcase.remoteComponent", + "icon": "bi-palette", + "routeName": "route.testcase.remoteComponent" + }, { "type": "URL", "order": 50, diff --git a/io.sc.platform.core.frontend/template-project/src/routes/routes.json b/io.sc.platform.core.frontend/template-project/src/routes/routes.json index dda10bc7..4683a359 100644 --- a/io.sc.platform.core.frontend/template-project/src/routes/routes.json +++ b/io.sc.platform.core.frontend/template-project/src/routes/routes.json @@ -1,4 +1,16 @@ [ + { + "name": "route.testcase.remoteComponent", + "path": "/testcase/remoteComponent", + "parent": "/", + "priority": 0, + "component": "component.testcase.remoteComponent", + "componentPath": "@/views/testcase/remote-component/RemoteComponent.vue", + "redirect": null, + "meta": { + "permissions": ["/testcase/loading/**/*"] + } + }, { "name": "route.testcase.openNoMenuRoute", "path": "testcase/openNoMenuRoute", diff --git a/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs b/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs +++ b/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.core.frontend/webpack.config.mf.cjs b/io.sc.platform.core.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.core.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.core.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties index f9ab76a2..e9193baf 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties @@ -260,4 +260,5 @@ thinking=Thinking: errorOccurred=An Error Occurred migration=Migration view=View -before=Before \ No newline at end of file +before=Before +send=Send \ No newline at end of file diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties index 4119ce9e..6804a6c1 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties @@ -260,4 +260,5 @@ thinking=\u601D\u8003\u4E2D: errorOccurred=\u767C\u751F\u932F\u8AA4 migration=\u9077\u79FB view=\u67E5\u770B -before=\u4EE5\u524D \ No newline at end of file +before=\u4EE5\u524D +send=\u767C\u9001 \ No newline at end of file diff --git a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties index c47fd3a0..82f5f56a 100644 --- a/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties +++ b/io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties @@ -260,4 +260,5 @@ thinking=\u601D\u8003\u4E2D: errorOccurred=\u53D1\u751F\u9519\u8BEF migration=\u8FC1\u79FB view=\u67E5\u770B -before=\u4EE5\u524D \ No newline at end of file +before=\u4EE5\u524D +send=\u53D1\u9001 \ No newline at end of file diff --git a/io.sc.platform.developer.doc/package.json b/io.sc.platform.developer.doc/package.json index 4bec3e49..1d6de35b 100644 --- a/io.sc.platform.developer.doc/package.json +++ b/io.sc.platform.developer.doc/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.developer.doc", - "version": "8.2.11", + "version": "8.2.13", "description": "", "main": "index.js", "scripts": { @@ -28,7 +28,7 @@ "vuepress": "2.0.0-rc.15" }, "dependencies": { - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "vue": "3.5.13", "vue-i18n": "11.0.1" diff --git a/io.sc.platform.developer.frontend/package.json b/io.sc.platform.developer.frontend/package.json index 12415cea..00ec4188 100644 --- a/io.sc.platform.developer.frontend/package.json +++ b/io.sc.platform.developer.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.developer.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.developer.frontend/webpack.config.mf.cjs b/io.sc.platform.developer.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.developer.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.developer.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/api/ProcessVo.java b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/api/ProcessVo.java index 748b5063..cb3e534c 100644 --- a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/api/ProcessVo.java +++ b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/api/ProcessVo.java @@ -15,7 +15,9 @@ public class ProcessVo extends CorporationAuditorVo { private ProcessStatus status; private Boolean canClaimTask; private String businessDescriptionSql; - private String routePath; + private String taskHandFrontendModelName; + private String taskHandFrontendComponentName; + private String taskHandFrontendComponentProperties; public String getId() { return id; @@ -105,11 +107,27 @@ public class ProcessVo extends CorporationAuditorVo { this.businessDescriptionSql = businessDescriptionSql; } - public String getRoutePath() { - return routePath; + public String getTaskHandFrontendModelName() { + return taskHandFrontendModelName; } - public void setRoutePath(String routePath) { - this.routePath = routePath; + public void setTaskHandFrontendModelName(String taskHandFrontendModelName) { + this.taskHandFrontendModelName = taskHandFrontendModelName; + } + + public String getTaskHandFrontendComponentName() { + return taskHandFrontendComponentName; + } + + public void setTaskHandFrontendComponentName(String taskHandFrontendComponentName) { + this.taskHandFrontendComponentName = taskHandFrontendComponentName; + } + + public String getTaskHandFrontendComponentProperties() { + return taskHandFrontendComponentProperties; + } + + public void setTaskHandFrontendComponentProperties(String taskHandFrontendComponentProperties) { + this.taskHandFrontendComponentProperties = taskHandFrontendComponentProperties; } } diff --git a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/entity/ProcessEntity.java b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/entity/ProcessEntity.java index d843ab07..04968624 100644 --- a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/entity/ProcessEntity.java +++ b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/entity/ProcessEntity.java @@ -76,13 +76,24 @@ public class ProcessEntity extends CorporationAuditorEntity { @Convert(converter= NumericBooleanConverter.class) private Boolean canClaimTask; + // 任务描述SQL语句,用于生成带业务信息的任务描述 @Column(name="BUSINESS_DESC_SQL_") @Size(max=1024) private String businessDescriptionSql; - @Column(name="ROUTE_PATH_") - @Size(max=1024) - private String routePath; + // 任务处理前端组件的模块名 + @Column(name="TASK_HAND_FE_MODEL_NAME_") + @Size(max=255) + private String taskHandFrontendModelName; + + // 任务处理前端组件的组件名 + @Column(name="TASK_HAND_FE_COMP_NAME_") + @Size(max=255) + private String taskHandFrontendComponentName; + + // 任务处理前端组件的组件属性 + @Column(name="TASK_HAND_FE_COMP_PROPS_") + private String taskHandFrontendComponentProperties; @Override public ProcessVo toVo() { @@ -99,7 +110,9 @@ public class ProcessEntity extends CorporationAuditorEntity { vo.setStatus(this.getStatus()); vo.setCanClaimTask(this.getCanClaimTask()); vo.setBusinessDescriptionSql(this.getBusinessDescriptionSql()); - vo.setRoutePath(this.getRoutePath()); + vo.setTaskHandFrontendModelName(this.getTaskHandFrontendModelName()); + vo.setTaskHandFrontendComponentName(this.getTaskHandFrontendComponentName()); + vo.setTaskHandFrontendComponentProperties(this.getTaskHandFrontendComponentProperties()); return vo; } @@ -191,12 +204,28 @@ public class ProcessEntity extends CorporationAuditorEntity { this.businessDescriptionSql = businessDescriptionSql; } - public String getRoutePath() { - return routePath; + public String getTaskHandFrontendModelName() { + return taskHandFrontendModelName; + } + + public void setTaskHandFrontendModelName(String taskHandFrontendModelName) { + this.taskHandFrontendModelName = taskHandFrontendModelName; + } + + public String getTaskHandFrontendComponentName() { + return taskHandFrontendComponentName; + } + + public void setTaskHandFrontendComponentName(String taskHandFrontendComponentName) { + this.taskHandFrontendComponentName = taskHandFrontendComponentName; + } + + public String getTaskHandFrontendComponentProperties() { + return taskHandFrontendComponentProperties; } - public void setRoutePath(String routePath) { - this.routePath = routePath; + public void setTaskHandFrontendComponentProperties(String taskHandFrontendComponentProperties) { + this.taskHandFrontendComponentProperties = taskHandFrontendComponentProperties; } @Override diff --git a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessQueryServiceImpl.java b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessQueryServiceImpl.java index 71a156dd..93c309b5 100644 --- a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessQueryServiceImpl.java +++ b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessQueryServiceImpl.java @@ -1,6 +1,5 @@ package io.sc.platform.flowable.service.impl; -import io.sc.platform.core.support.KeyValue; import io.sc.platform.flowable.jpa.entity.ProcessEntity; import io.sc.platform.flowable.service.AssigneeQueryService; import io.sc.platform.flowable.service.ProcessEntityService; @@ -27,6 +26,7 @@ import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.image.impl.DefaultProcessDiagramGenerator; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.domain.Page; @@ -322,6 +322,11 @@ public class ProcessQueryServiceImpl implements ProcessQueryService { businessKeyAndDescription.setProcessDefinitionName(processInstance.getProcessDefinitionName()); businessKeyAndDescription.setBusinessKey(processInstance.getBusinessKey()); businessKeyAndDescription.setBusinessDescription(processInstance.getProcessDefinitionName()); + + List historicTaskInstances =historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstance.getId()).finished().orderByHistoricTaskInstanceEndTime().desc().list(); + if(CollectionUtil.hasElements(historicTaskInstances)){ + businessKeyAndDescription.setPreviousAssignee(historicTaskInstances.get(0).getAssignee()); + } } } } @@ -336,7 +341,9 @@ public class ProcessQueryServiceImpl implements ProcessQueryService { for(String processInstanceId : processInstanceAndBusinessMap.keySet()){ BusinessKeyAndDescription businessKeyAndDescription =processInstanceAndBusinessMap.get(processInstanceId); if(businessKeyAndDescription!=null){ - businessKeyAndDescription.setRoutePath(processEntity.getRoutePath()); + businessKeyAndDescription.setTaskHandFrontendModelName(processEntity.getTaskHandFrontendModelName()); + businessKeyAndDescription.setTaskHandFrontendComponentName(processEntity.getTaskHandFrontendComponentName()); + businessKeyAndDescription.setTaskHandFrontendComponentProperties(processEntity.getTaskHandFrontendComponentProperties()); } } if(processEntity==null){ @@ -378,10 +385,13 @@ public class ProcessQueryServiceImpl implements ProcessQueryService { for(ProcessTaskWrapper wrapper : wrappers){ Map processInstanceAndBusinessMap =processDefineAndInstanceAndBusinessMap.get(wrapper.getProcessDefinitionId()); BusinessKeyAndDescription businessKeyAndDescription =processInstanceAndBusinessMap.get(wrapper.getProcessInstanceId()); + wrapper.setPreviousAssignee(businessKeyAndDescription.getPreviousAssignee()); wrapper.setBusinessKey(businessKeyAndDescription.getBusinessKey()); wrapper.setBusinessDescription(businessKeyAndDescription.getBusinessDescription()); wrapper.setProcessDefinitionName(businessKeyAndDescription.getProcessDefinitionName()); - wrapper.setRoutePath(businessKeyAndDescription.getRoutePath()); + wrapper.setTaskHandFrontendModelName(businessKeyAndDescription.getTaskHandFrontendModelName()); + wrapper.setTaskHandFrontendComponentName(businessKeyAndDescription.getTaskHandFrontendComponentName()); + wrapper.setTaskHandFrontendComponentProperties(businessKeyAndDescription.getTaskHandFrontendComponentProperties()); } return new PageImpl(wrappers,pageable,total); diff --git a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/BusinessKeyAndDescription.java b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/BusinessKeyAndDescription.java index 71224995..16654d77 100644 --- a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/BusinessKeyAndDescription.java +++ b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/BusinessKeyAndDescription.java @@ -1,10 +1,21 @@ package io.sc.platform.flowable.support; public class BusinessKeyAndDescription { + private String previousAssignee; private String processDefinitionName; private String businessKey; private String businessDescription; - private String routePath; + private String taskHandFrontendModelName; + private String taskHandFrontendComponentName; + private String taskHandFrontendComponentProperties; + + public String getPreviousAssignee() { + return previousAssignee; + } + + public void setPreviousAssignee(String previousAssignee) { + this.previousAssignee = previousAssignee; + } public String getProcessDefinitionName() { return processDefinitionName; @@ -30,11 +41,27 @@ public class BusinessKeyAndDescription { this.businessDescription = businessDescription; } - public String getRoutePath() { - return routePath; + public String getTaskHandFrontendModelName() { + return taskHandFrontendModelName; + } + + public void setTaskHandFrontendModelName(String taskHandFrontendModelName) { + this.taskHandFrontendModelName = taskHandFrontendModelName; + } + + public String getTaskHandFrontendComponentName() { + return taskHandFrontendComponentName; + } + + public void setTaskHandFrontendComponentName(String taskHandFrontendComponentName) { + this.taskHandFrontendComponentName = taskHandFrontendComponentName; + } + + public String getTaskHandFrontendComponentProperties() { + return taskHandFrontendComponentProperties; } - public void setRoutePath(String routePath) { - this.routePath = routePath; + public void setTaskHandFrontendComponentProperties(String taskHandFrontendComponentProperties) { + this.taskHandFrontendComponentProperties = taskHandFrontendComponentProperties; } } diff --git a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/ProcessTaskWrapper.java b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/ProcessTaskWrapper.java index ed39bb62..c87c15c6 100644 --- a/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/ProcessTaskWrapper.java +++ b/io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/ProcessTaskWrapper.java @@ -31,10 +31,13 @@ public class ProcessTaskWrapper { private String formKey; private Date claimTime; + private String previousAssignee; private String processDefinitionName; private String businessKey; private String businessDescription; - private String routePath; + private String taskHandFrontendModelName; + private String taskHandFrontendComponentName; + private String taskHandFrontendComponentProperties; private long createTimeAndNowDiff; private ChronoUnit createTimeAndNowDiffUnit; @@ -169,6 +172,15 @@ public class ProcessTaskWrapper { public void setClaimTime(Date claimTime) { this.claimTime = claimTime; } + + public String getPreviousAssignee() { + return previousAssignee; + } + + public void setPreviousAssignee(String previousAssignee) { + this.previousAssignee = previousAssignee; + } + public String getProcessDefinitionName() { return processDefinitionName; } @@ -190,12 +202,28 @@ public class ProcessTaskWrapper { this.businessDescription = businessDescription; } - public String getRoutePath() { - return routePath; + public String getTaskHandFrontendModelName() { + return taskHandFrontendModelName; + } + + public void setTaskHandFrontendModelName(String taskHandFrontendModelName) { + this.taskHandFrontendModelName = taskHandFrontendModelName; + } + + public String getTaskHandFrontendComponentName() { + return taskHandFrontendComponentName; + } + + public void setTaskHandFrontendComponentName(String taskHandFrontendComponentName) { + this.taskHandFrontendComponentName = taskHandFrontendComponentName; + } + + public String getTaskHandFrontendComponentProperties() { + return taskHandFrontendComponentProperties; } - public void setRoutePath(String routePath) { - this.routePath = routePath; + public void setTaskHandFrontendComponentProperties(String taskHandFrontendComponentProperties) { + this.taskHandFrontendComponentProperties = taskHandFrontendComponentProperties; } public long getCreateTimeAndNowDiff() { diff --git a/io.sc.platform.flowable/src/main/resources/liquibase/io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL.xml b/io.sc.platform.flowable/src/main/resources/liquibase/io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL.xml index bfbf830d..cc6d691f 100644 --- a/io.sc.platform.flowable/src/main/resources/liquibase/io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL.xml +++ b/io.sc.platform.flowable/src/main/resources/liquibase/io.sc.platform.flowable_8.0.0_20220606__Process Manager Database Schema DDL.xml @@ -26,6 +26,9 @@ + + + diff --git a/io.sc.platform.lcdp.frontend/package.json b/io.sc.platform.lcdp.frontend/package.json index 9f41a197..526f5db1 100644 --- a/io.sc.platform.lcdp.frontend/package.json +++ b/io.sc.platform.lcdp.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.lcdp.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.lcdp.frontend/src/i18n/messages.json b/io.sc.platform.lcdp.frontend/src/i18n/messages.json index a530db5c..40cd2c83 100644 --- a/io.sc.platform.lcdp.frontend/src/i18n/messages.json +++ b/io.sc.platform.lcdp.frontend/src/i18n/messages.json @@ -165,7 +165,9 @@ "lcdp.bpm.processDefine.grid.entity.deployId": "Deploy ID", "lcdp.bpm.processDefine.grid.entity.canClaimTask": "Can Claim Task", "lcdp.bpm.processDefine.grid.entity.businessDescriptionSql": "Bussiness Description SQL", - "lcdp.bpm.processDefine.grid.entity.routePath": "Front End Route Path (start with /)", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendModelName": "Task Handler's Frontend Module Name", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentName": "Task Handler's Frontend Component Name", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentProperties": "Task Handler's Frontend Component Properties(json)", "lcdp.bpm.designer.dialog.title.prefix": "Process Designer", diff --git a/io.sc.platform.lcdp.frontend/src/i18n/messages_tw_CN.json b/io.sc.platform.lcdp.frontend/src/i18n/messages_tw_CN.json index fdcdfc5c..cb2fccea 100644 --- a/io.sc.platform.lcdp.frontend/src/i18n/messages_tw_CN.json +++ b/io.sc.platform.lcdp.frontend/src/i18n/messages_tw_CN.json @@ -165,7 +165,9 @@ "lcdp.bpm.processDefine.grid.entity.deployId": "發佈 ID", "lcdp.bpm.processDefine.grid.entity.canClaimTask": "允許領取任務", "lcdp.bpm.processDefine.grid.entity.businessDescriptionSql": "業務描述 SQL", - "lcdp.bpm.processDefine.grid.entity.routePath": "前端路由路徑(以 / 開頭)", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendModelName": "任務處理前端模塊名稱", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentName": "任務處理前端組件名稱", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentProperties": "任務處理前端組件屬性(json)", "lcdp.bpm.designer.dialog.title.prefix": "流程設計器", diff --git a/io.sc.platform.lcdp.frontend/src/i18n/messages_zh_CN.json b/io.sc.platform.lcdp.frontend/src/i18n/messages_zh_CN.json index 7ff40a50..20791e34 100644 --- a/io.sc.platform.lcdp.frontend/src/i18n/messages_zh_CN.json +++ b/io.sc.platform.lcdp.frontend/src/i18n/messages_zh_CN.json @@ -165,7 +165,9 @@ "lcdp.bpm.processDefine.grid.entity.deployId": "发布 ID", "lcdp.bpm.processDefine.grid.entity.canClaimTask": "允许领取任务", "lcdp.bpm.processDefine.grid.entity.businessDescriptionSql": "业务描述 SQL", - "lcdp.bpm.processDefine.grid.entity.routePath": "前端路由路径(以 / 开头)", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendModelName": "任务处理前端模块名称", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentName": "任务处理前端组件名称", + "lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentProperties": "任务处理前端组件属性(json)", "lcdp.bpm.designer.dialog.title.prefix": "流程设计器", diff --git a/io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue b/io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue index 90ae86a0..6e722ebb 100644 --- a/io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue +++ b/io.sc.platform.lcdp.frontend/src/views/bpm/Bpm.vue @@ -179,7 +179,7 @@ width: '800px', }, form: { - colsNum: 1, + colsNum: 3, fields: [ { name: 'category', @@ -212,12 +212,18 @@ return true; }, }, - { name: 'description', label: $t('description'), type: 'w-textarea', rows: 1 }, - { name: 'xml', label: $t('xml'), type: 'w-textarea' }, + { colSpan: 3, name: 'description', label: $t('description'), type: 'w-textarea', rows: 1 }, + { colSpan: 3, name: 'xml', label: $t('xml'), type: 'w-textarea', rows: 5 }, { name: 'status', label: $t('status'), type: 'w-text', defaultValue: 'SKETCH', showIf: false }, - { name: 'canClaimTask', label: $t('lcdp.bpm.processDefine.grid.entity.canClaimTask'), type: 'w-checkbox', defaultValue: true, rule: [] }, - { name: 'routePath', label: $t('lcdp.bpm.processDefine.grid.entity.routePath'), type: 'w-text', defaultValue: '/' }, { + name: 'canClaimTask', + label: $t('lcdp.bpm.processDefine.grid.entity.canClaimTask'), + type: 'w-checkbox', + defaultValue: true, + rule: [], + }, + { + colSpan: 2, type: 'w-form-group', align: 'right', fields: [ @@ -240,10 +246,11 @@ ], }, { + colSpan: 3, name: 'businessDescriptionSql', label: $t('lcdp.bpm.processDefine.grid.entity.businessDescriptionSql'), type: 'w-code-mirror', - rows: 6, + rows: 5, lang: 'sql', toolbar: false, lineHeight: '1.3rem', @@ -253,6 +260,33 @@ lineBreak: true, placeholder: true, }, + { + colSpan: 1, + name: 'taskHandFrontendModelName', + label: $t('lcdp.bpm.processDefine.grid.entity.taskHandFrontendModelName'), + type: 'w-text', + }, + { + colSpan: 2, + name: 'taskHandFrontendComponentName', + label: $t('lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentName'), + type: 'w-text', + }, + { + colSpan: 3, + name: 'taskHandFrontendComponentProperties', + label: $t('lcdp.bpm.processDefine.grid.entity.taskHandFrontendComponentProperties'), + type: 'w-code-mirror', + rows: 5, + lang: 'json', + toolbar: false, + lineHeight: '1.3rem', + fontSize: '0.75rem', + lineNumber: true, + lineWrap: false, + lineBreak: true, + placeholder: true, + }, ], }, }" diff --git a/io.sc.platform.lcdp.frontend/webpack.config.mf.cjs b/io.sc.platform.lcdp.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.lcdp.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.lcdp.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/api/Setting.java b/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/api/Setting.java index dcb4fe7b..3393a38a 100644 --- a/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/api/Setting.java +++ b/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/api/Setting.java @@ -3,6 +3,7 @@ package io.sc.platform.lcdp.configure.api; public class Setting { private long sessionTimeout =30 * 60; // 会话过期时间(单位:秒) private String homePage ="/home"; // 首页路由 path + private String notifierTaskNavigateFrontendRoutePath;//顶部通知栏任务导航前端路由路径 private I18n i18n =new I18n(); // 多语言国际化 private boolean isMultiCorporationMode =false; // 是否是多法人模式 @@ -22,6 +23,14 @@ public class Setting { this.homePage = homePage; } + public String getNotifierTaskNavigateFrontendRoutePath() { + return notifierTaskNavigateFrontendRoutePath; + } + + public void setNotifierTaskNavigateFrontendRoutePath(String notifierTaskNavigateFrontendRoutePath) { + this.notifierTaskNavigateFrontendRoutePath = notifierTaskNavigateFrontendRoutePath; + } + public I18n getI18n() { return i18n; } diff --git a/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/service/impl/ConfigureServiceImpl.java b/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/service/impl/ConfigureServiceImpl.java index 1c8fbba0..a823450a 100644 --- a/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/service/impl/ConfigureServiceImpl.java +++ b/io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/service/impl/ConfigureServiceImpl.java @@ -19,6 +19,7 @@ import org.springframework.util.StringUtils; import javax.transaction.Transactional; import java.time.Duration; import java.time.temporal.TemporalUnit; +import java.util.Map; @Service("io.sc.platform.lcdp.configure.service.impl.ConfigureServiceImpl") public class ConfigureServiceImpl extends DaoServiceImpl implements ConfigureService { @@ -52,10 +53,21 @@ public class ConfigureServiceImpl extends DaoServiceImpl parameters =systemParameterService.getParameters(new String[]{ + "parameter.system.homePage", + "parameter.system.notifierTaskNavigateFrontendRoutePath" + }); + String homePage =parameters.get("parameter.system.homePage"); if(StringUtils.hasText(homePage)) { configure.getSetting().setHomePage(homePage); } + + String notifierTaskNavigateFrontendRoutePath =parameters.get("parameter.system.notifierTaskNavigateFrontendRoutePath"); + if(StringUtils.hasText(notifierTaskNavigateFrontendRoutePath)) { + configure.getSetting().setNotifierTaskNavigateFrontendRoutePath(notifierTaskNavigateFrontendRoutePath); + } + configure.getSetting().setIsMultiCorporationMode(io.sc.platform.core.Environment.getInstance().isMultiCorportationMode()); return configure; } diff --git a/io.sc.platform.license.keygen.frontend/package.json b/io.sc.platform.license.keygen.frontend/package.json index 523bc764..b4cc5d2b 100644 --- a/io.sc.platform.license.keygen.frontend/package.json +++ b/io.sc.platform.license.keygen.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.license.keygen.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.license.keygen.frontend/webpack.config.mf.cjs b/io.sc.platform.license.keygen.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.license.keygen.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.license.keygen.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.mvc.frontend/package.json b/io.sc.platform.mvc.frontend/package.json index 847b2abd..320d7502 100644 --- a/io.sc.platform.mvc.frontend/package.json +++ b/io.sc.platform.mvc.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.mvc.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.mvc.frontend/webpack.config.mf.cjs b/io.sc.platform.mvc.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.mvc.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.mvc.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/MvcErrorAutoConfiguration.java b/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/MvcErrorAutoConfiguration.java index ffb00f8c..d881cc98 100644 --- a/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/MvcErrorAutoConfiguration.java +++ b/io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/MvcErrorAutoConfiguration.java @@ -1,5 +1,6 @@ package io.sc.platform.mvc.autoconfigure; +import java.math.BigDecimal; import java.util.stream.Collectors; import javax.servlet.Servlet; diff --git a/io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/parameters.json b/io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/parameters.json index 24152d7a..0e829636 100644 --- a/io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/parameters.json +++ b/io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/parameters.json @@ -1,12 +1,20 @@ [ - /*系统*/ - {"id":"parameter.system","order":0}, - /*系统/首页路由*/ - { - "id" : "parameter.system.homePage", - "parentId" : "parameter.system", - "code" : "parameter.system.homePage", - "defaultValue" : "/home", - "order" : 100 - } -] \ No newline at end of file + /*系统*/ + { "id": "parameter.system", "order": 0 }, + /*系统/首页路由*/ + { + "id": "parameter.system.homePage", + "parentId": "parameter.system", + "code": "parameter.system.homePage", + "defaultValue": "/home", + "order": 100 + }, + /*系统/顶部通知栏任务导航前端路由路径*/ + { + "id": "parameter.system.notifierTaskNavigateFrontendRoutePath", + "parentId": "parameter.system", + "code": "parameter.system.notifierTaskNavigateFrontendRoutePath", + "defaultValue": "", + "order": 150 + } +] diff --git a/io.sc.platform.scheduler.manager.frontend/package.json b/io.sc.platform.scheduler.manager.frontend/package.json index aace8ec5..d6c1cc17 100644 --- a/io.sc.platform.scheduler.manager.frontend/package.json +++ b/io.sc.platform.scheduler.manager.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.scheduler.manager.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.scheduler.manager.frontend/webpack.config.mf.cjs b/io.sc.platform.scheduler.manager.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.scheduler.manager.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.scheduler.manager.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.system.frontend/package.json b/io.sc.platform.system.frontend/package.json index 4e79d64b..319c86a2 100644 --- a/io.sc.platform.system.frontend/package.json +++ b/io.sc.platform.system.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.system.frontend", - "version": "8.2.11", + "version": "8.2.13", "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.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue b/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue index 94aede6d..416dc298 100644 --- a/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue +++ b/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue @@ -193,7 +193,6 @@ const changeOptions = () => { const isExistsOptions = () => { const row = treeGridRef.value.getSelectedRow(); - console.log(row); if (row) { return row.options && Object.keys(row.options).length > 0; } diff --git a/io.sc.platform.system.frontend/webpack.config.mf.cjs b/io.sc.platform.system.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.platform.system.frontend/webpack.config.mf.cjs +++ b/io.sc.platform.system.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter.properties b/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter.properties index c0711f71..81637126 100644 --- a/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter.properties +++ b/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter.properties @@ -2,4 +2,5 @@ home.default=Home Page (System Default) parameter.system=System parameter.system.homePage=Home Page +parameter.system.notifierTaskNavigateFrontendRoutePath=The Route Path of Task Navigator in Notifier parameter.login.encodePassword=\u767B\u9304\u9801\u9762\u5BC6\u78BC\u52A0\u5BC6 \ No newline at end of file diff --git a/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_tw_CN.properties b/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_tw_CN.properties index 6fd77a99..ee53026d 100644 --- a/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_tw_CN.properties +++ b/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_tw_CN.properties @@ -2,4 +2,5 @@ home.default=\u9996\u9801 (\u7CFB\u7D71\u9ED8\u8A8D) parameter.system=\u7CFB\u7D71 parameter.system.homePage=\u9996\u9801 +parameter.system.notifierTaskNavigateFrontendRoutePath=\u901A\u77E5\u6B04\u4EFB\u52D9\u5C0E\u822A\u524D\u7AEF\u8DEF\u7531\u8DEF\u5F91 parameter.login.encodePassword=\u767B\u9304\u9801\u9762\u5BC6\u78BC\u52A0\u5BC6 \ No newline at end of file diff --git a/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_zh_CN.properties b/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_zh_CN.properties index 6b36c94c..be279485 100644 --- a/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_zh_CN.properties +++ b/io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_zh_CN.properties @@ -2,4 +2,5 @@ home.default=\u9996\u9875 (\u7CFB\u7EDF\u9ED8\u8BA4) parameter.system=\u7CFB\u7EDF parameter.system.homePage=\u9996\u9875 +parameter.system.notifierTaskNavigateFrontendRoutePath=\u901A\u77E5\u680F\u4EFB\u52A1\u5BFC\u822A\u524D\u7AEF\u8DEF\u7531\u8DEF\u5F84 parameter.login.encodePassword=\u767B\u9304\u9801\u9762\u5BC6\u78BC\u52A0\u5BC6 \ No newline at end of file diff --git a/io.sc.standard.frontend/package.json b/io.sc.standard.frontend/package.json index 36b6fdf7..bd29048a 100644 --- a/io.sc.standard.frontend/package.json +++ b/io.sc.standard.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.standard.frontend", - "version": "8.2.11", + "version": "8.2.13", "description": "", "private": false, "keywords": [], @@ -112,7 +112,7 @@ "node-sql-parser": "5.3.6", "pinia": "2.3.0", "pinia-undo": "0.2.4", - "platform-core": "8.2.65", + "platform-core": "8.2.70", "quasar": "2.17.6", "sort-array": "5.0.0", "svg-path-commander": "2.1.7", diff --git a/io.sc.standard.frontend/webpack.config.mf.cjs b/io.sc.standard.frontend/webpack.config.mf.cjs index b61795a4..912325e5 100644 --- a/io.sc.standard.frontend/webpack.config.mf.cjs +++ b/io.sc.standard.frontend/webpack.config.mf.cjs @@ -9,13 +9,20 @@ const projectName = packageJson.name; // 项目名称 const deps = packageJson.dependencies; // 项目依赖 // 读取本地路由配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 -const data = fs.readFileSync('./src/routes/routes.json', 'utf8'); -const routes = Json5.parse(data); +const routesJson = fs.readFileSync('./src/routes/routes.json', 'utf8'); +const routes = Json5.parse(routesJson); const mfExposes = {}; for (const route of routes) { mfExposes[route.component] = route.componentPath; } +// 读取远程组件配置, 通过其中 component 和 componentPath 两个属性构建 webpack 模块联邦的 exposes 属性值 +const remoteComponentsJson = fs.readFileSync('./src/remote-components/remote-components.json', 'utf8'); +const remoteComponents = Json5.parse(remoteComponentsJson); +for (const remoteComponent of remoteComponents) { + mfExposes[remoteComponent.component] = remoteComponent.componentPath; +} + // 导出 webapck 配置的模块联邦部分 module.exports = { plugins: [ diff --git a/io.sc.website/package.json b/io.sc.website/package.json index 72e0d724..c21c6c38 100644 --- a/io.sc.website/package.json +++ b/io.sc.website/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.website", - "version": "8.2.11", + "version": "8.2.12", "description": "", "main": "index.js", "scripts": { @@ -28,6 +28,6 @@ }, "dependencies": { "vue": "3.5.13", - "platform-core": "8.2.65" + "platform-core": "8.2.70" } } \ No newline at end of file