Browse Source

update

main
wangshaoping 3 months ago
parent
commit
d9d44d1ac5
  1. 2
      erm.frontend/package.json
  2. 2
      gradle.properties
  3. 6
      io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-dictionary.json
  4. 18
      io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json
  5. 4
      io.sc.creditreport.core/src/main/resources/io/sc/creditreport/core/i18n/messages.properties
  6. 4
      io.sc.creditreport.core/src/main/resources/io/sc/creditreport/core/i18n/messages_tw_CN.properties
  7. 4
      io.sc.creditreport.core/src/main/resources/io/sc/creditreport/core/i18n/messages_zh_CN.properties
  8. 2
      io.sc.engine.mv.frontend/package.json
  9. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ParameterResult.java
  10. 9
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/DecisionTree.java
  11. 9
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/DictionaryType.java
  12. 25
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/IndicatorType.java
  13. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ParameterType.java
  14. 5
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ResourceType.java
  15. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/TestCaseOwnerType.java
  16. 213
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValueType.java
  17. 25
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/dictionary/Dictionary.java
  18. 41
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/dictionary/UserDefinedJavaClassField.java
  19. 10
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/Indicator.java
  20. 3
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/IndicatorLib.java
  21. 18
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/Lib.java
  22. 37
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/Parameter.java
  23. 4
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/IndicatorParameter.java
  24. 21
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ModelResource.java
  25. 47
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ReleasableResource.java
  26. 20
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/Resource.java
  27. 15
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/ScoreCardTestCase.java
  28. 23
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/TestCase.java
  29. 6
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ExpressionReplacer.java
  30. 66
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java
  31. 3
      io.sc.engine.rule.core/src/main/resources/META-INF/platform/plugins/messages.json
  32. 16
      io.sc.engine.rule.core/src/main/resources/META-INF/platform/plugins/rule-engine-dictionary.json
  33. 3
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary.properties
  34. 3
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_tw_CN.properties
  35. 3
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_zh_CN.properties
  36. 11
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties
  37. 11
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties
  38. 11
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties
  39. 2
      io.sc.engine.rule.frontend/package.json
  40. 329
      io.sc.engine.rule.frontend/src/i18n/messages.json
  41. 325
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  42. 326
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  43. 40
      io.sc.engine.rule.frontend/src/routes/routes.json
  44. 25
      io.sc.engine.rule.frontend/src/utils/PassOrNotFormater.ts
  45. 60
      io.sc.engine.rule.frontend/src/views/authorization/Authorization.vue
  46. 342
      io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue
  47. 37
      io.sc.engine.rule.frontend/src/views/function/Function.vue
  48. 2
      io.sc.engine.rule.frontend/src/views/lib/ImportDialog.vue
  49. 248
      io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue
  50. 32
      io.sc.engine.rule.frontend/src/views/lib/Lib.vue
  51. 90
      io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue
  52. 15
      io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue
  53. 155
      io.sc.engine.rule.frontend/src/views/lib/TestCase.vue
  54. 210
      io.sc.engine.rule.frontend/src/views/lib/TestCaseParameter.vue
  55. 76
      io.sc.engine.rule.frontend/src/views/lib/UploadIndicatorTemplateDialog.vue
  56. 25
      io.sc.engine.rule.frontend/src/views/lib/ValidatorGrid.vue
  57. 2
      io.sc.engine.rule.frontend/src/views/resources/ImportDialog.vue
  58. 6
      io.sc.engine.rule.frontend/src/views/resources/ImportSampleDialog.vue
  59. 244
      io.sc.engine.rule.frontend/src/views/resources/Resources.vue
  60. 23
      io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue
  61. 107
      io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue
  62. 46
      io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue
  63. 32
      io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue
  64. 40
      io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue
  65. 37
      io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue
  66. 394
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  67. 12
      io.sc.engine.rule.frontend/src/views/resources/designer/Processor.vue
  68. 204
      io.sc.engine.rule.frontend/src/views/resources/designer/TestCaseParameter.vue
  69. 201
      io.sc.engine.rule.frontend/src/views/resources/designer/Testcase.vue
  70. 67
      io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue
  71. 105
      io.sc.engine.rule.frontend/src/views/shared/AutoCompletionManager.ts
  72. 23
      io.sc.engine.rule.frontend/src/views/shared/BloodRelationshipDialog.vue
  73. 28
      io.sc.engine.rule.frontend/src/views/shared/LibManager.ts
  74. 11
      io.sc.engine.rule.frontend/src/views/shared/MoveParameterDialog.vue
  75. 2
      io.sc.engine.rule.frontend/src/views/shared/ObjectPropertiesMatcherDialog.vue
  76. 4
      io.sc.engine.rule.frontend/src/views/shared/Processor.ts
  77. 14
      io.sc.engine.rule.frontend/src/views/shared/ResourceDeployStatusTag.vue
  78. 97
      io.sc.engine.rule.frontend/src/views/shared/SelectIndicatorDialog.vue
  79. 472
      io.sc.engine.rule.frontend/src/views/shared/SimulatorDialog.vue
  80. 82
      io.sc.engine.rule.frontend/src/views/shared/TemplateImportAndExportDialog.vue
  81. 41
      io.sc.engine.rule.frontend/src/views/shared/TemplateImportAndExportManager.ts
  82. 246
      io.sc.engine.rule.frontend/src/views/shared/TestCaseGrid.vue
  83. 213
      io.sc.engine.rule.frontend/src/views/shared/TestcaseParameterGrid.vue
  84. 13
      io.sc.engine.rule.frontend/src/views/shared/UserDefinedFunctionsManager.ts
  85. 260
      io.sc.engine.rule.frontend/src/views/shared/ValueTypeManager.ts
  86. 97
      io.sc.engine.rule.frontend/src/views/shared/enums/EngineEnums.ts
  87. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts
  88. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts
  89. 16
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts
  90. 14
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts
  91. 2
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts
  92. 2
      io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts
  93. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts
  94. 42
      io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts
  95. 2
      io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts
  96. 7
      io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts
  97. 8
      io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts
  98. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts
  99. 2
      io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts
  100. 4
      io.sc.engine.rule.frontend/src/views/shared/processors/Rule.ts

2
erm.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.2",
"pinia": "2.2.2",
"pinia-undo": "0.2.4",
"platform-core": "8.1.440",
"platform-core": "8.1.454",
"quasar": "2.17.0",
"svg-path-commander": "2.0.10",
"tailwindcss": "3.4.10",

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc
platform_version=8.1.50
platform_plugin_version=8.1.50
platform_core_frontend_version=8.1.440
platform_core_frontend_version=8.1.454
###########################################################
# dependencies version

6
io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-dictionary.json

@ -1,4 +1,4 @@
[
"io.sc.creditreport.core.company.Document",
"io.sc.creditreport.core.person.Document"
]
{ "type": "JAVA_CLASS", "order": 1000, "id": "io.sc.creditreport.core.company.Document", "parent": "re.dictionary.category.engine", "code": "io.sc.creditreport.core.company.Document", "nameI18nKey": "io.sc.creditreport.core.company.Document", "description": "企业征信报告", "version": 2},
{ "type": "JAVA_CLASS", "order": 2000, "id": "io.sc.creditreport.core.person.Document", "parent": "re.dictionary.category.engine", "code": "io.sc.creditreport.core.person.Document", "nameI18nKey": "io.sc.creditreport.core.person.Document", "description": "企业征信报告", "version": 2}
]

18
io.sc.creditreport.core/src/main/resources/META-INF/platform/plugins/rule-engine-function.json

@ -0,0 +1,18 @@
[
{
"name" : "parseCompanyCreditReport",
"signature" : "parseCompanyCreditReport(xml)",
"description" : "将 xml 解析成征信报告对象(企业)",
"enable" : true,
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>parseCompanyCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def parseCompanyCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parseCompanyCreditReport(xml);\n}"
},
{
"name" : "parsePersonCreditReport",
"signature" : "parsePersonCreditReport(xml)",
"description" : "将 xml 解析成征信报告对象(个人)",
"enable" : true,
"mathXml" : "<mspace></mspace>\n<mrow>\n <mo>parsePersonCreditReport</mo>\n <mi>(</mi>\n <mspace></mspace>\n <mi>xml</mi>\n <mspace></mspace>\n <mi>)</mi>\n</mrow>\n<mspace></mspace>",
"body" : "def parsePersonCreditReport(String xml){\n return io.sc.creditreport.core.CreditReportParser.parsePersonCreditReport(xml);\n}"
}
]

4
io.sc.creditreport.core/src/main/resources/io/sc/creditreport/core/i18n/messages.properties

@ -1,4 +1,4 @@
io.sc.creditreport.core.company.Document = \u4F01\u4E1A\u4FE1\u7528\u62A5\u544A\u63A5\u53E3\u67E5\u8BE2
io.sc.creditreport.core.company.Document = \u4F01\u4E1A\u4FE1\u7528\u62A5\u544A
io.sc.creditreport.core.company.EA01 = \u62A5\u544A\u5934\u4FE1\u606F\u5355\u5143
io.sc.creditreport.core.company.EA01A = \u62A5\u544A\u6807\u8BC6\u4FE1\u606F\u6BB5
io.sc.creditreport.core.company.EA01A.ea01ai01 = \u62A5\u544A\u7F16\u53F7
@ -1180,7 +1180,7 @@ io.sc.creditreport.core.company.eg10b = \u4E8B\u4E1A\u5355\u4F4D\u6536\u5165\u65
io.sc.creditreport.core.company.ega = \u8D22\u52A1\u4FE1\u606F
io.sc.creditreport.core.company.eha = \u8BC4\u7EA7\u4FE1\u606F
io.sc.creditreport.core.company.eia = \u58F0\u660E\u53CA\u5F02\u8BAE\u6807\u6CE8\u4FE1\u606F
io.sc.creditreport.core.person.Document = \u4E2A\u4EBA\u4FE1\u7528\u62A5\u544A\u63A5\u53E3\u67E5\u8BE2
io.sc.creditreport.core.person.Document = \u4E2A\u4EBA\u4FE1\u7528\u62A5\u544A
io.sc.creditreport.core.person.PA01 = \u62A5\u544A\u5934\u4FE1\u606F\u5355\u5143
io.sc.creditreport.core.person.PA01A = \u62A5\u544A\u6807\u8BC6\u4FE1\u606F\u6BB5
io.sc.creditreport.core.person.PA01A.pa01ai01 = \u62A5\u544A\u7F16\u53F7

4
io.sc.creditreport.core/src/main/resources/io/sc/creditreport/core/i18n/messages_tw_CN.properties

@ -1,4 +1,4 @@
io.sc.creditreport.core.company.Document = \u4F01\u4E1A\u4FE1\u7528\u62A5\u544A\u63A5\u53E3\u67E5\u8BE2
io.sc.creditreport.core.company.Document = \u4F01\u4E1A\u4FE1\u7528\u62A5\u544A
io.sc.creditreport.core.company.EA01 = \u62A5\u544A\u5934\u4FE1\u606F\u5355\u5143
io.sc.creditreport.core.company.EA01A = \u62A5\u544A\u6807\u8BC6\u4FE1\u606F\u6BB5
io.sc.creditreport.core.company.EA01A.ea01ai01 = \u62A5\u544A\u7F16\u53F7
@ -1180,7 +1180,7 @@ io.sc.creditreport.core.company.eg10b = \u4E8B\u4E1A\u5355\u4F4D\u6536\u5165\u65
io.sc.creditreport.core.company.ega = \u8D22\u52A1\u4FE1\u606F
io.sc.creditreport.core.company.eha = \u8BC4\u7EA7\u4FE1\u606F
io.sc.creditreport.core.company.eia = \u58F0\u660E\u53CA\u5F02\u8BAE\u6807\u6CE8\u4FE1\u606F
io.sc.creditreport.core.person.Document = \u4E2A\u4EBA\u4FE1\u7528\u62A5\u544A\u63A5\u53E3\u67E5\u8BE2
io.sc.creditreport.core.person.Document = \u4E2A\u4EBA\u4FE1\u7528\u62A5\u544A
io.sc.creditreport.core.person.PA01 = \u62A5\u544A\u5934\u4FE1\u606F\u5355\u5143
io.sc.creditreport.core.person.PA01A = \u62A5\u544A\u6807\u8BC6\u4FE1\u606F\u6BB5
io.sc.creditreport.core.person.PA01A.pa01ai01 = \u62A5\u544A\u7F16\u53F7

4
io.sc.creditreport.core/src/main/resources/io/sc/creditreport/core/i18n/messages_zh_CN.properties

@ -1,4 +1,4 @@
io.sc.creditreport.core.company.Document = \u4F01\u4E1A\u4FE1\u7528\u62A5\u544A\u63A5\u53E3\u67E5\u8BE2
io.sc.creditreport.core.company.Document = \u4F01\u4E1A\u4FE1\u7528\u62A5\u544A
io.sc.creditreport.core.company.EA01 = \u62A5\u544A\u5934\u4FE1\u606F\u5355\u5143
io.sc.creditreport.core.company.EA01A = \u62A5\u544A\u6807\u8BC6\u4FE1\u606F\u6BB5
io.sc.creditreport.core.company.EA01A.ea01ai01 = \u62A5\u544A\u7F16\u53F7
@ -1180,7 +1180,7 @@ io.sc.creditreport.core.company.eg10b = \u4E8B\u4E1A\u5355\u4F4D\u6536\u5165\u65
io.sc.creditreport.core.company.ega = \u8D22\u52A1\u4FE1\u606F
io.sc.creditreport.core.company.eha = \u8BC4\u7EA7\u4FE1\u606F
io.sc.creditreport.core.company.eia = \u58F0\u660E\u53CA\u5F02\u8BAE\u6807\u6CE8\u4FE1\u606F
io.sc.creditreport.core.person.Document = \u4E2A\u4EBA\u4FE1\u7528\u62A5\u544A\u63A5\u53E3\u67E5\u8BE2
io.sc.creditreport.core.person.Document = \u4E2A\u4EBA\u4FE1\u7528\u62A5\u544A
io.sc.creditreport.core.person.PA01 = \u62A5\u544A\u5934\u4FE1\u606F\u5355\u5143
io.sc.creditreport.core.person.PA01A = \u62A5\u544A\u6807\u8BC6\u4FE1\u606F\u6BB5
io.sc.creditreport.core.person.PA01A.pa01ai01 = \u62A5\u544A\u7F16\u53F7

2
io.sc.engine.mv.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.2",
"pinia": "2.2.2",
"pinia-undo": "0.2.4",
"platform-core": "8.1.440",
"platform-core": "8.1.454",
"quasar": "2.17.0",
"svg-path-commander": "2.0.10",
"tailwindcss": "3.4.10",

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ParameterResult.java

@ -1,15 +1,13 @@
package io.sc.engine.rule.core.code.impl.support;
import java.math.BigDecimal;
import java.math.RoundingMode;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.engine.rule.core.classes.RuleResult;
import io.sc.engine.rule.core.classes.SingleRuleResult;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.ValueType;
import io.sc.engine.rule.core.util.JacksonObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* 参数结果
@ -59,7 +57,7 @@ public class ParameterResult {
this.valueScale =valueScale;
this.valueRoundingMode =valueRoundingMode;
this.value =value;
if(ValueType.Decimal.getJavaType().equals(valueType)) {
if(BigDecimal.class.getName().equals(valueType)) {
if(value!=null && !"".equals(value.trim())) {
BigDecimal _value =new BigDecimal(value);
if(valueScale!=null && valueRoundingMode!=null) {

9
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/DecisionTree.java

@ -5,7 +5,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.sc.engine.rule.core.enums.ValueType;
import io.sc.engine.rule.core.mxgraph.parser.DecisionTreeParser;
import io.sc.engine.rule.core.mxgraph.po.*;
import io.sc.engine.rule.core.po.model.Parameter;
@ -153,13 +152,13 @@ public class DecisionTree {
*/
private static String generateResourceAbstractGroovyCode(Map<String,String> methodNameCache,Parameter parameter,ResourceAbstractNode expressionNode,String methodName) {
StringBuilder sb =new StringBuilder();
sb.append("\tprivate static ").append(ValueType.getSimpleJavaType(parameter.getValueType())).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n");
String code =ExpressionReplacer.groovy(expressionNode.getCode(),ValueType.String.getJavaType());
String version =ExpressionReplacer.groovy(expressionNode.getVersion(),ValueType.Long.getJavaType());
sb.append("\tprivate static ").append(parameter.getValueType()).append(" ").append(methodName).append("(Executor executor,Argument ").append(ExpressionReplacer.ARGUMENT_NAME).append("){//资源").append("\n");
String code =ExpressionReplacer.groovy(expressionNode.getCode(),String.class.getName());
String version =ExpressionReplacer.groovy(expressionNode.getVersion(),Long.class.getName());
if(version==null || version.trim().isEmpty()) {
version ="null";
}
sb.append("\t\t").append("return new ").append(ValueType.getSimpleJavaType(parameter.getValueType())).append("(").append(code).append(",").append(version).append(")").append(";\n");
sb.append("\t\t").append("return new ").append(parameter.getValueType()).append("(").append(code).append(",").append(version).append(")").append(";\n");
sb.append("\t}").append("\n\n");
return sb.toString();

9
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/DictionaryType.java

@ -8,13 +8,4 @@ public enum DictionaryType {
JAVA_CLASS, //Java类
UD_JAVA_CLASS, //自定义Java类
ENUM; //枚举
public int getOrder() {
switch(this) {
case FOLDER:
return 0;
default:
return 1;
}
}
}

25
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/IndicatorType.java

@ -5,5 +5,28 @@ package io.sc.engine.rule.core.enums;
*/
public enum IndicatorType {
INTERFACE, //接口
INDICATOR //指标
INDICATOR; //指标
public static boolean isInputType(IndicatorType type) {
return IndicatorType.INTERFACE.equals(type);
}
public static boolean isInputType(String type){
return IndicatorType.INTERFACE.toString().equals(type);
}
public static boolean isOutputType(IndicatorType type) {
return IndicatorType.INDICATOR.equals(type);
}
public static boolean isOutputType(String type) {
return IndicatorType.INDICATOR.toString().equals(type);
}
public static String[] getNames(){
return new String[]{
INTERFACE.toString(),
INDICATOR.toString()
};
}
}

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ParameterType.java

@ -12,6 +12,31 @@ public enum ParameterType {
OUT, //输出
RULE_RESULT, //规则结果值
SINGLE_RULE_RESULT, //单规则结果值
CONSTANT //常量
CONSTANT; //常量
public static boolean isInputType(ParameterType type) {
return ParameterType.IN.equals(type) || ParameterType.IN_OPTION.equals(type) || ParameterType.INDICATOR.equals(type);
}
public static boolean isInputType(String type){
return ParameterType.IN.toString().equals(type) || ParameterType.IN_OPTION.toString().equals(type) || ParameterType.INDICATOR.toString().equals(type);
}
public static boolean isOutputType(ParameterType type) {
return ParameterType.INTERMEDIATE.equals(type) || ParameterType.OUT.equals(type);
}
public static boolean isOutputType(String type) {
return ParameterType.INTERMEDIATE.toString().equals(type) || ParameterType.OUT.toString().equals(type);
}
public static String[] getNames(){
return new String[]{
IN.toString(),
IN_OPTION.toString(),
INDICATOR.toString(),
INTERMEDIATE.toString(),
OUT.toString()
};
}
}

5
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ResourceType.java

@ -5,9 +5,8 @@ package io.sc.engine.rule.core.enums;
*/
public enum ResourceType {
FOLDER, //文件夹
MODEL, //模型
SCORE_CARD; //评分卡
MODEL; //模型
public int getOrder() {
switch(this) {
case FOLDER:

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/TestCaseOwnerType.java

@ -6,8 +6,7 @@ package io.sc.engine.rule.core.enums;
*
*/
public enum TestCaseOwnerType {
LIB, //指标库
RESOURCE, //资源
MODEL, //模型
SCORE_CARD //评分卡
LIB; //指标库
}

213
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValueType.java

@ -1,213 +0,0 @@
package io.sc.engine.rule.core.enums;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import io.sc.engine.rule.core.classes.ResourceAbstract;
import io.sc.engine.rule.core.classes.RuleResult;
import io.sc.engine.rule.core.classes.SingleRuleResult;
import io.sc.engine.rule.core.util.DateUtil;
import io.sc.engine.rule.core.util.JacksonObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
/**
* 值类型
* @author wangshaoping
*
*/
public enum ValueType {
Boolean, //布尔
Long, //整数
Float, //浮点数
Decimal, //小数
String, //字符串
Date, //日期
List, //列表
Map, //字典
RuleResult, //规则结果值
SingleRuleResult, //单规则结果值
ResourceAbstract; //资源摘要
public static boolean isBase(Object o){
if(o==null){
return true;
}
return isBase(o.getClass());
}
public static boolean isBase(Class<?> clazz){
if(clazz.isPrimitive()){
return true;
}
if(
Byte.class.equals(clazz)
|| Short.class.equals(clazz)
|| Integer.class.equals(clazz)
|| BigInteger.class.equals(clazz)
|| Long.class.equals(clazz)
|| Float.class.equals(clazz)
|| Double.class.equals(clazz)
|| BigDecimal.class.equals(clazz)
|| String.class.equals(clazz)
|| Calendar.class.equals(clazz)
|| Date.class.equals(clazz)
){
return true;
}
return false;
}
public static boolean isList(Class<?> clazz){
return List.class.isAssignableFrom(clazz);
}
public static boolean isMap(Class<?> clazz){
return Map.class.isAssignableFrom(clazz);
}
public String getJavaType() {
switch(this) {
case Boolean:
return "java.lang.Boolean";
case Long:
return "java.lang.Long";
case Float:
return "java.lang.Float";
case Decimal:
return "java.math.BigDecimal";
case String:
return "java.lang.String";
case Date:
return "java.util.Date";
case List:
return "java.util.List";
case Map:
return "java.util.Map";
case RuleResult:
return "io.sc.engine.rule.core.classes.RuleResult";
case SingleRuleResult:
return "io.sc.engine.rule.core.classes.SingleRuleResult";
case ResourceAbstract:
return "io.sc.engine.rule.core.classes.ResourceAbstract";
default:
return this.toString();
}
}
public String getSimpleJavaType() {
switch(this) {
case Boolean:
return "Boolean";
case Long:
return "Long";
case Float:
return "Float";
case Decimal:
return "BigDecimal";
case String:
return "String";
case Date:
return "Date";
case List:
return "List";
case Map:
return "Map";
case RuleResult:
return "RuleResult";
case SingleRuleResult:
return "SingleRuleResult";
case ResourceAbstract:
return "ResourceAbstract";
default:
return this.toString();
}
}
public static String getSimpleJavaType(String type) {
if(Boolean.getJavaType().equals(type)) {
return Boolean.getSimpleJavaType();
}else if(Long.getJavaType().equals(type)) {
return Long.getSimpleJavaType();
}else if(Float.getJavaType().equals(type)) {
return Float.getSimpleJavaType();
}else if(Decimal.getJavaType().equals(type)) {
return Decimal.getSimpleJavaType();
}else if(String.getJavaType().equals(type)) {
return String.getSimpleJavaType();
}else if(Date.getJavaType().equals(type)) {
return Date.getSimpleJavaType();
}else if(List.getJavaType().equals(type)) {
return List.getSimpleJavaType();
}else if(Map.getJavaType().equals(type)) {
return Map.getSimpleJavaType();
}else if(RuleResult.getJavaType().equals(type)) {
return RuleResult.getSimpleJavaType();
}else if(SingleRuleResult.getJavaType().equals(type)) {
return SingleRuleResult.getSimpleJavaType();
}else if(ResourceAbstract.getJavaType().equals(type)) {
return ResourceAbstract.getSimpleJavaType();
}else {
return type;
}
}
public static boolean isBaseType(String type) {
if(
Boolean.getJavaType().equals(type) || Boolean.getSimpleJavaType().equals(type)
|| Long.getJavaType().equals(type) || Long.getSimpleJavaType().equals(type)
|| Float.getJavaType().equals(type) || Float.getSimpleJavaType().equals(type)
|| Decimal.getJavaType().equals(type) || Decimal.getSimpleJavaType().equals(type)
|| String.getJavaType().equals(type) || String.getSimpleJavaType().equals(type)
|| Date.getJavaType().equals(type)|| Date.getSimpleJavaType().equals(type)
|| List.getJavaType().equals(type)|| List.getSimpleJavaType().equals(type)
|| Map.getJavaType().equals(type)|| Map.getSimpleJavaType().equals(type)
|| RuleResult.getJavaType().equals(type)|| RuleResult.getSimpleJavaType().equals(type)
|| SingleRuleResult.getJavaType().equals(type)|| SingleRuleResult.getSimpleJavaType().equals(type)
|| ResourceAbstract.getJavaType().equals(type)|| ResourceAbstract.getSimpleJavaType().equals(type)
) {
return true;
}
return false;
}
public static String generateSampleValue(String type) {
if(Boolean.getJavaType().equals(type)) {
return "true";
}else if(Long.getJavaType().equals(type)) {
return "1";
}else if(Float.getJavaType().equals(type)) {
return "1.0";
}else if(Decimal.getJavaType().equals(type)) {
return "1.0";
}else if(String.getJavaType().equals(type)) {
return "\"string\"";
}else if(Date.getJavaType().equals(type)) {
return "\"" + DateUtil.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss) + "\"";
}else if(List.getJavaType().equals(type)) {
return "new ArrayList<Object>()";
}else if(Map.getJavaType().equals(type)) {
return "new LinkedHashMap<String,Object>()";
}else if(RuleResult.getJavaType().equals(type)) {
try {
return JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(new RuleResult());
} catch (JsonProcessingException e) {
}
}else if(SingleRuleResult.getJavaType().equals(type)) {
try {
return JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(new SingleRuleResult());
} catch (JsonProcessingException e) {
}
}else if(ResourceAbstract.getJavaType().equals(type)) {
try {
return JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(new ResourceAbstract());
} catch (JsonProcessingException e) {
}
}
return null;
}
}

25
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/dictionary/Dictionary.java

@ -6,6 +6,7 @@ import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.enums.DeployStatus;
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=FolderDictionary.class)
@ -19,8 +20,10 @@ public abstract class Dictionary {
protected String id; //Id
protected String code; //代码
protected String name; //名称
protected String namec; //名称(字母)
protected String description; //描述
protected Integer order; //排序
protected Integer version; //版本
protected DeployStatus status; //状态
private List<Dictionary> children =new ArrayList<Dictionary>();//孩子集合
public Dictionary() {}
@ -46,17 +49,29 @@ public abstract class Dictionary {
public void setName(String name) {
this.name = name;
}
public String getNamec() {
return namec;
}
public void setNamec(String namec) {
this.namec = namec;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getOrder() {
return order;
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public DeployStatus getStatus() {
return status;
}
public void setOrder(Integer order) {
this.order = order;
public void setStatus(DeployStatus status) {
this.status = status;
}
public List<Dictionary> getChildren() {
return children;

41
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/dictionary/UserDefinedJavaClassField.java

@ -1,15 +1,20 @@
package io.sc.engine.rule.core.po.dictionary;
import java.math.RoundingMode;
public class UserDefinedJavaClassField {
protected String id; //Id
protected String code; //代码
protected String name; //名称
protected String description; //描述
protected String valueType; //值类型
protected Boolean valueTypeIsList; //值是否为列表
protected String defaultValue; //默认值
protected String valueCalculation; //值计算逻辑
protected Integer order; //排序
protected String id; //Id
protected String code; //代码
protected String name; //名称
protected String description; //描述
protected String valueType; //值类型
protected Integer valueTypeVersion; //值版本
protected Integer valueScale; //值精度
protected RoundingMode valueRoundingMode; //值四舍五入模式
protected Boolean valueTypeIsList; //值是否为列表
protected String defaultValue; //默认值
protected String valueCalculation; //值计算逻辑
protected Integer order; //排序
public String getId() {
return id;
@ -41,6 +46,24 @@ public class UserDefinedJavaClassField {
public void setValueType(String valueType) {
this.valueType = valueType;
}
public Integer getValueTypeVersion() {
return valueTypeVersion;
}
public void setValueTypeVersion(Integer valueTypeVersion) {
this.valueTypeVersion = valueTypeVersion;
}
public Integer getValueScale() {
return valueScale;
}
public void setValueScale(Integer valueScale) {
this.valueScale = valueScale;
}
public RoundingMode getValueRoundingMode() {
return valueRoundingMode;
}
public void setValueRoundingMode(RoundingMode valueRoundingMode) {
this.valueRoundingMode = valueRoundingMode;
}
public Boolean getValueTypeIsList() {
return valueTypeIsList;
}

10
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/Indicator.java

@ -7,7 +7,6 @@ import java.util.List;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import io.sc.engine.rule.core.code.impl.support.parameter.ParameterGroovyCodeContributionItem;
import io.sc.engine.rule.core.enums.IndicatorType;
import io.sc.engine.rule.core.enums.ValueType;
import io.sc.engine.rule.core.po.lib.indicator.IndicatorIndicator;
import io.sc.engine.rule.core.po.lib.indicator.InterfaceIndicator;
import io.sc.engine.rule.core.po.lib.processor.EmptyIndicatorProcessor;
@ -16,6 +15,7 @@ import io.sc.engine.rule.core.util.CodeReplacer;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.util.ValueTypeUtil;
/**
* 指标
@ -47,8 +47,8 @@ public abstract class Indicator implements ParameterGroovyCodeContributionItem{
public String getValueTypeFullName() {
String parameterValueType =this.getValueType();
if(ValueType.isBaseType(parameterValueType)) {
parameterValueType =ValueType.getSimpleJavaType(parameterValueType);
if(ValueTypeUtil.isBase(parameterValueType)) {
return parameterValueType;
}else {
parameterValueType =parameterValueType + (this.getValueTypeVersion()==null?"":"_V" + this.getValueTypeVersion());
}
@ -98,7 +98,7 @@ public abstract class Indicator implements ParameterGroovyCodeContributionItem{
sb.append("}");
sb.append("//").append(this.getName());
if(!ValueType.isBaseType(parameterValueType)) {
if(!ValueTypeUtil.isBase(parameterValueType)) {
sb.append("\n\t\t\t");
sb.append("if(").append(targetVarName).append(".").append(CodeReplacer.fieldName(parameterCode)).append("!=null){");
sb.append(targetVarName).append(".").append(CodeReplacer.fieldName(parameterCode)).append(".init();}");
@ -110,7 +110,7 @@ public abstract class Indicator implements ParameterGroovyCodeContributionItem{
public String forConvertArgumentFromJson(ResourceWrapper wrapper,String targetVarName) {
StringBuilder sb =new StringBuilder("");
String parameterValueType =getValueTypeFullName();
if(!ValueType.isBaseType(parameterValueType)) {
if(!ValueTypeUtil.isBase(parameterValueType)) {
sb.append("if(").append(targetVarName).append(".").append(CodeReplacer.fieldName(this.getCode())).append("!=null){");
sb.append(targetVarName).append(".").append(CodeReplacer.fieldName(this.getCode())).append(".init();}");
}else {

3
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/IndicatorLib.java

@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("INDICATOR")
@JsonIgnoreProperties(ignoreUnknown=true)
public class IndicatorLib extends ReleasableLib {
public class IndicatorLib extends Lib {
protected List<Indicator> indicators =new ArrayList<Indicator>();
public List<Indicator> getIndicators() {
@ -18,5 +18,4 @@ public class IndicatorLib extends ReleasableLib {
public void setIndicators(List<Indicator> indicators) {
this.indicators = indicators;
}
}

18
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/lib/Lib.java

@ -3,6 +3,7 @@ package io.sc.engine.rule.core.po.lib;
import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.enums.DeployStatus;
import io.sc.engine.rule.core.po.testcase.LibTestCase;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@ -20,7 +21,8 @@ public abstract class Lib {
protected String code; //代码
protected String name; //名称
protected String description; //描述
protected Integer order; //排序
protected Integer version; //版本
protected DeployStatus status; //状态
private List<Lib> children =new ArrayList<Lib>();//孩子集合
protected List<LibTestCase> testCases =new ArrayList<LibTestCase>();//测试用例
@ -53,11 +55,17 @@ public abstract class Lib {
public void setDescription(String description) {
this.description = description;
}
public Integer getOrder() {
return order;
public Integer getVersion() {
return version;
}
public void setOrder(Integer order) {
this.order = order;
public void setVersion(Integer version) {
this.version = version;
}
public DeployStatus getStatus() {
return status;
}
public void setStatus(DeployStatus status) {
this.status = status;
}
public List<Lib> getChildren() {
return children;

37
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/Parameter.java

@ -1,27 +1,18 @@
package io.sc.engine.rule.core.po.model;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import io.sc.engine.rule.core.code.impl.support.parameter.ParameterGroovyCodeContributionItem;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.ValueType;
import io.sc.engine.rule.core.po.model.parameter.ConstantParameter;
import io.sc.engine.rule.core.po.model.parameter.InOptionParameter;
import io.sc.engine.rule.core.po.model.parameter.InParameter;
import io.sc.engine.rule.core.po.model.parameter.InSubOutParameter;
import io.sc.engine.rule.core.po.model.parameter.IndicatorParameter;
import io.sc.engine.rule.core.po.model.parameter.IntermediateParameter;
import io.sc.engine.rule.core.po.model.parameter.OutParameter;
import io.sc.engine.rule.core.po.model.parameter.RuleResultParameter;
import io.sc.engine.rule.core.po.model.parameter.SingleRuleResultParameter;
import io.sc.engine.rule.core.po.model.parameter.*;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ValueTypeUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=InParameter.class)
@JsonSubTypes({
@ -55,13 +46,7 @@ public abstract class Parameter implements ParameterGroovyCodeContributionItem{
public abstract ParameterType getType();
public String getValueTypeFullName() {
String parameterValueType =this.getValueType();
if(ValueType.isBaseType(parameterValueType)) {
parameterValueType =ValueType.getSimpleJavaType(parameterValueType);
}else {
parameterValueType =parameterValueType + (this.getValueTypeVersion()==null?"":"_V" + this.getValueTypeVersion());
}
return parameterValueType;
return this.getValueType() + (this.getValueTypeVersion()==null?"":"_V" + this.getValueTypeVersion());
}
@Override
@ -107,7 +92,7 @@ public abstract class Parameter implements ParameterGroovyCodeContributionItem{
sb.append("}");
sb.append("//").append(this.getName());
if(!ValueType.isBaseType(parameterValueType)) {
if(!ValueTypeUtil.isBase(parameterValueType)) {
sb.append("\\n\t\t\t");
sb.append("if(").append(targetVarName).append(".").append(CodeReplacer.fieldName(parameterCode)).append("!=null){");
sb.append(targetVarName).append(".").append(CodeReplacer.fieldName(parameterCode)).append(".init();}");
@ -119,7 +104,7 @@ public abstract class Parameter implements ParameterGroovyCodeContributionItem{
public String forConvertArgumentFromJson(ResourceWrapper wrapper,String targetVarName) {
StringBuilder sb =new StringBuilder("");
String parameterValueType =getValueTypeFullName();
if(!ValueType.isBaseType(parameterValueType)) {
if(!ValueTypeUtil.isBase(parameterValueType)) {
sb.append("if(").append(targetVarName).append(".").append(CodeReplacer.fieldName(this.getCode())).append("!=null){");
sb.append(targetVarName).append(".").append(CodeReplacer.fieldName(this.getCode())).append(".init();}");
}else {

4
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/parameter/IndicatorParameter.java

@ -5,13 +5,13 @@ import io.sc.engine.rule.core.code.impl.support.ResourceWrapper4Resource;
import io.sc.engine.rule.core.code.impl.support.lib.LibUtil;
import io.sc.engine.rule.core.code.impl.support.parameter.ParameterGroovyCodeContributionItem;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.ValueType;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.util.CodeReplacer;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.util.ValueTypeUtil;
/**
* 模型参数(指标)
@ -53,7 +53,7 @@ public class IndicatorParameter extends Parameter implements ParameterGroovyCode
sb.append("}");
sb.append("//").append(this.getName());
if(!ValueType.isBaseType(parameterValueType)) {
if(!ValueTypeUtil.isBase(parameterValueType)) {
sb.append("\n\t\t\t");
sb.append("if(").append(targetVarName).append(".").append(CodeReplacer.fieldName(parameterCode)).append("!=null){");
sb.append(targetVarName).append(".").append(CodeReplacer.fieldName(parameterCode)).append(".init();}");

21
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ModelResource.java

@ -6,19 +6,34 @@ import io.sc.engine.rule.core.po.model.Model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
import java.util.Date;
@JsonTypeName("MODEL")
@JsonIgnoreProperties(ignoreUnknown=true)
public class ModelResource extends ReleasableResource {
public class ModelResource extends Resource {
private Model model;
protected Date effectiveDate; //生效日期
protected String imports; //imports
public Model getModel() {
return model;
}
public void setModel(Model model) {
this.model = model;
}
public Date getEffectiveDate() {
return effectiveDate;
}
public void setEffectiveDate(Date effectiveDate) {
this.effectiveDate = effectiveDate;
}
public String getImports() {
return imports;
}
public void setImports(String imports) {
this.imports = imports;
}
@Override
public ResourceType getType() {
return ResourceType.MODEL;

47
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ReleasableResource.java

@ -1,47 +0,0 @@
package io.sc.engine.rule.core.po.resource;
import java.util.Date;
import io.sc.engine.rule.core.enums.DeployStatus;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown=true)
public abstract class ReleasableResource extends Resource{
protected DeployStatus status; //状态
protected Integer version; //版本
protected Date effectiveDate; //生效日期
protected String imports; //imports
public DeployStatus getStatus() {
return status;
}
public void setStatus(DeployStatus status) {
this.status = status;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public Date getEffectiveDate() {
return effectiveDate;
}
public void setEffectiveDate(Date effectiveDate) {
this.effectiveDate = effectiveDate;
}
public String getImports() {
return imports;
}
public void setImports(String imports) {
this.imports = imports;
}
}

20
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/Resource.java

@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.enums.DeployStatus;
import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.core.po.testcase.ResourceTestCase;
@ -21,8 +22,9 @@ public abstract class Resource {
protected String code; //代码
protected String name; //名称
protected String description; //描述
protected Integer order; //排序
protected Integer version; //版本
protected DeployStatus status; //状态
private List<Resource> children =new ArrayList<Resource>();//孩子集合
protected List<ResourceTestCase> testCases =new ArrayList<ResourceTestCase>();//测试用例
@ -58,11 +60,17 @@ public abstract class Resource {
public void setDescription(String description) {
this.description = description;
}
public Integer getOrder() {
return order;
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public DeployStatus getStatus() {
return status;
}
public void setOrder(Integer order) {
this.order = order;
public void setStatus(DeployStatus status) {
this.status = status;
}
public List<Resource> getChildren() {
return children;

15
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/ScoreCardTestCase.java

@ -1,15 +0,0 @@
package io.sc.engine.rule.core.po.testcase;
import io.sc.engine.rule.core.enums.TestCaseOwnerType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("SCORE_CARD")
@JsonIgnoreProperties(ignoreUnknown=true)
public class ScoreCardTestCase extends ResourceTestCase{
@Override
public TestCaseOwnerType getType() {
return TestCaseOwnerType.SCORE_CARD;
}
}

23
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/testcase/TestCase.java

@ -1,30 +1,27 @@
package io.sc.engine.rule.core.po.testcase;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import io.sc.engine.rule.core.enums.TestCaseOwnerType;
import io.sc.engine.rule.core.enums.TestResult;
import io.sc.engine.rule.core.po.lib.FolderLib;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.sc.engine.rule.core.enums.TestCaseOwnerType;
import io.sc.engine.rule.core.enums.TestResult;
import io.sc.engine.rule.core.po.lib.FolderLib;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=FolderLib.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=ModelTestCase.class),
@JsonSubTypes.Type(value=ScoreCardTestCase.class),
@JsonSubTypes.Type(value=LibTestCase.class),
})
public abstract class TestCase {
protected String id; //ID
protected String name; //名称
protected String description; //描述
protected Integer order; //排序
protected Date lastTestDate; //最近执行测试用例日期
protected TestResult testResult; //测试用例执行结果
protected List<TestCaseParameter> parameters =new ArrayList<TestCaseParameter>(); //测试用例包含的参数
@ -55,12 +52,6 @@ public abstract class TestCase {
public void setDescription(String description) {
this.description = description;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public Date getLastTestDate() {
return lastTestDate;
}

6
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ExpressionReplacer.java

@ -7,8 +7,6 @@ import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.sc.engine.rule.core.enums.ValueType;
public class ExpressionReplacer {
/**
* 转为 groovy 脚本时变量所属参数名
@ -88,7 +86,7 @@ public class ExpressionReplacer {
*/
public static String groovy(String expression,String valueType) {
if(expression==null) return null;
if(ValueType.String.getJavaType().equals(valueType)) {
if(String.class.getName().equals(valueType)) {
//查找占位符模式(`xxx`)
Matcher matcher =PLACE_HOLDER_REGEX_PATTERN2.matcher(expression);
Map<String,String> founds =new HashMap<String,String>();
@ -133,7 +131,7 @@ public class ExpressionReplacer {
founds.put(matcher.group(1),matcher.group(2));
}
if(ValueType.String.getJavaType().equals(valueType)) {
if(String.class.getName().equals(valueType)) {
String result =expression;
if(founds!=null && founds.size()>0) {
for(String placeholder : founds.keySet()) {

66
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/util/ValueTypeUtil.java

@ -0,0 +1,66 @@
package io.sc.engine.rule.core.util;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
public class ValueTypeUtil {
private static final Map<String,Class<?>> BASE_CLASS_MAP = new HashMap<>();
static {
BASE_CLASS_MAP.put(Boolean.class.getName(),Boolean.class);
BASE_CLASS_MAP.put(Byte.class.getName(),Byte.class);
BASE_CLASS_MAP.put(Character.class.getName(),Character.class);
BASE_CLASS_MAP.put(Short.class.getName(),Short.class);
BASE_CLASS_MAP.put(Integer.class.getName(),Integer.class);
BASE_CLASS_MAP.put(Long.class.getName(),Long.class);
BASE_CLASS_MAP.put(Float.class.getName(),Float.class);
BASE_CLASS_MAP.put(Double.class.getName(),Double.class);
BASE_CLASS_MAP.put(BigInteger.class.getName(),BigInteger.class);
BASE_CLASS_MAP.put(BigDecimal.class.getName(),BigDecimal.class);
BASE_CLASS_MAP.put(String.class.getName(),String.class);
BASE_CLASS_MAP.put(Date.class.getName(),Date.class);
BASE_CLASS_MAP.put(Calendar.class.getName(),Calendar.class);
}
public static boolean isBase(Class<?> type){
return isBase(type.getName());
}
public static boolean isBase(String type){
return BASE_CLASS_MAP.containsKey(type);
}
public static boolean isList(Class<?> clazz){
return List.class.isAssignableFrom(clazz);
}
public static boolean isMap(Class<?> clazz){
return Map.class.isAssignableFrom(clazz);
}
public static String generateSampleValue(String type) {
if(Boolean.class.getName().equals(type)) {
return "true";
}else if(Long.class.getName().equals(type)) {
return "1";
}else if(Float.class.getName().equals(type)) {
return "1.0";
}else if(BigDecimal.class.getName().equals(type)) {
return "1.0";
}else if(String.class.getName().equals(type)) {
return "\"string\"";
}else if(Date.class.getName().equals(type)) {
return "\"" + DateUtil.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss) + "\"";
}else if(List.class.getName().equals(type)) {
return "new ArrayList<Object>()";
}else if(Map.class.getName().equals(type)) {
return "new LinkedHashMap<String,Object>()";
}
return null;
}
}

3
io.sc.engine.rule.core/src/main/resources/META-INF/platform/plugins/messages.json

@ -10,7 +10,8 @@
{
"includes":[
"io/sc/engine/rule/core/i18n/enums"
"io/sc/engine/rule/core/i18n/enums",
"io/sc/engine/rule/core/i18n/dictionary"
],
"excludes":[]
}

16
io.sc.engine.rule.core/src/main/resources/META-INF/platform/plugins/rule-engine-dictionary.json

@ -0,0 +1,16 @@
[
{ "type": "FOLDER", "order": 1000, "id": "re.dictionary.category.base", "parent": null, "code": "re.dictionary.category.base", "nameI18nKey": "re.dictionary.category.base", "description": "基本类型", "version": null},
{ "type": "JAVA_CLASS", "order": 100, "id": "java.lang.Boolean", "parent": "re.dictionary.category.base", "code": "java.lang.Boolean", "nameI18nKey": "java.lang.Boolean", "description": "布尔类型", "version": null},
{ "type": "JAVA_CLASS", "order": 200, "id": "java.lang.Long", "parent": "re.dictionary.category.base", "code": "java.lang.Long", "nameI18nKey": "java.lang.Long", "description": "整数类型", "version": null},
{ "type": "JAVA_CLASS", "order": 300, "id": "java.lang.Float", "parent": "re.dictionary.category.base", "code": "java.lang.Float", "nameI18nKey": "java.lang.Float", "description": "浮点数类型", "version": null},
{ "type": "JAVA_CLASS", "order": 400, "id": "java.math.BigDecimal", "parent": "re.dictionary.category.base", "code": "java.math.BigDecimal", "nameI18nKey": "java.math.BigDecimal", "description": "小数类型", "version": null},
{ "type": "JAVA_CLASS", "order": 500, "id": "java.lang.String", "parent": "re.dictionary.category.base", "code": "java.lang.String", "nameI18nKey": "java.lang.String", "description": "字符串类型", "version": null},
{ "type": "JAVA_CLASS", "order": 600, "id": "java.util.Date", "parent": "re.dictionary.category.base", "code": "java.util.Date", "nameI18nKey": "java.util.Date", "description": "日期类型", "version": null},
{ "type": "JAVA_CLASS", "order": 700, "id": "java.util.List", "parent": "re.dictionary.category.base", "code": "java.util.List", "nameI18nKey": "java.util.List", "description": "列表类型", "version": null},
{ "type": "JAVA_CLASS", "order": 800, "id": "java.util.Map", "parent": "re.dictionary.category.base", "code": "java.util.Map", "nameI18nKey": "java.util.Map", "description": "字典类型", "version": null},
{ "type": "FOLDER", "order": 2000, "id": "re.dictionary.category.engine", "parent": null, "code": "re.dictionary.category.engine", "nameI18nKey": "re.dictionary.category.engine", "description": "引擎内置类型", "version": null},
{ "type": "JAVA_CLASS", "order": 100, "id": "io.sc.engine.rule.core.classes.ResourceAbstract", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.classes.ResourceAbstract", "nameI18nKey": "io.sc.engine.rule.core.classes.ResourceAbstract", "description": "资源摘要", "version": null},
{ "type": "JAVA_CLASS", "order": 200, "id": "io.sc.engine.rule.core.classes.RuleResult", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.classes.RuleResult", "nameI18nKey": "io.sc.engine.rule.core.classes.RuleResult", "description": "规则集结果", "version": null},
{ "type": "JAVA_CLASS", "order": 300, "id": "io.sc.engine.rule.core.classes.SingleRuleResult", "parent": "re.dictionary.category.engine", "code": "io.sc.engine.rule.core.classes.SingleRuleResult", "nameI18nKey": "io.sc.engine.rule.core.classes.SingleRuleResult", "description": "单规则结果", "version": null},
{ "type": "FOLDER", "order": 3000, "id": "re.dictionary.category.customization", "parent": null, "code": "re.dictionary.category.customization", "nameI18nKey": "re.dictionary.category.customization", "description": "用户自定义类型", "version": null}
]

3
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary.properties

@ -0,0 +1,3 @@
re.dictionary.category.base=Base
re.dictionary.category.engine=Engine
re.dictionary.category.customization=User Customization

3
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_tw_CN.properties

@ -0,0 +1,3 @@
re.dictionary.category.base=\u57FA\u672C\u985E\u578B
re.dictionary.category.engine=\u5F15\u64CE\u5167\u7F6E\u985E\u578B
re.dictionary.category.customization=\u7528\u6236\u81EA\u5B9A\u7FA9\u985E\u578B

3
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/dictionary_zh_CN.properties

@ -0,0 +1,3 @@
re.dictionary.category.base=\u57FA\u672C\u7C7B\u578B
re.dictionary.category.engine=\u5F15\u64CE\u5185\u7F6E\u7C7B\u578B
re.dictionary.category.customization=\u7528\u6237\u81EA\u5B9A\u4E49\u7C7B\u578B

11
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties

@ -92,7 +92,7 @@ io.sc.engine.rule.core.enums.HttpAuthorizationType.BEARER=Bearer Token
#================================================
io.sc.engine.rule.core.enums.DictionaryType.FOLDER=Folder
io.sc.engine.rule.core.enums.DictionaryType.JAVA_CLASS=Java Class
io.sc.engine.rule.core.enums.DictionaryType.UD_JAVA_CLASS=User Defined Class
io.sc.engine.rule.core.enums.DictionaryType.UD_JAVA_CLASS=Structure
io.sc.engine.rule.core.enums.DictionaryType.ENUM=Enumerate
#================================================
@ -133,4 +133,11 @@ io.sc.engine.rule.core.enums.ScoreCardVarType.RESULT=Result
#================================================
io.sc.engine.rule.core.enums.TestCaseOwnerType.MODEL=Model
io.sc.engine.rule.core.enums.TestCaseOwnerType.SCORE_CARD=Score Card
io.sc.engine.rule.core.enums.TestCaseOwnerType.LIB=Lib
io.sc.engine.rule.core.enums.TestCaseOwnerType.LIB=Lib
#================================================
# \u6D4B\u8BD5\u7ED3\u679C\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.TestResult.PASSED=Passed
io.sc.engine.rule.core.enums.TestResult.UN_PASSED=UnPassed
io.sc.engine.rule.core.enums.TestResult.ERROR=Error

11
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties

@ -92,7 +92,7 @@ io.sc.engine.rule.core.enums.HttpAuthorizationType.BEARER=Bearer Token
#================================================
io.sc.engine.rule.core.enums.DictionaryType.FOLDER=\u6587\u4EF6\u593E
io.sc.engine.rule.core.enums.DictionaryType.JAVA_CLASS=Java \u985E
io.sc.engine.rule.core.enums.DictionaryType.UD_JAVA_CLASS=\u81EA\u5B9A\u7FA9\u985E
io.sc.engine.rule.core.enums.DictionaryType.UD_JAVA_CLASS=\u7D50\u69CB\u9AD4
io.sc.engine.rule.core.enums.DictionaryType.ENUM=\u679A\u8209
#================================================
@ -133,4 +133,11 @@ io.sc.engine.rule.core.enums.ScoreCardVarType.RESULT=\u7D50\u679C\u503C
#================================================
io.sc.engine.rule.core.enums.TestCaseOwnerType.MODEL=\u6A21\u578B
io.sc.engine.rule.core.enums.TestCaseOwnerType.SCORE_CARD=\u8A55\u5206\u5361
io.sc.engine.rule.core.enums.TestCaseOwnerType.LIB=\u6307\u6A19\u5EAB
io.sc.engine.rule.core.enums.TestCaseOwnerType.LIB=\u6307\u6A19\u5EAB
#================================================
# \u6D4B\u8BD5\u7ED3\u679C\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.TestResult.PASSED=\u901A\u904E
io.sc.engine.rule.core.enums.TestResult.UN_PASSED=\u672A\u901A\u904E
io.sc.engine.rule.core.enums.TestResult.ERROR=\u932F\u8AA4

11
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties

@ -92,7 +92,7 @@ io.sc.engine.rule.core.enums.HttpAuthorizationType.BEARER=Bearer Token
#================================================
io.sc.engine.rule.core.enums.DictionaryType.FOLDER=\u6587\u4EF6\u5939
io.sc.engine.rule.core.enums.DictionaryType.JAVA_CLASS=Java \u7C7B
io.sc.engine.rule.core.enums.DictionaryType.UD_JAVA_CLASS=\u81EA\u5B9A\u4E49\u7C7B
io.sc.engine.rule.core.enums.DictionaryType.UD_JAVA_CLASS=\u7ED3\u6784\u4F53
io.sc.engine.rule.core.enums.DictionaryType.ENUM=\u679A\u4E3E
#================================================
@ -133,4 +133,11 @@ io.sc.engine.rule.core.enums.ScoreCardVarType.RESULT=\u7ED3\u679C\u503C
#================================================
io.sc.engine.rule.core.enums.TestCaseOwnerType.MODEL=\u6A21\u578B
io.sc.engine.rule.core.enums.TestCaseOwnerType.SCORE_CARD=\u8BC4\u5206\u5361
io.sc.engine.rule.core.enums.TestCaseOwnerType.LIB=\u6307\u6807\u5E93
io.sc.engine.rule.core.enums.TestCaseOwnerType.LIB=\u6307\u6807\u5E93
#================================================
# \u6D4B\u8BD5\u7ED3\u679C\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.TestResult.PASSED=\u901A\u8FC7
io.sc.engine.rule.core.enums.TestResult.UN_PASSED=\u672A\u901A\u8FC7
io.sc.engine.rule.core.enums.TestResult.ERROR=\u51FA\u73B0\u9519\u8BEF

2
io.sc.engine.rule.frontend/package.json

@ -111,7 +111,7 @@
"node-sql-parser": "5.3.2",
"pinia": "2.2.2",
"pinia-undo": "0.2.4",
"platform-core": "8.1.440",
"platform-core": "8.1.454",
"quasar": "2.17.0",
"svg-path-commander": "2.0.10",
"tailwindcss": "3.4.10",

329
io.sc.engine.rule.frontend/src/i18n/messages.json

@ -9,11 +9,10 @@
"menu.engine.rule.testcase": "Test Case Manager",
"menu.engine.rule.migration": "Data Back and Migration",
"re.resources.grid.title": "Model",
"re.resources.grid.title": "Resources",
"re.resources.grid.toolbar.addTop": "Top Folder",
"re.resources.grid.toolbar.addChild": "Child Folder",
"re.resources.grid.toolbar.addModel": "Model",
"re.resources.grid.toolbar.addScoreCard": "Score Card",
"re.resources.grid.toolbar.deepClone.tip": "Are you sure to deep clone the resource?",
"re.resources.grid.toolbar.deepCloneNew": "Deep Clone(new)",
"re.resources.grid.toolbar.deepCloneNew.tip": "Are you sure to deep clone the resource as new resource?",
@ -22,6 +21,7 @@
"re.resources.grid.toolbar.deploy.online.tip": "Are you sure to on line the resource?",
"re.resources.grid.toolbar.deploy.offline": "Offline",
"re.resources.grid.toolbar.deploy.offline.tip": "Are you sure to off line the resource?",
"re.resources.grid.toolbar.viewBloodRelationship": "View Blood Relationship",
"re.resources.grid.toolbar.importExample": "Import Example",
"re.resources.grid.entity.effectiveDate": "Effective Date",
@ -29,170 +29,129 @@
"re.resources.grid.entity.taskName": "Task Name",
"re.resources.grid.entity.taskAssignee": "Task Assignee",
"re.resources.dialog.import.title": "Import Resource",
"re.resources.dialog.importSample.title": "Import Sample Resource",
"re.resources.dialog.importSample.grid.title": "Sample List",
"re.resources.dialog.importSample.grid.toolbar.import": "Import Sample",
"re.resources.dialog.importSample.grid.toolbar.import.tip": "Are you sure to import the samples?",
"re.resources.dialog.attachment.title": "Attachment Manager",
"re.resources.dialog.attachment.grid.title": "Attachment List",
"re.resources.dialog.attachment.grid.entity.file": "Please select a file",
"re.resources.designer.dialog.title": "Model Designer - {name} ({status},V{version})",
"re.resources.designer.model.grid.title": "Model Structure",
"re.resources.designer.model.grid.toolbar.addChild": "Add Child Model",
"re.resources.designer.model.grid.toolbar.deepClone.tip": "Are you sure to deep clone the model?",
"re.resources.designer.model.grid.toolbar.generateGroovySourceCode": "Generate Script Code",
"re.resources.designer.model.grid.toolbar.generateGroovySourceCode4TestCase": "Generate Script Code(Test Case)",
"re.resources.designer.model.grid.entity.executeMode": "Execute Mode",
"re.resources.designer.parameter.tab.title": "Parameter",
"re.resources.designer.testcase.tab.title": "Test Case",
"re.resources.designer.validator.tab.title": "Validator",
"re.resources.designer.processor.tab.title": "Processor",
"re.resources.designer.option.tab.title": "Option",
"re.resources.designer.parameter.grid.title": "Parameter List",
"re.resources.designer.parameter.grid.toolbar.move": "Move",
"re.resources.designer.parameter.grid.toolbar.add.constant": "Constant",
"re.resources.designer.parameter.grid.toolbar.add.in": "Input",
"re.resources.designer.parameter.grid.toolbar.add.inOption": "Input(Option)",
"re.resources.designer.parameter.grid.toolbar.add.indicator": "Indicator",
"re.resources.designer.parameter.grid.toolbar.add.intermediate": "Intermediate",
"re.resources.designer.parameter.grid.toolbar.add.out": "Output",
"re.resources.designer.parameter.grid.toolbar.add.ruleResult": "Rule Set Output",
"re.resources.designer.parameter.grid.toolbar.add.singleRuleResult": "Single Rule Output",
"re.resources.designer.parameter.grid.toolbar.add.importPmml": "Import PMML",
"re.resources.designer.parameter.grid.toolbar.deepClone.tip": "Are you sure to deep clone the parameter?",
"re.resources.designer.parameter.grid.entity.valueType": "Value Type",
"re.resources.designer.parameter.grid.entity.valueTypeVersion": "Value Type Version",
"re.resources.designer.parameter.grid.entity.valueScale": "Value Scale",
"re.resources.designer.parameter.grid.entity.valueRoundingMode": "Rounding Mode",
"re.resources.designer.parameter.grid.entity.valueTypeIsList": "Is List",
"re.resources.designer.parameter.grid.entity.libCode": "Library",
"re.resources.designer.parameter.grid.entity.libVersion": "Library Version",
"re.resources.designer.parameter.grid.entity.indicatorCode": "Indicator",
"re.resources.designer.validator.grid.title": "Validator",
"re.resources.designer.validator.grid.entity.content": "Content",
"re.resources.designer.validator.grid.entity.tip": "Error Tip",
"re.resources.designer.option.grid.title": "Options",
"re.resources.designer.option.grid.entity.inputValue": "Input Value",
"re.resources.designer.option.grid.entity.value": "Value",
"re.resources.designer.option.grid.entity.title": "Title",
"re.resources.designer.processor.grid.title": "Processor",
"re.resources.designer.processor.grid.entity.content": "Content",
"re.resources.designer.processor.grid.entity.arithmetic": "Arithmetic",
"re.resources.designer.processor.grid.entity.conditionRangeVar": "Condition Range Variable",
"re.resources.designer.processor.grid.entity.conditionRange": "Condition Range",
"re.resources.designer.processor.grid.entity.decisionTable": "Decision Table",
"re.resources.designer.processor.grid.entity.decisionTable2C": "Simple Decision Table",
"re.resources.designer.processor.grid.entity.decisionTree": "Decision Tree",
"re.resources.designer.processor.grid.entity.executionFlow": "Execution Flow",
"re.resources.designer.processor.grid.entity.groovyScript": "Script",
"re.resources.designer.processor.grid.entity.httpMethod": "Http Method",
"re.resources.designer.processor.grid.entity.httpUrl": "URL",
"re.resources.designer.processor.grid.entity.httpAuthType": "Authorization Type",
"re.resources.designer.processor.grid.entity.httpAuthApikey": "API Key",
"re.resources.designer.processor.grid.entity.httpAuthApiValue": "API Value",
"re.resources.designer.processor.grid.entity.httpAuthBasicUsername": "User Name",
"re.resources.designer.processor.grid.entity.httpAuthBasicPassword": "Password",
"re.resources.designer.processor.grid.entity.httpAuthBearerToken": "Bearer Token",
"re.resources.designer.processor.grid.entity.httpRequestBody": "Request Body",
"re.resources.designer.processor.grid.entity.httpResponseBody": "Response Body",
"re.resources.designer.processor.grid.entity.httpResponseMapping": "Response Mapping",
"re.resources.designer.processor.grid.entity.mathFormula": "Math Formula",
"re.resources.designer.processor.grid.entity.numberRangeVar": "Number Range Variable",
"re.resources.designer.processor.grid.entity.numberRange": "Number Range",
"re.resources.designer.processor.grid.entity.objectCondition": "Condition",
"re.resources.designer.processor.grid.entity.objectProperties": "Object Properties",
"re.resources.designer.processor.grid.entity.optionCode": "Option",
"re.resources.designer.processor.grid.entity.pmml": "PMML",
"re.resources.designer.processor.grid.entity.rule": "Rule",
"re.resources.designer.processor.grid.entity.scoreCard": "Score Card",
"re.resources.designer.processor.grid.entity.singleRule": "Single Rule",
"re.resources.designer.processor.grid.entity.sqlDatasourceName": "Datasource Name",
"re.resources.designer.processor.grid.entity.sql": "SQL",
"re.resources.designer.processor.grid.entity.sqlParameterValues": "Parameter Values",
"re.resources.designer.processor.grid.entity.sqlQueryResult": "Query Result",
"re.resources.designer.processor.grid.entity.sqlFieldMapping": "Result Mapping",
"re.resources.designer.processor.grid.entity.ternaryCondition": "Ternary Condition",
"re.resources.designer.processor.grid.entity.ternaryTrue": "Ternary True",
"re.resources.designer.processor.grid.entity.ternaryFalse": "Ternary False",
"re.resources.designer.processor.grid.entity.when": "When Expression",
"re.resources.designer.processor.grid.entity.then": "Then Expression",
"re.resources.designer.processor.grid.entity.isWhenThenShorted": "Shorted",
"re.resources.designer.processor.decisionTable.toolbar.addCol2Left": "Add Column at Left",
"re.resources.designer.processor.decisionTable.toolbar.addCol2Right": "Add Column at Right",
"re.resources.designer.processor.decisionTable.toolbar.addRow": "Add Row",
"re.resources.designer.processor.decisionTable.toolbar.addConditionRow": "Add Condition Row",
"re.resources.designer.processor.decisionTable.toolbar.addResultRow": "Add Result Row",
"re.resources.designer.processor.decisionTable.toolbar.removeCol": "Remove Column",
"re.resources.designer.processor.decisionTable.toolbar.removeRow": "Remove Row",
"re.resources.designer.processor.decisionTable.action.addConditionRow": "Add Condition Row",
"re.resources.designer.processor.decisionTable.action.addResultRow": "Add Result Row",
"re.resources.designer.processor.dialog.decisionTree.title": "Decision Tree Designer",
"re.resources.designer.processor.dialog.executionFlow.title": "Execution Flow Designer",
"re.graph.vertex.start.label": "Start",
"re.graph.vertex.start.title": "Start",
"re.graph.vertex.condition.label": "C",
"re.graph.vertex.condition.title": "Condition",
"re.graph.vertex.condition.entity.condition": "Condition",
"re.graph.vertex.expression.label": "Exp",
"re.graph.vertex.expression.title": "Expression",
"re.graph.vertex.expression.entity.expression": "Expression",
"re.graph.vertex.expression.entity.commands": "Commands",
"re.graph.vertex.resourceAbstract.label": "RA",
"re.graph.vertex.resourceAbstract.title": "Resource",
"re.graph.vertex.resourceAbstract.entity.resourceAbstractId": "Resource",
"re.graph.vertex.commandSet.label": "Commands",
"re.graph.vertex.commandSet.title": "Commands",
"re.graph.vertex.commandSet.entity.commands": "Commands",
"re.graph.vertex.configurableResourceAbstract.label": "RA(I/O)",
"re.graph.vertex.configurableResourceAbstract.title": "Resource with Input/Output Commands",
"re.graph.vertex.configurableResourceAbstract.entity.resourceAbstractId": "Resource",
"re.graph.vertex.configurableResourceAbstract.entity.inputCommands": "Input Commands",
"re.graph.vertex.configurableResourceAbstract.entity.outputCommands": "Output Commands",
"re.graph.vertex.subModelAbstract.label": "SM",
"re.graph.vertex.subModelAbstract.title": "Sub Model",
"re.graph.vertex.subModelAbstract.entity.code": "Sub Model",
"re.graph.edge.conditionBranch.entity.valueType": "Value Type",
"re.graph.edge.conditionBranch.entity.value": "Value",
"re.graph.edge.conditionBranch.entity.commands": "Commands",
"re.resources.designer.testCase.grid.title": "Test Cases",
"re.resources.designer.testCase.grid.tools.batchTest": "Batch Test",
"re.resources.designer.testCase.grid.tools.download": "Download Template",
"re.resources.designer.testCase.grid.tools.upload": "Upload Data and Execute",
"re.resources.designer.testCase.grid.entity.testResult": "Result",
"re.resources.designer.testCase.grid.entity.lastTestDate": "Test Date",
"re.resources.designer.testCase.grid.entity.ownerCode": "Code",
"re.resources.designer.testCase.grid.entity.ownerName": "Name",
"re.resources.designer.testCase.grid.entity.ownerVersion": "Version",
"re.resources.designer.testCase.grid.entity.ownerStatus": "Status",
"re.resources.designer.testCaseParameter.grid.title": "Parameter List",
"re.resources.designer.testCaseParameter.grid.entity.inputValue": "Input Value",
"re.resources.designer.testCaseParameter.grid.entity.expectValue": "Expect Value",
"re.resources.designer.testCaseParameter.grid.entity.resultValue": "Result Value",
"re.resources.designer.testCaseParameter.grid.entity.skipCheck": "Skip Check",
"re.resources.designer.testCaseParameter.grid.entity.testResult": "Result",
"re.resources.import.dialog.title": "Import Resource",
"re.resources.importSample.dialog.title": "Import Sample Resource",
"re.resources.importSample.grid.title": "Sample List",
"re.resources.importSample.grid.toolbar.import": "Import Sample",
"re.resources.importSample.grid.toolbar.import.tip": "Are you sure to import the samples?",
"re.resources.dialog.designer.title": "Model Designer - {name} ({status},V{version})",
"re.resources.dialog.designer.tab.parameter.title": "Parameter",
"re.resources.dialog.designer.tab.testcase.title": "Test Case",
"re.resources.dialog.designer.tab.validator.title": "Validator",
"re.resources.dialog.designer.tab.processor.title": "Processor",
"re.resources.dialog.designer.tab.option.title": "Option",
"re.model.grid.title": "Model Structure",
"re.model.grid.toolbar.addChild": "Add Child Model",
"re.model.grid.toolbar.deepClone.tip": "Are you sure to deep clone the model?",
"re.model.grid.toolbar.generateGroovySourceCode": "Generate Script Code",
"re.model.grid.toolbar.generateGroovySourceCode4TestCase": "Generate Script Code(Test Case)",
"re.model.grid.entity.resource": "Resource",
"re.model.grid.entity.executeMode": "Execute Mode",
"re.parameter.grid.title": "Parameter List",
"re.parameter.grid.toolbar.move": "Move",
"re.parameter.grid.toolbar.add.constant": "Constant",
"re.parameter.grid.toolbar.add.in": "Input",
"re.parameter.grid.toolbar.add.inOption": "Input(Option)",
"re.parameter.grid.toolbar.add.indicator": "Indicator",
"re.parameter.grid.toolbar.add.intermediate": "Intermediate",
"re.parameter.grid.toolbar.add.out": "Output",
"re.parameter.grid.toolbar.add.ruleResult": "Rule Set Output",
"re.parameter.grid.toolbar.add.singleRuleResult": "Single Rule Output",
"re.parameter.grid.toolbar.add.importPmml": "Import PMML",
"re.parameter.grid.toolbar.deepClone.tip": "Are you sure to deep clone the parameter?",
"re.parameter.grid.entity.model": "Model",
"re.parameter.grid.entity.valueType": "Value Type",
"re.parameter.grid.entity.valueTypeVersion": "Value Type Version",
"re.parameter.grid.entity.valueScale": "Value Scale",
"re.parameter.grid.entity.valueRoundingMode": "Rounding Mode",
"re.parameter.grid.entity.valueTypeIsList": "Is List",
"re.parameter.grid.entity.libCode": "Library",
"re.parameter.grid.entity.libVersion": "Library Version",
"re.parameter.grid.entity.indicatorCode": "Indicator",
"re.parameter.tip.indicatorParameterCanNotEditable": "Indicator parameter can NOT editable!",
"re.parameter.dialog.moveParameter.title": "Select Target Location of Parameter",
"re.validator.grid.title": "Validator",
"re.validator.grid.entity.content": "Content",
"re.validator.grid.entity.tip": "Error Tip",
"re.option.grid.title": "Options",
"re.option.grid.entity.inputValue": "Input Value",
"re.option.grid.entity.value": "Value",
"re.option.grid.entity.title": "Title",
"re.processor.dialog.decisionTree.title": "Decision Tree Designer",
"re.processor.dialog.executionFlow.title": "Execution Flow Designer",
"re.processor.grid.title": "Processor",
"re.processor.grid.entity.content": "Content",
"re.processor.grid.entity.arithmetic": "Arithmetic",
"re.processor.grid.entity.conditionRangeVar": "Condition Range Variable",
"re.processor.grid.entity.conditionRange": "Condition Range",
"re.processor.grid.entity.decisionTable": "Decision Table",
"re.processor.grid.entity.decisionTable2C": "Simple Decision Table",
"re.processor.grid.entity.decisionTree": "Decision Tree",
"re.processor.grid.entity.executionFlow": "Execution Flow",
"re.processor.grid.entity.groovyScript": "Script",
"re.processor.grid.entity.httpMethod": "Http Method",
"re.processor.grid.entity.httpUrl": "URL",
"re.processor.grid.entity.httpAuthType": "Authorization Type",
"re.processor.grid.entity.httpAuthApikey": "API Key",
"re.processor.grid.entity.httpAuthApiValue": "API Value",
"re.processor.grid.entity.httpAuthBasicUsername": "User Name",
"re.processor.grid.entity.httpAuthBasicPassword": "Password",
"re.processor.grid.entity.httpAuthBearerToken": "Bearer Token",
"re.processor.grid.entity.httpRequestBody": "Request Body",
"re.processor.grid.entity.httpResponseBody": "Response Body",
"re.processor.grid.entity.httpResponseMapping": "Response Mapping",
"re.processor.grid.entity.mathFormula": "Math Formula",
"re.processor.grid.entity.numberRangeVar": "Number Range Variable",
"re.processor.grid.entity.numberRange": "Number Range",
"re.processor.grid.entity.objectCondition": "Condition",
"re.processor.grid.entity.objectProperties": "Object Properties",
"re.processor.grid.entity.optionCode": "Option",
"re.processor.grid.entity.pmml": "PMML",
"re.processor.grid.entity.rule": "Rule",
"re.processor.grid.entity.scoreCard": "Score Card",
"re.processor.grid.entity.singleRule": "Single Rule",
"re.processor.grid.entity.sqlDatasourceName": "Datasource Name",
"re.processor.grid.entity.sql": "SQL",
"re.processor.grid.entity.sqlParameterValues": "Parameter Values",
"re.processor.grid.entity.sqlQueryResult": "Query Result",
"re.processor.grid.entity.sqlFieldMapping": "Result Mapping",
"re.processor.grid.entity.ternaryCondition": "Ternary Condition",
"re.processor.grid.entity.ternaryTrue": "Ternary True",
"re.processor.grid.entity.ternaryFalse": "Ternary False",
"re.processor.grid.entity.when": "When Expression",
"re.processor.grid.entity.then": "Then Expression",
"re.processor.grid.entity.isWhenThenShorted": "Shorted",
"re.processor.decisionTable.toolbar.addCol2Left": "Add Column at Left",
"re.processor.decisionTable.toolbar.addCol2Right": "Add Column at Right",
"re.processor.decisionTable.toolbar.addRow": "Add Row",
"re.processor.decisionTable.toolbar.addConditionRow": "Add Condition Row",
"re.processor.decisionTable.toolbar.addResultRow": "Add Result Row",
"re.processor.decisionTable.toolbar.removeCol": "Remove Column",
"re.processor.decisionTable.toolbar.removeRow": "Remove Row",
"re.processor.decisionTable.action.addConditionRow": "Add Condition Row",
"re.processor.decisionTable.action.addResultRow": "Add Result Row",
"re.dictionary.grid.title": "Meta Data",
"re.dictionary.grid.toolbar.addGroup": "Add New",
"re.dictionary.grid.toolbar.addTop": "Top Folder",
"re.dictionary.grid.toolbar.addChild": "Child Folder",
"re.dictionary.grid.toolbar.addJavaType": "Java Type",
"re.dictionary.grid.toolbar.addUserDefinedJavaClassType": "User Defined Type",
"re.dictionary.grid.toolbar.addEnumType": "Enum Type",
"re.dictionary.grid.toolbar.addUserDefinedJavaClassType": "Structure",
"re.dictionary.grid.toolbar.addEnumType": "Enum",
"re.dictionary.grid.toolbar.cloneGroup": "Clone",
"re.dictionary.grid.toolbar.deepClone": "Deep Clone",
"re.dictionary.grid.toolbar.deepClone.tip": "Are you sure to deep clone the meta data?",
@ -209,7 +168,7 @@
"re.dictionary.field.grid.title": "Field List",
"re.dictionary.field.grid.entity.valueType": "Value Type",
"re.dictionary.field.grid.entity.valueTypeIsList": "Is List",
"re.dictionary.field.grid.entity.valueTypeIsList": "List?",
"re.dictionary.field.grid.entity.valueCalculation": "Calculation Expression",
"re.dictionary.enum.grid.title": "Enum List",
@ -253,6 +212,32 @@
"re.indicator.grid.toolbar.addInterface": "Interface",
"re.indicator.grid.toolbar.addIndicator": "Indicator",
"re.testcase.grid.title": "Test Cases",
"re.testcase.grid.tools.batchTest": "Batch Test",
"re.testcase.grid.tools.download": "Download Template",
"re.testcase.grid.tools.upload": "Upload Data and Execute",
"re.testcase.grid.entity.testResult": "Result",
"re.testcase.grid.entity.lastTestDate": "Test Date",
"re.testcase.grid.entity.ownerId": "Owner ID",
"re.testcase.grid.entity.ownerType": "Owner Type",
"re.testcase.grid.entity.ownerCode": "Owner Code",
"re.testcase.grid.entity.ownerName": "Owner Name",
"re.testcase.grid.entity.ownerVersion": "Owner Version",
"re.testcase.grid.entity.ownerStatus": "Owner Status",
"re.testcase.grid.entity.ownerDescription": "Owner Name",
"re.testCaseParameter.grid.title": "Parameter List",
"re.testCaseParameter.grid.entity.testCaseId": "Test Case ID",
"re.testCaseParameter.grid.entity.inputValue": "Input Value",
"re.testCaseParameter.grid.entity.expectValue": "Expect Value",
"re.testCaseParameter.grid.entity.resultValue": "Result Value",
"re.testCaseParameter.grid.entity.skipCheck": "Skip Check",
"re.testCaseParameter.grid.entity.testResult": "Result",
"re.templateImportAndExport.action.group": "Batch Creation",
"re.templateImportAndExport.action.downloadTemplate": "Download Template",
"re.templateImportAndExport.action.upload": "Upload and Create in Batch",
"re.migration.import.title": "Import ( From The File Uploaded )",
"re.migration.import.subTitle": "",
"re.migration.import.action": "Import",
@ -304,5 +289,33 @@
"re.workflow.task.grid.entity.resourceStatus": "Resource Status",
"re.workflow.task.grid.entity.attachments": "Attachments",
"re.workflow.historyTask.grid.title": "历史任务列表"
"re.workflow.historyTask.grid.title": "History Tasks",
"re.graph.vertex.start.label": "Start",
"re.graph.vertex.start.title": "Start",
"re.graph.vertex.condition.label": "C",
"re.graph.vertex.condition.title": "Condition",
"re.graph.vertex.condition.entity.condition": "Condition",
"re.graph.vertex.expression.label": "Exp",
"re.graph.vertex.expression.title": "Expression",
"re.graph.vertex.expression.entity.expression": "Expression",
"re.graph.vertex.expression.entity.commands": "Commands",
"re.graph.vertex.resourceAbstract.label": "RA",
"re.graph.vertex.resourceAbstract.title": "Resource",
"re.graph.vertex.resourceAbstract.entity.resourceAbstractId": "Resource",
"re.graph.vertex.commandSet.label": "Commands",
"re.graph.vertex.commandSet.title": "Commands",
"re.graph.vertex.commandSet.entity.commands": "Commands",
"re.graph.vertex.configurableResourceAbstract.label": "RA(I/O)",
"re.graph.vertex.configurableResourceAbstract.title": "Resource with Input/Output Commands",
"re.graph.vertex.configurableResourceAbstract.entity.resourceAbstractId": "Resource",
"re.graph.vertex.configurableResourceAbstract.entity.inputCommands": "Input Commands",
"re.graph.vertex.configurableResourceAbstract.entity.outputCommands": "Output Commands",
"re.graph.vertex.subModelAbstract.label": "SM",
"re.graph.vertex.subModelAbstract.title": "Sub Model",
"re.graph.vertex.subModelAbstract.entity.code": "Sub Model",
"re.graph.edge.conditionBranch.entity.valueType": "Value Type",
"re.graph.edge.conditionBranch.entity.value": "Value",
"re.graph.edge.conditionBranch.entity.commands": "Commands"
}

325
io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json

@ -13,7 +13,6 @@
"re.resources.grid.toolbar.addTop": "頂級文件夾",
"re.resources.grid.toolbar.addChild": "子文件夾",
"re.resources.grid.toolbar.addModel": "模型",
"re.resources.grid.toolbar.addScoreCard": "評分卡",
"re.resources.grid.toolbar.deepClone.tip": "您確定要深度複製資源嗎?",
"re.resources.grid.toolbar.deepCloneNew": "深度複製(新)",
"re.resources.grid.toolbar.deepCloneNew.tip": "您確定要深度複製資源成一個新的資源嗎?",
@ -22,6 +21,7 @@
"re.resources.grid.toolbar.deploy.online.tip": "您確定要上線資源嗎?",
"re.resources.grid.toolbar.deploy.offline": "下線",
"re.resources.grid.toolbar.deploy.offline.tip": "您確定要下線資源嗎?",
"re.resources.grid.toolbar.viewBloodRelationship": "查看血緣關係",
"re.resources.grid.toolbar.importExample": "導入示例",
"re.resources.grid.entity.effectiveDate": "生效日期",
@ -29,170 +29,129 @@
"re.resources.grid.entity.taskName": "任務名稱",
"re.resources.grid.entity.taskAssignee": "處理人",
"re.resources.dialog.import.title": "導入資源",
"re.resources.dialog.importSample.title": "導入示例資源",
"re.resources.dialog.importSample.grid.title": "示例資源列表",
"re.resources.dialog.importSample.grid.toolbar.import": "導入示例",
"re.resources.dialog.importSample.grid.toolbar.import.tip": "您確定要導入示例資源嗎?",
"re.resources.dialog.attachment.title": "附件管理",
"re.resources.dialog.attachment.grid.title": "附件列表",
"re.resources.dialog.attachment.grid.entity.file": "請選擇一個文件",
"re.resources.designer.dialog.title": "模型設計 - {name} ({status},V{version})",
"re.resources.designer.model.grid.title": "模型結構",
"re.resources.designer.model.grid.toolbar.addChild": "添加子模型",
"re.resources.designer.model.grid.toolbar.deepClone.tip": "您確定要深度複製模型嗎?",
"re.resources.designer.model.grid.toolbar.generateGroovySourceCode": "生成腳本代碼",
"re.resources.designer.model.grid.toolbar.generateGroovySourceCode4TestCase": "生成腳本代碼(測試用例)",
"re.resources.designer.model.grid.entity.executeMode": "執行模式",
"re.resources.designer.parameter.tab.title": "參數",
"re.resources.designer.testcase.tab.title": "試算用例",
"re.resources.designer.validator.tab.title": "驗證器",
"re.resources.designer.processor.tab.title": "處理邏輯",
"re.resources.designer.option.tab.title": "選項",
"re.resources.designer.parameter.grid.title": "參數列表",
"re.resources.designer.parameter.grid.toolbar.move": "移動",
"re.resources.designer.parameter.grid.toolbar.add.constant": "常量",
"re.resources.designer.parameter.grid.toolbar.add.in": "輸入值",
"re.resources.designer.parameter.grid.toolbar.add.inOption": "輸入值(選項)",
"re.resources.designer.parameter.grid.toolbar.add.indicator": "指標",
"re.resources.designer.parameter.grid.toolbar.add.intermediate": "中間值",
"re.resources.designer.parameter.grid.toolbar.add.out": "結果值",
"re.resources.designer.parameter.grid.toolbar.add.ruleResult": "規則集結果值",
"re.resources.designer.parameter.grid.toolbar.add.singleRuleResult": "單規則結果值",
"re.resources.designer.parameter.grid.toolbar.add.importPmml": "導入 PMML",
"re.resources.designer.parameter.grid.toolbar.deepClone.tip": "您確定要深度複製參數嗎?",
"re.resources.designer.parameter.grid.entity.valueType": "值類型",
"re.resources.designer.parameter.grid.entity.valueTypeVersion": "值類型版本",
"re.resources.designer.parameter.grid.entity.valueScale": "值精度",
"re.resources.designer.parameter.grid.entity.valueRoundingMode": "四捨五入模式",
"re.resources.designer.parameter.grid.entity.valueTypeIsList": "是否列表",
"re.resources.designer.parameter.grid.entity.libCode": "指標庫",
"re.resources.designer.parameter.grid.entity.libVersion": "指標庫版本",
"re.resources.designer.parameter.grid.entity.indicatorCode": "指標",
"re.resources.designer.validator.grid.title": "驗證器",
"re.resources.designer.validator.grid.entity.content": "內容",
"re.resources.designer.validator.grid.entity.tip": "錯誤提示",
"re.resources.designer.option.grid.title": "選項",
"re.resources.designer.option.grid.entity.inputValue": "輸入值",
"re.resources.designer.option.grid.entity.value": "計算值",
"re.resources.designer.option.grid.entity.title": "顯示文本",
"re.resources.designer.processor.grid.title": "處理邏輯",
"re.resources.designer.processor.grid.entity.content": "內容",
"re.resources.designer.processor.grid.entity.arithmetic": "算數表達式",
"re.resources.designer.processor.grid.entity.conditionRangeVar": "条件分段",
"re.resources.designer.processor.grid.entity.conditionRange": "條件分段",
"re.resources.designer.processor.grid.entity.decisionTable": "決策表",
"re.resources.designer.processor.grid.entity.decisionTable2C": "簡單決策表",
"re.resources.designer.processor.grid.entity.decisionTree": "決策樹",
"re.resources.designer.processor.grid.entity.executionFlow": "執行流",
"re.resources.designer.processor.grid.entity.groovyScript": "腳本代碼",
"re.resources.designer.processor.grid.entity.httpMethod": "請求方法",
"re.resources.designer.processor.grid.entity.httpUrl": "URL",
"re.resources.designer.processor.grid.entity.httpAuthType": "認證類型",
"re.resources.designer.processor.grid.entity.httpAuthApikey": "API Key",
"re.resources.designer.processor.grid.entity.httpAuthApiValue": "API Value",
"re.resources.designer.processor.grid.entity.httpAuthBasicUsername": "用戶名",
"re.resources.designer.processor.grid.entity.httpAuthBasicPassword": "密碼",
"re.resources.designer.processor.grid.entity.httpAuthBearerToken": "Bearer Token",
"re.resources.designer.processor.grid.entity.httpRequestBody": "請求體",
"re.resources.designer.processor.grid.entity.httpResponseBody": "響應體",
"re.resources.designer.processor.grid.entity.httpResponseMapping": "響應映射",
"re.resources.designer.processor.grid.entity.mathFormula": "數學公式",
"re.resources.designer.processor.grid.entity.numberRangeVar": "數值分段表達式",
"re.resources.designer.processor.grid.entity.numberRange": "數值分段",
"re.resources.designer.processor.grid.entity.objectCondition": "條件",
"re.resources.designer.processor.grid.entity.objectProperties": "對象屬性",
"re.resources.designer.processor.grid.entity.optionCode": "選項",
"re.resources.designer.processor.grid.entity.pmml": "PMML",
"re.resources.designer.processor.grid.entity.rule": "規則",
"re.resources.designer.processor.grid.entity.scoreCard": "評分卡",
"re.resources.designer.processor.grid.entity.singleRule": "單規則",
"re.resources.designer.processor.grid.entity.sqlDatasourceName": "數據源名稱",
"re.resources.designer.processor.grid.entity.sql": "SQL 語句",
"re.resources.designer.processor.grid.entity.sqlParameterValues": "參數值",
"re.resources.designer.processor.grid.entity.sqlQueryResult": "執行結果",
"re.resources.designer.processor.grid.entity.sqlFieldMapping": "結果映射",
"re.resources.designer.processor.grid.entity.ternaryCondition": "條件",
"re.resources.designer.processor.grid.entity.ternaryTrue": "條件滿足時",
"re.resources.designer.processor.grid.entity.ternaryFalse": "條件不滿足時",
"re.resources.designer.processor.grid.entity.when": "When 表達式",
"re.resources.designer.processor.grid.entity.then": "Then 表達式",
"re.resources.designer.processor.grid.entity.isWhenThenShorted": "跳過後續操作",
"re.resources.designer.processor.decisionTable.toolbar.addCol2Left": "在左邊新增列",
"re.resources.designer.processor.decisionTable.toolbar.addCol2Right": "在右邊新增列",
"re.resources.designer.processor.decisionTable.toolbar.addRow": "新增行",
"re.resources.designer.processor.decisionTable.toolbar.addConditionRow": "新增條件行",
"re.resources.designer.processor.decisionTable.toolbar.addResultRow": "新增結果行",
"re.resources.designer.processor.decisionTable.toolbar.removeCol": "刪除列",
"re.resources.designer.processor.decisionTable.toolbar.removeRow": "刪除行",
"re.resources.designer.processor.decisionTable.action.addConditionRow": "添加條件行",
"re.resources.designer.processor.decisionTable.action.addResultRow": "添加結果行",
"re.resources.designer.processor.dialog.decisionTree.title": "決策樹設計器",
"re.resources.designer.processor.dialog.executionFlow.title": "執行流設計器",
"re.graph.vertex.start.label": "開始",
"re.graph.vertex.start.title": "開始",
"re.graph.vertex.condition.label": "條件",
"re.graph.vertex.condition.title": "條件",
"re.graph.vertex.condition.entity.condition": "判斷條件",
"re.graph.vertex.expression.label": "表達式",
"re.graph.vertex.expression.title": "表達式",
"re.graph.vertex.expression.entity.expression": "表達式",
"re.graph.vertex.expression.entity.commands": "附加指令集",
"re.graph.vertex.resourceAbstract.label": "資源",
"re.graph.vertex.resourceAbstract.title": "資源",
"re.graph.vertex.resourceAbstract.entity.resourceAbstractId": "資源",
"re.graph.vertex.commandSet.label": "指令集",
"re.graph.vertex.commandSet.title": "指令集",
"re.graph.vertex.commandSet.entity.commands": "指令集",
"re.graph.vertex.configurableResourceAbstract.label": "資源",
"re.graph.vertex.configurableResourceAbstract.title": "帶輸入輸出指令的資源",
"re.graph.vertex.configurableResourceAbstract.entity.resourceAbstractId": "資源",
"re.graph.vertex.configurableResourceAbstract.entity.inputCommands": "輸入指令集",
"re.graph.vertex.configurableResourceAbstract.entity.outputCommands": "輸出指令集",
"re.graph.vertex.subModelAbstract.label": "子模型",
"re.graph.vertex.subModelAbstract.title": "子模型",
"re.graph.vertex.subModelAbstract.entity.code": "子模型",
"re.graph.edge.conditionBranch.entity.valueType": "值類型",
"re.graph.edge.conditionBranch.entity.value": "值",
"re.graph.edge.conditionBranch.entity.commands": "附加指令集",
"re.resources.designer.testCase.grid.title": "試算用例",
"re.resources.designer.testCase.grid.tools.batchTest": "批量試算",
"re.resources.designer.testCase.grid.tools.download": "下載試算模版",
"re.resources.designer.testCase.grid.tools.upload": "上傳用例並試算",
"re.resources.designer.testCase.grid.entity.testResult": "結果",
"re.resources.designer.testCase.grid.entity.lastTestDate": "測試日期",
"re.resources.designer.testCase.grid.entity.ownerCode": "資源代碼",
"re.resources.designer.testCase.grid.entity.ownerName": "資源名稱",
"re.resources.designer.testCase.grid.entity.ownerVersion": "資源版本",
"re.resources.designer.testCase.grid.entity.ownerStatus": "資源狀態",
"re.resources.designer.testCaseParameter.grid.title": "參數列表",
"re.resources.designer.testCaseParameter.grid.entity.inputValue": "輸入值",
"re.resources.designer.testCaseParameter.grid.entity.expectValue": "期望值",
"re.resources.designer.testCaseParameter.grid.entity.resultValue": "結果值",
"re.resources.designer.testCaseParameter.grid.entity.skipCheck": "跳過檢查",
"re.resources.designer.testCaseParameter.grid.entity.testResult": "結果",
"re.resources.import.dialog.title": "導入資源",
"re.resources.importSample.dialog.title": "導入示例資源",
"re.resources.importSample.grid.title": "示例資源列表",
"re.resources.importSample.grid.toolbar.import": "導入示例",
"re.resources.importSample.grid.toolbar.import.tip": "您確定要導入示例資源嗎?",
"re.resources.dialog.designer.title": "模型設計 - {name} ({status},V{version})",
"re.resources.dialog.designer.tab.parameter.title": "參數",
"re.resources.dialog.designer.tab.testcase.title": "試算用例",
"re.resources.dialog.designer.tab.validator.title": "驗證器",
"re.resources.dialog.designer.tab.processor.title": "處理邏輯",
"re.resources.dialog.designer.tab.option.title": "選項",
"re.model.grid.title": "模型結構",
"re.model.grid.toolbar.addChild": "添加子模型",
"re.model.grid.toolbar.deepClone.tip": "您確定要深度複製模型嗎?",
"re.model.grid.toolbar.generateGroovySourceCode": "生成腳本代碼",
"re.model.grid.toolbar.generateGroovySourceCode4TestCase": "生成腳本代碼(測試用例)",
"re.model.grid.entity.resource": "資源",
"re.model.grid.entity.executeMode": "執行模式",
"re.parameter.grid.title": "參數列表",
"re.parameter.grid.toolbar.move": "移動",
"re.parameter.grid.toolbar.add.constant": "常量",
"re.parameter.grid.toolbar.add.in": "輸入值",
"re.parameter.grid.toolbar.add.inOption": "輸入值(選項)",
"re.parameter.grid.toolbar.add.indicator": "指標",
"re.parameter.grid.toolbar.add.intermediate": "中間值",
"re.parameter.grid.toolbar.add.out": "結果值",
"re.parameter.grid.toolbar.add.ruleResult": "規則集結果值",
"re.parameter.grid.toolbar.add.singleRuleResult": "單規則結果值",
"re.parameter.grid.toolbar.add.importPmml": "導入 PMML",
"re.parameter.grid.toolbar.deepClone.tip": "您確定要深度複製參數嗎?",
"re.parameter.grid.entity.model": "模型",
"re.parameter.grid.entity.valueType": "值類型",
"re.parameter.grid.entity.valueTypeVersion": "值類型版本",
"re.parameter.grid.entity.valueScale": "值精度",
"re.parameter.grid.entity.valueRoundingMode": "四捨五入模式",
"re.parameter.grid.entity.valueTypeIsList": "列表?",
"re.parameter.grid.entity.libCode": "指標庫",
"re.parameter.grid.entity.libVersion": "指標庫版本",
"re.parameter.grid.entity.indicatorCode": "指標",
"re.parameter.tip.indicatorParameterCanNotEditable": "類型為指標的參數不能進行編輯!",
"re.parameter.dialog.moveParameter.title": "選擇參數移動的目標位置",
"re.validator.grid.title": "驗證器",
"re.validator.grid.entity.content": "內容",
"re.validator.grid.entity.tip": "錯誤提示",
"re.option.grid.title": "選項",
"re.option.grid.entity.inputValue": "輸入值",
"re.option.grid.entity.value": "計算值",
"re.option.grid.entity.title": "顯示文本",
"re.processor.dialog.decisionTree.title": "決策樹設計器",
"re.processor.dialog.executionFlow.title": "執行流設計器",
"re.processor.grid.title": "處理邏輯",
"re.processor.grid.entity.content": "內容",
"re.processor.grid.entity.arithmetic": "算數表達式",
"re.processor.grid.entity.conditionRangeVar": "条件分段",
"re.processor.grid.entity.conditionRange": "條件分段",
"re.processor.grid.entity.decisionTable": "決策表",
"re.processor.grid.entity.decisionTable2C": "簡單決策表",
"re.processor.grid.entity.decisionTree": "決策樹",
"re.processor.grid.entity.executionFlow": "執行流",
"re.processor.grid.entity.groovyScript": "腳本代碼",
"re.processor.grid.entity.httpMethod": "請求方法",
"re.processor.grid.entity.httpUrl": "URL",
"re.processor.grid.entity.httpAuthType": "認證類型",
"re.processor.grid.entity.httpAuthApikey": "API Key",
"re.processor.grid.entity.httpAuthApiValue": "API Value",
"re.processor.grid.entity.httpAuthBasicUsername": "用戶名",
"re.processor.grid.entity.httpAuthBasicPassword": "密碼",
"re.processor.grid.entity.httpAuthBearerToken": "Bearer Token",
"re.processor.grid.entity.httpRequestBody": "請求體",
"re.processor.grid.entity.httpResponseBody": "響應體",
"re.processor.grid.entity.httpResponseMapping": "響應映射",
"re.processor.grid.entity.mathFormula": "數學公式",
"re.processor.grid.entity.numberRangeVar": "數值分段表達式",
"re.processor.grid.entity.numberRange": "數值分段",
"re.processor.grid.entity.objectCondition": "條件",
"re.processor.grid.entity.objectProperties": "對象屬性",
"re.processor.grid.entity.optionCode": "選項",
"re.processor.grid.entity.pmml": "PMML",
"re.processor.grid.entity.rule": "規則",
"re.processor.grid.entity.scoreCard": "評分卡",
"re.processor.grid.entity.singleRule": "單規則",
"re.processor.grid.entity.sqlDatasourceName": "數據源名稱",
"re.processor.grid.entity.sql": "SQL 語句",
"re.processor.grid.entity.sqlParameterValues": "參數值",
"re.processor.grid.entity.sqlQueryResult": "執行結果",
"re.processor.grid.entity.sqlFieldMapping": "結果映射",
"re.processor.grid.entity.ternaryCondition": "條件",
"re.processor.grid.entity.ternaryTrue": "條件滿足時",
"re.processor.grid.entity.ternaryFalse": "條件不滿足時",
"re.processor.grid.entity.when": "When 表達式",
"re.processor.grid.entity.then": "Then 表達式",
"re.processor.grid.entity.isWhenThenShorted": "跳過後續操作",
"re.processor.decisionTable.toolbar.addCol2Left": "在左邊新增列",
"re.processor.decisionTable.toolbar.addCol2Right": "在右邊新增列",
"re.processor.decisionTable.toolbar.addRow": "新增行",
"re.processor.decisionTable.toolbar.addConditionRow": "新增條件行",
"re.processor.decisionTable.toolbar.addResultRow": "新增結果行",
"re.processor.decisionTable.toolbar.removeCol": "刪除列",
"re.processor.decisionTable.toolbar.removeRow": "刪除行",
"re.processor.decisionTable.action.addConditionRow": "添加條件行",
"re.processor.decisionTable.action.addResultRow": "添加結果行",
"re.dictionary.grid.title": "元數據",
"re.dictionary.grid.toolbar.addGroup": "新增",
"re.dictionary.grid.toolbar.addTop": "頂級文件夾",
"re.dictionary.grid.toolbar.addChild": "子文件夾",
"re.dictionary.grid.toolbar.addJavaType": "Java 類型",
"re.dictionary.grid.toolbar.addUserDefinedJavaClassType": "用戶自定義類型",
"re.dictionary.grid.toolbar.addEnumType": "枚舉類型",
"re.dictionary.grid.toolbar.addUserDefinedJavaClassType": "結構體",
"re.dictionary.grid.toolbar.addEnumType": "枚舉",
"re.dictionary.grid.toolbar.cloneGroup": "複製",
"re.dictionary.grid.toolbar.deepClone": "深度複製",
"re.dictionary.grid.toolbar.deepClone.tip": "您確定要深度複製元數據嗎?",
@ -253,6 +212,32 @@
"re.indicator.grid.toolbar.addInterface": "接口",
"re.indicator.grid.toolbar.addIndicator": "指標",
"re.testcase.grid.title": "試算用例",
"re.testcase.grid.tools.batchTest": "批量試算",
"re.testcase.grid.tools.download": "下載試算模版",
"re.testcase.grid.tools.upload": "上傳用例並試算",
"re.testcase.grid.entity.testResult": "結果",
"re.testcase.grid.entity.lastTestDate": "測試日期",
"re.testcase.grid.entity.ownerId": "所有者ID",
"re.testcase.grid.entity.ownerType": "所有者類型",
"re.testcase.grid.entity.ownerCode": "所有者代碼",
"re.testcase.grid.entity.ownerName": "所有者名稱",
"re.testcase.grid.entity.ownerVersion": "所有者版本",
"re.testcase.grid.entity.ownerStatus": "所有者狀態",
"re.testcase.grid.entity.ownerDescription": "所有者名稱",
"re.testCaseParameter.grid.title": "參數列表",
"re.testCaseParameter.grid.entity.testCaseId": "試算用例ID",
"re.testCaseParameter.grid.entity.inputValue": "輸入值",
"re.testCaseParameter.grid.entity.expectValue": "期望值",
"re.testCaseParameter.grid.entity.resultValue": "結果值",
"re.testCaseParameter.grid.entity.skipCheck": "跳過檢查",
"re.testCaseParameter.grid.entity.testResult": "結果",
"re.templateImportAndExport.action.group": "批量創建",
"re.templateImportAndExport.action.downloadTemplate": "下載模版",
"re.templateImportAndExport.action.upload": "上傳並創建",
"re.migration.import.title": "導入數據 (通過上傳文件導入)",
"re.migration.import.subTitle": "",
"re.migration.import.action": "導入數據",
@ -304,5 +289,33 @@
"re.workflow.task.grid.entity.resourceStatus": "資源狀態",
"re.workflow.task.grid.entity.attachments": "資源附件",
"re.workflow.historyTask.grid.title": "歷史任務列表"
"re.workflow.historyTask.grid.title": "歷史任務列表",
"re.graph.vertex.start.label": "開始",
"re.graph.vertex.start.title": "開始",
"re.graph.vertex.condition.label": "條件",
"re.graph.vertex.condition.title": "條件",
"re.graph.vertex.condition.entity.condition": "判斷條件",
"re.graph.vertex.expression.label": "表達式",
"re.graph.vertex.expression.title": "表達式",
"re.graph.vertex.expression.entity.expression": "表達式",
"re.graph.vertex.expression.entity.commands": "附加指令集",
"re.graph.vertex.resourceAbstract.label": "資源",
"re.graph.vertex.resourceAbstract.title": "資源",
"re.graph.vertex.resourceAbstract.entity.resourceAbstractId": "資源",
"re.graph.vertex.commandSet.label": "指令集",
"re.graph.vertex.commandSet.title": "指令集",
"re.graph.vertex.commandSet.entity.commands": "指令集",
"re.graph.vertex.configurableResourceAbstract.label": "資源",
"re.graph.vertex.configurableResourceAbstract.title": "帶輸入輸出指令的資源",
"re.graph.vertex.configurableResourceAbstract.entity.resourceAbstractId": "資源",
"re.graph.vertex.configurableResourceAbstract.entity.inputCommands": "輸入指令集",
"re.graph.vertex.configurableResourceAbstract.entity.outputCommands": "輸出指令集",
"re.graph.vertex.subModelAbstract.label": "子模型",
"re.graph.vertex.subModelAbstract.title": "子模型",
"re.graph.vertex.subModelAbstract.entity.code": "子模型",
"re.graph.edge.conditionBranch.entity.valueType": "值類型",
"re.graph.edge.conditionBranch.entity.value": "值",
"re.graph.edge.conditionBranch.entity.commands": "附加指令集"
}

326
io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json

@ -13,7 +13,6 @@
"re.resources.grid.toolbar.addTop": "顶级文件夹",
"re.resources.grid.toolbar.addChild": "子文件夹",
"re.resources.grid.toolbar.addModel": "模型",
"re.resources.grid.toolbar.addScoreCard": "评分卡",
"re.resources.grid.toolbar.deepClone.tip": "您确定要深度复制资源吗?",
"re.resources.grid.toolbar.deepCloneNew": "深度复制(新)",
"re.resources.grid.toolbar.deepCloneNew.tip": "您确定要深度复制资源成一个新的资源吗?",
@ -22,6 +21,7 @@
"re.resources.grid.toolbar.deploy.online.tip": "您确定要上线资源吗?",
"re.resources.grid.toolbar.deploy.offline": "下线",
"re.resources.grid.toolbar.deploy.offline.tip": "您确定要下线资源吗?",
"re.resources.grid.toolbar.viewBloodRelationship": "查看血缘关系",
"re.resources.grid.toolbar.importExample": "导入示例",
"re.resources.grid.entity.effectiveDate": "生效日期",
@ -29,170 +29,128 @@
"re.resources.grid.entity.taskName": "任务名称",
"re.resources.grid.entity.taskAssignee": "处理人",
"re.resources.dialog.import.title": "导入资源",
"re.resources.dialog.importSample.title": "导入示例资源",
"re.resources.dialog.importSample.grid.title": "示例资源列表",
"re.resources.dialog.importSample.grid.toolbar.import": "导入示例",
"re.resources.dialog.importSample.grid.toolbar.import.tip": "您确定要导入示例资源吗?",
"re.resources.dialog.attachment.title": "附件管理",
"re.resources.dialog.attachment.grid.title": "附件列表",
"re.resources.dialog.attachment.grid.entity.file": "请选择一个文件",
"re.resources.designer.dialog.title": "模型设计 - {name} ({status},V{version})",
"re.resources.designer.model.grid.title": "模型结构",
"re.resources.designer.model.grid.toolbar.addChild": "添加子模型",
"re.resources.designer.model.grid.toolbar.deepClone.tip": "您确定要深度复制模型吗?",
"re.resources.designer.model.grid.toolbar.generateGroovySourceCode": "生成脚本代码",
"re.resources.designer.model.grid.toolbar.generateGroovySourceCode4TestCase": "生成脚本代码(测试用例)",
"re.resources.designer.model.grid.entity.executeMode": "执行模式",
"re.resources.designer.parameter.tab.title": "参数",
"re.resources.designer.testcase.tab.title": "试算用例",
"re.resources.designer.validator.tab.title": "验证器",
"re.resources.designer.processor.tab.title": "处理逻辑",
"re.resources.designer.option.tab.title": "选项",
"re.resources.designer.parameter.grid.title": "参数列表",
"re.resources.designer.parameter.grid.toolbar.move": "移动",
"re.resources.designer.parameter.grid.toolbar.add.constant": "常量",
"re.resources.designer.parameter.grid.toolbar.add.in": "输入值",
"re.resources.designer.parameter.grid.toolbar.add.inOption": "输入值(选项)",
"re.resources.designer.parameter.grid.toolbar.add.indicator": "指标",
"re.resources.designer.parameter.grid.toolbar.add.intermediate": "中间值",
"re.resources.designer.parameter.grid.toolbar.add.out": "结果值",
"re.resources.designer.parameter.grid.toolbar.add.ruleResult": "规则集结果值",
"re.resources.designer.parameter.grid.toolbar.add.singleRuleResult": "单规则结果值",
"re.resources.designer.parameter.grid.toolbar.add.importPmml": "导入 PMML",
"re.resources.designer.parameter.grid.toolbar.deepClone.tip": "您确定要深度复制参数吗?",
"re.resources.designer.parameter.grid.entity.valueType": "值类型",
"re.resources.designer.parameter.grid.entity.valueTypeVersion": "值类型版本",
"re.resources.designer.parameter.grid.entity.valueScale": "值精度",
"re.resources.designer.parameter.grid.entity.valueRoundingMode": "四舍五入模式",
"re.resources.designer.parameter.grid.entity.valueTypeIsList": "是否列表",
"re.resources.designer.parameter.grid.entity.libCode": "指标库",
"re.resources.designer.parameter.grid.entity.libVersion": "指标库版本",
"re.resources.designer.parameter.grid.entity.indicatorCode": "指标",
"re.resources.designer.validator.grid.title": "验证器",
"re.resources.designer.validator.grid.entity.content": "内容",
"re.resources.designer.validator.grid.entity.tip": "错误提示",
"re.resources.designer.option.grid.title": "选项",
"re.resources.designer.option.grid.entity.inputValue": "输入值",
"re.resources.designer.option.grid.entity.value": "计算值",
"re.resources.designer.option.grid.entity.title": "显示文本",
"re.resources.designer.processor.grid.title": "处理逻辑",
"re.resources.designer.processor.grid.entity.content": "内容",
"re.resources.designer.processor.grid.entity.arithmetic": "算数表达式",
"re.resources.designer.processor.grid.entity.conditionRangeVar": "条件分段",
"re.resources.designer.processor.grid.entity.conditionRange": "条件分段",
"re.resources.designer.processor.grid.entity.decisionTable": "决策表",
"re.resources.designer.processor.grid.entity.decisionTable2C": "简单决策表",
"re.resources.designer.processor.grid.entity.decisionTree": "决策树",
"re.resources.designer.processor.grid.entity.executionFlow": "执行流",
"re.resources.designer.processor.grid.entity.groovyScript": "脚本代码",
"re.resources.designer.processor.grid.entity.httpMethod": "请求方法",
"re.resources.designer.processor.grid.entity.httpUrl": "URL",
"re.resources.designer.processor.grid.entity.httpAuthType": "认证类型",
"re.resources.designer.processor.grid.entity.httpAuthApikey": "API Key",
"re.resources.designer.processor.grid.entity.httpAuthApiValue": "API Value",
"re.resources.designer.processor.grid.entity.httpAuthBasicUsername": "用户名",
"re.resources.designer.processor.grid.entity.httpAuthBasicPassword": "密码",
"re.resources.designer.processor.grid.entity.httpAuthBearerToken": "Bearer Token",
"re.resources.designer.processor.grid.entity.httpRequestBody": "请求体",
"re.resources.designer.processor.grid.entity.httpResponseBody": "响应体",
"re.resources.designer.processor.grid.entity.httpResponseMapping": "响应映射",
"re.resources.designer.processor.grid.entity.mathFormula": "数学公式",
"re.resources.designer.processor.grid.entity.numberRangeVar": "数值分段表达式",
"re.resources.designer.processor.grid.entity.numberRange": "数值分段",
"re.resources.designer.processor.grid.entity.objectCondition": "条件",
"re.resources.designer.processor.grid.entity.objectProperties": "对象属性",
"re.resources.designer.processor.grid.entity.optionCode": "选项",
"re.resources.designer.processor.grid.entity.pmml": "PMML",
"re.resources.designer.processor.grid.entity.rule": "规则",
"re.resources.designer.processor.grid.entity.scoreCard": "评分卡",
"re.resources.designer.processor.grid.entity.singleRule": "单规则",
"re.resources.designer.processor.grid.entity.sqlDatasourceName": "数据源名称",
"re.resources.designer.processor.grid.entity.sql": "SQL 语句",
"re.resources.designer.processor.grid.entity.sqlParameterValues": "参数值",
"re.resources.designer.processor.grid.entity.sqlQueryResult": "执行结果",
"re.resources.designer.processor.grid.entity.sqlFieldMapping": "结果映射",
"re.resources.designer.processor.grid.entity.ternaryCondition": "条件",
"re.resources.designer.processor.grid.entity.ternaryTrue": "条件满足时",
"re.resources.designer.processor.grid.entity.ternaryFalse": "条件不满足时",
"re.resources.designer.processor.grid.entity.when": "When 表达式",
"re.resources.designer.processor.grid.entity.then": "Then 表达式",
"re.resources.designer.processor.grid.entity.isWhenThenShorted": "跳过后续操作",
"re.resources.designer.processor.decisionTable.toolbar.addCol2Left": "在左边新增列",
"re.resources.designer.processor.decisionTable.toolbar.addCol2Right": "在右边新增列",
"re.resources.designer.processor.decisionTable.toolbar.addRow": "新增行",
"re.resources.designer.processor.decisionTable.toolbar.addConditionRow": "新增条件行",
"re.resources.designer.processor.decisionTable.toolbar.addResultRow": "新增结果行",
"re.resources.designer.processor.decisionTable.toolbar.removeCol": "删除列",
"re.resources.designer.processor.decisionTable.toolbar.removeRow": "删除行",
"re.resources.designer.processor.decisionTable.action.addConditionRow": "添加条件行",
"re.resources.designer.processor.decisionTable.action.addResultRow": "添加结果行",
"re.resources.designer.processor.dialog.decisionTree.title": "决策树设计器",
"re.resources.designer.processor.dialog.executionFlow.title": "执行流设计器",
"re.graph.vertex.start.label": "开始",
"re.graph.vertex.start.title": "开始",
"re.graph.vertex.condition.label": "条件",
"re.graph.vertex.condition.title": "条件",
"re.graph.vertex.condition.entity.condition": "判断条件",
"re.graph.vertex.expression.label": "表达式",
"re.graph.vertex.expression.title": "表达式",
"re.graph.vertex.expression.entity.expression": "表达式",
"re.graph.vertex.expression.entity.commands": "附加指令集",
"re.graph.vertex.resourceAbstract.label": "资源",
"re.graph.vertex.resourceAbstract.title": "资源",
"re.graph.vertex.resourceAbstract.entity.resourceAbstractId": "资源",
"re.graph.vertex.commandSet.label": "指令集",
"re.graph.vertex.commandSet.title": "指令集",
"re.graph.vertex.commandSet.entity.commands": "指令集",
"re.graph.vertex.configurableResourceAbstract.label": "资源",
"re.graph.vertex.configurableResourceAbstract.title": "带输入输出指令的资源",
"re.graph.vertex.configurableResourceAbstract.entity.resourceAbstractId": "资源",
"re.graph.vertex.configurableResourceAbstract.entity.inputCommands": "输入指令集",
"re.graph.vertex.configurableResourceAbstract.entity.outputCommands": "输出指令集",
"re.graph.vertex.subModelAbstract.label": "子模型",
"re.graph.vertex.subModelAbstract.title": "子模型",
"re.graph.vertex.subModelAbstract.entity.code": "子模型",
"re.graph.edge.conditionBranch.entity.valueType": "值类型",
"re.graph.edge.conditionBranch.entity.value": "值",
"re.graph.edge.conditionBranch.entity.commands": "附加指令集",
"re.resources.designer.testCase.grid.title": "试算用例",
"re.resources.designer.testCase.grid.tools.batchTest": "批量试算",
"re.resources.designer.testCase.grid.tools.download": "下载试算模版",
"re.resources.designer.testCase.grid.tools.upload": "上传用例并试算",
"re.resources.designer.testCase.grid.entity.testResult": "结果",
"re.resources.designer.testCase.grid.entity.lastTestDate": "测试日期",
"re.resources.designer.testCase.grid.entity.ownerCode": "资源代码",
"re.resources.designer.testCase.grid.entity.ownerName": "资源名称",
"re.resources.designer.testCase.grid.entity.ownerVersion": "资源版本",
"re.resources.designer.testCase.grid.entity.ownerStatus": "资源状态",
"re.resources.designer.testCaseParameter.grid.title": "参数列表",
"re.resources.designer.testCaseParameter.grid.entity.inputValue": "输入值",
"re.resources.designer.testCaseParameter.grid.entity.expectValue": "期望值",
"re.resources.designer.testCaseParameter.grid.entity.resultValue": "结果值",
"re.resources.designer.testCaseParameter.grid.entity.skipCheck": "跳过检查",
"re.resources.designer.testCaseParameter.grid.entity.testResult": "结果",
"re.resources.import.dialog.title": "导入资源",
"re.resources.importSample.dialog.title": "导入示例资源",
"re.resources.importSample.grid.title": "示例资源列表",
"re.resources.importSample.grid.toolbar.import": "导入示例",
"re.resources.importSample.grid.toolbar.import.tip": "您确定要导入示例资源吗?",
"re.resources.dialog.designer.title": "模型设计 - {name} ({status},V{version})",
"re.resources.dialog.designer.tab.parameter.title": "参数",
"re.resources.dialog.designer.tab.testcase.title": "试算用例",
"re.resources.dialog.designer.tab.validator.title": "验证器",
"re.resources.dialog.designer.tab.processor.title": "处理逻辑",
"re.resources.dialog.designer.tab.option.title": "选项",
"re.model.grid.title": "模型结构",
"re.model.grid.toolbar.addChild": "添加子模型",
"re.model.grid.toolbar.deepClone.tip": "您确定要深度复制模型吗?",
"re.model.grid.toolbar.generateGroovySourceCode": "生成脚本代码",
"re.model.grid.toolbar.generateGroovySourceCode4TestCase": "生成脚本代码(测试用例)",
"re.model.grid.entity.resource": "资源",
"re.model.grid.entity.executeMode": "执行模式",
"re.parameter.grid.title": "参数列表",
"re.parameter.grid.toolbar.move": "移动",
"re.parameter.grid.toolbar.add.constant": "常量",
"re.parameter.grid.toolbar.add.in": "输入值",
"re.parameter.grid.toolbar.add.inOption": "输入值(选项)",
"re.parameter.grid.toolbar.add.indicator": "指标",
"re.parameter.grid.toolbar.add.intermediate": "中间值",
"re.parameter.grid.toolbar.add.out": "结果值",
"re.parameter.grid.toolbar.add.ruleResult": "规则集结果值",
"re.parameter.grid.toolbar.add.singleRuleResult": "单规则结果值",
"re.parameter.grid.toolbar.add.importPmml": "导入 PMML",
"re.parameter.grid.toolbar.deepClone.tip": "您确定要深度复制参数吗?",
"re.parameter.grid.entity.model": "模型",
"re.parameter.grid.entity.valueType": "值类型",
"re.parameter.grid.entity.valueTypeVersion": "值类型版本",
"re.parameter.grid.entity.valueScale": "值精度",
"re.parameter.grid.entity.valueRoundingMode": "四舍五入模式",
"re.parameter.grid.entity.valueTypeIsList": "列表?",
"re.parameter.grid.entity.libCode": "指标库",
"re.parameter.grid.entity.libVersion": "指标库版本",
"re.parameter.grid.entity.indicatorCode": "指标",
"re.parameter.tip.indicatorParameterCanNotEditable": "类型为指标的参数不能进行编辑!",
"re.parameter.dialog.moveParameter.title": "选择参数移动的目标位置",
"re.validator.grid.title": "验证器",
"re.validator.grid.entity.content": "内容",
"re.validator.grid.entity.tip": "错误提示",
"re.option.grid.title": "选项",
"re.option.grid.entity.inputValue": "输入值",
"re.option.grid.entity.value": "计算值",
"re.option.grid.entity.title": "显示文本",
"re.processor.dialog.decisionTree.title": "决策树设计器",
"re.processor.dialog.executionFlow.title": "执行流设计器",
"re.processor.grid.title": "处理逻辑",
"re.processor.grid.entity.content": "内容",
"re.processor.grid.entity.arithmetic": "算数表达式",
"re.processor.grid.entity.conditionRangeVar": "条件分段",
"re.processor.grid.entity.conditionRange": "条件分段",
"re.processor.grid.entity.decisionTable": "决策表",
"re.processor.grid.entity.decisionTable2C": "简单决策表",
"re.processor.grid.entity.decisionTree": "决策树",
"re.processor.grid.entity.executionFlow": "执行流",
"re.processor.grid.entity.groovyScript": "脚本代码",
"re.processor.grid.entity.httpMethod": "请求方法",
"re.processor.grid.entity.httpUrl": "URL",
"re.processor.grid.entity.httpAuthType": "认证类型",
"re.processor.grid.entity.httpAuthApikey": "API Key",
"re.processor.grid.entity.httpAuthApiValue": "API Value",
"re.processor.grid.entity.httpAuthBasicUsername": "用户名",
"re.processor.grid.entity.httpAuthBasicPassword": "密码",
"re.processor.grid.entity.httpAuthBearerToken": "Bearer Token",
"re.processor.grid.entity.httpRequestBody": "请求体",
"re.processor.grid.entity.httpResponseBody": "响应体",
"re.processor.grid.entity.httpResponseMapping": "响应映射",
"re.processor.grid.entity.mathFormula": "数学公式",
"re.processor.grid.entity.numberRangeVar": "数值分段表达式",
"re.processor.grid.entity.numberRange": "数值分段",
"re.processor.grid.entity.objectCondition": "条件",
"re.processor.grid.entity.objectProperties": "对象属性",
"re.processor.grid.entity.optionCode": "选项",
"re.processor.grid.entity.pmml": "PMML",
"re.processor.grid.entity.rule": "规则",
"re.processor.grid.entity.scoreCard": "评分卡",
"re.processor.grid.entity.singleRule": "单规则",
"re.processor.grid.entity.sqlDatasourceName": "数据源名称",
"re.processor.grid.entity.sql": "SQL 语句",
"re.processor.grid.entity.sqlParameterValues": "参数值",
"re.processor.grid.entity.sqlQueryResult": "执行结果",
"re.processor.grid.entity.sqlFieldMapping": "结果映射",
"re.processor.grid.entity.ternaryCondition": "条件",
"re.processor.grid.entity.ternaryTrue": "条件满足时",
"re.processor.grid.entity.ternaryFalse": "条件不满足时",
"re.processor.grid.entity.when": "When 表达式",
"re.processor.grid.entity.then": "Then 表达式",
"re.processor.grid.entity.isWhenThenShorted": "跳过后续操作",
"re.processor.decisionTable.toolbar.addCol2Left": "在左边新增列",
"re.processor.decisionTable.toolbar.addCol2Right": "在右边新增列",
"re.processor.decisionTable.toolbar.addRow": "新增行",
"re.processor.decisionTable.toolbar.addConditionRow": "新增条件行",
"re.processor.decisionTable.toolbar.addResultRow": "新增结果行",
"re.processor.decisionTable.toolbar.removeCol": "删除列",
"re.processor.decisionTable.toolbar.removeRow": "删除行",
"re.processor.decisionTable.action.addConditionRow": "添加条件行",
"re.processor.decisionTable.action.addResultRow": "添加结果行",
"re.dictionary.grid.title": "元数据",
"re.dictionary.grid.toolbar.addGroup": "新增",
"re.dictionary.grid.toolbar.addTop": "顶级文件夹",
"re.dictionary.grid.toolbar.addChild": "子文件夹",
"re.dictionary.grid.toolbar.addJavaType": "Java 类型",
"re.dictionary.grid.toolbar.addUserDefinedJavaClassType": "用户自定义类型",
"re.dictionary.grid.toolbar.addEnumType": "枚举类型",
"re.dictionary.grid.toolbar.addUserDefinedJavaClassType": "结构体",
"re.dictionary.grid.toolbar.addEnumType": "枚举",
"re.dictionary.grid.toolbar.cloneGroup": "复制",
"re.dictionary.grid.toolbar.deepClone": "深度复制",
"re.dictionary.grid.toolbar.deepClone.tip": "您确定要深度复制元数据吗?",
@ -253,6 +211,32 @@
"re.indicator.grid.toolbar.addInterface": "接口",
"re.indicator.grid.toolbar.addIndicator": "指标",
"re.testcase.grid.title": "试算用例",
"re.testcase.grid.tools.batchTest": "批量试算",
"re.testcase.grid.tools.download": "下载试算模版",
"re.testcase.grid.tools.upload": "上传用例并试算",
"re.testcase.grid.entity.testResult": "结果",
"re.testcase.grid.entity.lastTestDate": "测试日期",
"re.testcase.grid.entity.ownerId": "所有者ID",
"re.testcase.grid.entity.ownerType": "所有者类型",
"re.testcase.grid.entity.ownerCode": "所有者代码",
"re.testcase.grid.entity.ownerName": "所有者名称",
"re.testcase.grid.entity.ownerVersion": "所有者版本",
"re.testcase.grid.entity.ownerStatus": "所有者状态",
"re.testcase.grid.entity.ownerDescription": "所有者名称",
"re.testCaseParameter.grid.title": "参数列表",
"re.testCaseParameter.grid.entity.testCaseId": "测试用例ID",
"re.testCaseParameter.grid.entity.inputValue": "输入值",
"re.testCaseParameter.grid.entity.expectValue": "期望值",
"re.testCaseParameter.grid.entity.resultValue": "结果值",
"re.testCaseParameter.grid.entity.skipCheck": "跳过检查",
"re.testCaseParameter.grid.entity.testResult": "结果",
"re.templateImportAndExport.action.group": "批量创建",
"re.templateImportAndExport.action.downloadTemplate": "下载模版",
"re.templateImportAndExport.action.upload": "上传并创建",
"re.migration.import.title": "导入数据 (通过上传文件导入)",
"re.migration.import.subTitle": "",
"re.migration.import.action": "导入数据",
@ -304,5 +288,33 @@
"re.workflow.task.grid.entity.resourceStatus": "资源状态",
"re.workflow.task.grid.entity.attachments": "资源附件",
"re.workflow.historyTask.grid.title": "历史任务列表"
"re.workflow.historyTask.grid.title": "历史任务列表",
"re.graph.vertex.start.label": "开始",
"re.graph.vertex.start.title": "开始",
"re.graph.vertex.condition.label": "条件",
"re.graph.vertex.condition.title": "条件",
"re.graph.vertex.condition.entity.condition": "判断条件",
"re.graph.vertex.expression.label": "表达式",
"re.graph.vertex.expression.title": "表达式",
"re.graph.vertex.expression.entity.expression": "表达式",
"re.graph.vertex.expression.entity.commands": "附加指令集",
"re.graph.vertex.resourceAbstract.label": "资源",
"re.graph.vertex.resourceAbstract.title": "资源",
"re.graph.vertex.resourceAbstract.entity.resourceAbstractId": "资源",
"re.graph.vertex.commandSet.label": "指令集",
"re.graph.vertex.commandSet.title": "指令集",
"re.graph.vertex.commandSet.entity.commands": "指令集",
"re.graph.vertex.configurableResourceAbstract.label": "资源",
"re.graph.vertex.configurableResourceAbstract.title": "带输入输出指令的资源",
"re.graph.vertex.configurableResourceAbstract.entity.resourceAbstractId": "资源",
"re.graph.vertex.configurableResourceAbstract.entity.inputCommands": "输入指令集",
"re.graph.vertex.configurableResourceAbstract.entity.outputCommands": "输出指令集",
"re.graph.vertex.subModelAbstract.label": "子模型",
"re.graph.vertex.subModelAbstract.title": "子模型",
"re.graph.vertex.subModelAbstract.entity.code": "子模型",
"re.graph.edge.conditionBranch.entity.valueType": "值类型",
"re.graph.edge.conditionBranch.entity.value": "值",
"re.graph.edge.conditionBranch.entity.commands": "附加指令集"
}

40
io.sc.engine.rule.frontend/src/routes/routes.json

@ -9,25 +9,21 @@
"componentPath": "@/views/resources/Resources.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/resources/**/*"
]
"permissions": ["/re/resources/**/*"]
}
},
{
"force": true,
"name": "route.engine.rule.designer",
"path": "re/designer",
"icon": "bi-1-circle",
"path": "re/designer/:id",
"parent": "/",
"priority": 0,
"module": "io.sc.engine.rule.frontend",
"component": "component.engine.rule.designer",
"componentPath": "@/views/resources/designer/Designer.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/resources/**/*"
]
"permissions": ["/re/resources/**/*"]
}
},
{
@ -40,9 +36,7 @@
"componentPath": "@/views/authorization/Authorization.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/authorization/**/*"
]
"permissions": ["/re/authorization/**/*"]
}
},
{
@ -55,9 +49,7 @@
"componentPath": "@/views/workflow/Workflow.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/workflow/**/*"
]
"permissions": ["/re/workflow/**/*"]
}
},
{
@ -70,9 +62,7 @@
"componentPath": "@/views/dictionary/Dictionary.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/dictionary/**/*"
]
"permissions": ["/re/dictionary/**/*"]
}
},
{
@ -85,9 +75,7 @@
"componentPath": "@/views/lib/Lib.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/lib/**/*"
]
"permissions": ["/re/lib/**/*"]
}
},
{
@ -100,9 +88,7 @@
"componentPath": "@/views/function/Function.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/function/**/*"
]
"permissions": ["/re/function/**/*"]
}
},
{
@ -115,9 +101,7 @@
"componentPath": "@/views/testcase/Testcase.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/testcase/**/*"
]
"permissions": ["/re/testcase/**/*"]
}
},
{
@ -130,9 +114,7 @@
"componentPath": "@/views/migration/Migration.vue",
"redirect": null,
"meta": {
"permissions": [
"/re/migration/**/*"
]
"permissions": ["/re/migration/**/*"]
}
}
]

25
io.sc.engine.rule.frontend/src/utils/PassOrNotFormater.ts

@ -1,25 +0,0 @@
import { Tools } from 'platform-core';
const PassOrNotFormater = (value) => {
if (Tools.isUndefinedOrNull(value)) {
return '';
}
if (value === 'PASSED') {
return {
componentType: 'QIcon',
attrs: { name: 'bi-check-circle', size: '20px', color: 'green' },
};
} else if (value === 'UN_PASSED') {
return {
componentType: 'QIcon',
attrs: { name: 'bi-x-circle', size: '20px', color: 'red' },
};
} else if (value === 'ERROR') {
return {
componentType: 'QIcon',
attrs: { name: 'bi-x-circle', size: '20px', color: 'red' },
};
}
};
export default PassOrNotFormater;

60
io.sc.engine.rule.frontend/src/views/authorization/Authorization.vue

@ -4,6 +4,7 @@
<div class="pr-1" style="height: 100%">
<w-grid
ref="roleGridRef"
dense-body
:title="$t('system.role.grid.title')"
:config-button="true"
selection="multiple"
@ -20,7 +21,7 @@
{ name: 'enable', label: $t('isEnable'), type: 'w-select', options: Options.yesNo() },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'separator', 'refresh', 'separator', 'view', 'separator', 'export']"
:toolbar-actions="['query', 'separator', 'separator', 'view', 'separator', 'export']"
:columns="[
{ width: 100, name: 'code', label: $t('code') },
{ width: '100%', name: 'name', label: $t('name') },
@ -35,12 +36,7 @@
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'enable', label: $t('enable'), format: Formater.none() },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -66,7 +62,6 @@
ref="resourceTreeGridRef"
:title="$t('re.resources.grid.title')"
dense-body
hide-bottom
:config-button="true"
selection="multiple"
:checkbox-selection="true"
@ -86,16 +81,18 @@
"
ticked-field="selected"
:fetch-data-url="Environment.apiContextPath('/api/re/resource/listAllResourcesWithSelectedStatusByRole?roleId=' + roleIdRef)"
:sort-by="['type', 'namec', '-lastModifyDate']"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
'expand',
'separator',
{
name: 'save',
label: $t('save'),
icon: 'sym_o_save',
icon: 'bi-floppy',
click: (arg) => {
const data = {
one: roleIdRef,
@ -106,25 +103,44 @@
});
},
},
'separator',
'view',
]"
:columns="[
{ width: '100%', name: 'name', label: $t('name') },
{ width: 80, name: 'type', label: $t('type'), format: Formater.enum(Enums.ResourceType) },
{ width: 150, name: 'code', label: $t('code') },
{ width: 60, name: 'version', label: $t('version') },
{ width: '100%', name: 'name', label: $t('name'), sortable: false },
{ width: 150, name: 'code', label: $t('code'), sortable: false },
{ width: 60, name: 'version', label: $t('version'), sortable: false, align: 'right' },
{
width: 80,
name: 'status',
label: $t('status'),
align: 'center',
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
sortable: false,
format: EngineEnums.DeployStatus.formater,
},
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'type', label: $t('type') },
{ name: 'parent', label: $t('parent') },
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'version', label: $t('version') },
{ name: 'status', label: $t('status'), format: Formater.none() },
{ name: 'effectiveDate', label: $t('effectiveDate') },
{ name: 'taskName', label: $t('re.resources.grid.entity.taskName') },
{ name: 'taskAssignee', label: $t('re.resources.grid.entity.taskAssignee') },
{ name: 'attachmentCount', label: $t('attachment') },
{ name: 'imports', label: $t('imports') },
{ name: 'order', label: $t('order') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
></w-grid>
</div>
</template>
@ -133,12 +149,12 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref } from 'vue';
import { Environment, NotifyManager, axios, Tools, EnumTools, Options, Formater } from 'platform-core';
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue';
import { axios, Environment, NotifyManager, Tools, EnumTools, Options, Formater, CorporationAuditorEntityManager } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const roleGridRef = ref();
const resourceTreeGridRef = ref();
const roleIdRef = ref();
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ResourceType', 'io.sc.engine.rule.core.enums.DeployStatus']);
await EngineEnums.init();
</script>

342
io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue

@ -1,5 +1,5 @@
<template>
<q-splitter :model-value="500" unit="px" separator-style="width: 3px;" class="w-full" style="height: 100%">
<q-splitter :model-value="600" unit="px" separator-style="width: 3px;" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1" style="height: 100%">
<w-grid
@ -15,20 +15,22 @@
:tree="true"
:tree-icon="
(row) => {
if (row.type === 'FOLDER') {
return { name: 'folder', color: 'amber' };
if (row.type === 'UD_JAVA_CLASS') {
return { name: 'bi-receipt' };
} else if (row.type === 'ENUM') {
return { name: 'bi-list-ul' };
} else {
return { name: 'bi-card-list' };
return { name: 'folder', color: 'amber' };
}
}
"
ticked-field="selected"
:data-url="Environment.apiContextPath('/api/re/dictionary')"
:pageable="false"
:sort-by="['type', 'namec', '-version']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
'expand',
[
{
@ -57,23 +59,11 @@
},
},
'separator',
{
name: 'addJavaType',
extend: 'addChild',
label: $t('re.dictionary.grid.toolbar.addJavaType'),
icon: 'playlist_add',
enableIf: (arg) => {
return arg.selected && arg.selected.type === 'FOLDER';
},
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'JAVA_CLASS');
},
},
{
name: 'addUserDefinedJavaClassType',
extend: 'addChild',
label: $t('re.dictionary.grid.toolbar.addUserDefinedJavaClassType'),
icon: 'playlist_add',
icon: 'bi-receipt',
enableIf: (arg) => {
return arg.selected && arg.selected.type === 'FOLDER';
},
@ -85,7 +75,7 @@
name: 'addEnumType',
extend: 'addChild',
label: $t('re.dictionary.grid.toolbar.addEnumType'),
icon: 'playlist_add',
icon: 'bi-list-ul',
enableIf: (arg) => {
return arg.selected && arg.selected.type === 'FOLDER';
},
@ -93,17 +83,7 @@
arg.grid.getEditorForm().setFieldValue('type', 'ENUM');
},
},
],
[
{
name: 'cloneGroup',
label: $t('re.dictionary.grid.toolbar.cloneGroup'),
icon: 'content_copy',
click: undefined,
enableIf: (arg) => {
return arg.selected;
},
},
'separator',
'clone',
{
extend: 'deepClone',
@ -138,7 +118,6 @@
},
},
],
'separator',
'edit',
'remove',
@ -201,6 +180,17 @@
],
'separator',
'view',
{
name: 'viewBloodRelationship',
label: $t('re.resources.grid.toolbar.viewBloodRelationship'),
icon: 'hub',
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: (args) => {
bloodRelationshipDialogRef.open();
},
},
'separator',
{
extend: 'export',
@ -224,28 +214,24 @@
return value;
},
},
{ width: 135, name: 'code', label: $t('code') },
{
width: 80,
width: 60,
name: 'type',
label: $t('type'),
format: (value) => {
if (value !== 'FOLDER') {
return Formater.enum(Enums.DictionaryType)(value);
return EngineEnums.DictionaryType.formater(value);
}
},
},
{ width: 60, name: 'version', label: $t('version') },
{ width: 60, name: 'version', label: $t('version'), align: 'right' },
{
width: 60,
name: 'status',
label: $t('status'),
align: 'center',
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
format: EngineEnums.DeployStatus.formater,
},
]"
:editor="{
@ -262,23 +248,13 @@
label: $t('code'),
type: 'w-text',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
return type !== 'FOLDER';
return false;
// const type = arg.form.getFieldValue('type');
// return type !== 'FOLDER';
},
},
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' },
{
name: 'javaClassName',
label: $t('re.dictionary.grid.entity.javaClassName'),
type: 'w-input-select',
clearable: false,
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
return type === 'JAVA_CLASS';
},
options: javaClassNameOptionsRef,
},
],
},
}"
@ -286,19 +262,13 @@
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'id', label: $t('id') },
{ name: 'parent', label: $t('parent') },
{ name: 'type', label: $t('type') },
{ name: 'parent', label: $t('parent') },
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'javaClassName', label: $t('re.dictionary.grid.entity.javaClassName') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -326,6 +296,7 @@
divStatus.isShowEnumGrid = false;
}
"
@after-editor-data-submit="eventBus.emit('dictionaryChanged')"
></w-grid>
<UserDefinedJavaClassDictionaryJsonDialog ref="userDefinedJavaClassDictionaryJsonDialogRef"></UserDefinedJavaClassDictionaryJsonDialog>
<ImportDialog
@ -337,6 +308,7 @@
"
></ImportDialog>
<ImportSampleDialog ref="importSampleDialogRef"></ImportSampleDialog>
<BloodRelationshipDialog ref="bloodRelationshipDialogRef"></BloodRelationshipDialog>
</div>
</template>
<template #after>
@ -354,7 +326,8 @@
:checkbox-selection="true"
:fetch-data-url="Environment.apiContextPath('/api/re/dictionary/userDefinedJavaClassField?dictionary=' + currentSelectedDictionaryIdRef)"
:data-url="Environment.apiContextPath('/api/re/dictionary/userDefinedJavaClassField')"
:pageable="false"
:pageable="true"
:pagination="{ rowsPerPage: 50 }"
:sort-by="['order']"
:query-form-cols-num="3"
:query-form-fields="[
@ -362,36 +335,42 @@
{ name: 'name', label: $t('name'), type: 'w-text', clearable: true },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view']"
:toolbar-actions="[
'query',
'separator',
'add',
'clone',
'edit',
'remove',
'separator',
...templateImportAndExportManager.getToolbarAction(),
'separator',
[
'view',
{
name: 'viewBloodRelationship',
label: $t('re.resources.grid.toolbar.viewBloodRelationship'),
icon: 'hub',
enableIf: (args) => {
return args.selected;
},
click: (args) => {
bloodRelationshipDialogRef.open();
},
},
],
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), align: 'right' },
{ width: 120, name: 'code', label: $t('code') },
{ width: 200, name: 'name', label: $t('name') },
{ width: 140, name: 'code', label: $t('code') },
{ width: 260, name: 'name', label: $t('name') },
...valueTypeManager.getColumns(),
{
width: 200,
name: 'valueType',
label: $t('re.resources.designer.parameter.grid.entity.valueType'),
format: (value, row) => {
if (row.valueTypeVersion) {
return ValueTypeMap[value] + ' (V' + row.valueTypeVersion + ')';
}
return ValueTypeMap[value];
},
},
{
width: 85,
name: 'valueTypeIsList',
label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'),
align: 'center',
format: Formater.yesNo(),
},
{ width: 100, name: 'defaultValue', label: $t('defaultValue') },
{
width: 500,
name: 'valueCalculation',
label: $t('re.dictionary.field.grid.entity.valueCalculation'),
format: (value, row) => {
return PlaceHolder.replace(value);
return value;
//return PlaceHolder.replace(value);
},
},
]"
@ -403,43 +382,10 @@
colsNum: 1,
fields: [
{ name: 'dictionary', label: $t('dictionary'), type: 'w-text', showIf: false, defaultValue: currentSelectedDictionaryIdRef },
{ name: 'code', label: $t('code'), type: 'w-text' },
{ name: 'code', label: $t('code'), type: 'w-text', requiredIf: true },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' },
{
name: 'valueType',
label: $t('re.dictionary.field.grid.entity.valueType'),
requiredIf: true,
type: 'w-select',
options: ValueTypeList,
'onUpdate:modelValue': (value) => {
const valueType = fieldGridRef.getEditorForm().getFieldValue('valueType');
axios.get(Environment.apiContextPath('/api/re/dictionary/getVersionsByCode?code=' + valueType)).then((response) => {
const versions = response.data;
const options = [];
versions.forEach((version) => {
options.push({ label: version.key, value: version.value });
});
valueTypeVersionOptionsRef = options;
});
},
},
{
name: 'valueTypeVersion',
label: $t('re.resources.designer.parameter.grid.entity.valueTypeVersion'),
type: 'w-select',
clearable: true,
options: valueTypeVersionOptionsRef,
showIf: (arg) => {
return !ValueTypeUtil.isBase();
},
},
{
name: 'valueTypeIsList',
label: $t('re.dictionary.field.grid.entity.valueTypeIsList'),
type: 'w-checkbox',
},
{ name: 'defaultValue', label: $t('defaultValue'), type: 'w-text' },
...valueTypeManager.getEditorFields(),
{
name: 'valueCalculation',
label: $t('re.dictionary.field.grid.entity.valueCalculation'),
@ -447,8 +393,8 @@
lang: 'java',
rows: 3,
placeholder: true,
autoCompletion: autoCompletion,
userDefinedFunctions: userDefinedFunctionsRef,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
},
{ name: 'order', label: $t('order'), type: 'w-number' },
],
@ -458,61 +404,39 @@
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'id', label: $t('id') },
{ name: 'dictionary', label: $t('dictionary') },
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'valueType', label: $t('re.dictionary.field.grid.entity.valueType') },
{ name: 'valueTypeIsList', label: $t('re.dictionary.field.grid.entity.valueTypeIsList') },
{ name: 'defaultValue', label: $t('defaultValue') },
...valueTypeManager.getViewerFields(),
{ name: 'valueCalculation', label: $t('re.dictionary.field.grid.entity.valueCalculation') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'order', label: $t('order') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@after-editor-open="
(row) => {
axios
.get(Environment.apiContextPath('/api/re/dictionary/listParemterHintsByUserDefinedJavaClassDictionaryId/' + currentSelectedDictionaryIdRef))
.then((response) => {
const names = [];
if (response.data?.parentParameterNames && response.data?.parentParameterNames.length > 0) {
response.data.parentParameterNames.forEach((item) => {
names.push({ label: item, type: 'variable', apply: '${' + item + '}' });
});
}
if (response.data?.parameterNames && response.data?.parameterNames.length > 0) {
response.data.parameterNames.forEach((item) => {
names.push({ label: item, type: 'variable', apply: '${' + item + '}' });
});
}
autoCompletionOptionsRef = names;
});
const valueType = fieldGridRef.getEditorForm().getFieldValue('valueType');
if (valueType) {
if (!ValueTypeUtil.isBase(valueType) && ValueTypeMap[valueType]) {
axios.get(Environment.apiContextPath('/api/re/dictionary/getVersionsByCode?code=' + valueType)).then((response) => {
const versions = response.data;
const options = [];
versions.forEach((version) => {
options.push({ label: version.key, value: version.value });
});
valueTypeVersionOptionsRef = options;
});
}
}
(args: any) => {
valueTypeManager.afterEditorOpen(args);
autoCompletionManager.load(
Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByDictionaryId/' + currentSelectedDictionaryIdRef),
);
userDefinedFunctionsManager.load();
}
"
>
</w-grid>
<TemplateImportAndExportDialog
ref="templateImportAndExportDialogRef"
:download-url="Environment.apiContextPath('/api/re/template/downloadUserDefinedJavaClassFieldTemplate/' + currentSelectedDictionaryIdRef)"
:upload-url="Environment.apiContextPath('/api/re/template/uploadUserDefinedJavaClassFieldTemplate/' + currentSelectedDictionaryIdRef)"
@after-imported="
() => {
fieldGridRef.refresh();
}
"
></TemplateImportAndExportDialog>
</div>
<!--选项-->
@ -524,14 +448,12 @@
hide-bottom
:config-button="true"
selection="multiple"
db-click-operation="edit"
:checkbox-selection="true"
:fetch-data-url="Environment.apiContextPath('/api/re/dictionary/enumItem?dictionary=' + currentSelectedDictionaryIdRef)"
:data-url="Environment.apiContextPath('/api/re/dictionary/enumItem')"
:pageable="false"
:pagination="{
sortBy: 'value',
descending: false,
}"
:sort-by="['order']"
:query-form-cols-num="3"
:query-form-fields="[]"
:toolbar-configure="{ noIcon: false }"
@ -548,12 +470,13 @@
form: {
colsNum: 1,
fields: [
{ name: 'dictionary', label: $t('dictionary'), type: 'w-text', defaultValue: currentSelectedDictionaryIdRef },
{ name: 'value', label: $t('value'), type: 'w-text' },
{ name: 'dictionary', label: $t('dictionary'), type: 'w-text', showIf: false, defaultValue: currentSelectedDictionaryIdRef },
{ name: 'value', label: $t('value'), type: 'w-text', requiredIf: true },
{
name: 'title',
label: $t('title'),
type: 'text',
type: 'w-text',
requiredIf: true,
},
{ name: 'description', label: $t('description'), type: 'w-text' },
{ name: 'order', label: $t('order'), type: 'w-number' },
@ -564,17 +487,13 @@
panel: {
columnNum: 1,
fields: [
{ name: 'dictionary', label: $t('dictionary') },
{ name: 'id', label: $t('id') },
{ name: 'value', label: $t('value') },
{ name: 'title', label: $t('title') },
{ name: 'description', label: $t('description') },
{ name: 'order', label: $t('order') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -587,74 +506,37 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, reactive } from 'vue';
import { $t, axios, Environment, Formater, EnumTools, DialogManager, Downloader } from 'platform-core';
import { ValueTypeUtil } from '@/utils/ValueTypeUtil';
import { i18n, eventBus, $t, axios, Environment, Formater, EnumTools, DialogManager, Downloader, CorporationAuditorEntityManager } from 'platform-core';
import UserDefinedJavaClassDictionaryJsonDialog from './UserDefinedJavaClassDictionaryJsonDialog.vue';
import ImportDialog from './ImportDialog.vue';
import ImportSampleDialog from './ImportSampleDialog.vue';
import { PlaceHolder } from '@/utils/PlaceHolder';
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue';
import BloodRelationshipDialog from '@/views/shared/BloodRelationshipDialog.vue';
import TemplateImportAndExportDialog from '@/views/shared/TemplateImportAndExportDialog.vue';
import { TemplateImportAndExportManager } from '@/views/shared/TemplateImportAndExportManager';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const treeGridRef = ref();
const fieldGridRef = ref();
const enumGridRef = ref();
const javaClassNameOptionsRef = ref();
const userDefinedJavaClassDictionaryJsonDialogRef = ref();
const importDialogRef = ref();
const importSampleDialogRef = ref();
const bloodRelationshipDialogRef = ref();
const currentSelectedDictionaryIdRef = ref('');
const valueTypeVersionOptionsRef = ref();
const valueTypeManager = new ValueTypeManager();
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsRef = ref();
const autoCompletion = (context) => {
return autoCompletionManager.autoCompletion(context);
};
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
const templateImportAndExportDialogRef = ref();
const templateImportAndExportManager = new TemplateImportAndExportManager(templateImportAndExportDialogRef);
const divStatus = reactive({
isShowFieldGrid: false,
isShowEnumGrid: false,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.DictionaryType', 'io.sc.engine.rule.core.enums.DeployStatus']);
let ValueTypeMap = {};
let ValueTypeList = [];
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
ValueTypeList = [];
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
ValueTypeList.push({ value: item.key, label: item.value });
});
}
axios.get(Environment.apiContextPath('/api/re/function?pageable=false')).then((response) => {
const options = [];
const items = response.data?.content;
if (items && items.length > 0) {
items.forEach((item) => {
if (item.enable) {
options.push(item);
}
});
}
userDefinedFunctionsRef.value = options;
});
axios.get(Environment.apiContextPath('/api/re/dictionary/listJavaClassNames')).then((response) => {
const options = [];
const items = response.data;
if (items && items.length > 0) {
items.forEach((item) => {
options.push({
label: $t(item),
value: item,
});
});
}
javaClassNameOptionsRef.value = options;
console.log(options);
});
await EngineEnums.init();
await valueTypeManager.init();
</script>

37
io.sc.engine.rule.frontend/src/views/function/Function.vue

@ -9,17 +9,29 @@
:checkbox-selection="false"
:data-url="Environment.apiContextPath('/api/re/function')"
:pageable="false"
:sort-by="['-lastModifyDate']"
:sort-by="['name']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'query',
'refresh',
'separator',
'add',
'edit',
'remove',
'separator',
'view',
[
'view',
{
name: 'viewBloodRelationship',
label: $t('re.resources.grid.toolbar.viewBloodRelationship'),
icon: 'hub',
enableIf: (args) => {
return args.selected;
},
click: (args) => {
bloodRelationshipDialogRef.open();
},
},
],
'separator',
{
name: 'import',
@ -42,11 +54,11 @@
]"
:columns="[
{ width: 70, name: 'enable', label: $t('enable'), format: Formater.enableTag(), align: 'center', sortable: false },
{ width: 120, name: 'name', label: $t('name') },
{ width: 150, name: 'signature', label: $t('re.function.grid.entity.signature') },
{ width: 200, name: 'description', label: $t('description') },
{ width: 200, name: 'name', label: $t('name') },
{ width: 300, name: 'signature', label: $t('re.function.grid.entity.signature') },
{ width: 300, name: 'description', label: $t('description') },
{
width: 230,
width: 300,
name: 'mathXml',
label: $t('re.function.grid.entity.mathXml'),
format: (value) => {
@ -124,11 +136,7 @@
{ name: 'mathXml', label: $t('re.function.grid.entity.mathXml') },
{ name: 'body', label: $t('re.function.grid.entity.body'), format: Formater.none() },
{ name: 'enable', label: $t('enable'), format: Formater.none() },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -141,14 +149,17 @@
}
"
></ImportDialog>
<BloodRelationshipDialog ref="bloodRelationshipDialogRef"></BloodRelationshipDialog>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref } from 'vue';
import { Environment, Formater, Downloader } from 'platform-core';
import { Environment, Formater, Downloader, CorporationAuditorEntityManager } from 'platform-core';
import ImportDialog from './ImportDialog.vue';
import BloodRelationshipDialog from '@/views/shared/BloodRelationshipDialog.vue';
const gridRef = ref();
const importDialogRef = ref();
const bloodRelationshipDialogRef = ref();
</script>

2
io.sc.engine.rule.frontend/src/views/lib/ImportDialog.vue

@ -39,7 +39,7 @@ const fileRef = ref();
const importData = () => {
axios
.post(
Environment.apiContextPath('/api/re/function/import'),
Environment.apiContextPath('/api/re/lib/import'),
{
file: fileRef.value.nativeEl.files[0],
},

248
io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue

@ -4,7 +4,8 @@
ref="gridRef"
:title="$t('re.indicator.grid.title')"
dnd-mode="server"
dense
dense-body
dense-bottom
hide-bottom
db-click-operation="edit"
:config-button="true"
@ -13,11 +14,12 @@
:tree="false"
:fetch-data-url="Environment.apiContextPath('api/re/indicator?lib=' + lib.id)"
:data-url="Environment.apiContextPath('api/re/indicator')"
:pageable="false"
:pageable="true"
:pagination="{ rowsPerPage: 50 }"
:sort-by="['order']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'query',
'refresh',
'separator',
[
{
@ -33,6 +35,7 @@
extend: 'add',
name: 'addInterface',
label: $t('re.indicator.grid.toolbar.addInterface'),
icon: 'bi-link',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'INTERFACE');
},
@ -41,21 +44,13 @@
extend: 'add',
name: 'addIndicator',
label: $t('re.indicator.grid.toolbar.addIndicator'),
icon: 'bi-superscript',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'INDICATOR');
},
},
],
[
{
name: 'cloneGroup',
label: $t('re.lib.grid.toolbar.cloneGroup'),
icon: 'content_copy',
click: undefined,
enableIf: (arg) => {
return !readOnly && arg.selected;
},
},
'clone',
{
extend: 'deepClone',
@ -77,18 +72,33 @@
'separator',
{
extend: 'edit',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args: any) => {
return !readOnly && args.selected;
},
},
{
extend: 'remove',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args: any) => {
return !readOnly && args.selected;
},
},
'separator',
'view',
...templateImportAndExportManager.getToolbarAction(),
'separator',
[
'view',
{
name: 'viewBloodRelationship',
label: $t('re.resources.grid.toolbar.viewBloodRelationship'),
icon: 'hub',
enableIf: (args) => {
return args.selected;
},
click: (args) => {
bloodRelationshipDialogRef.open();
},
},
],
'separator',
'export',
]"
@ -98,35 +108,16 @@
{ colSpan: 3, name: 'name', label: $t('name'), type: 'w-text', clearable: true },
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), align: 'right' },
{ width: 250, name: 'name', label: $t('name') },
{ width: 100, name: 'type', label: $t('type'), format: Formater.enum(Enums.IndicatorType) },
{
width: 200,
name: 'valueType',
label: $t('valueType'),
format: (value, row) => {
if (row.valueTypeVersion) {
return ValueTypeMap[value] + ' (V' + row.valueTypeVersion + ')';
}
if (row.valueType == 'java.math.BigDecimal') {
if (row.valueRoundingMode == 'HALF_UP') {
return ValueTypeMap[value] + '(' + row.valueScale + ')';
} else {
return ValueTypeMap[value] + '(' + row.valueScale + ',' + Formater.enum(Enums.RoundingMode)(row.valueRoundingMode) + ')';
}
}
var result = ValueTypeMap[value];
result = result || row.valueType;
if (result) {
result = result.replace('<', '&lt;');
result = result.replace('>', '&gt;');
}
return result;
width: '100%',
name: 'namec',
label: $t('name'),
format: (value: any, row: any) => {
return row.name;
},
},
{ width: 90, name: 'valueTypeIsList', label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'), format: Formater.checkTag() },
{ width: 100, name: 'defaultValue', label: $t('defaultValue') },
{ width: 60, name: 'type', label: $t('type'), format: EngineEnums.IndicatorType.formater },
...valueTypeManager.getColumns(),
]"
:editor="{
dialog: {
@ -136,84 +127,11 @@
colsNum: 1,
fields: [
{ name: 'lib', label: $t('lib'), type: 'w-text', defaultValue: lib.id, showIf: false },
{ name: 'name', label: $t('name'), type: 'w-text' },
{ name: 'type', label: $t('type'), type: 'w-select', options: Options.enum(Enums.IndicatorType) },
{
name: 'valueType',
label: $t('re.resources.designer.parameter.grid.entity.valueType'),
type: 'w-select',
options: ValueTypeList,
'onUpdate:modelValue': (value) => {
axios.get(Environment.apiContextPath('/api/re/dictionary/getVersionsByCode?code=' + value)).then((response) => {
const data = response.data;
const options = [];
data.forEach((item) => {
options.push({ label: item.key, value: item.value });
});
valueTypeVersionOptionsRef = options;
});
},
},
{
name: 'valueTypeVersion',
label: $t('re.resources.designer.parameter.grid.entity.valueTypeVersion'),
type: 'w-select',
options: valueTypeVersionOptionsRef,
showIf: (arg) => {
const valueType = arg.form.getFieldValue('valueType');
if (valueType) {
if (ValueTypeUtil.isBase(valueType)) {
return false;
} else if (Tools.isUndefinedOrNull(ValueTypeMap[valueType])) {
return false;
} else {
return true;
}
}
return false;
},
},
{
name: 'valueScale',
label: $t('re.resources.designer.parameter.grid.entity.valueScale'),
type: 'w-number',
defaultValue: 6,
showIf: (arg) => {
const valueType = arg.form.getFieldValue('valueType');
const type = arg.form.getFieldValue('type');
if (valueType == 'java.math.BigDecimal' && type === 'INDICATOR') {
return true;
}
return false;
},
},
{
name: 'valueRoundingMode',
label: $t('re.resources.designer.parameter.grid.entity.valueRoundingMode'),
type: 'w-select',
options: Options.enum(Enums.RoundingMode),
defaultValue: 'HALF_UP',
showIf: (arg) => {
const valueType = arg.form.getFieldValue('valueType');
const type = arg.form.getFieldValue('type');
if (valueType == 'java.math.BigDecimal' && type === 'INDICATOR') {
return true;
}
return false;
},
},
{
name: 'valueTypeIsList',
label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'),
type: 'w-checkbox',
defaultValue: false,
},
{
name: 'defaultValue',
label: $t('defaultValue'),
type: 'w-text',
},
{ name: 'type', label: $t('type'), type: 'w-select', options: EngineEnums.IndicatorType.options, showIf: false },
{ name: 'code', label: $t('code'), type: 'w-text' },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-textarea' },
...valueTypeManager.getEditorFields(),
{ name: 'order', label: $t('order'), type: 'w-number' },
],
},
@ -222,50 +140,74 @@
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'id', label: $t('id') },
{ name: 'lib', label: $t('lib') },
{ name: 'type', label: $t('type') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'valueType', label: $t('re.resources.designer.parameter.grid.entity.valueType') },
{ name: 'valueTypeVersion', label: $t('re.resources.designer.parameter.grid.entity.valueTypeVersion') },
{ name: 'valueScale', label: $t('re.resources.designer.parameter.grid.entity.valueScale') },
{ name: 'valueRoundingMode', label: $t('re.resources.designer.parameter.grid.entity.valueRoundingMode') },
{ name: 'valueTypeIsList', label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList') },
{ name: 'defaultValue', label: $t('defaultValue') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
...valueTypeManager.getViewerFields(),
{ name: 'order', label: $t('order') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
v-bind="attrs"
@row-click="
(args) => {
emit('rowClick', args);
}
"
@before-request-data="
(args) => {
emit('beforeRequestData');
}
"
@after-editor-open="
(args: any) => {
valueTypeManager.afterEditorOpen(args);
}
"
></w-grid>
<ImportDialog ref="importDialogRef"></ImportDialog>
<BloodRelationshipDialog ref="bloodRelationshipDialogRef"></BloodRelationshipDialog>
<TemplateImportAndExportDialog
ref="templateImportAndExportDialogRef"
:download-url="Environment.apiContextPath('/api/re/template/downloadIndicatorTemplate/' + props.lib?.id)"
:upload-url="Environment.apiContextPath('/api/re/template/uploadIndicatorTemplate/' + props.lib?.id)"
@after-imported="
() => {
gridRef.refresh();
}
"
></TemplateImportAndExportDialog>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, useAttrs, onMounted } from 'vue';
import { axios, Environment, EnumTools, Formater, Options, DialogManager, Tools } from 'platform-core';
import { ValueTypeUtil } from '@/utils/ValueTypeUtil';
import { IndicatorManager } from '@/views/shared/IndicatorManager';
import { ref, onMounted } from 'vue';
import { axios, Environment, Formater, DialogManager, CorporationAuditorEntityManager, Downloader } from 'platform-core';
import ImportDialog from './ImportDialog.vue';
const attrs = useAttrs();
import BloodRelationshipDialog from '@/views/shared/BloodRelationshipDialog.vue';
import TemplateImportAndExportDialog from '@/views/shared/TemplateImportAndExportDialog.vue';
import { TemplateImportAndExportManager } from '@/views/shared/TemplateImportAndExportManager';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
lib: { type: Object, default: undefined },
readOnly: { type: Boolean, default: false },
});
const emit = defineEmits<{
(e: 'rowClick', args): void;
(e: 'beforeRequestData', args): void;
}>();
const gridRef = ref();
const valueTypeVersionOptionsRef = ref([]);
const bloodRelationshipDialogRef = ref();
const templateImportAndExportDialogRef = ref();
const templateImportAndExportManager = new TemplateImportAndExportManager(templateImportAndExportDialogRef);
const valueTypeManager = new ValueTypeManager();
const refresh = () => {
gridRef?.value?.refresh();
@ -279,20 +221,6 @@ defineExpose({
refresh,
});
const Enums = await EnumTools.fetch([
'io.sc.engine.rule.core.enums.IndicatorType',
'io.sc.engine.rule.core.enums.DeployStatus',
'io.sc.platform.core.enums.RoundingMode',
]);
let ValueTypeMap = {};
let ValueTypeList = [];
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
ValueTypeList = [];
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
ValueTypeList.push({ value: item.key, label: item.value });
});
}
await valueTypeManager.init();
await EngineEnums.init();
</script>

32
io.sc.engine.rule.frontend/src/views/lib/Lib.vue

@ -1,5 +1,5 @@
<template>
<q-splitter :model-value="450" unit="px" separator-style="width: 3px;" class="w-full" style="height: 100%">
<q-splitter :model-value="600" unit="px" separator-style="width: 3px;" class="w-full" style="height: 100%">
<template #before>
<LibGrid
ref="libTreeGridRef"
@ -26,13 +26,13 @@
</template>
<template #after>
<div v-if="showStatus.detail" style="height: 100%" class="pl-1">
<q-tabs v-model="currentSelectedIndicatorOrTestcaseTabNameRef" no-caps inline-label align="left">
<q-tabs v-model="currentSelectedIndicatorOrTestcaseTabNameRef" align="left" no-caps inline-label :breakpoint="0">
<q-tab name="indicator" :label="$t('re.lib.tab.indicator.title')" icon="bi-card-list" />
<q-tab name="testcase" :label="$t('re.lib.tab.testcase.title')" icon="bi-receipt" />
</q-tabs>
<q-tab-panels v-model="currentSelectedIndicatorOrTestcaseTabNameRef" animated style="height: calc(100% - 48px)">
<q-tab-panel name="indicator" class="px-0 py-0" style="height: 100%; padding-left: 0px; padding-right: 0px; padding-bottom: 0px">
<q-splitter :model-value="indicatorSplitterRef" unit="%" separator-style="height: 3px;" horizontal style="height: 100%">
<q-tab-panel name="indicator" class="px-0 py-0" style="height: 100%; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px">
<q-splitter :model-value="60" unit="%" separator-style="height: 3px;" horizontal style="height: 100%">
<template #before>
<IndicatorGrid
ref="indicatorGridRef"
@ -56,7 +56,7 @@
}
"
@before-request-data="
() => {
(args: any) => {
showStatus.validator = false;
showStatus.processor = false;
}
@ -80,11 +80,11 @@
</q-splitter>
</q-tab-panel>
<q-tab-panel name="testcase" class="px-0 pb-0" style="height: 100%; padding-left: 0px; padding-right: 0px; padding-bottom: 0px">
<q-splitter :model-value="testcaseSplitterRef" unit="px" separator-style="height: 3px;" horizontal style="height: 100%">
<q-splitter :model-value="50" unit="%" separator-style="height: 3px;" horizontal style="height: 100%">
<template #before>
<TestCase
<TestcaseGrid
ref="testcaseGridRef"
:lib="currentSelectedLibRef"
:owner="currentSelectedLibRef"
@row-click="
(args) => {
currentSelectedTestCaseRef = args.row;
@ -92,15 +92,15 @@
}
"
@before-request-data="
() => {
(args: any) => {
currentSelectedTestCaseRef = {};
testcaseParameterGridRef?.refresh();
}
"
></TestCase>
></TestcaseGrid>
</template>
<template #after>
<TestCaseParameter ref="testcaseParameterGridRef" :test-case="currentSelectedTestCaseRef"></TestCaseParameter>
<TestcaseParameterGrid ref="testcaseParameterGridRef" :test-case="currentSelectedTestCaseRef"></TestcaseParameterGrid>
</template>
</q-splitter>
</q-tab-panel>
@ -112,22 +112,23 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, reactive } from 'vue';
import { Environment, Tools } from 'platform-core';
import LibGrid from './LibGrid.vue';
import IndicatorGrid from './IndicatorGrid.vue';
import ValidatorGrid from './ValidatorGrid.vue';
import ProcessorGrid from './ProcessorGrid.vue';
import TestCase from './TestCase.vue';
import TestcaseGrid from '@/views/shared/TestcaseGrid.vue';
import TestcaseParameterGrid from '@/views/shared/TestcaseParameterGrid.vue';
//import TestCase from './TestCase.vue';
import TestCaseParameter from './TestCaseParameter.vue';
const indicatorSplitterRef = ref(60); //
const testcaseSplitterRef = ref(300); //
const readOnlyRef = ref(false);
const libTreeGridRef = ref(); //
const indicatorGridRef = ref(); //
const validatorGridRef = ref(); //
const processorGridRef = ref(); //
const testcaseGridRef = ref(); //
const testcaseParameterGridRef = ref(); //
const currentSelectedIndicatorOrTestcaseTabNameRef = ref('indicator');
//
@ -139,5 +140,4 @@ const showStatus = reactive({
const currentSelectedLibRef = ref({});
const currentSelectedIndicatorRef = ref({});
const currentSelectedTestCaseRef = ref({});
const readOnlyRef = ref(false);
</script>

90
io.sc.engine.rule.frontend/src/views/lib/LibGrid.vue

@ -3,12 +3,9 @@
<w-grid
ref="treeGridRef"
:title="$t('re.lib.grid.title')"
dnd-mode="server"
dense-body
hide-bottom
db-click-operation="edit"
:config-button="true"
selection="multiple"
:checkbox-selection="false"
:tree="true"
:tree-icon="
@ -20,8 +17,8 @@
}
}
"
ticked-field="selected"
:data-url="Environment.apiContextPath('/api/re/lib')"
:sort-by="['type', 'namec', '-version']"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
@ -59,7 +56,7 @@
name: 'addLib',
extend: 'addChild',
label: $t('re.lib.grid.toolbar.addLib'),
icon: 'playlist_add',
icon: 'bi-card-list',
enableIf: (arg) => {
return arg.selected && arg.selected.type === 'FOLDER';
},
@ -67,17 +64,7 @@
arg.grid.getEditorForm().setFieldValue('type', 'INDICATOR');
},
},
],
[
{
name: 'cloneGroup',
label: $t('re.lib.grid.toolbar.cloneGroup'),
icon: 'content_copy',
click: undefined,
enableIf: (arg) => {
return arg.selected;
},
},
'separator',
'clone',
{
extend: 'deepClone',
@ -112,7 +99,6 @@
},
},
],
'separator',
'edit',
'remove',
@ -173,6 +159,17 @@
],
'separator',
'view',
{
name: 'viewBloodRelationship',
label: $t('re.resources.grid.toolbar.viewBloodRelationship'),
icon: 'hub',
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: (args) => {
bloodRelationshipDialogRef.open();
},
},
'separator',
{
extend: 'export',
@ -187,34 +184,30 @@
:columns="[
{
width: '100%',
name: 'name',
name: 'namec',
label: $t('name'),
sortable: false,
format: (value: any, row: any) => {
return row.name;
},
},
{ width: 135, name: 'code', label: $t('code') },
{
width: 80,
width: 60,
name: 'type',
label: $t('type'),
sortable: false,
format: (value) => {
if (value !== 'FOLDER') {
return Formater.enum(Enums.LibType)(value);
return EngineEnums.LibType.formater(value);
}
},
},
{ width: 60, name: 'version', label: $t('version') },
{ width: 60, name: 'version', label: $t('version'), align: 'right' },
{
width: 60,
name: 'status',
label: $t('status'),
align: 'center',
sortable: false,
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
format: EngineEnums.DeployStatus.formater,
},
]"
:editor="{
@ -231,8 +224,9 @@
label: $t('code'),
type: 'w-text',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
return type !== 'FOLDER';
return false;
// const type = arg.form.getFieldValue('type');
// return type !== 'FOLDER';
},
},
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
@ -244,19 +238,13 @@
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'id', label: $t('id') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'parent', label: $t('parent') },
{ name: 'type', label: $t('type') },
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -272,16 +260,18 @@
></ImportDialog>
<ImportSampleDialog ref="importSampleDialogRef"></ImportSampleDialog>
<SourceCodeDialog ref="sourceCodeDialogRef"></SourceCodeDialog>
<BloodRelationshipDialog ref="bloodRelationshipDialogRef"></BloodRelationshipDialog>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, useAttrs } from 'vue';
import { axios, Environment, Formater, EnumTools, DialogManager, Downloader } from 'platform-core';
import { axios, Environment, Formater, EnumTools, DialogManager, Downloader, CorporationAuditorEntityManager } from 'platform-core';
import ImportDialog from './ImportDialog.vue';
import ImportSampleDialog from './ImportSampleDialog.vue';
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue';
import SourceCodeDialog from '@/views/shared/SourceCodeDialog.vue';
import BloodRelationshipDialog from '@/views/shared/BloodRelationshipDialog.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const attrs = useAttrs();
@ -289,17 +279,7 @@ const treeGridRef = ref();
const sourceCodeDialogRef = ref();
const importDialogRef = ref();
const importSampleDialogRef = ref();
const bloodRelationshipDialogRef = ref();
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.LibType', 'io.sc.engine.rule.core.enums.DeployStatus']);
let ValueTypeMap = {};
const ValueTypeList = [];
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
ValueTypeList.splice(0, ValueTypeList.length);
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
ValueTypeList.push({ value: item.key, label: item.value });
});
}
await EngineEnums.init();
</script>

15
io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue

@ -2,9 +2,9 @@
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.processor.grid.title')"
:title="$t('re.processor.grid.title')"
dnd-mode="server"
dense
dense-body
hide-bottom
db-click-operation="edit"
:config-button="true"
@ -52,7 +52,6 @@
'export',
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' },
{
width: 120,
name: 'type',
@ -65,7 +64,7 @@
{
width: '100%',
name: 'content',
label: $t('re.resources.designer.processor.grid.entity.content'),
label: $t('re.processor.grid.entity.content'),
sortable: false,
format: (value, row) => {
return processorManager.format(value, row);
@ -98,11 +97,7 @@
{ name: 'enable', label: $t('enable') },
{ name: 'type', label: $t('type') },
...processorManager.getViewerFields(),
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -133,7 +128,7 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { axios, Environment, Formater, Tools } from 'platform-core';
import { axios, Environment, Formater, Tools, CorporationAuditorEntityManager } from 'platform-core';
import { ProcessorManager } from '@/views/shared/ProcessorManager';
import { Processor } from '@/views/shared/Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';

155
io.sc.engine.rule.frontend/src/views/lib/TestCase.vue

@ -1,155 +0,0 @@
<template>
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.testCase.grid.title')"
dense-body
class="px-1"
hide-bottom
:config-button="false"
selection="multiple"
:checkbox-selection="false"
:tree="false"
:fetch-data-url="Environment.apiContextPath('/api/re/testCase/findByOwnerId?ownerId=' + lib.id)"
:data-url="Environment.apiContextPath('/api/re/testCase')"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
'add',
'clone',
{
extend: 'clone',
name: 'deepClone',
label: $t('deepClone'),
icon: 'bi-copy',
click: (arg) => {
axios.post(Environment.apiContextPath('/api/re/testCase/deepClone/' + arg.selected.id), {}, { loading: true }).then((response) => {
gridRef.refresh();
});
},
},
'edit',
'remove',
'separator',
{
name: 'execute',
label: $t('execute'),
icon: 'bi-caret-right',
click: (arg) => {
axios.post(Environment.apiContextPath('/api/re/testCase/executeTestCase/' + arg.selected.id), {}, { loading: true }).then((response) => {
gridRef.refresh();
});
},
},
{
name: 'executeAll',
label: $t('executeAll'),
icon: 'bi-caret-right-fill',
click: (arg) => {
axios.post(Environment.apiContextPath('/api/re/testCase/executeAllLibTestCase/' + lib.id), {}, { loading: true }).then((response) => {
gridRef.refresh();
});
},
},
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: 50, name: 'order', label: $t('order'), showIf: false },
{ width: 100, name: 'id', label: $t('id'), showIf: false },
{
width: 80,
name: 'testResult',
label: $t('re.resources.designer.testCase.grid.entity.testResult'),
align: 'center',
sortable: false,
format: PassOrNotFormater,
},
{ width: 150, name: 'lastTestDate', label: $t('re.resources.designer.testCase.grid.entity.lastTestDate') },
{ width: 200, name: 'name', label: $t('name') },
{ width: '100%', name: 'description', label: $t('description') },
]"
:editor="{
dialog: {
width: '600px',
height: '250px',
},
form: {
colsNum: 1,
fields: [
{ name: 'order', label: $t('order'), type: 'w-text', showIf: false },
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{ name: 'ownerType', label: $t('ownerType'), type: 'w-text', defaultValue: 'LIB', showIf: false },
{ name: 'owner', label: $t('owner'), type: 'w-text', defaultValue: lib.id, showIf: false },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'id', label: $t('id') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
v-bind="attrs"
></w-grid>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { onMounted, ref, useAttrs } from 'vue';
import { axios, Environment, EnumTools, Formater, Options, Tools } from 'platform-core';
import PassOrNotFormater from '@/utils/PassOrNotFormater';
const attrs = useAttrs();
const props = defineProps({
lib: { type: Object, default: undefined },
});
const gridRef = ref();
const refresh = () => {
gridRef?.value?.refresh();
};
onMounted(() => {
gridRef?.value?.refresh();
});
defineExpose({
refresh,
});
const Enums = await EnumTools.fetch([
'io.sc.platform.core.enums.RoundingMode',
'io.sc.engine.rule.core.enums.ParameterType',
'io.sc.engine.rule.core.enums.DeployStatus',
]);
let ValueTypeMap = {};
let ValueTypeList = [];
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
ValueTypeList = [];
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
ValueTypeList.push({ value: item.key, label: item.value });
});
}
</script>

210
io.sc.engine.rule.frontend/src/views/lib/TestCaseParameter.vue

@ -1,210 +0,0 @@
<template>
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.testCaseParameter.grid.title')"
dense-body
class="px-1"
hide-bottom
:config-button="false"
selection="multiple"
:checkbox-selection="false"
:tree="false"
:tree-icon="
(row) => {
if (row.category === 'M') {
return { name: 'folder', color: 'amber' };
} else {
return { name: 'bi-p-circle' };
}
}
"
db-click-operation="edit"
:fetch-data-url="Environment.apiContextPath('/api/re/testCaseParameter/findByTestCase?testCaseId=' + testCase.id)"
:data-url="Environment.apiContextPath('/api/re/testCaseParameter')"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
{
extend: 'edit',
},
'separator',
{
name: 'execute',
label: $t('execute'),
icon: 'bi-caret-right',
click: () => {
axios.post(Environment.apiContextPath('/api/re/testCase/executeTestCase/' + testCase.id), {}, { loading: true }).then(() => {
gridRef?.refresh();
});
},
},
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: 300, name: 'name', label: $t('name') },
{ width: 100, name: 'indicatorType', label: $t('type'), format: Formater.enum(Enums.IndicatorType) },
{
width: 100,
name: 'valueType',
label: $t('re.resources.designer.parameter.grid.entity.valueType'),
format: (value, row) => {
return ValueTypeMap[value];
// if (row.valueTypeVersion) {
// return ValueTypeMap[value] + ' (V' + row.valueTypeVersion + ')';
// }
// if (row.valueType == 'java.math.BigDecimal') {
// if (row.valueRoundingMode == 'HALF_UP') {
// return ValueTypeMap[value] + '(' + row.valueScale + ')';
// } else {
// return ValueTypeMap[value] + '(' + row.valueScale + ',' + Formater.enum(Enums.RoundingMode)(row.valueRoundingMode) + ')';
// }
// }
// var result = ValueTypeMap[value];
// result = result || row.valueType;
// if (result) {
// result = result.replace('<', '&lt;');
// result = result.replace('>', '&gt;');
// }
// return result;
},
},
{ width: 100, name: 'defaultValue', label: $t('defaultValue') },
{ width: 100, name: 'inputValue', label: $t('re.resources.designer.testCaseParameter.grid.entity.inputValue') },
{ width: 100, name: 'expectValue', label: $t('re.resources.designer.testCaseParameter.grid.entity.expectValue') },
{ width: 100, name: 'resultValue', label: $t('re.resources.designer.testCaseParameter.grid.entity.resultValue') },
{ width: 100, name: 'skipCheck', label: $t('re.resources.designer.testCaseParameter.grid.entity.skipCheck') },
{ width: 100, name: 'testResult', label: $t('re.resources.designer.testCaseParameter.grid.entity.testResult'), format: PassOrNotFormater },
]"
:editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{ name: 'testCase', label: $t('testCase'), type: 'w-text', defaultValue: testCase.id, showIf: false },
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{ name: 'source', label: $t('source'), type: 'w-text', showIf: false },
{ name: 'parameterType', label: $t('parameterType'), type: 'w-text', showIf: false },
{ name: 'scoreCardVarType', label: $t('scoreCardVarType'), type: 'w-text', showIf: false },
{ name: 'indicatorType', label: $t('indicatorType'), type: 'w-text', showIf: false },
{
name: 'inputValue',
label: $t('re.resources.designer.testCaseParameter.grid.entity.inputValue'),
type: 'w-code-mirror',
rows: 4,
showIf: (arg) => {
const parameterType = arg.form.getFieldValue('parameterType');
const scoreCardVarType = arg.form.getFieldValue('scoreCardVarType');
const indicatorType = arg.form.getFieldValue('indicatorType');
if (
(!Tools.isUndefinedOrNull(parameterType) && (parameterType === 'IN' || parameterType === 'IN_OPTION' || parameterType === 'INDICATOR')) ||
(!Tools.isUndefinedOrNull(scoreCardVarType) && scoreCardVarType !== 'RESULT') ||
(!Tools.isUndefinedOrNull(indicatorType) && indicatorType === 'INTERFACE')
) {
return true;
}
return false;
},
},
{
name: 'expectValue',
label: $t('re.resources.designer.testCaseParameter.grid.entity.expectValue'),
type: 'w-code-mirror',
rows: 4,
showIf: (arg) => {
const parameterType = arg.form.getFieldValue('parameterType');
const scoreCardVarType = arg.form.getFieldValue('scoreCardVarType');
const indicatorType = arg.form.getFieldValue('indicatorType');
if (
(!Tools.isUndefinedOrNull(parameterType) &&
(parameterType === 'INTERMEDIATE' || parameterType === 'OUT' || parameterType === 'RULE_RESULT' || parameterType === 'SINGLE_RULE_RESULT')) ||
!Tools.isUndefinedOrNull(scoreCardVarType) ||
(!Tools.isUndefinedOrNull(indicatorType) && indicatorType === 'INDICATOR')
) {
return true;
}
return false;
},
},
{
name: 'resultValue',
label: $t('re.resources.designer.testCaseParameter.grid.entity.resultValue'),
type: 'w-code-mirror',
rows: 4,
lang: 'json',
},
{ name: 'skipCheck', label: $t('re.resources.designer.testCaseParameter.grid.entity.skipCheck'), type: 'w-checkbox' },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
@row-click="
(evt, row, index) => {
emit('rowClick', evt, row, index);
}
"
@before-request-data="
() => {
emit('beforeRequestData');
}
"
></w-grid>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { onMounted, ref } from 'vue';
import { axios, Environment, EnumTools, Formater, Options, Tools } from 'platform-core';
import PassOrNotFormater from '@/utils/PassOrNotFormater';
const props = defineProps({
testCase: { type: Object, default: undefined },
});
const emit = defineEmits<{
(e: 'rowClick', evt: Event, row: any, index: number): void;
(e: 'beforeRequestData', requestParams: URLSearchParams | any, callback: any): void;
}>();
const gridRef = ref();
const refresh = () => {
gridRef?.value?.refresh();
};
onMounted(() => {
gridRef?.value?.refresh();
});
defineExpose({
refresh,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.IndicatorType', 'io.sc.platform.core.enums.RoundingMode']);
let ValueTypeMap = {};
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
});
}
</script>

76
io.sc.engine.rule.frontend/src/views/lib/UploadIndicatorTemplateDialog.vue

@ -0,0 +1,76 @@
<template>
<w-dialog ref="dialogRef" :title="$t('upload')" width="600px" :can-maximize="false">
<q-form action="post">
<div class="row py-1">
<div class="col-1"></div>
<div class="col-10">
<q-file ref="fileRef" v-model="modelValue.file" :label="$t('file.single.tip')" dense outlined clearable counter accept=".xlsx">
<template #prepend>
<q-icon name="cloud_upload" />
</template>
</q-file>
</div>
<div class="col-1"></div>
</div>
<div class="row py-1">
<div class="col-1"></div>
<div class="col-10 row justify-center q-gutter-md py-2">
<q-btn icon="bi-database-up" :label="$t('import')" color="primary" no-caps @click="importData"></q-btn>
</div>
<div class="col-1"></div>
</div>
</q-form>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import { axios, Environment } from 'platform-core';
const props = defineProps({
lib: { type: Object, default: undefined },
});
const emit = defineEmits<{
(e: 'afterImported', evt: Event): void;
}>();
const dialogRef = ref();
const modelValue = reactive({
file: undefined,
});
const fileRef = ref();
const importData = () => {
axios
.post(
Environment.apiContextPath('/api/re/template/uploadIndicatorTemplate/' + props.lib?.id),
{
file: fileRef.value.nativeEl.files[0],
},
{
loading: true,
headers: {
'Content-Type': 'multipart/form-data',
},
},
)
.then(() => {
close();
emit('afterImported');
});
};
const open = () => {
modelValue.file = undefined;
dialogRef.value.show();
};
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
});
</script>

25
io.sc.engine.rule.frontend/src/views/lib/ValidatorGrid.vue

@ -2,7 +2,7 @@
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.validator.grid.title')"
:title="$t('re.validator.grid.title')"
dense-body
hide-bottom
:config-button="true"
@ -16,11 +16,11 @@
:toolbar-actions="['refresh', 'separator', 'add', 'edit', 'remove', 'separator', 'view', 'separator', 'export']"
:columns="[
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' },
{ width: 100, name: 'type', label: $t('type'), sortable: false, format: Formater.enum(Enums.ValidatorType) },
{ width: 100, name: 'type', label: $t('type'), sortable: false, format: EngineEnums.ValidatorType.formater },
{
width: 300,
name: 'content',
label: $t('re.resources.designer.validator.grid.entity.content'),
label: $t('re.validator.grid.entity.content'),
sortable: false,
format: (value, row) => {
const type = row.type;
@ -34,7 +34,7 @@
return '';
},
},
{ width: '100%', name: 'tip', label: $t('re.resources.designer.validator.grid.entity.tip'), sortable: false },
{ width: '100%', name: 'tip', label: $t('re.validator.grid.entity.tip'), sortable: false },
]"
:editor="{
dialog: {
@ -120,7 +120,7 @@
},
{
name: 'tip',
label: $t('re.resources.designer.validator.grid.entity.tip'),
label: $t('re.validator.grid.entity.tip'),
type: 'w-text',
},
{ name: 'order', label: $t('order'), type: 'w-number' },
@ -135,19 +135,13 @@
{ name: 'order', label: $t('order') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'description', label: $t('description') },
{ name: 'tip', label: $t('re.resources.designer.validator.grid.entity.tip') },
{ name: 'tip', label: $t('re.validator.grid.entity.tip') },
{ name: 'minInclude', label: $t('isMinValueInclude') },
{ name: 'minValue', label: $t('minValue') },
{ name: 'maxValue', label: $t('maxValue') },
{ name: 'maxInclude', label: $t('isMaxValueInclude') },
{ name: 'pattern', label: $t('RegExp') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -158,7 +152,8 @@
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, EnumTools, Formater, Tools } from 'platform-core';
import { Environment, Formater, Tools, CorporationAuditorEntityManager } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
indicator: { type: Object, default: undefined },
@ -214,5 +209,5 @@ defineExpose({
refresh,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ValidatorType']);
await EngineEnums.init();
</script>

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

@ -1,5 +1,5 @@
<template>
<w-dialog ref="dialogRef" :title="$t('re.resources.import.dialog.title')" width="600px" :can-maximize="false">
<w-dialog ref="dialogRef" :title="$t('re.resources.dialog.import.title')" width="600px" :can-maximize="false">
<q-form action="post">
<div class="row py-1">
<div class="col-1"></div>

6
io.sc.engine.rule.frontend/src/views/resources/ImportSampleDialog.vue

@ -1,5 +1,5 @@
<template>
<w-dialog ref="dialogRef" :title="$t('re.resources.importSample.dialog.title')" width="900px" :can-maximize="false">
<w-dialog ref="dialogRef" :title="$t('re.resources.dialog.importSample.title')" width="900px" :can-maximize="false">
<div class="px-2">
<w-grid
ref="gridRef"
@ -18,7 +18,7 @@
'separator',
{
name: 'import',
label: $t('re.resources.importSample.grid.toolbar.import'),
label: $t('re.resources.dialog.importSample.grid.toolbar.import'),
icon: 'bi-database-up',
enableIf: (arg) => {
return arg.ticked;
@ -30,7 +30,7 @@
close();
emit('afterImported');
});
// DialogManager.confirm($t('re.resources.importSample.grid.toolbar.import.tip'), () => {
// DialogManager.confirm($t('re.resources.dialog.importSample.grid.toolbar.import.tip'), () => {
// });
}

244
io.sc.engine.rule.frontend/src/views/resources/Resources.vue

@ -4,8 +4,6 @@
ref="treeGridRef"
:title="$t('re.resources.grid.title')"
dense-body
hide-bottom
dnd-mode="server"
:config-button="true"
selection="multiple"
:checkbox-selection="false"
@ -23,7 +21,7 @@
"
:data-url="Environment.apiContextPath('/api/re/resource')"
:pageable="false"
:sort-by="['order', '-lastModifyDate']"
:sort-by="['type', 'namec', '-lastModifyDate']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
@ -37,18 +35,18 @@
{
extend: 'addTop',
label: $t('re.resources.grid.toolbar.addTop'),
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'FOLDER');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'FOLDER');
},
},
{
extend: 'addChild',
label: $t('re.resources.grid.toolbar.addChild'),
enableIf: (arg) => {
return arg.selected && arg.selected.type === 'FOLDER';
enableIf: (args) => {
return args.selected && args.selected.type === 'FOLDER';
},
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'FOLDER');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'FOLDER');
},
},
'separator',
@ -57,11 +55,11 @@
name: 'addModel',
label: $t('re.resources.grid.toolbar.addModel'),
icon: 'bi-boxes',
enableIf: (arg) => {
return arg.selected && arg.selected.type === 'FOLDER';
enableIf: (args) => {
return args.selected && args.selected.type === 'FOLDER';
},
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'MODEL');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'MODEL');
},
},
'separator',
@ -71,12 +69,12 @@
name: 'deepClone',
label: $t('deepClone'),
icon: 'bi-copy',
enableIf: (arg) => {
return arg.selected && arg.selected.type !== 'FOLDER';
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: (arg) => {
click: (args) => {
DialogManager.confirm($t('re.resources.grid.toolbar.deepClone.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/resource/deepClone/' + arg.selected.id)).then(() => {
axios.post(Environment.apiContextPath('/api/re/resource/deepClone/' + args.selected.id)).then(() => {
treeGridRef.refresh();
});
});
@ -87,12 +85,12 @@
name: 'deepCloneNew',
label: $t('re.resources.grid.toolbar.deepCloneNew'),
icon: 'bi-copy',
enableIf: (arg) => {
return arg.selected && arg.selected.type !== 'FOLDER';
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: (arg) => {
click: (args) => {
DialogManager.confirm($t('re.resources.grid.toolbar.deepCloneNew.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/resource/deepCloneNew/' + arg.selected.id)).then(() => {
axios.post(Environment.apiContextPath('/api/re/resource/deepCloneNew/' + args.selected.id)).then(() => {
treeGridRef.refresh();
});
});
@ -102,39 +100,15 @@
'edit',
'remove',
'separator',
{
name: 'attachment',
label: $t('attachment'),
icon: 'bi-briefcase-fill',
enableIf: (arg) => {
return arg.selected && arg.selected.type !== 'FOLDER';
},
click: (arg) => {
if (arg.selected) {
foreignValueRef = arg.selected.id;
attachmentDialogRef.open();
}
},
},
/*
{
name: 'compare',
label: $t('compare'),
icon: 'bi-code',
enableIf: (arg) => {
return arg.selecteds && arg.selecteds.length === 2;
},
click: () => {},
},*/
{
name: 'design',
label: $t('re.resources.grid.toolbar.design'),
icon: 'bi-vector-pen',
enableIf: (arg) => {
return arg.selected && arg.selected.type !== 'FOLDER';
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: (arg) => {
designerDialogRef.open(arg.selected);
click: (args) => {
designerDialogRef.open(args.selected);
},
},
[
@ -142,8 +116,8 @@
name: 'deploy',
label: $t('deploy'),
icon: 'bi-balloon',
enableIf: (arg) => {
return arg.selected && arg.selected.type !== 'FOLDER';
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: undefined,
},
@ -151,17 +125,17 @@
name: 'online',
label: $t('re.resources.grid.toolbar.deploy.online'),
icon: 'bi-arrow-up-right-circle',
enableIf: (arg) => {
return arg.selected && arg.selected.type !== 'FOLDER' && arg.selected.status !== 'ON_LINE';
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER' && args.selected.status !== 'ON_LINE';
},
click: (arg) => {
currentSelectedResourceIdRef = arg.selected.id;
click: (args) => {
currentSelectedResourceIdRef = args.selected.id;
axios.get(Environment.apiContextPath('/api/parameter/list/parameter.re.server.deploy.approve.workflow.enable')).then((response) => {
if (response.data === 'true') {
startDeployWorkflowDialogRef.open(arg.selected.id, arg.selected.code, arg.selected.version, 'ON_LINE');
startDeployWorkflowDialogRef.open(args.selected.id, args.selected.code, args.selected.version, 'ON_LINE');
} else {
DialogManager.confirm($t('re.resources.grid.toolbar.deploy.online.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/resource/online/' + arg.selected.id)).then(() => {
axios.post(Environment.apiContextPath('/api/re/resource/online/' + args.selected.id)).then(() => {
axios.get(Environment.apiContextPath('/api/re/resource/' + currentSelectedResourceIdRef)).then((response) => {
treeGridRef.updateLocalData(response.data);
});
@ -175,17 +149,17 @@
name: 'offline',
label: $t('re.resources.grid.toolbar.deploy.offline'),
icon: 'bi-arrow-down-right-circle',
enableIf: (arg) => {
return arg.selected && arg.selected.type !== 'FOLDER' && arg.selected.status === 'ON_LINE';
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER' && args.selected.status === 'ON_LINE';
},
click: (arg) => {
currentSelectedResourceIdRef = arg.selected.id;
click: (args) => {
currentSelectedResourceIdRef = args.selected.id;
axios.get(Environment.apiContextPath('/api/parameter/list/parameter.re.server.deploy.approve.workflow.enable')).then((response) => {
if (response.data === 'true') {
startDeployWorkflowDialogRef.open(arg.selected.id, arg.selected.code, arg.selected.version, 'OFF_LINE');
startDeployWorkflowDialogRef.open(args.selected.id, args.selected.code, args.selected.version, 'OFF_LINE');
} else {
DialogManager.confirm($t('re.resources.grid.toolbar.deploy.offline.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/resource/offline/' + arg.selected.id)).then(() => {
axios.post(Environment.apiContextPath('/api/re/resource/offline/' + args.selected.id)).then(() => {
axios.get(Environment.apiContextPath('/api/re/resource/' + currentSelectedResourceIdRef)).then((response) => {
treeGridRef.updateLocalData(response.data);
});
@ -196,7 +170,52 @@
},
},
],
{
name: 'attachment',
label: $t('attachment'),
icon: 'bi-briefcase-fill',
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: (args) => {
if (args.selected) {
foreignValueRef = args.selected.id;
attachmentDialogRef.open();
}
},
},
{
name: 'compare',
label: $t('compare'),
icon: 'bi-code',
enableIf: (args) => {
return args.tickeds && args.tickeds.length === 2;
},
click: () => {},
},
'separator',
[
'view',
{
name: 'viewBloodRelationship',
label: $t('re.resources.grid.toolbar.viewBloodRelationship'),
icon: 'hub',
enableIf: (args) => {
return args.selected && args.selected.type !== 'FOLDER';
},
click: (args) => {
bloodRelationshipDialogRef.open();
},
},
],
'separator',
[
{
name: 'importOrExport',
label: $t('importOrExport'),
icon: 'file_upload',
click: undefined,
},
{
name: 'import',
label: $t('import'),
@ -213,54 +232,53 @@
importSampleDialogRef.open();
},
},
'separator',
{
extend: 'export',
enableIf: (args) => {
return args.selected;
},
click: (args) => {
Downloader.get(Environment.apiContextPath('/api/re/resource/export/' + args.selected.id), { loading: true });
},
},
],
'separator',
'view',
'separator',
]"
:columns="[
{
extend: 'export',
enableIf: (arg) => {
return arg.selected;
},
click: (arg) => {
Downloader.get(Environment.apiContextPath('/api/re/resource/export/' + arg.selected.id), { loading: true });
width: '100%',
name: 'namec',
label: $t('name'),
format: (value: any, row: any) => {
return row.name;
},
},
]"
:columns="[
{ width: '100%', name: 'name', label: $t('name') },
{
width: 80,
name: 'type',
label: $t('type'),
format: (value, row) => {
if (value !== 'FOLDER') {
return Formater.enum(Enums.ResourceType)(value);
}
},
showIf: false,
format: EngineEnums.ResourceType.formater,
},
{ width: 150, name: 'code', label: $t('code') },
{ width: 60, name: 'version', label: $t('version') },
{ width: 150, name: 'code', label: $t('code'), showIf: false },
{ width: 60, name: 'version', label: $t('version'), align: 'right' },
{
width: 80,
width: 60,
name: 'status',
label: $t('status'),
align: 'center',
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
format: EngineEnums.DeployStatus.formater,
},
{ width: 120, name: 'taskName', label: $t('re.resources.grid.entity.taskName') },
{ width: 100, name: 'taskAssignee', label: $t('re.resources.grid.entity.taskAssignee') },
{ width: 80, name: 'lastModifier', label: $t('lastModifier'), sortable: false },
{ width: 90, name: 'lastModifyDate', label: $t('lastModifyDate'), sortable: false, format: Formater.dateOnly() },
{ width: 120, name: 'taskName', label: $t('re.resources.grid.entity.taskName'), sortable: false },
{ width: 80, name: 'taskAssignee', label: $t('re.resources.grid.entity.taskAssignee'), sortable: false },
{ width: 100, name: 'lastModifier', label: $t('lastModifier') },
{ width: 140, name: 'lastModifyDate', label: $t('lastModifyDate') },
{
width: 60,
width: 80,
name: 'attachmentCount',
label: $t('attachment'),
sortable: false,
align: 'right',
format: (value) => {
if (value > 0) {
return value;
@ -282,8 +300,8 @@
name: 'code',
label: $t('code'),
type: 'w-text',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'MODEL' || type === 'SCORE_CARD';
},
},
@ -297,8 +315,8 @@
lineWrap: true,
lineBreak: false,
toolbar: false,
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'MODEL' || type === 'SCORE_CARD';
},
},
@ -309,25 +327,21 @@
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'parent', label: $t('parent') },
{ name: 'order', label: $t('order') },
{ name: 'type', label: $t('type') },
{ name: 'name', label: $t('name') },
{ name: 'parent', label: $t('parent') },
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'version', label: $t('version') },
{ name: 'status', label: $t('status') },
{ name: 'status', label: $t('status'), format: Formater.none() },
{ name: 'effectiveDate', label: $t('effectiveDate') },
{ name: 'taskName', label: $t('re.resources.grid.entity.taskName') },
{ name: 'taskAssignee', label: $t('re.resources.grid.entity.taskAssignee') },
{ name: 'attachmentCount', label: $t('attachment') },
{ name: 'imports', label: $t('imports') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate') },
{ name: 'order', label: $t('order') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -335,6 +349,10 @@
(args) => {
if (args.row.type !== 'FOLDER') {
designerDialogRef.open(args.row);
// router.push({
// name: 'route.engine.rule.designer',
// params: { id: args.row.id },
// });
}
}
"
@ -359,18 +377,20 @@
}
"
></StartDeployWorkflowDialog>
<BloodRelationshipDialog ref="bloodRelationshipDialogRef"></BloodRelationshipDialog>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref } from 'vue';
import { axios, Environment, DialogManager, Formater, EnumTools, Downloader } from 'platform-core';
import { axios, router, Environment, DialogManager, Formater, EnumTools, Downloader, CorporationAuditorEntityManager } from 'platform-core';
import AttachmentDialog from './AttachmentDialog.vue';
import DesignerDialog from './designer/DesignerDialog.vue';
import ImportSampleDialog from './ImportSampleDialog.vue';
import ImportDialog from './ImportDialog.vue';
import StartDeployWorkflowDialog from './StartDeployWorkflowDialog.vue';
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue';
import BloodRelationshipDialog from '@/views/shared/BloodRelationshipDialog.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const treeGridRef = ref();
const attachmentDialogRef = ref();
@ -379,10 +399,12 @@ const designerDialogRef = ref();
const importDialogRef = ref();
const importSampleDialogRef = ref();
const startDeployWorkflowDialogRef = ref();
const bloodRelationshipDialogRef = ref();
const currentSelectedResourceIdRef = ref();
const afterImported = () => {
treeGridRef.value.refresh();
};
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ResourceType', 'io.sc.engine.rule.core.enums.DeployStatus']);
await EngineEnums.init();
</script>

23
io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue

@ -1,21 +1,15 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('re.resources.designer.processor.dialog.decisionTree.title')"
:can-maximize="false"
:maximized="true"
body-padding="0px 2px 2px 2px"
>
<w-dialog ref="dialogRef" :title="$t('re.processor.dialog.decisionTree.title')" :can-maximize="false" :maximized="true" body-padding="0px 2px 2px 2px">
<w-graph v-model="modelValueRef" :vertex-defines="vertexDefines" :edge-defines="edgeDefines" @save="save"></w-graph>
</w-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, Environment, NotifyManager, Formater, EnumTools, $t } from 'platform-core';
import { $t, axios, Environment, NotifyManager, Formater, EnumTools } from 'platform-core';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { PlaceHolder } from '@/utils/PlaceHolder';
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const dialogRef = ref();
const processorIdRef = ref();
@ -307,7 +301,7 @@ const vertexDefines = [
label: $t('type'),
format: (value, row) => {
if (value !== 'FOLDER') {
return Formater.enum(Enums.ResourceType)(value);
return EngineEnums.ResourceType.formater(value);
}
},
},
@ -317,12 +311,7 @@ const vertexDefines = [
name: 'status',
label: $t('status'),
align: 'center',
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
format: EngineEnums.DeployStatus.formater,
},
],
},
@ -382,5 +371,5 @@ defineExpose({
close,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ResourceType', 'io.sc.engine.rule.core.enums.DeployStatus']);
await EngineEnums.init();
</script>

107
io.sc.engine.rule.frontend/src/views/resources/designer/Designer.vue

@ -1,9 +1,9 @@
<template>
<q-splitter v-model="verticalSplitterRef" unit="px" separator-style="width: 3px;" style="height: 100%">
<q-splitter :model-value="400" unit="px" separator-style="width: 3px;" style="height: 100%">
<template #before>
<div>{{ $route.params }}</div>
<Model
:resource="currentSelectedResourceRef"
:read-only="readOnlyRef"
@row-click="
(args) => {
currentSelectedModelRef = args.row;
@ -53,38 +53,44 @@
@update:model-value="
(value) => {
if (value === 'testcase') {
horizontalSplitterRef = 30;
} else {
horizontalSplitterRef = 50;
} else {
horizontalSplitterRef = 60;
}
}
"
>
<q-tab v-if="statusReactive.isShowParameter" name="parameter" icon="bi-p-square" :label="$t('re.resources.designer.parameter.tab.title')" />
<q-tab v-if="statusReactive.isShowTestCase" name="testcase" icon="bi-receipt" :label="$t('re.resources.designer.testcase.tab.title')" />
<q-tab v-if="statusReactive.isShowParameter" name="parameter" icon="bi-p-square" :label="$t('re.resources.dialog.designer.tab.parameter.title')" />
<q-tab v-if="statusReactive.isShowTestCase" name="testcase" icon="bi-receipt" :label="$t('re.resources.dialog.designer.tab.testcase.title')" />
</q-tabs>
<q-tab-panels v-model="statusReactive.parameterAndTestcaseTab" animated style="height: calc(100% - 48px)">
<q-tab-panel v-if="statusReactive.isShowParameter" name="parameter" style="padding: 0px; height: 100%">
<Parameter
ref="parameterGridRef"
:read-only="readOnlyRef"
:model="currentSelectedModelRef"
:resource="currentSelectedResourceRef"
@row-click="
(evt, row, index) => {
currentSelectedParameterRef = row;
if (row.type === 'IN') {
(args) => {
currentSelectedParameterRef = args.row;
if (args.row.type === 'IN') {
statusReactive.isShowValidator = true;
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false;
validatorGridRef?.refresh();
} else if (row.type === 'IN_OPTION') {
} else if (args.row.type === 'IN_OPTION') {
statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = true;
statusReactive.isShowTestCaseParameter = false;
optionGridRef?.refresh();
} else if (row.type == 'OUT' || row.type == 'INTERMEDIATE' || row.type == 'RULE_RESULT' || row.type == 'SINGLE_RULE_RESULT') {
} else if (
args.row.type == 'OUT' ||
args.row.type == 'INTERMEDIATE' ||
args.row.type == 'RULE_RESULT' ||
args.row.type == 'SINGLE_RULE_RESULT'
) {
statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = true;
statusReactive.isShowOption = false;
@ -109,12 +115,13 @@
></Parameter>
</q-tab-panel>
<q-tab-panel v-if="statusReactive.isShowTestCase" name="testcase" class="px-0 pb-0" style="padding: 0px; height: 100%">
<TestCase
<TestcaseGrid
ref="testCaseGridRef"
:model="currentSelectedModelRef"
:read-only="readOnlyRef"
:owner="currentSelectedResourceRef"
@row-click="
(evt, row, index) => {
currentSelectedTestCaseRef = row;
(args: any) => {
currentSelectedTestCaseRef = args.row;
statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false;
@ -123,27 +130,37 @@
}
"
@before-request-data="
() => {
(args: any) => {
statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false;
}
"
></TestCase>
></TestcaseGrid>
</q-tab-panel>
</q-tab-panels>
</template>
<template #after>
<div style="height: 100%">
<Validator v-if="statusReactive.isShowValidator" ref="validatorGridRef" :parameter="currentSelectedParameterRef"></Validator>
<Processor v-if="statusReactive.isShowProcessor" ref="processorGridRef" :parameter="currentSelectedParameterRef"></Processor>
<Option v-if="statusReactive.isShowOption" ref="optionGridRef" :parameter="currentSelectedParameterRef"></Option>
<TestCaseParameter
<Validator
v-if="statusReactive.isShowValidator"
ref="validatorGridRef"
:read-only="readOnlyRef"
:parameter="currentSelectedParameterRef"
></Validator>
<Processor
v-if="statusReactive.isShowProcessor"
ref="processorGridRef"
:read-only="readOnlyRef"
:parameter="currentSelectedParameterRef"
></Processor>
<Option v-if="statusReactive.isShowOption" ref="optionGridRef" :read-only="readOnlyRef" :parameter="currentSelectedParameterRef"></Option>
<TestcaseParameterGrid
v-if="statusReactive.isShowTestCaseParameter"
ref="testCaseParameterGridRef"
ref="testcaseParameterGridRef"
:test-case="currentSelectedTestCaseRef"
></TestCaseParameter>
></TestcaseParameterGrid>
</div>
</template>
</q-splitter>
@ -151,25 +168,32 @@
</q-splitter>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, nextTick, reactive, onMounted } from 'vue';
import { ref, nextTick, reactive } from 'vue';
import { useRoute } from 'vue-router';
import { axios, Environment, Tools, EnumTools, Options, Formater } from 'platform-core';
import Model from './Model.vue';
import Parameter from './Parameter.vue';
import TestCase from './TestCase.vue';
import TestCaseParameter from './TestCaseParameter.vue';
import Validator from './Validator.vue';
import Processor from './Processor.vue';
import Option from './Option.vue';
import TestcaseGrid from '@/views/shared/TestcaseGrid.vue';
import TestcaseParameterGrid from '@/views/shared/TestcaseParameterGrid.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
opener: { type: Object, default: undefined },
fetchDataUrl: { type: String, default: '' },
dataUrl: { type: String, default: '' },
foreignKey: { type: String, default: '' },
foreignValue: { type: String, default: '' },
});
const route = useRoute();
const currentSelectedResourceId = route.params.id;
const horizontalSplitterRef = ref(50);
const verticalSplitterRef = ref(400);
console.log(route.params);
const dialogRef = ref();
const horizontalSplitterRef = ref(60);
const readOnlyRef = ref();
const currentSelectedResourceRef = ref();
const readOnlyRef = ref(false);
const currentSelectedResourceRef = ref({ id: route.params.id });
const currentSelectedModelRef = ref({});
const currentSelectedParameterRef = ref({});
const currentSelectedTestCaseRef = ref({});
@ -190,9 +214,20 @@ const statusReactive = reactive({
isShowTestCaseParameter: false,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.DeployStatus']);
const open = (resource) => {
currentSelectedResourceRef.value = resource;
readOnlyRef.value = currentSelectedResourceRef.value.status !== 'SKETCH';
dialogRef.value.show();
};
axios.get(Environment.apiContextPath('/api/re/resource/' + currentSelectedResourceId)).then((response) => {
currentSelectedResourceRef.value = response.data;
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
});
await EngineEnums.init();
</script>

46
io.sc.engine.rule.frontend/src/views/resources/designer/DesignerDialog.vue

@ -2,9 +2,9 @@
<w-dialog
ref="dialogRef"
:title="
$t('re.resources.designer.dialog.title', {
$t('re.resources.dialog.designer.title', {
name: currentSelectedResourceRef?.name,
status: Formater.enum(Enums.DeployStatus)(currentSelectedResourceRef?.status),
status: EngineEnums.DeployStatus.i18nMessage(currentSelectedResourceRef?.status),
version: currentSelectedResourceRef?.version,
})
"
@ -12,7 +12,7 @@
:maximized="true"
body-padding="2px 2px 2px 2px"
>
<q-splitter v-model="verticalSplitterRef" unit="px" separator-style="width: 3px;" style="height: 100%">
<q-splitter :model-value="400" unit="px" separator-style="width: 3px;" style="height: 100%">
<template #before>
<Model
:resource="currentSelectedResourceRef"
@ -66,15 +66,20 @@
@update:model-value="
(value) => {
if (value === 'testcase') {
horizontalSplitterRef = 40;
horizontalSplitterRef = 50;
} else {
horizontalSplitterRef = 60;
}
}
"
>
<q-tab v-if="statusReactive.isShowParameter" name="parameter" icon="bi-p-square" :label="$t('re.resources.designer.parameter.tab.title')" />
<q-tab v-if="statusReactive.isShowTestCase" name="testcase" icon="bi-receipt" :label="$t('re.resources.designer.testcase.tab.title')" />
<q-tab
v-if="statusReactive.isShowParameter"
name="parameter"
icon="bi-p-square"
:label="$t('re.resources.dialog.designer.tab.parameter.title')"
/>
<q-tab v-if="statusReactive.isShowTestCase" name="testcase" icon="bi-receipt" :label="$t('re.resources.dialog.designer.tab.testcase.title')" />
</q-tabs>
<q-tab-panels v-model="statusReactive.parameterAndTestcaseTab" animated style="height: calc(100% - 48px)">
<q-tab-panel v-if="statusReactive.isShowParameter" name="parameter" style="padding: 0px; height: 100%">
@ -128,13 +133,13 @@
></Parameter>
</q-tab-panel>
<q-tab-panel v-if="statusReactive.isShowTestCase" name="testcase" class="px-0 pb-0" style="padding: 0px; height: 100%">
<TestCase
<TestcaseGrid
ref="testCaseGridRef"
:read-only="readOnlyRef"
:model="currentSelectedModelRef"
:owner="currentSelectedResourceRef"
@row-click="
(evt, row, index) => {
currentSelectedTestCaseRef = row;
(args: any) => {
currentSelectedTestCaseRef = args.row;
statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false;
@ -143,14 +148,16 @@
}
"
@before-request-data="
() => {
(args: any) => {
statusReactive.isShowValidator = false;
statusReactive.isShowProcessor = false;
statusReactive.isShowOption = false;
statusReactive.isShowTestCaseParameter = false;
// currentSelectedTestCaseRef = {};
// testCaseParameterGridRef?.refresh();
}
"
></TestCase>
></TestcaseGrid>
</q-tab-panel>
</q-tab-panels>
</template>
@ -169,11 +176,11 @@
:parameter="currentSelectedParameterRef"
></Processor>
<Option v-if="statusReactive.isShowOption" ref="optionGridRef" :read-only="readOnlyRef" :parameter="currentSelectedParameterRef"></Option>
<TestCaseParameter
<TestcaseParameterGrid
v-if="statusReactive.isShowTestCaseParameter"
ref="testCaseParameterGridRef"
ref="testcaseParameterGridRef"
:test-case="currentSelectedTestCaseRef"
></TestCaseParameter>
></TestcaseParameterGrid>
</div>
</template>
</q-splitter>
@ -183,14 +190,14 @@
</template>
<script setup lang="ts">
import { ref, nextTick, reactive } from 'vue';
import { Environment, Tools, EnumTools, Options, Formater } from 'platform-core';
import Model from './Model.vue';
import Parameter from './Parameter.vue';
import TestCase from './TestCase.vue';
import TestCaseParameter from './TestCaseParameter.vue';
import Validator from './Validator.vue';
import Processor from './Processor.vue';
import Option from './Option.vue';
import TestcaseGrid from '@/views/shared/TestcaseGrid.vue';
import TestcaseParameterGrid from '@/views/shared/TestcaseParameterGrid.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
opener: { type: Object, default: undefined },
@ -202,7 +209,6 @@ const props = defineProps({
const dialogRef = ref();
const horizontalSplitterRef = ref(60);
const verticalSplitterRef = ref(400);
const readOnlyRef = ref(false);
const currentSelectedResourceRef = ref();
@ -241,5 +247,5 @@ defineExpose({
close,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.DeployStatus']);
await EngineEnums.init();
</script>

32
io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue

@ -1,21 +1,15 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('re.resources.designer.processor.dialog.executionFlow.title')"
:can-maximize="false"
:maximized="true"
body-padding="2px 2px 2px 2px"
>
<w-dialog ref="dialogRef" :title="$t('re.processor.dialog.executionFlow.title')" :can-maximize="false" :maximized="true" body-padding="2px 2px 2px 2px">
<w-graph v-model="modelValueRef" :vertex-defines="vertexDefines" :edge-defines="edgeDefines" @save="save"></w-graph>
</w-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, Environment, NotifyManager, Formater, EnumTools, $t } from 'platform-core';
import { $t, axios, Environment, NotifyManager, Formater, EnumTools } from 'platform-core';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { PlaceHolder } from '@/utils/PlaceHolder';
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const dialogRef = ref();
const processorIdRef = ref();
@ -303,7 +297,7 @@ const vertexDefines = [
label: $t('type'),
format: (value, row) => {
if (value !== 'FOLDER') {
return Formater.enum(Enums.ResourceType)(value);
return EngineEnums.ResourceType.formater(value);
}
},
},
@ -313,12 +307,7 @@ const vertexDefines = [
name: 'status',
label: $t('status'),
align: 'center',
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
format: EngineEnums.DeployStatus.formater,
},
],
},
@ -420,7 +409,7 @@ const vertexDefines = [
label: $t('type'),
format: (value, row) => {
if (value !== 'FOLDER') {
return Formater.enum(Enums.ResourceType)(value);
return EngineEnums.ResourceType.formater(value);
}
},
},
@ -430,12 +419,7 @@ const vertexDefines = [
name: 'status',
label: $t('status'),
align: 'center',
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
format: EngineEnums.DeployStatus.formater,
},
],
},
@ -572,5 +556,5 @@ defineExpose({
close,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ResourceType', 'io.sc.engine.rule.core.enums.DeployStatus']);
await EngineEnums.init();
</script>

40
io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue

@ -2,7 +2,7 @@
<div style="height: 100%">
<w-grid
ref="treeGridRef"
:title="$t('re.resources.designer.model.grid.title')"
:title="$t('re.model.grid.title')"
dnd-mode="server"
dense-body
class="px-1"
@ -27,7 +27,7 @@
'expand',
{
extend: 'addChild',
label: $t('re.resources.designer.model.grid.toolbar.addChild'),
label: $t('re.model.grid.toolbar.addChild'),
enableIf: (arg) => {
return !readOnly;
},
@ -47,7 +47,7 @@
return !readOnly && arg.selected && arg.selected.parent;
},
click: (arg) => {
DialogManager.confirm($t('re.resources.designer.model.grid.toolbar.deepClone.tip'), () => {
DialogManager.confirm($t('re.model.grid.toolbar.deepClone.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/model/deepClone/' + arg.selected.id)).then(() => {
treeGridRef.refresh();
});
@ -70,7 +70,7 @@
'separator',
{
name: 'generateGroovySourceCode',
label: $t('re.resources.designer.model.grid.toolbar.generateGroovySourceCode'),
label: $t('re.model.grid.toolbar.generateGroovySourceCode'),
icon: 'bi-code',
enableIf: (arg) => {
return !readOnly && arg.selected;
@ -83,7 +83,7 @@
},
{
name: 'generateGroovySourceCode4TestCase',
label: $t('re.resources.designer.model.grid.toolbar.generateGroovySourceCode4TestCase'),
label: $t('re.model.grid.toolbar.generateGroovySourceCode4TestCase'),
icon: 'bi-code',
enableIf: (arg) => {
return !readOnly && arg.selected;
@ -108,12 +108,12 @@
name: 'category',
label: $t('category'),
sortable: false,
format: Formater.enum(Enums.ModelCategory),
format: EngineEnums.ModelCategory.formater,
},
{
width: 80,
name: 'executeMode',
label: $t('re.resources.designer.model.grid.entity.executeMode'),
label: $t('re.model.grid.entity.executeMode'),
align: 'center',
sortable: false,
format: (value) => {
@ -140,14 +140,14 @@
name: 'category',
label: $t('category'),
type: 'w-select',
options: Options.enum(Enums.ModelCategory),
options: EngineEnums.ModelCategory.options,
defaultValue: 'OTHER',
},
{
name: 'executeMode',
label: $t('re.resources.designer.model.grid.entity.executeMode'),
label: $t('re.model.grid.entity.executeMode'),
type: 'w-select',
options: Options.enum(Enums.ExecuteMode),
options: EngineEnums.ExecuteMode.options,
defaultValue: 'DOWN_TOP',
},
{ name: 'description', label: $t('description'), type: 'w-text' },
@ -159,22 +159,17 @@
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'id', label: $t('id') },
{ name: 'resource', label: $t('re.model.grid.entity.resource') },
{ name: 'parent', label: $t('parent') },
{ name: 'resource', label: $t('resource') },
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'enable', label: $t('enable') },
{ name: 'category', label: $t('category'), format: Formater.none() },
{ name: 'executeMode', label: $t('re.resources.designer.model.grid.entity.executeMode'), format: Formater.none() },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'executeMode', label: $t('re.model.grid.entity.executeMode'), format: Formater.none() },
{ name: 'order', label: $t('order') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -186,8 +181,9 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, useAttrs } from 'vue';
import { axios, Environment, EnumTools, Formater, Options, DialogManager } from 'platform-core';
import { axios, Environment, Formater, DialogManager, CorporationAuditorEntityManager } from 'platform-core';
import SourceCodeDialog from '@/views/shared/SourceCodeDialog.vue';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const attrs = useAttrs();
@ -199,5 +195,5 @@ const props = defineProps({
const treeGridRef = ref();
const sourceCodeDialogRef = ref();
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ModelCategory', 'io.sc.engine.rule.core.enums.ExecuteMode']);
await EngineEnums.init();
</script>

37
io.sc.engine.rule.frontend/src/views/resources/designer/Option.vue

@ -1,17 +1,20 @@
<template>
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.option.grid.title')"
:title="$t('re.option.grid.title')"
dense-body
class="px-1"
hide-bottom
:config-button="false"
dnd-mode="server"
selection="multiple"
:checkbox-selection="true"
db-click-operation="edit"
:tree="false"
:fetch-data-url="Environment.apiContextPath('/api/re/model/parameter/option/findByParameterId?parameterId=' + parameter.id)"
:data-url="Environment.apiContextPath('/api/re/model/parameter/option')"
:pageable="false"
:sort-by="['order']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
@ -46,16 +49,15 @@
'export',
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' },
{ width: 100, name: 'inputValue', label: $t('re.resources.designer.option.grid.entity.inputValue'), sortable: false },
{ width: 100, name: 'value', label: $t('re.resources.designer.option.grid.entity.value'), sortable: false },
{ width: 400, name: 'title', label: $t('re.resources.designer.option.grid.entity.title'), sortable: false },
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right', showIf: false },
{ width: 100, name: 'inputValue', label: $t('re.option.grid.entity.inputValue'), sortable: false },
{ width: 100, name: 'value', label: $t('re.option.grid.entity.value'), sortable: false },
{ width: 400, name: 'title', label: $t('re.option.grid.entity.title'), sortable: false },
{ width: '100%', name: 'description', label: $t('description'), sortable: false },
]"
:editor="{
dialog: {
width: '600px',
height: '400px',
},
form: {
colsNum: 1,
@ -64,17 +66,17 @@
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{
name: 'inputValue',
label: $t('re.resources.designer.option.grid.entity.inputValue'),
label: $t('re.option.grid.entity.inputValue'),
type: 'w-text',
},
{
name: 'value',
label: $t('re.resources.designer.option.grid.entity.value'),
label: $t('re.option.grid.entity.value'),
type: 'w-text',
},
{
name: 'title',
label: $t('re.resources.designer.option.grid.entity.title'),
label: $t('re.option.grid.entity.title'),
type: 'w-text',
},
{
@ -82,7 +84,6 @@
label: $t('description'),
type: 'w-text',
},
{ name: 'order', label: $t('order'), type: 'w-number' },
],
},
}"
@ -92,17 +93,11 @@
fields: [
{ name: 'id', label: $t('id') },
{ name: 'order', label: $t('order') },
{ name: 'inputValue', label: $t('re.resources.designer.option.grid.entity.inputValue') },
{ name: 'value', label: $t('re.resources.designer.option.grid.entity.value') },
{ name: 'title', label: $t('re.resources.designer.option.grid.entity.title') },
{ name: 'inputValue', label: $t('re.option.grid.entity.inputValue') },
{ name: 'value', label: $t('re.option.grid.entity.value') },
{ name: 'title', label: $t('re.option.grid.entity.title') },
{ name: 'description', label: $t('description') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -111,7 +106,7 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { Environment, Formater } from 'platform-core';
import { Environment, Formater, CorporationAuditorEntityManager } from 'platform-core';
const props = defineProps({
fetchDataUrl: { type: String, default: '' },

394
io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue

@ -2,7 +2,7 @@
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.parameter.grid.title')"
:title="$t('re.parameter.grid.title')"
dnd-mode="server"
dense-body
class="px-1"
@ -30,7 +30,7 @@
{
extend: 'add',
name: 'constant',
label: $t('re.resources.designer.parameter.grid.toolbar.add.constant'),
label: $t('re.parameter.grid.toolbar.add.constant'),
icon: 'bi-tag',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'CONSTANT');
@ -40,7 +40,7 @@
{
extend: 'add',
name: 'in',
label: $t('re.resources.designer.parameter.grid.toolbar.add.in'),
label: $t('re.parameter.grid.toolbar.add.in'),
icon: 'bi-terminal',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'IN');
@ -49,17 +49,16 @@
{
extend: 'add',
name: 'inOption',
label: $t('re.resources.designer.parameter.grid.toolbar.add.inOption'),
label: $t('re.parameter.grid.toolbar.add.inOption'),
icon: 'bi-list-check',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'IN_OPTION');
args.grid.getEditorForm().setFieldValue('valueType', 'java.lang.String');
args.grid.getEditorForm().setFieldValue('valueTypeSelect', 'java.lang.String');
},
},
{
extend: 'add',
name: 'indicator',
label: $t('re.resources.designer.parameter.grid.toolbar.add.indicator'),
label: $t('re.parameter.grid.toolbar.add.indicator'),
icon: 'bi-link',
click: (args) => {
selectIndicatorDialogRef.open();
@ -69,7 +68,7 @@
{
extend: 'add',
name: 'intermediate',
label: $t('re.resources.designer.parameter.grid.toolbar.add.intermediate'),
label: $t('re.parameter.grid.toolbar.add.intermediate'),
icon: 'bi-superscript',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'INTERMEDIATE');
@ -78,7 +77,7 @@
{
extend: 'add',
name: 'out',
label: $t('re.resources.designer.parameter.grid.toolbar.add.out'),
label: $t('re.parameter.grid.toolbar.add.out'),
icon: 'bi-shuffle',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'OUT');
@ -88,7 +87,7 @@
{
extend: 'add',
name: 'ruleResult',
label: $t('re.resources.designer.parameter.grid.toolbar.add.ruleResult'),
label: $t('re.parameter.grid.toolbar.add.ruleResult'),
icon: 'bi-sliders',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'RULE_RESULT');
@ -97,7 +96,7 @@
{
extend: 'add',
name: 'singleRuleResult',
label: $t('re.resources.designer.parameter.grid.toolbar.add.singleRuleResult'),
label: $t('re.parameter.grid.toolbar.add.singleRuleResult'),
icon: 'bi-lightning',
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'SINGLE_RULE_RESULT');
@ -106,37 +105,54 @@
'separator',
{
name: 'importPmml',
label: $t('re.resources.designer.parameter.grid.toolbar.add.importPmml'),
label: $t('re.parameter.grid.toolbar.add.importPmml'),
icon: 'bi-file-earmark-text',
},
],
'separator',
{
extend: 'clone',
enableIf: (args) => {
return !readOnly && args.selected;
[
{
extend: 'clone',
enableIf: (args: any) => {
return args.selected;
},
click: undefined,
},
},
{
extend: 'clone',
name: 'deepClone',
label: $t('deepClone'),
icon: 'bi-copy',
enableIf: (args) => {
return !readOnly && args.selected;
{
extend: 'clone',
enableIf: (args) => {
return !readOnly && args.selected && args.selected.type !== 'INDICATOR';
},
},
click: (args) => {
DialogManager.confirm($t('re.resources.designer.parameter.grid.toolbar.deepClone.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/model/parameter/deepClone/' + args.selected.id)).then(() => {
gridRef.refresh();
{
extend: 'clone',
name: 'deepClone',
label: $t('deepClone'),
icon: 'bi-copy',
enableIf: (args) => {
return !readOnly && args.selected && args.selected.type !== 'INDICATOR';
},
click: (args) => {
DialogManager.confirm($t('re.parameter.grid.toolbar.deepClone.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/model/parameter/deepClone/' + args.selected.id)).then(() => {
gridRef.refresh();
});
});
});
},
},
},
],
{
extend: 'edit',
enableIf: (args) => {
return !readOnly && args.selected;
return !readOnly && args.selected && args.selected.type !== 'INDICATOR';
},
click: (args: any) => {
const row = args.selected;
if (row.type === 'INDICATOR') {
NotifyManager.warn($t('re.parameter.tip.indicatorParameterCanNotEditable'));
return;
}
args._click(args);
},
},
{
@ -148,7 +164,7 @@
'separator',
{
name: 'move',
label: $t('re.resources.designer.parameter.grid.toolbar.move'),
label: $t('re.parameter.grid.toolbar.move'),
icon: 'bi-share-fill',
enableIf: (args) => {
return !readOnly && args.selected;
@ -158,48 +174,23 @@
},
},
'separator',
...templateImportAndExportManager.getToolbarAction(),
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' },
{ width: '100%', name: 'name', label: $t('name'), sortable: false },
{ width: 150, name: 'code', label: $t('code'), sortable: false },
{ width: 110, name: 'type', label: $t('type'), sortable: false, format: Formater.enum(Enums.ParameterType) },
{
width: 180,
name: 'valueType',
label: $t('re.resources.designer.parameter.grid.entity.valueType'),
sortable: false,
format: (value, row) => {
if (row.valueTypeVersion) {
return ValueTypeMap[value] + ' (V' + row.valueTypeVersion + ')';
}
if (row.valueType == 'java.math.BigDecimal') {
if (row.valueRoundingMode == 'HALF_UP') {
return ValueTypeMap[value] + '(' + row.valueScale + ')';
} else {
return ValueTypeMap[value] + '(' + row.valueScale + ',' + Formater.enum(Enums.RoundingMode)(row.valueRoundingMode) + ')';
}
}
var result = ValueTypeMap[value];
result = result || row.valueType;
if (result) {
result = result.replace('<', '&lt;');
result = result.replace('>', '&gt;');
}
return result;
},
},
{ width: '100%', name: 'name', label: $t('name') },
{ width: 130, name: 'code', label: $t('code'), showIf: false },
{ width: 100, name: 'type', label: $t('type'), format: EngineEnums.ParameterType.formater },
{
width: 80,
name: 'valueTypeIsList',
label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'),
sortable: false,
format: Formater.yesNo(),
width: 200,
name: 'indicatorInfo',
label: $t('re.lib.grid.title'),
format: LibManager.getFormater(),
},
{ width: 200, name: 'defaultValue', label: $t('defaultValue'), sortable: false },
...valueTypeManager.getColumns(),
]"
:editor="{
dialog: {
@ -208,165 +199,19 @@
form: {
colsNum: 1,
fields: [
{ name: 'type', label: $t('type'), type: 'w-select', options: Options.enum(Enums.ParameterType), 'onUpdate:modelValue': (value) => {} },
{ name: 'model', label: $t('modelId'), type: 'w-text', defaultValue: model.id, showIf: false },
{ name: 'code', label: $t('code'), type: 'w-text' },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' },
{
name: 'libCode',
label: $t('re.resources.designer.parameter.grid.entity.libCode'),
name: 'type',
label: $t('type'),
type: 'w-select',
options: libCodeOptionsRef,
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'INDICATOR';
},
'onUpdate:modelValue': (value) => {
libVersionOptionsRef = IndicatorManager.getLibVersionMap(value);
},
showIf: false,
options: EngineEnums.ParameterType.options,
'onUpdate:modelValue': (value) => {},
},
{
name: 'libVersion',
label: $t('re.resources.designer.parameter.grid.entity.libVersion'),
type: 'w-select',
options: libVersionOptionsRef,
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'INDICATOR';
},
'onUpdate:modelValue': (value) => {
const libCode = gridRef.getEditorForm().getFieldValue('libCode');
indicatorCodeOptionsRef = IndicatorManager.getIndicatorMap(libCode, value);
},
},
{
name: 'indicatorCode',
label: $t('re.resources.designer.parameter.grid.entity.indicatorCode'),
type: 'w-select',
options: indicatorCodeOptionsRef,
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'INDICATOR';
},
},
{
name: 'valueType',
label: $t('re.resources.designer.parameter.grid.entity.valueType'),
type: 'w-select',
options: ValueTypeList,
defaultValue: 'java.math.BigDecimal',
showIf: (args) => {
const type = args.form.getFieldValue('type');
if (type == 'INDICATOR' || type == 'IN_OPTION' || type == 'RULE_RESULT' || type == 'SINGLE_RULE_RESULT') {
return false;
}
return true;
},
'onUpdate:modelValue': (value) => {
const valueType = gridRef.getEditorForm().getFieldValue('valueType');
axios.get(Environment.apiContextPath('/api/re/dictionary/getVersionsByCode?code=' + valueType)).then((response) => {
const versions = response.data;
const options = [];
versions.forEach((version) => {
options.push({ label: version.key, value: version.value });
});
valueTypeVersionOptionsRef = options;
});
},
},
{
name: 'valueTypeVersion',
label: $t('re.resources.designer.parameter.grid.entity.valueTypeVersion'),
type: 'w-select',
clearable: true,
options: valueTypeVersionOptionsRef,
showIf: (args) => {
const type = args.form.getFieldValue('type');
if (type == 'INDICATOR' || type == 'IN_OPTION' || type == 'RULE_RESULT' || type == 'SINGLE_RULE_RESULT') {
return false;
}
const valueType = args.form.getFieldValue('valueType');
if (valueType) {
if (ValueTypeUtil.isBase(valueType)) {
return false;
} else if (Tools.isUndefinedOrNull(ValueTypeMap[valueType])) {
return false;
} else {
return true;
}
}
return false;
},
},
{
name: 'valueScale',
label: $t('re.resources.designer.parameter.grid.entity.valueScale'),
type: 'w-number',
defaultValue: 6,
showIf: (args) => {
const valueType = args.form.getFieldValue('valueType');
const type = args.form.getFieldValue('type');
if (
valueType == 'java.math.BigDecimal' &&
type != 'INDICATOR' &&
type != 'IN_OPTION' &&
type != 'RULE_RESULT' &&
type != 'SINGLE_RULE_RESULT'
) {
return true;
}
return false;
},
},
{
name: 'valueRoundingMode',
label: $t('re.resources.designer.parameter.grid.entity.valueRoundingMode'),
type: 'w-select',
options: Options.enum(Enums.RoundingMode),
defaultValue: 'HALF_UP',
showIf: (args) => {
const valueType = args.form.getFieldValue('valueType');
const type = args.form.getFieldValue('type');
if (
valueType == 'java.math.BigDecimal' &&
type != 'INDICATOR' &&
type != 'IN_OPTION' &&
type != 'RULE_RESULT' &&
type != 'SINGLE_RULE_RESULT'
) {
return true;
}
return false;
},
},
{
name: 'valueTypeIsList',
label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'),
type: 'w-checkbox',
defaultValue: false,
showIf: (args) => {
const type = args.form.getFieldValue('type');
if (type == 'IN_OPTION' || type == 'INDICATOR' || type == 'RULE_RESULT' || type == 'SINGLE_RULE_RESULT') {
return false;
}
return true;
},
},
{
name: 'defaultValue',
label: $t('defaultValue'),
type: 'w-text',
showIf: (args) => {
const type = args.form.getFieldValue('type');
const valueTypeIsList = args.form.getFieldValue('valueTypeIsList');
if (type == 'INDICATOR' || type == 'RULE_RESULT' || type == 'SINGLE_RULE_RESULT' || valueTypeIsList) {
return false;
}
return true;
},
},
{ name: 'code', label: $t('code'), type: 'w-text' },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' },
...valueTypeManager.getEditorFields(),
{ name: 'order', label: $t('order'), type: 'w-number' },
],
},
@ -375,28 +220,18 @@
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'model', label: $t('re.parameter.grid.entity.model') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'id', label: $t('id') },
{ name: 'model', label: $t('model') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'type', label: $t('type') },
{ name: 'valueType', label: $t('re.resources.designer.parameter.grid.entity.valueType') },
{ name: 'valueTypeVersion', label: $t('re.resources.designer.parameter.grid.entity.valueTypeVersion') },
{ name: 'valueScale', label: $t('re.resources.designer.parameter.grid.entity.valueScale') },
{ name: 'valueRoundingMode', label: $t('re.resources.designer.parameter.grid.entity.valueRoundingMode') },
{ name: 'valueTypeIsList', label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList') },
{ name: 'defaultValue', label: $t('defaultValue') },
{ name: 'libCode', label: $t('re.resources.designer.parameter.grid.entity.libCode') },
{ name: 'libVersion', label: $t('re.resources.designer.parameter.grid.entity.libVersion') },
{ name: 'indicatorCode', label: $t('re.resources.designer.parameter.grid.entity.indicatorCode') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'libCode', label: $t('re.parameter.grid.entity.libCode') },
{ name: 'libVersion', label: $t('re.parameter.grid.entity.libVersion') },
{ name: 'indicatorCode', label: $t('re.parameter.grid.entity.indicatorCode') },
...valueTypeManager.getViewerFields(),
{ name: 'order', label: $t('order') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -411,44 +246,36 @@
}
"
@after-editor-open="
(args) => {
const type = args.grid.getEditorForm().getFieldValue('type');
if (type === 'INDICATOR') {
axios.get(Environment.apiContextPath('/api/re/lib/isc/getLibInformationWrapper')).then((response) => {
IndicatorManager.setWrapper(response.data);
libCodeOptionsRef = IndicatorManager.getLibMap();
libVersionOptionsRef = IndicatorManager.getLibVersionMap(row.libCode);
indicatorCodeOptionsRef = IndicatorManager.getIndicatorMap(row.libCode, row.libVersion);
});
}
const valueType = args.grid.getEditorForm().getFieldValue('valueType');
if (valueType) {
if (!ValueTypeUtil.isBase(valueType) && ValueTypeMap[valueType]) {
axios.get(Environment.apiContextPath('/api/re/dictionary/getVersionsByCode?code=' + valueType)).then((response) => {
const versions = response.data;
const options = [];
versions.forEach((version) => {
options.push({ label: version.key, value: version.value });
});
valueTypeVersionOptionsRef = options;
});
}
}
(args: any) => {
valueTypeManager.afterEditorOpen(args);
}
"
></w-grid>
<SelectIndicatorDialog ref="selectIndicatorDialogRef" :parameter-grid="gridRef" :model-id="model.id"></SelectIndicatorDialog>
<MoveParameterDialog ref="moveParameterDialogRef" :parameter-grid="gridRef" :resource="resource"></MoveParameterDialog>
<TemplateImportAndExportDialog
ref="templateImportAndExportDialogRef"
:download-url="Environment.apiContextPath('/api/re/template/downloadParameterTemplate/' + props.model?.id)"
:upload-url="Environment.apiContextPath('/api/re/template/uploadParameterTemplate/' + props.model?.id)"
@after-imported="
() => {
gridRef.refresh();
}
"
></TemplateImportAndExportDialog>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { onMounted, ref } from 'vue';
import { axios, Environment, EnumTools, DialogManager, Formater, Options, Tools } from 'platform-core';
import { ValueTypeUtil } from '@/utils/ValueTypeUtil';
import { IndicatorManager } from '@/views/shared/IndicatorManager';
import { axios, Environment, DialogManager, NotifyManager, Formater, CorporationAuditorEntityManager } from 'platform-core';
import SelectIndicatorDialog from '@/views/shared/SelectIndicatorDialog.vue';
import MoveParameterDialog from '@/views/shared/MoveParameterDialog.vue';
import TemplateImportAndExportDialog from '@/views/shared/TemplateImportAndExportDialog.vue';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { LibManager } from '@/views/shared/LibManager';
import { TemplateImportAndExportManager } from '@/views/shared/TemplateImportAndExportManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
resource: { type: Object, default: undefined },
@ -462,12 +289,15 @@ const emit = defineEmits<{
}>();
const gridRef = ref();
const valueTypeVersionOptionsRef = ref([]);
const libCodeOptionsRef = ref([]);
const libVersionOptionsRef = ref();
const indicatorCodeOptionsRef = ref();
const selectIndicatorDialogRef = ref();
const moveParameterDialogRef = ref();
const templateImportAndExportDialogRef = ref();
const valueTypeManager = new ValueTypeManager();
const templateImportAndExportManager = new TemplateImportAndExportManager(templateImportAndExportDialogRef);
onMounted(() => {
gridRef.value.refresh();
});
const refresh = () => {
gridRef.value.refresh();
@ -477,25 +307,7 @@ defineExpose({
refresh,
});
const Enums = await EnumTools.fetch([
'io.sc.platform.core.enums.RoundingMode',
'io.sc.engine.rule.core.enums.ParameterType',
'io.sc.engine.rule.core.enums.DeployStatus',
]);
let ValueTypeMap = {};
const ValueTypeList = [];
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
ValueTypeList.splice(0, ValueTypeList.length);
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
ValueTypeList.push({ value: item.key, label: item.value });
});
}
onMounted(() => {
gridRef.value.refresh();
});
await EngineEnums.init();
await valueTypeManager.init();
await LibManager.load();
</script>

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

@ -2,7 +2,7 @@
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.processor.grid.title')"
:title="$t('re.processor.grid.title')"
dnd-mode="server"
dense-body
class="px-1"
@ -99,7 +99,7 @@
{
width: '100%',
name: 'content',
label: $t('re.resources.designer.processor.grid.entity.content'),
label: $t('re.processor.grid.entity.content'),
sortable: false,
title: () => {},
format: (value, row) => {
@ -135,11 +135,7 @@
{ name: 'enable', label: $t('enable') },
{ name: 'type', label: $t('type') },
...processorManager.getViewerFields(),
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -172,7 +168,7 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { $t, axios, Environment, Formater } from 'platform-core';
import { $t, axios, Environment, Formater, CorporationAuditorEntityManager } from 'platform-core';
import { ProcessorManager } from '@/views/shared/ProcessorManager';
import { Processor } from '@/views/shared/Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';

204
io.sc.engine.rule.frontend/src/views/resources/designer/TestCaseParameter.vue

@ -1,204 +0,0 @@
<template>
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.testCaseParameter.grid.title')"
dense-body
class="px-1"
hide-bottom
:config-button="false"
selection="multiple"
:checkbox-selection="false"
:tree="true"
:tree-icon="
(row) => {
if (row.category === 'M') {
return { name: 'folder', color: 'amber' };
} else {
return { name: 'bi-p-circle' };
}
}
"
db-click-operation="edit"
:tree-default-expand-all="true"
:fetch-data-url="Environment.apiContextPath('/api/re/testCaseParameter/findByTestCase?testCaseId=' + testCase.id)"
:data-url="Environment.apiContextPath('/api/re/testCaseParameter')"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
'expand',
'separator',
{
extend: 'edit',
enableIf: (arg) => {
return arg.selected && arg.selected.category !== 'M';
},
},
'separator',
{
name: 'execute',
label: $t('execute'),
icon: 'bi-caret-right',
click: () => {
axios.post(Environment.apiContextPath('/api/re/testCase/executeTestCase/' + testCase.id), {}, { loading: true }).then(() => {
gridRef?.refresh();
});
},
},
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: 350, name: 'name', label: $t('name'), sortable: false },
{ width: 100, name: 'parameterType', label: $t('type'), format: Formater.enum(Enums.ParameterType), sortable: false },
{
width: 90,
name: 'valueType',
label: $t('re.resources.designer.parameter.grid.entity.valueType'),
sortable: false,
format: (value) => {
return ValueTypeMap[value];
},
},
{ width: 90, name: 'defaultValue', label: $t('defaultValue'), sortable: false },
{ width: 90, name: 'inputValue', label: $t('re.resources.designer.testCaseParameter.grid.entity.inputValue'), sortable: false },
{ width: 90, name: 'expectValue', label: $t('re.resources.designer.testCaseParameter.grid.entity.expectValue'), sortable: false },
{ width: 90, name: 'resultValue', label: $t('re.resources.designer.testCaseParameter.grid.entity.resultValue'), sortable: false },
{ width: 80, name: 'skipCheck', label: $t('re.resources.designer.testCaseParameter.grid.entity.skipCheck'), sortable: false },
{
width: 80,
name: 'testResult',
label: $t('re.resources.designer.testCaseParameter.grid.entity.testResult'),
format: PassOrNotFormater,
sortable: false,
},
]"
:editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{ name: 'testCase', label: $t('testCase'), type: 'w-text', defaultValue: testCase.id, showIf: false },
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{ name: 'source', label: $t('source'), type: 'w-text', showIf: false },
{ name: 'parameterType', label: $t('parameterType'), type: 'w-text', showIf: false },
{ name: 'scoreCardVarType', label: $t('scoreCardVarType'), type: 'w-text', showIf: false },
{ name: 'indicatorType', label: $t('indicatorType'), type: 'w-text', showIf: false },
{
name: 'inputValue',
label: $t('re.resources.designer.testCaseParameter.grid.entity.inputValue'),
type: 'w-code-mirror',
toolbar: false,
rows: 10,
showIf: (arg) => {
const parameterType = arg.form.getFieldValue('parameterType');
const scoreCardVarType = arg.form.getFieldValue('scoreCardVarType');
const indicatorType = arg.form.getFieldValue('indicatorType');
if (
(!Tools.isUndefinedOrNull(parameterType) && (parameterType === 'IN' || parameterType === 'IN_OPTION' || parameterType === 'INDICATOR')) ||
(!Tools.isUndefinedOrNull(scoreCardVarType) && scoreCardVarType !== 'RESULT') ||
(!Tools.isUndefinedOrNull(indicatorType) && indicatorType === 'INTERFACE')
) {
return true;
}
return false;
},
},
{
name: 'expectValue',
label: $t('re.resources.designer.testCaseParameter.grid.entity.expectValue'),
type: 'w-code-mirror',
toolbar: false,
rows: 10,
showIf: (arg) => {
const parameterType = arg.form.getFieldValue('parameterType');
const scoreCardVarType = arg.form.getFieldValue('scoreCardVarType');
const indicatorType = arg.form.getFieldValue('indicatorType');
if (
(!Tools.isUndefinedOrNull(parameterType) &&
(parameterType === 'INTERMEDIATE' || parameterType === 'OUT' || parameterType === 'RULE_RESULT' || parameterType === 'SINGLE_RULE_RESULT')) ||
!Tools.isUndefinedOrNull(scoreCardVarType) ||
(!Tools.isUndefinedOrNull(indicatorType) && indicatorType === 'INDICATOR')
) {
return true;
}
return false;
},
},
{
name: 'resultValue',
label: $t('re.resources.designer.testCaseParameter.grid.entity.resultValue'),
type: 'w-code-mirror',
toolbar: false,
rows: 10,
lang: 'json',
},
{ name: 'skipCheck', label: $t('re.resources.designer.testCaseParameter.grid.entity.skipCheck'), type: 'w-checkbox' },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
@row-click="
(evt, row, index) => {
emit('rowClick', evt, row, index);
}
"
@before-request-data="
() => {
emit('beforeRequestData');
}
"
></w-grid>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { onMounted, ref } from 'vue';
import { axios, Environment, EnumTools, Formater, Options, Tools } from 'platform-core';
import PassOrNotFormater from '@/utils/PassOrNotFormater';
const props = defineProps({
testCase: { type: Object, default: undefined },
});
const emit = defineEmits<{
(e: 'rowClick', evt: Event, row: any, index: number): void;
(e: 'beforeRequestData', requestParams: URLSearchParams | any, callback: any): void;
}>();
const gridRef = ref();
const refresh = () => {
gridRef.value.refresh();
};
defineExpose({
refresh,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ParameterType']);
let ValueTypeMap = {};
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
});
}
</script>

201
io.sc.engine.rule.frontend/src/views/resources/designer/Testcase.vue

@ -1,201 +0,0 @@
<template>
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.testCase.grid.title')"
dense-body
class="px-1"
hide-bottom
:config-button="false"
selection="multiple"
:checkbox-selection="false"
:tree="false"
:fetch-data-url="Environment.apiContextPath('/api/re/testCase/findByOwnerId?ownerId=' + model.resource)"
:data-url="Environment.apiContextPath('/api/re/testCase')"
:pageable="false"
:sort-by="['-lastModifyDate']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
'add',
'clone',
{
extend: 'clone',
name: 'deepClone',
label: $t('deepClone'),
icon: 'bi-copy',
click: (arg) => {},
},
'edit',
'remove',
'separator',
[
{
name: 'execute',
label: $t('execute'),
icon: 'bi-caret-right',
click: (arg) => {
axios.post(Environment.apiContextPath('/api/re/testCase/executeTestCase/' + arg.selected.id), {}, { loading: true }).then((response) => {
gridRef.refresh();
});
},
},
{
name: 'executeAll',
label: $t('executeAll'),
icon: 'bi-fast-forward',
click: (arg) => {
axios.post(Environment.apiContextPath('/api/re/testCase/executeAllTestCase/' + model.resource), {}, { loading: true }).then((response) => {
gridRef.refresh();
});
},
},
],
'separator',
[
{
name: 'batchTest',
label: $t('re.resources.designer.testCase.grid.tools.batchTest'),
},
{
name: 'download',
label: $t('re.resources.designer.testCase.grid.tools.download'),
icon: 'bi-box-arrow-in-down',
click: (arg) => {
Downloader.post(Environment.apiContextPath('/api/re/testCase/downloadTemplate/' + model.resource), {}, { loading: true });
},
},
{
name: 'upload',
label: $t('re.resources.designer.testCase.grid.tools.upload'),
icon: 'bi-box-arrow-in-up',
click: (arg) => {
uploadTestCaseDialogRef.open();
},
},
],
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), align: 'right', showIf: false },
{ width: 100, name: 'id', label: $t('id'), showIf: false },
{
width: 60,
name: 'testResult',
label: $t('re.resources.designer.testCase.grid.entity.testResult'),
align: 'center',
format: PassOrNotFormater,
},
{ width: 150, name: 'lastTestDate', label: $t('re.resources.designer.testCase.grid.entity.lastTestDate') },
{ width: 400, name: 'name', label: $t('name') },
{ width: '100%', name: 'description', label: $t('description') },
{ width: 140, name: 'lastModifyDate', label: $t('lastModifyDate') },
]"
:editor="{
dialog: {
width: '600px',
height: '250px',
},
form: {
colsNum: 1,
fields: [
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{ name: 'ownerType', label: $t('ownerType'), type: 'w-text', defaultValue: 'MODEL', showIf: false },
{ name: 'owner', label: $t('owner'), type: 'w-text', defaultValue: model.resource, showIf: false },
{ name: 'ownerId', label: $t('ownerId'), type: 'w-text', defaultValue: model.resource, showIf: false },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' },
{ name: 'order', label: $t('order'), type: 'w-number' },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'order', label: $t('order') },
{ name: 'id', label: $t('id') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
@row-click="
(args) => {
emit('rowClick', args.evt, args.row, args.index);
}
"
@before-request-data="
() => {
emit('beforeRequestData');
}
"
@after-editor-open="
(row) => {
console.log(gridRef.getEditorForm());
}
"
></w-grid>
<UploadTestCaseDialog ref="uploadTestCaseDialogRef"></UploadTestCaseDialog>
</div>
</template>
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { onMounted, ref } from 'vue';
import { axios, Environment, EnumTools, Formater, Options, Tools, Downloader } from 'platform-core';
import PassOrNotFormater from '@/utils/PassOrNotFormater';
import UploadTestCaseDialog from '@/views/shared/UploadTestCaseDialog.vue';
const props = defineProps({
model: { type: Object, default: undefined },
});
const emit = defineEmits<{
(e: 'rowClick', evt: Event, row: any, index: number): void;
(e: 'beforeRequestData', requestParams: URLSearchParams | any, callback: any): void;
}>();
const gridRef = ref();
const uploadTestCaseDialogRef = ref();
const refresh = () => {
gridRef.value.refresh();
};
defineExpose({
refresh,
});
const Enums = await EnumTools.fetch([
'io.sc.platform.core.enums.RoundingMode',
'io.sc.engine.rule.core.enums.ParameterType',
'io.sc.engine.rule.core.enums.DeployStatus',
]);
let ValueTypeMap = {};
let ValueTypeList = [];
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
ValueTypeList = [];
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
ValueTypeList.push({ value: item.key, label: item.value });
});
}
onMounted(() => {
gridRef.value.refresh();
});
</script>

67
io.sc.engine.rule.frontend/src/views/resources/designer/Validator.vue

@ -1,7 +1,7 @@
<template>
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.validator.grid.title')"
:title="$t('re.validator.grid.title')"
draggable="server"
dense-body
class="px-1"
@ -42,11 +42,11 @@
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), sortable: false, align: 'right' },
{ width: 100, name: 'type', label: $t('type'), sortable: false, format: Formater.enum(Enums.ValidatorType) },
{ width: 100, name: 'type', label: $t('type'), sortable: false, format: EngineEnums.ValidatorType.formater },
{
width: 300,
name: 'content',
label: $t('re.resources.designer.validator.grid.entity.content'),
label: $t('re.validator.grid.entity.content'),
sortable: false,
format: (value, row) => {
const type = row.type;
@ -60,7 +60,7 @@
return '';
},
},
{ width: '100%', name: 'tip', label: $t('re.resources.designer.validator.grid.entity.tip'), sortable: false },
{ width: '100%', name: 'tip', label: $t('re.validator.grid.entity.tip'), sortable: false },
]"
:editor="{
dialog: {
@ -139,7 +139,7 @@
},
{
name: 'tip',
label: $t('re.resources.designer.validator.grid.entity.tip'),
label: $t('re.validator.grid.entity.tip'),
type: 'w-text',
},
{ name: 'order', label: $t('order'), type: 'w-number' },
@ -154,19 +154,13 @@
{ name: 'order', label: $t('order') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'description', label: $t('description') },
{ name: 'tip', label: $t('re.resources.designer.validator.grid.entity.tip') },
{ name: 'tip', label: $t('re.validator.grid.entity.tip') },
{ name: 'minInclude', label: $t('isMinValueInclude') },
{ name: 'minValue', label: $t('minValue') },
{ name: 'maxValue', label: $t('maxValue') },
{ name: 'maxInclude', label: $t('isMaxValueInclude') },
{ name: 'pattern', label: $t('RegExp') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@ -175,8 +169,8 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, EnumTools, Formater, Tools } from 'platform-core';
import { $t, Environment, Formater, Tools, CorporationAuditorEntityManager } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
fetchDataUrl: { type: String, default: '' },
@ -189,41 +183,40 @@ const emit = defineEmits<{
(e: 'rowClick', evt: Event, row: any, index: number): void;
(e: 'beforeRequestData', requestParams: URLSearchParams | any, callback: any): void;
}>();
const { t } = useI18n();
const gridRef = ref();
const ValueTypeAndValidatorTypeMapping = {
'java.lang.Boolean': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'TRUE', label: t('io.sc.engine.rule.core.enums.ValidatorType.TRUE') },
{ value: 'FALSE', label: t('io.sc.engine.rule.core.enums.ValidatorType.FALSE') },
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'TRUE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.TRUE') },
{ value: 'FALSE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.FALSE') },
],
'java.lang.Long': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'INTEGER_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.INTEGER_RANGE') },
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'INTEGER_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.INTEGER_RANGE') },
],
'java.math.BigDecimal': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DECIMAL_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.DECIMAL_RANGE') },
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DECIMAL_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.DECIMAL_RANGE') },
],
'java.lang.String': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'LENGTH_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE') },
{ value: 'EMAIL', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMAIL') },
{ value: 'PATTERN', label: t('io.sc.engine.rule.core.enums.ValidatorType.PATTERN') },
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'LENGTH_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE') },
{ value: 'EMAIL', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMAIL') },
{ value: 'PATTERN', label: $t('io.sc.engine.rule.core.enums.ValidatorType.PATTERN') },
],
'java.util.Date': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DATE_RANGE', label: t('io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE') },
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'DATE_RANGE', label: $t('io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE') },
],
'java.lang.Object': [
{ value: 'NOT_EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
{ value: 'NOT_EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.NOT_EMPTY') },
{ value: 'EMPTY', label: $t('io.sc.engine.rule.core.enums.ValidatorType.EMPTY') },
],
};
@ -239,5 +232,5 @@ defineExpose({
refresh,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ValidatorType']);
await EngineEnums.init();
</script>

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

@ -1,12 +1,12 @@
import { axios, Tools } from 'platform-core';
class AutoCompletionManager {
parameters: any[];
valueTypes: any[];
parameters: any;
valueTypes: any;
constructor() {
this.parameters = [];
this.valueTypes = [];
this.parameters = {};
this.valueTypes = {};
}
public setParameters(parameters: any) {
@ -17,9 +17,11 @@ class AutoCompletionManager {
}
public getOptions(path: string): any {
// 如果没有路径, 返回参数列表
if (!path) {
return this.getParameterOptions();
}
// 以 . 结束表示对象属性
if (path.endsWith('.')) {
path = path.substring(0, path.length - 1);
}
@ -27,7 +29,7 @@ class AutoCompletionManager {
if (!names) {
return this.getParameterOptions();
}
//参数
//查找参数
const parameter = this.findParmeter(names[0]);
if (!parameter) {
return null;
@ -42,48 +44,27 @@ class AutoCompletionManager {
while (index < names.length) {
valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index++]);
}
const options: any[] = [];
for (const property of valueType.properties) {
const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion);
if (!propertyValueType) {
continue;
}
const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name;
if (property.valueType.startsWith('java.util.List<')) {
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}[0]', info: info });
} else {
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info });
const option = this.getOptionItem(property);
if (option) {
options.push(option);
}
}
return options;
}
public findParmeter(parameterName: string) {
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
return parameter;
}
}
return null;
return this.parameters[parameterName];
}
public findValueType(valueTypeString: string, valueTypeVersion: number): any {
if (valueTypeString.startsWith('java.util.List<')) {
valueTypeString = valueTypeString.substring(15, valueTypeString.length - 1);
}
for (const valueType of this.valueTypes) {
if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) {
return valueType;
}
}
return null;
public findValueType(valueType: string, valueTypeVersion: number): any {
return this.valueTypes[this.getValueTypeAndVersionKey(valueType, valueTypeVersion)];
}
public findValueTypeByProperty(valueTypeString: string, valueTypeVersion: number, propertyName: string) {
const valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType) {
if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
return null;
}
for (const property of valueType.properties) {
@ -91,46 +72,32 @@ class AutoCompletionManager {
return this.findValueType(property.valueType, property.valueTypeVersion);
}
}
return null;
}
public getParameterOptions(): any {
const options: any[] = [];
for (const parameter of this.parameters) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
if (valueType) {
const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info });
Object.values(this.parameters).forEach((parameter: any) => {
const option = this.getOptionItem(parameter);
if (option) {
options.push(option);
}
}
});
return options;
}
public getPropertyOptions(parameterName: string): any {
let parameterType: any = undefined;
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
parameterType = parameter.valueType;
}
}
if (!parameterType) {
return null;
}
for (const type of this.valueTypes) {
if (type.code === parameterType) {
parameterType = type;
public getOptionItem(parameter: any) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
if (!Tools.isNill(valueType)) {
const version = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
const info = parameter.valueTypeIsList ? 'List<' + version + '>' : version;
if (parameter.valueTypeIsList) {
return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}[0]', info: info };
} else {
return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info };
}
}
if (!parameterType) {
return null;
}
if (parameterType.properties && parameterType.properties.length > 0) {
const options: any = [];
parameterType.properties.forEach((property) => {
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', detail: property.valueType });
});
return options;
}
return null;
}
public autoCompletionParameters(to: any, matchedText?: any): any {
@ -143,7 +110,6 @@ class AutoCompletionManager {
public autoCompletionProperties(to: any, matchedText?: any): any {
const matchedTextReverse = Tools.reverseString(matchedText);
console.log(matchedTextReverse);
const regReverse = /(\.(\]\S*(.+?)\S*\[)?\}(.+?)\{\$)+/g; //匹配 '.]xxx[}yyy{$' 模式
//const regReverse = /(\.\}(.+?)\{\$)+/g; //匹配 '.}]xxx[yyy{$' 模式
const matcheds: any = matchedTextReverse.match(regReverse);
@ -166,6 +132,13 @@ class AutoCompletionManager {
};
}
private getValueTypeAndVersionKey(valueType: string, valueTypeVersion: number): string {
if (Tools.isNill(valueType)) {
return '';
}
return valueType + (Tools.isNill(valueTypeVersion) ? '' : ':' + valueTypeVersion);
}
public doAutoCompletion(context: any): any {
const beforeMatched = context.matchBefore(/(.+?)/g);
if (Tools.isUndefinedOrNull(beforeMatched)) {
@ -185,8 +158,8 @@ class AutoCompletionManager {
public load(url: string) {
axios.get(url).then((response) => {
this.setParameters(response.data.parameters);
this.setValueTypes(response.data.valueTypes);
this.setParameters(response.data?.parameters);
this.setValueTypes(response.data?.valueTypes);
});
}

23
io.sc.engine.rule.frontend/src/views/shared/BloodRelationshipDialog.vue

@ -0,0 +1,23 @@
<template>
<w-dialog ref="dialogRef" width="600px" height="500px" :can-maximize="false">
<div class="pt-2" style="height: 100%"></div>
</w-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const dialogRef = ref();
const open = () => {
dialogRef.value.show();
};
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
});
</script>

28
io.sc.engine.rule.frontend/src/views/shared/LibManager.ts

@ -0,0 +1,28 @@
import { axios, Environment, Tools } from 'platform-core';
class LibManager {
private static LIB_MAP = new Map();
private static FORMATER = (value: any, row: any) => {
const key = row.libCode + (Tools.isNill(row.libVersion) ? '' : ':' + row.libVersion);
return LibManager.LIB_MAP.get(key);
};
public static getFormater() {
return LibManager.FORMATER;
}
public static async load() {
LibManager.LIB_MAP.clear();
const response = await axios.get(Environment.apiContextPath('/api/re/lib'));
if (response && response.data && response.data.content) {
for (const item of response.data.content) {
if (item.type !== 'FOLDER') {
const key = item.code + (Tools.isNill(item.version) ? '' : ':' + item.version);
LibManager.LIB_MAP.set(key, item.name + '(V' + item.version + ')');
}
}
}
}
}
export { LibManager };

11
io.sc.engine.rule.frontend/src/views/shared/MoveParameterDialog.vue

@ -1,9 +1,11 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('re.parameter.dialog.moveParameter.title')"
width="600px"
height="500px"
:can-maximize="false"
body-padding="2px 2px"
:buttons="[
{
label: $t('confirm'),
@ -53,12 +55,12 @@
name: 'category',
label: $t('category'),
sortable: false,
format: Formater.enum(Enums.ModelCategory),
format: EngineEnums.ModelCategory.formater,
},
{
width: 80,
name: 'executeMode',
label: $t('re.resources.designer.model.grid.entity.executeMode'),
label: $t('re.model.grid.entity.executeMode'),
align: 'center',
sortable: false,
format: (value) => {
@ -79,7 +81,8 @@
<script setup lang="ts">
import 'tailwindcss/utilities.css';
import { ref } from 'vue';
import { axios, Environment, EnumTools, Formater } from 'platform-core';
import { axios, Environment } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
parameterGrid: { type: Object, default: undefined },
@ -102,5 +105,5 @@ defineExpose({
close,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.ModelCategory', 'io.sc.engine.rule.core.enums.ExecuteMode']);
await EngineEnums.init();
</script>

2
io.sc.engine.rule.frontend/src/views/shared/ObjectPropertiesMatcherDialog.vue

@ -65,7 +65,7 @@ const open = (objectProperties) => {
let url = '';
if (props.targetType === Processor.PARAMETER) {
dialogTitleRef.value = $t('re.resources.designer.parameter.grid.title');
dialogTitleRef.value = $t('re.parameter.grid.title');
url = Environment.apiContextPath('/api/re/model/parameter/findParametersByParameterId?parameterId=' + props.target.id);
} else if (props.targetType === Processor.INDICATOR) {
dialogTitleRef.value = $t('re.indicator.grid.title');

4
io.sc.engine.rule.frontend/src/views/shared/Processor.ts

@ -64,9 +64,9 @@ abstract class Processor {
*/
initAutoCompletionManager() {
if (this.targetType === Processor.PARAMETER || this.targetType === Processor.SCORE_CARD) {
this.autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + this.context.target.id));
this.autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByParameterId/' + this.context.target.id));
} else if (this.targetType === Processor.INDICATOR) {
this.autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + this.context.target.id));
this.autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByIndicatorId/' + this.context.target.id));
}
}

14
io.sc.engine.rule.frontend/src/views/shared/ResourceDeployStatusTag.vue

@ -1,14 +0,0 @@
<template>
<div>
<q-chip v-if="status === 'HISTORY'" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.HISTORY')" dense></q-chip>
<q-chip v-if="status === 'ON_LINE'" color="green" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.ON_LINE')" dense></q-chip>
<q-chip v-if="status === 'OFF_LINE'" color="brown" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.OFF_LINE')" dense></q-chip>
<q-chip v-if="status === 'SKETCH'" color="blue-grey" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.SKETCH')" dense></q-chip>
<q-chip v-if="status === 'APPROVING'" color="orange" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.APPROVING')" dense></q-chip>
</div>
</template>
<script setup lang="ts">
const props = defineProps({
status: { type: String, default: '' },
});
</script>

97
io.sc.engine.rule.frontend/src/views/shared/SelectIndicatorDialog.vue

@ -1,7 +1,7 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('re.workflow.dialog.title')"
:title="$t('re.indicator.grid.title')"
width="1248px"
height="500px"
:can-maximize="false"
@ -9,7 +9,7 @@
{
label: $t('confirm'),
noCaps: true,
click: () => {
click: (args: any) => {
axios
.post(Environment.apiContextPath('/api/re/model/parameter/addIndicators'), {
modelId: modelId,
@ -61,28 +61,37 @@
label: $t('type'),
format: (value) => {
if (value !== 'FOLDER') {
return Formater.enum(Enums.LibType)(value);
return EngineEnums.LibType.formater(value);
}
},
},
{ width: 60, name: 'version', label: $t('version') },
{ width: 60, name: 'version', label: $t('version'), align: 'right' },
{
width: 80,
name: 'status',
label: $t('status'),
align: 'center',
format: (value, row) => {
return {
componentType: ResourceDeployStatusTag,
attrs: { status: value },
};
},
format: EngineEnums.DeployStatus.formater,
},
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'parent', label: $t('parent') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
@row-click="
(evt, row, index) => {
if (row.type === 'INDICATOR') {
currentSelectedLibIdRef = row.id;
(args: any) => {
if (args.row.type === 'INDICATOR') {
currentSelectedLibIdRef = args.row.id;
} else {
currentSelectedLibIdRef = null;
}
@ -90,7 +99,7 @@
}
"
@before-request-data="
() => {
(args: any) => {
currentSelectedLibIdRef = null;
indicatorGridRef?.refresh();
}
@ -102,7 +111,7 @@
<div class="pl-1" style="height: 100%">
<w-grid
ref="indicatorGridRef"
:title="$t('re.lib.grid.title')"
:title="$t('re.indicator.grid.title')"
dense-body
hide-bottom
:config-button="true"
@ -114,26 +123,32 @@
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'view']"
:query-form-cols-num="2"
:query-form-cols-num="6"
:query-form-fields="[
{ name: 'code', label: $t('code'), type: 'w-text', clearable: true },
{ name: 'name', label: $t('name'), type: 'w-text', clearable: true },
{ colSpan: 2, name: 'code', label: $t('code'), type: 'w-text', clearable: true },
{ colSpan: 3, name: 'name', label: $t('name'), type: 'w-text', clearable: true },
]"
:columns="[
{ width: 60, name: 'order', label: $t('order'), align: 'right' },
{ width: 250, name: 'name', label: $t('name') },
{ width: 100, name: 'type', label: $t('type'), format: Formater.enum(Enums.IndicatorType) },
{
width: 100,
name: 'valueType',
label: $t('valueType'),
format: (value, row) => {
return ValueTypeMap[value];
},
},
{ width: 80, name: 'valueTypeIsList', label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'), format: Formater.checkTag() },
{ width: '100%', name: 'defaultValue', label: $t('defaultValue') },
{ width: 60, name: 'type', label: $t('type'), format: EngineEnums.IndicatorType.formater },
...valueTypeManager.getColumns(),
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'lib', label: $t('lib') },
{ name: 'type', label: $t('type'), format: Formater.none() },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
...valueTypeManager.getViewerFields(),
{ name: 'order', label: $t('order') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
}"
></w-grid>
</div>
</template>
@ -142,8 +157,9 @@
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, Environment, EnumTools, Formater } from 'platform-core';
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue';
import { axios, Environment, EnumTools, Formater, CorporationAuditorEntityManager } from 'platform-core';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const props = defineProps({
parameterGrid: { type: Object, default: undefined },
@ -152,8 +168,9 @@ const props = defineProps({
const dialogRef = ref();
const libTreeGridRef = ref();
const currentSelectedLibIdRef = ref();
const indicatorGridRef = ref();
const currentSelectedLibIdRef = ref();
const valueTypeManager = new ValueTypeManager();
const open = () => {
dialogRef.value.show();
@ -169,16 +186,6 @@ defineExpose({
close,
});
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.LibType', 'io.sc.engine.rule.core.enums.DeployStatus']);
let ValueTypeMap = {};
let ValueTypeList = [];
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap'));
if (response && response.data) {
ValueTypeMap = {};
ValueTypeList = [];
response.data.forEach((item) => {
ValueTypeMap[item.key] = item.value;
ValueTypeList.push({ value: item.key, label: item.value });
});
}
await valueTypeManager.init();
await EngineEnums.init();
</script>

472
io.sc.engine.rule.frontend/src/views/shared/SimulatorDialog.vue

@ -0,0 +1,472 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('re.indicator.grid.title')"
width="1248px"
height="500px"
:can-maximize="true"
:buttons="[
{
label: $t('confirm'),
noCaps: true,
click: (args: any) => {
axios
.post(Environment.apiContextPath('/api/re/model/parameter/addIndicators'), {
modelId: modelId,
indicators: indicatorGridRef.getTickedRows(),
})
.then((response) => {
close();
parameterGrid.refresh();
});
},
},
]"
>
<q-splitter :model-value="70" unit="%" separator-style="width: 3px;" class="w-full" style="height: 100%">
<template #before>
<div class="pr-1" style="width: 100%; height: 100%">
<w-echarts
:option="{
tooltip: {
trigger: 'item',
triggerOn: 'mousemove',
},
series: [
{
type: 'tree',
data: [data],
top: '1%',
left: '15%',
bottom: '1%',
right: '7%',
symbolSize: 7,
orient: 'RL',
label: {
position: 'right',
verticalAlign: 'middle',
align: 'left',
},
leaves: {
label: {
position: 'left',
verticalAlign: 'middle',
align: 'right',
},
},
emphasis: {
focus: 'descendant',
},
expandAndCollapse: true,
animationDuration: 550,
animationDurationUpdate: 750,
},
],
}"
></w-echarts>
</div>
</template>
<template #after>
<div class="pl-1" style="height: 100%"></div>
</template>
</q-splitter>
</w-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, Environment, EnumTools, CorporationAuditorEntityManager } from 'platform-core';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
const dialogRef = ref();
const open = (sourceCode: string) => {
dialogRef.value.show();
};
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
});
const data = {
name: 'flare',
children: [
{
name: 'analytics',
children: [
{
name: 'cluster',
children: [
{ name: 'AgglomerativeCluster', value: 3938 },
{ name: 'CommunityStructure', value: 3812 },
{ name: 'HierarchicalCluster', value: 6714 },
{ name: 'MergeEdge', value: 743 },
],
},
{
name: 'graph',
children: [
{ name: 'BetweennessCentrality', value: 3534 },
{ name: 'LinkDistance', value: 5731 },
{ name: 'MaxFlowMinCut', value: 7840 },
{ name: 'ShortestPaths', value: 5914 },
{ name: 'SpanningTree', value: 3416 },
],
},
{
name: 'optimization',
children: [{ name: 'AspectRatioBanker', value: 7074 }],
},
],
},
{
name: 'animate',
children: [
{ name: 'Easing', value: 17010 },
{ name: 'FunctionSequence', value: 5842 },
{
name: 'interpolate',
children: [
{ name: 'ArrayInterpolator', value: 1983 },
{ name: 'ColorInterpolator', value: 2047 },
{ name: 'DateInterpolator', value: 1375 },
{ name: 'Interpolator', value: 8746 },
{ name: 'MatrixInterpolator', value: 2202 },
{ name: 'NumberInterpolator', value: 1382 },
{ name: 'ObjectInterpolator', value: 1629 },
{ name: 'PointInterpolator', value: 1675 },
{ name: 'RectangleInterpolator', value: 2042 },
],
},
{ name: 'ISchedulable', value: 1041 },
{ name: 'Parallel', value: 5176 },
{ name: 'Pause', value: 449 },
{ name: 'Scheduler', value: 5593 },
{ name: 'Sequence', value: 5534 },
{ name: 'Transition', value: 9201 },
{ name: 'Transitioner', value: 19975 },
{ name: 'TransitionEvent', value: 1116 },
{ name: 'Tween', value: 6006 },
],
},
{
name: 'data',
children: [
{
name: 'converters',
children: [
{ name: 'Converters', value: 721 },
{ name: 'DelimitedTextConverter', value: 4294 },
{ name: 'GraphMLConverter', value: 9800 },
{ name: 'IDataConverter', value: 1314 },
{ name: 'JSONConverter', value: 2220 },
],
},
{ name: 'DataField', value: 1759 },
{ name: 'DataSchema', value: 2165 },
{ name: 'DataSet', value: 586 },
{ name: 'DataSource', value: 3331 },
{ name: 'DataTable', value: 772 },
{ name: 'DataUtil', value: 3322 },
],
},
{
name: 'display',
children: [
{ name: 'DirtySprite', value: 8833 },
{ name: 'LineSprite', value: 1732 },
{ name: 'RectSprite', value: 3623 },
{ name: 'TextSprite', value: 10066 },
],
},
{
name: 'flex',
children: [{ name: 'FlareVis', value: 4116 }],
},
{
name: 'physics',
children: [
{ name: 'DragForce', value: 1082 },
{ name: 'GravityForce', value: 1336 },
{ name: 'IForce', value: 319 },
{ name: 'NBodyForce', value: 10498 },
{ name: 'Particle', value: 2822 },
{ name: 'Simulation', value: 9983 },
{ name: 'Spring', value: 2213 },
{ name: 'SpringForce', value: 1681 },
],
},
{
name: 'query',
children: [
{ name: 'AggregateExpression', value: 1616 },
{ name: 'And', value: 1027 },
{ name: 'Arithmetic', value: 3891 },
{ name: 'Average', value: 891 },
{ name: 'BinaryExpression', value: 2893 },
{ name: 'Comparison', value: 5103 },
{ name: 'CompositeExpression', value: 3677 },
{ name: 'Count', value: 781 },
{ name: 'DateUtil', value: 4141 },
{ name: 'Distinct', value: 933 },
{ name: 'Expression', value: 5130 },
{ name: 'ExpressionIterator', value: 3617 },
{ name: 'Fn', value: 3240 },
{ name: 'If', value: 2732 },
{ name: 'IsA', value: 2039 },
{ name: 'Literal', value: 1214 },
{ name: 'Match', value: 3748 },
{ name: 'Maximum', value: 843 },
{
name: 'methods',
children: [
{ name: 'add', value: 593 },
{ name: 'and', value: 330 },
{ name: 'average', value: 287 },
{ name: 'count', value: 277 },
{ name: 'distinct', value: 292 },
{ name: 'div', value: 595 },
{ name: 'eq', value: 594 },
{ name: 'fn', value: 460 },
{ name: 'gt', value: 603 },
{ name: 'gte', value: 625 },
{ name: 'iff', value: 748 },
{ name: 'isa', value: 461 },
{ name: 'lt', value: 597 },
{ name: 'lte', value: 619 },
{ name: 'max', value: 283 },
{ name: 'min', value: 283 },
{ name: 'mod', value: 591 },
{ name: 'mul', value: 603 },
{ name: 'neq', value: 599 },
{ name: 'not', value: 386 },
{ name: 'or', value: 323 },
{ name: 'orderby', value: 307 },
{ name: 'range', value: 772 },
{ name: 'select', value: 296 },
{ name: 'stddev', value: 363 },
{ name: 'sub', value: 600 },
{ name: 'sum', value: 280 },
{ name: 'update', value: 307 },
{ name: 'variance', value: 335 },
{ name: 'where', value: 299 },
{ name: 'xor', value: 354 },
{ name: '-', value: 264 },
],
},
{ name: 'Minimum', value: 843 },
{ name: 'Not', value: 1554 },
{ name: 'Or', value: 970 },
{ name: 'Query', value: 13896 },
{ name: 'Range', value: 1594 },
{ name: 'StringUtil', value: 4130 },
{ name: 'Sum', value: 791 },
{ name: 'Variable', value: 1124 },
{ name: 'Variance', value: 1876 },
{ name: 'Xor', value: 1101 },
],
},
{
name: 'scale',
children: [
{ name: 'IScaleMap', value: 2105 },
{ name: 'LinearScale', value: 1316 },
{ name: 'LogScale', value: 3151 },
{ name: 'OrdinalScale', value: 3770 },
{ name: 'QuantileScale', value: 2435 },
{ name: 'QuantitativeScale', value: 4839 },
{ name: 'RootScale', value: 1756 },
{ name: 'Scale', value: 4268 },
{ name: 'ScaleType', value: 1821 },
{ name: 'TimeScale', value: 5833 },
],
},
{
name: 'util',
children: [
{ name: 'Arrays', value: 8258 },
{ name: 'Colors', value: 10001 },
{ name: 'Dates', value: 8217 },
{ name: 'Displays', value: 12555 },
{ name: 'Filter', value: 2324 },
{ name: 'Geometry', value: 10993 },
{
name: 'heap',
children: [
{ name: 'FibonacciHeap', value: 9354 },
{ name: 'HeapNode', value: 1233 },
],
},
{ name: 'IEvaluable', value: 335 },
{ name: 'IPredicate', value: 383 },
{ name: 'IValueProxy', value: 874 },
{
name: 'math',
children: [
{ name: 'DenseMatrix', value: 3165 },
{ name: 'IMatrix', value: 2815 },
{ name: 'SparseMatrix', value: 3366 },
],
},
{ name: 'Maths', value: 17705 },
{ name: 'Orientation', value: 1486 },
{
name: 'palette',
children: [
{ name: 'ColorPalette', value: 6367 },
{ name: 'Palette', value: 1229 },
{ name: 'ShapePalette', value: 2059 },
{ name: 'SizePalette', value: 2291 },
],
},
{ name: 'Property', value: 5559 },
{ name: 'Shapes', value: 19118 },
{ name: 'Sort', value: 6887 },
{ name: 'Stats', value: 6557 },
{ name: 'Strings', value: 22026 },
],
},
{
name: 'vis',
children: [
{
name: 'axis',
children: [
{ name: 'Axes', value: 1302 },
{ name: 'Axis', value: 24593 },
{ name: 'AxisGridLine', value: 652 },
{ name: 'AxisLabel', value: 636 },
{ name: 'CartesianAxes', value: 6703 },
],
},
{
name: 'controls',
children: [
{ name: 'AnchorControl', value: 2138 },
{ name: 'ClickControl', value: 3824 },
{ name: 'Control', value: 1353 },
{ name: 'ControlList', value: 4665 },
{ name: 'DragControl', value: 2649 },
{ name: 'ExpandControl', value: 2832 },
{ name: 'HoverControl', value: 4896 },
{ name: 'IControl', value: 763 },
{ name: 'PanZoomControl', value: 5222 },
{ name: 'SelectionControl', value: 7862 },
{ name: 'TooltipControl', value: 8435 },
],
},
{
name: 'data',
children: [
{ name: 'Data', value: 20544 },
{ name: 'DataList', value: 19788 },
{ name: 'DataSprite', value: 10349 },
{ name: 'EdgeSprite', value: 3301 },
{ name: 'NodeSprite', value: 19382 },
{
name: 'render',
children: [
{ name: 'ArrowType', value: 698 },
{ name: 'EdgeRenderer', value: 5569 },
{ name: 'IRenderer', value: 353 },
{ name: 'ShapeRenderer', value: 2247 },
],
},
{ name: 'ScaleBinding', value: 11275 },
{ name: 'Tree', value: 7147 },
{ name: 'TreeBuilder', value: 9930 },
],
},
{
name: 'events',
children: [
{ name: 'DataEvent', value: 2313 },
{ name: 'SelectionEvent', value: 1880 },
{ name: 'TooltipEvent', value: 1701 },
{ name: 'VisualizationEvent', value: 1117 },
],
},
{
name: 'legend',
children: [
{ name: 'Legend', value: 20859 },
{ name: 'LegendItem', value: 4614 },
{ name: 'LegendRange', value: 10530 },
],
},
{
name: 'operator',
children: [
{
name: 'distortion',
children: [
{ name: 'BifocalDistortion', value: 4461 },
{ name: 'Distortion', value: 6314 },
{ name: 'FisheyeDistortion', value: 3444 },
],
},
{
name: 'encoder',
children: [
{ name: 'ColorEncoder', value: 3179 },
{ name: 'Encoder', value: 4060 },
{ name: 'PropertyEncoder', value: 4138 },
{ name: 'ShapeEncoder', value: 1690 },
{ name: 'SizeEncoder', value: 1830 },
],
},
{
name: 'filter',
children: [
{ name: 'FisheyeTreeFilter', value: 5219 },
{ name: 'GraphDistanceFilter', value: 3165 },
{ name: 'VisibilityFilter', value: 3509 },
],
},
{ name: 'IOperator', value: 1286 },
{
name: 'label',
children: [
{ name: 'Labeler', value: 9956 },
{ name: 'RadialLabeler', value: 3899 },
{ name: 'StackedAreaLabeler', value: 3202 },
],
},
{
name: 'layout',
children: [
{ name: 'AxisLayout', value: 6725 },
{ name: 'BundledEdgeRouter', value: 3727 },
{ name: 'CircleLayout', value: 9317 },
{ name: 'CirclePackingLayout', value: 12003 },
{ name: 'DendrogramLayout', value: 4853 },
{ name: 'ForceDirectedLayout', value: 8411 },
{ name: 'IcicleTreeLayout', value: 4864 },
{ name: 'IndentedTreeLayout', value: 3174 },
{ name: 'Layout', value: 7881 },
{ name: 'NodeLinkTreeLayout', value: 12870 },
{ name: 'PieLayout', value: 2728 },
{ name: 'RadialTreeLayout', value: 12348 },
{ name: 'RandomLayout', value: 870 },
{ name: 'StackedAreaLayout', value: 9121 },
{ name: 'TreeMapLayout', value: 9191 },
],
},
{ name: 'Operator', value: 2490 },
{ name: 'OperatorList', value: 5248 },
{ name: 'OperatorSequence', value: 4190 },
{ name: 'OperatorSwitch', value: 2581 },
{ name: 'SortOperator', value: 2023 },
],
},
{ name: 'Visualization', value: 16540 },
],
},
],
};
</script>

82
io.sc.engine.rule.frontend/src/views/shared/TemplateImportAndExportDialog.vue

@ -0,0 +1,82 @@
<template>
<w-dialog ref="dialogRef" :title="$t('upload')" width="600px" :can-maximize="false">
<q-form action="post">
<div class="row py-1">
<div class="col-1"></div>
<div class="col-10">
<q-file ref="fileRef" v-model="modelValue.file" :label="$t('file.single.tip')" dense outlined clearable counter accept=".xlsx">
<template #prepend>
<q-icon name="cloud_upload" />
</template>
</q-file>
</div>
<div class="col-1"></div>
</div>
<div class="row py-1">
<div class="col-1"></div>
<div class="col-10 row justify-center q-gutter-md py-2">
<q-btn icon="bi-database-up" :label="$t('import')" color="primary" no-caps @click="upload"></q-btn>
</div>
<div class="col-1"></div>
</div>
</q-form>
</w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import { axios, Environment, Downloader } from 'platform-core';
const props = defineProps({
downloadUrl: { type: String, default: undefined },
uploadUrl: { type: String, default: undefined },
});
const emit = defineEmits<{
(e: 'afterImported', evt: Event): void;
}>();
const dialogRef = ref();
const modelValue = reactive({
file: undefined,
});
const fileRef = ref();
const download = () => {
Downloader.post(props.downloadUrl, {}, { loading: true });
};
const upload = () => {
axios
.post(
props.uploadUrl,
{
file: fileRef.value.nativeEl.files[0],
},
{
loading: true,
headers: {
'Content-Type': 'multipart/form-data',
},
},
)
.then(() => {
close();
emit('afterImported');
});
};
const open = () => {
modelValue.file = undefined;
dialogRef.value.show();
};
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
download,
});
</script>

41
io.sc.engine.rule.frontend/src/views/shared/TemplateImportAndExportManager.ts

@ -0,0 +1,41 @@
import { $t, Environment, Downloader } from 'platform-core';
import { cli } from 'webpack';
class TemplateImportAndExportManager {
#dialogRef: any;
constructor(dialogRef: any) {
this.#dialogRef = dialogRef;
}
public getToolbarAction(): any[] {
return [
[
{
name: 'templateImportAndExport',
label: $t('re.templateImportAndExport.action.group'),
icon: '',
click: undefined,
},
{
name: 'downloadExcelTemplate',
label: $t('re.templateImportAndExport.action.downloadTemplate'),
icon: '',
click: (args: any) => {
this.#dialogRef.value.download();
},
},
{
name: 'uploadExcel',
label: $t('re.templateImportAndExport.action.upload'),
icon: '',
click: (args: any) => {
this.#dialogRef.value.open();
},
},
],
];
}
}
export { TemplateImportAndExportManager };

246
io.sc.engine.rule.frontend/src/views/shared/TestCaseGrid.vue

@ -0,0 +1,246 @@
<template>
<div style="width: 100%; height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.lib.tab.testcase.title')"
dense-body
dense-bottom
:config-button="true"
selection="multiple"
:checkbox-selection="true"
db-click-operation="edit"
:tree="false"
:fetch-data-url="fetchDataUrlComputed"
:data-url="Environment.apiContextPath('/api/re/testCase')"
:pageable="true"
:pagination="{ rowsPerPage: 50 }"
:sort-by="['-lastModifyDate']"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="getActions()"
:query-form-cols-num="6"
:query-form-fields="
Tools.isNill(owner)
? [
{ colSpan: 2, name: 'name', label: $t('name'), type: 'w-text', clearable: true },
{ colSpan: 3, name: 'description', label: $t('description'), type: 'w-text', clearable: true },
]
: []
"
:columns="[
{ width: 100, name: 'id', label: $t('id'), showIf: false },
{
width: 60,
name: 'testResult',
label: $t('re.testcase.grid.entity.testResult'),
align: 'center',
format: EngineEnums.TestResult.formater,
},
{ width: 150, name: 'lastTestDate', label: $t('re.testcase.grid.entity.lastTestDate') },
{ width: 290, name: 'name', label: $t('name') },
{ width: 200, name: 'description', label: $t('description') },
{
width: 80,
name: 'ownerType',
label: $t('re.testcase.grid.entity.ownerType'),
sortable: false,
format: EngineEnums.TestCaseOwnerType.formater,
},
{
width: 190,
name: 'ownerDescription',
label: $t('re.testcase.grid.entity.ownerDescription'),
sortable: false,
format: (value: any, row: any) => {
return Tools.initialize(row.ownerName, '') + (Tools.isNill(row.ownerVersion) ? '' : '(V' + row.ownerVersion + ')');
},
},
{
width: 80,
name: 'ownerStatus',
label: $t('re.testcase.grid.entity.ownerStatus'),
sortable: false,
align: 'center',
format: EngineEnums.DeployStatus.formater,
},
]"
:editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{ name: 'name', label: $t('name'), type: 'w-text', requiredIf: true },
{ name: 'description', label: $t('description'), type: 'w-text' },
...getEditorFields(),
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'ownerId', label: $t('re.testcase.grid.entity.ownerId') },
{ name: 'ownerType', label: $t('re.testcase.grid.entity.ownerType'), format: Formater.none() },
{ name: 'ownerCode', label: $t('re.testcase.grid.entity.ownerCode') },
{ name: 'ownerName', label: $t('re.testcase.grid.entity.ownerName') },
{ name: 'ownerVersion', label: $t('re.testcase.grid.entity.ownerVersion') },
{ name: 'ownerStatus', label: $t('re.testcase.grid.entity.ownerStatus'), format: Formater.none() },
],
},
}"
v-bind="attrs"
@row-click="
(args) => {
emit('rowClick', args);
}
"
@before-request-data="
(args: any) => {
emit('beforeRequestData', args);
}
"
></w-grid>
<UploadTestCaseDialog ref="uploadTestCaseDialogRef"></UploadTestCaseDialog>
</div>
</template>
<script setup lang="ts">
import { ref, useAttrs, computed } from 'vue';
import { $t, axios, Environment, Tools, Downloader, Formater } from 'platform-core';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
import UploadTestCaseDialog from './UploadTestCaseDialog.vue';
const attrs = useAttrs();
const props = defineProps({
owner: { type: Object, default: undefined },
});
const emit = defineEmits<{
(e: 'rowClick', args): void;
(e: 'beforeRequestData', args): void;
}>();
const gridRef = ref();
const uploadTestCaseDialogRef = ref();
const valueTypeManager = new ValueTypeManager();
const fetchDataUrlComputed = computed(() => {
if (Tools.isNill(props.owner)) {
return Environment.apiContextPath('/api/re/testCase/find');
} else {
return Environment.apiContextPath('/api/re/testCase/findByOwnerId?ownerId=' + Tools.initialize(props.owner?.id, ''));
}
});
const actionMap = {
deepClone: {
extend: 'clone',
name: 'deepClone',
label: $t('deepClone'),
icon: 'bi-copy',
click: (args: any) => {
axios.post(Environment.apiContextPath('/api/re/testCase/deepClone/' + args.selected.id), {}, { loading: true }).then((response) => {
gridRef.value.refresh();
});
},
},
execute: {
name: 'execute',
label: $t('execute'),
icon: 'bi-caret-right',
enableIf: (args: any) => {
return args.selected;
},
click: (args: any) => {
const tickeds = args.tickeds;
if (tickeds && tickeds.length > 0) {
const ids = Tools.extractProperties(tickeds, 'id');
if (ids && ids.length > 0) {
axios.post(Environment.apiContextPath('/api/re/testCase/execute'), ids, { loading: true }).then((response) => {
gridRef.value.refresh();
});
}
}
},
},
executeAll: {
name: 'executeAll',
label: $t('executeAll'),
icon: 'bi-caret-right-fill',
click: (args: any) => {
axios.post(Environment.apiContextPath('/api/re/testCase/executeAll'), {}, { loading: true }).then(() => {
gridRef.value?.refresh();
});
},
},
batchTest: {
name: 'batchTest',
label: $t('re.testcase.grid.tools.batchTest'),
icon: 'bi-list-check',
},
download: {
name: 'download',
label: $t('re.testcase.grid.tools.download'),
icon: 'bi-box-arrow-in-down',
click: (args: any) => {
Downloader.post(Environment.apiContextPath('/api/re/testCase/downloadTemplate/' + props.owner.resource), {}, { loading: true });
},
},
upload: {
name: 'upload',
label: $t('re.testcase.grid.tools.upload'),
icon: 'bi-box-arrow-in-up',
click: (args: any) => {
uploadTestCaseDialogRef.value.open();
},
},
};
const getActions = () => {
if (Tools.isNill(props.owner)) {
return ['query', actionMap['execute'], actionMap['executeAll'], [actionMap['batchTest'], actionMap['upload']], 'separator', 'view', 'separator', 'export'];
} else {
return [
'refresh',
'separator',
['add', 'clone', actionMap['deepClone']],
'edit',
'remove',
'separator',
actionMap['execute'],
actionMap['executeAll'],
'separator',
[actionMap['batchTest'], actionMap['download'], actionMap['upload']],
'separator',
'view',
'separator',
'export',
];
}
};
const getEditorFields = () => {
if (Tools.isNill(props.owner)) {
return [];
}
if (props.owner.type === 'INDICATOR') {
return [
{ name: 'ownerType', label: $t('ownerType'), type: 'w-text', defaultValue: 'LIB', showIf: false },
{ name: 'owner', label: $t('owner'), type: 'w-text', defaultValue: props.owner.id, showIf: false },
];
} else {
return [
{ name: 'ownerType', label: $t('ownerType'), type: 'w-text', defaultValue: 'MODEL', showIf: false },
{ name: 'owner', label: $t('owner'), type: 'w-text', defaultValue: props.owner.id, showIf: false },
];
}
};
await EngineEnums.init();
await valueTypeManager.init();
</script>

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

@ -0,0 +1,213 @@
<template>
<div style="width: 100%; height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.testCaseParameter.grid.title')"
dense-body
hide-bottom
:config-button="true"
selection="multiple"
:checkbox-selection="false"
:tree="true"
:tree-icon="
(row) => {
if (row.category === 'F') {
return { name: 'folder', color: 'amber' };
} else {
return { name: 'bi-p-circle' };
}
}
"
db-click-operation="edit"
:tree-default-expand-all="true"
:fetch-data-url="Environment.apiContextPath('/api/re/testCaseParameter/findByTestCase?testCaseId=' + Tools.initialize(testCase?.id, ''))"
:data-url="Environment.apiContextPath('/api/re/testCaseParameter')"
:pageable="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
'expand',
'separator',
{
extend: 'edit',
enableIf: (args: any) => {
return args.selected && args.selected.category !== 'M';
},
},
'separator',
{
name: 'execute',
label: $t('execute'),
icon: 'bi-caret-right',
click: (args: any) => {
axios.post(Environment.apiContextPath('/api/re/testCase/execute/' + Tools.initialize(testCase?.id, '')), {}, { loading: true }).then(() => {
testcaseParameterGridRef?.refresh();
});
},
},
'separator',
{
name: 'simulate',
label: $t('simulate'),
icon: 'monitor',
click: (args: any) => {
simulatorDialogRef.open();
},
},
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: '100%', name: 'name', label: $t('name'), sortable: false },
{
width: 100,
name: 'parameterType',
label: $t('type'),
sortable: false,
format: (value: any, row: any) => {
if (row.parameterType) {
return EngineEnums.ParameterType.formater(row.parameterType);
}
if (row.indicatorType) {
return EngineEnums.IndicatorType.formater(row.indicatorType);
}
},
},
...valueTypeManager.getColumns([], false),
{ width: 100, name: 'inputValue', label: $t('re.testCaseParameter.grid.entity.inputValue'), sortable: false },
{ width: 100, name: 'expectValue', label: $t('re.testCaseParameter.grid.entity.expectValue'), sortable: false },
{ width: 100, name: 'resultValue', label: $t('re.testCaseParameter.grid.entity.resultValue'), sortable: false },
{
width: 70,
name: 'skipCheck',
label: $t('re.testCaseParameter.grid.entity.skipCheck'),
sortable: false,
format: Formater.checkTag(),
},
{
width: 60,
name: 'testResult',
label: $t('re.testCaseParameter.grid.entity.testResult'),
sortable: false,
align: 'center',
format: EngineEnums.TestResult.formater,
},
]"
:editor="{
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{ name: 'testCase', label: $t('testCase'), type: 'w-text', defaultValue: Tools.initialize(testCase?.id, ''), showIf: false },
{ name: 'id', label: $t('id'), type: 'w-text', showIf: false },
{ name: 'source', label: $t('source'), type: 'w-text', showIf: false },
{ name: 'parameterType', label: $t('parameterType'), type: 'w-text', showIf: false },
{ name: 'scoreCardVarType', label: $t('scoreCardVarType'), type: 'w-text', showIf: false },
{ name: 'indicatorType', label: $t('indicatorType'), type: 'w-text', showIf: false },
{
name: 'inputValue',
label: $t('re.testCaseParameter.grid.entity.inputValue'),
type: 'w-code-mirror',
toolbar: false,
rows: 4,
showIf: (arg) => {
const parameterType = arg.form.getFieldValue('parameterType');
const scoreCardVarType = arg.form.getFieldValue('scoreCardVarType');
const indicatorType = arg.form.getFieldValue('indicatorType');
if (
(!Tools.isUndefinedOrNull(parameterType) && (parameterType === 'IN' || parameterType === 'IN_OPTION' || parameterType === 'INDICATOR')) ||
(!Tools.isUndefinedOrNull(scoreCardVarType) && scoreCardVarType !== 'RESULT') ||
(!Tools.isUndefinedOrNull(indicatorType) && indicatorType === 'INTERFACE')
) {
return true;
}
return false;
},
},
{
name: 'expectValue',
label: $t('re.testCaseParameter.grid.entity.expectValue'),
type: 'w-code-mirror',
toolbar: false,
rows: 4,
showIf: (arg) => {
const parameterType = arg.form.getFieldValue('parameterType');
const scoreCardVarType = arg.form.getFieldValue('scoreCardVarType');
const indicatorType = arg.form.getFieldValue('indicatorType');
if (
(!Tools.isUndefinedOrNull(parameterType) &&
(parameterType === 'INTERMEDIATE' ||
parameterType === 'OUT' ||
parameterType === 'RULE_RESULT' ||
parameterType === 'SINGLE_RULE_RESULT')) ||
!Tools.isUndefinedOrNull(scoreCardVarType) ||
(!Tools.isUndefinedOrNull(indicatorType) && indicatorType === 'INDICATOR')
) {
return true;
}
return false;
},
},
{
name: 'resultValue',
label: $t('re.testCaseParameter.grid.entity.resultValue'),
type: 'w-code-mirror',
toolbar: false,
rows: 4,
lang: 'json',
},
{ name: 'skipCheck', label: $t('re.testCaseParameter.grid.entity.skipCheck'), type: 'w-checkbox' },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'testCaseId', label: $t('re.testCaseParameter.grid.entity.testCaseId') },
{ name: 'id', label: $t('id') },
{ name: 'inputValue', label: $t('re.testCaseParameter.grid.entity.inputValue') },
{ name: 'expectValue', label: $t('re.testCaseParameter.grid.entity.expectValue') },
{ name: 'resultValue', label: $t('re.testCaseParameter.grid.entity.resultValue') },
{ name: 'skipCheck', label: $t('re.testCaseParameter.grid.entity.skipCheck') },
],
},
}"
v-bind="attrs"
></w-grid>
<SimulatorDialog ref="simulatorDialogRef"></SimulatorDialog>
</div>
</template>
<script setup lang="ts">
import { ref, useAttrs, computed } from 'vue';
import { axios, Environment, Formater, Tools } from 'platform-core';
import { ValueTypeManager } from '@/views/shared/ValueTypeManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
import SimulatorDialog from './SimulatorDialog.vue';
const attrs = useAttrs();
const props = defineProps({
testCase: { type: Object, default: undefined },
});
const gridRef = ref();
const simulatorDialogRef = ref();
const valueTypeManager = new ValueTypeManager();
const refresh = () => {
gridRef?.value?.refresh();
};
defineExpose({
refresh,
});
await EngineEnums.init();
await valueTypeManager.init();
</script>

13
io.sc.engine.rule.frontend/src/views/shared/UserDefinedFunctionsManager.ts

@ -15,16 +15,9 @@ class UserDefinedFunctionsManager {
public load() {
// 获取自定义函数库中的函数
axios.get(Environment.apiContextPath('/api/re/function?pageable=false')).then((response) => {
const options: any[] = [];
const items: any[] = response.data?.content;
if (items && items.length > 0) {
items.forEach((item) => {
if (item.enable) {
options.push(item);
}
});
}
this.#functions.value = options;
this.#functions.value = Tools.objects2Objects(response.data?.content, null, (obj: any) => {
return obj.enable;
});
});
}
}

260
io.sc.engine.rule.frontend/src/views/shared/ValueTypeManager.ts

@ -0,0 +1,260 @@
import { eventBus, $t, axios, Environment, Tools, Formater } from 'platform-core';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
class ValueTypeManager {
private static FETCH_URL = '/api/re/dictionary/searchDictionaries';
private valueTypeMap = new Map();
constructor() {
eventBus.on('dictionaryChanged', this.dictionaryChanged);
}
public async init() {
await EngineEnums.init();
await this.dictionaryChanged();
}
public async dictionaryChanged() {
this.valueTypeMap.clear();
const response = await axios.get(Environment.apiContextPath(ValueTypeManager.FETCH_URL));
const items = response?.data;
for (const item of items) {
const key = item.code + (Tools.isNill(item.version) ? '' : ':' + item.version);
const value = {
label: $t(item.nameI18nKey),
version: item.version,
};
this.valueTypeMap.set(key, value);
}
}
public getColumns(columnNames: string[] = [], sortable: boolean = true): any {
const columns = {
valueType: {
width: 120,
name: 'valueType',
label: $t('valueType'),
sortable: sortable,
format: (value: any, row: any) => {
let scaleAndRoundingMode = '';
//小数
if (row.valueType == 'java.math.BigDecimal') {
if (!Tools.isNill(row.valueScale)) {
scaleAndRoundingMode += row.valueScale;
}
if (!Tools.isNill(row.valueRoundingMode)) {
if (row.valueRoundingMode !== 'HALF_UP') {
const roundingMode = EngineEnums.RoundingMode.formater(row.valueRoundingMode);
scaleAndRoundingMode += ',' + roundingMode;
}
}
}
let result = '';
const key = row.valueType + (Tools.isNill(row.valueTypeVersion) ? '' : ':' + row.valueTypeVersion);
const valueType = this.valueTypeMap.get(key);
if (valueType) {
result += valueType.label;
let description = '';
if (!Tools.isNill(valueType.version)) {
description += 'V' + valueType.version;
}
if (!Tools.isEmpty(scaleAndRoundingMode)) {
description += description ? ',' + scaleAndRoundingMode : scaleAndRoundingMode;
}
if (!Tools.isEmpty(description)) {
result += '(' + description + ')';
}
}
return result;
},
},
valueTypeIsList: {
width: 70,
name: 'valueTypeIsList',
label: $t('re.parameter.grid.entity.valueTypeIsList'),
sortable: sortable,
format: Formater.checkTag(),
},
defaultValue: { width: 100, name: 'defaultValue', label: $t('defaultValue'), sortable: sortable },
};
const result: any = [];
if (Tools.isArray(columnNames) && columnNames.length > 0) {
for (const columnName of columnNames) {
const column = columns[columnName];
if (column) {
result.push(column);
}
}
} else {
result.push(columns.valueType);
result.push(columns.valueTypeIsList);
result.push(columns.defaultValue);
}
return result;
}
public getEditorFields(): any {
return [
{
name: 'valueTypeSelect',
label: $t('re.parameter.grid.entity.valueType'),
type: 'w-grid-select',
requiredIf: true,
displayValue: (args: any) => {
const data = args.data;
if (data.type === 'UD_JAVA_CLASS' || data.type === 'ENUM') {
return data.nameI18nKey + (data.version ? '(V' + data.version + ')' : '');
} else {
return $t(data.code) + (data.version ? '(V' + data.version + ')' : '');
}
},
onUpdateValue: (args: any) => {
if (args.data) {
args.form.setFieldValue('valueType', args.data.code);
args.form.setFieldValue('valueTypeVersion', Tools.isNill(args.data.version) ? null : args.data.version);
}
},
selectableIf: (args: any) => {
if (args.row.type === 'FOLDER') {
return false;
} else {
return true;
}
},
grid: {
title: $t('re.parameter.grid.entity.valueType'),
height: 300,
denseBody: true,
hideBottom: true,
configButton: true,
checkboxSelection: false,
tree: true,
treeIcon: (row: any) => {
if (row.type === 'FOLDER') {
return { name: 'folder', color: 'amber' };
} else {
return { name: 'bi-card-list' };
}
},
dataUrl: Environment.apiContextPath(ValueTypeManager.FETCH_URL),
pageable: false,
sortBy: ['order'],
toolbarConfigure: { noIcon: false },
toolbarActions: ['refresh', 'expand'],
columns: [
{
width: '100%',
name: 'name',
label: $t('name'),
format: (value, row) => {
return $t(row.nameI18nKey);
},
},
{
width: 100,
name: 'type',
label: $t('type'),
format: (value, row) => {
if (value === 'FOLDER') {
return '';
} else {
return EngineEnums.DictionaryType.formater(value);
}
},
},
{ width: 60, name: 'version', label: $t('version'), align: 'right' },
],
},
},
{
name: 'valueType',
label: $t('re.parameter.grid.entity.valueType'),
type: 'w-text',
showIf: (args: any) => {
return false;
},
},
{
name: 'valueTypeVersion',
label: $t('re.parameter.grid.entity.valueTypeVersion'),
type: 'w-text',
showIf: (args: any) => {
return false;
},
},
{
name: 'valueScale',
label: $t('re.parameter.grid.entity.valueScale'),
type: 'w-integer',
defaultValue: 6,
showIf: (args: any) => {
const valueType = args.form.getFieldValue('valueType');
if (valueType == 'java.math.BigDecimal') {
return true;
}
return false;
},
},
{
name: 'valueRoundingMode',
label: $t('re.parameter.grid.entity.valueRoundingMode'),
type: 'w-select',
options: EngineEnums.RoundingMode.options,
defaultValue: 'HALF_UP',
showIf: (args: any) => {
const valueType = args.form.getFieldValue('valueType');
if (valueType == 'java.math.BigDecimal') {
return true;
}
return false;
},
},
{
name: 'valueTypeIsList',
label: $t('re.parameter.grid.entity.valueTypeIsList'),
type: 'w-checkbox',
defaultValue: false,
showIf: (args: any) => {
return args.form.getFieldValue('type') !== 'IN_OPTION';
},
},
{
name: 'defaultValue',
label: $t('defaultValue'),
type: 'w-code-mirror',
lang: 'json',
rows: 4,
toolbar: false,
},
];
}
public getViewerFields(): any {
return [
{ name: 'valueType', label: $t('re.parameter.grid.entity.valueType'), format: Formater.none() },
{ name: 'valueTypeVersion', label: $t('re.parameter.grid.entity.valueTypeVersion'), format: Formater.none() },
{ name: 'valueScale', label: $t('re.parameter.grid.entity.valueScale'), format: Formater.none() },
{ name: 'valueRoundingMode', label: $t('re.parameter.grid.entity.valueRoundingMode'), format: Formater.none() },
{ name: 'valueTypeIsList', label: $t('re.parameter.grid.entity.valueTypeIsList'), format: Formater.none() },
{ name: 'defaultValue', label: $t('defaultValue'), format: Formater.none() },
];
}
public beforeEditorDataSubmit(args: any): void {}
public afterEditorOpen(args: any): void {
const form = args.grid?.getEditorForm();
if (form && form.getStatus() !== 'add') {
let url = ValueTypeManager.FETCH_URL;
url += '?code=' + args.data.valueType;
url += '&version=' + (Tools.isNill(args.data.valueTypeVersion) ? '' : args.data.valueTypeVersion);
axios.get(Environment.apiContextPath(url)).then((response: any) => {
form?.getFieldComponent('valueTypeSelect')?.setValue(response?.data[0]?.id);
});
}
}
}
export { ValueTypeManager };

97
io.sc.engine.rule.frontend/src/views/shared/enums/EngineEnums.ts

@ -0,0 +1,97 @@
import type { EnumType } from 'platform-core';
import { EnumTools, Formater, Options } from 'platform-core';
import DeployStatusTag from '@/views/shared/tags/DeployStatusTag.vue';
import TestResultTag from '@/views/shared/tags/TestResultTag.vue';
class EngineEnums {
private static loaded: boolean = false;
private static enumNames = [
'io.sc.platform.core.enums.RoundingMode',
'io.sc.engine.rule.core.enums.DeployStatus',
'io.sc.engine.rule.core.enums.DictionaryType',
'io.sc.engine.rule.core.enums.ExecuteMode',
'io.sc.engine.rule.core.enums.HttpAuthorizationType',
'io.sc.engine.rule.core.enums.HttpMethodType',
'io.sc.engine.rule.core.enums.IndicatorType',
'io.sc.engine.rule.core.enums.LibType',
'io.sc.engine.rule.core.enums.ModelCategory',
'io.sc.engine.rule.core.enums.ParameterType',
'io.sc.engine.rule.core.enums.ProcessorType',
'io.sc.engine.rule.core.enums.ResourceType',
'io.sc.engine.rule.core.enums.RuntimeInputParameterType',
'io.sc.engine.rule.core.enums.ScoreCardVarType',
'io.sc.engine.rule.core.enums.TestCaseOwnerType',
'io.sc.engine.rule.core.enums.TestResult',
'io.sc.engine.rule.core.enums.ValidatorType',
];
public static RoundingMode: any;
public static DeployStatus: any;
public static DictionaryType: any;
public static ExecuteMode: any;
public static HttpAuthorizationType: any;
public static HttpMethodType: any;
public static IndicatorType: any;
public static LibType: any;
public static ModelCategory: any;
public static ParameterType: any;
public static ProcessorType: any;
public static ResourceType: any;
public static RuntimeInputParameterType: any;
public static ScoreCardVarType: any;
public static TestCaseOwnerType: any;
public static TestResult: any;
public static ValidatorType: any;
public static ValueType: any;
public static async init() {
if (!EngineEnums.loaded) {
const Enums = await EnumTools.fetch(EngineEnums.enumNames);
EngineEnums.RoundingMode = EngineEnums.createEnum(Enums.RoundingMode);
EngineEnums.DeployStatus = EngineEnums.createTagEnum(Enums.DeployStatus, (value: any, row: any) => {
return {
componentType: DeployStatusTag,
attrs: { value: value },
};
});
EngineEnums.DictionaryType = EngineEnums.createEnum(Enums.DictionaryType);
EngineEnums.ExecuteMode = EngineEnums.createEnum(Enums.ExecuteMode);
EngineEnums.HttpAuthorizationType = EngineEnums.createEnum(Enums.HttpAuthorizationType);
EngineEnums.HttpMethodType = EngineEnums.createEnum(Enums.HttpMethodType);
EngineEnums.IndicatorType = EngineEnums.createEnum(Enums.IndicatorType);
EngineEnums.LibType = EngineEnums.createEnum(Enums.LibType);
EngineEnums.ModelCategory = EngineEnums.createEnum(Enums.ModelCategory);
EngineEnums.ParameterType = EngineEnums.createEnum(Enums.ParameterType);
EngineEnums.ProcessorType = EngineEnums.createEnum(Enums.ProcessorType);
EngineEnums.ResourceType = EngineEnums.createEnum(Enums.ResourceType);
EngineEnums.RuntimeInputParameterType = EngineEnums.createEnum(Enums.RuntimeInputParameterType);
EngineEnums.ScoreCardVarType = EngineEnums.createEnum(Enums.ScoreCardVarType);
EngineEnums.TestCaseOwnerType = EngineEnums.createEnum(Enums.TestCaseOwnerType);
EngineEnums.TestResult = EngineEnums.createTagEnum(Enums.TestResult, (value: any, row: any) => {
return {
componentType: TestResultTag,
attrs: { value: value },
};
});
EngineEnums.ValidatorType = EngineEnums.createEnum(Enums.ValidatorType);
EngineEnums.ValueType = EngineEnums.createEnum(Enums.ValueType);
}
}
private static createTagEnum(enumType: EnumType, formater: any) {
return {
i18nMessage: Formater.enum(enumType),
formater: formater,
options: Options.enum(enumType),
};
}
private static createEnum(enumType: EnumType) {
return {
i18nMessage: Formater.enum(enumType),
formater: Formater.enum(enumType),
options: Options.enum(enumType),
};
}
}
export { EngineEnums };

4
io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts

@ -43,7 +43,7 @@ class Arithmetic extends Processor {
{
colSpan: 12,
name: 'arithmetic',
label: $t('re.resources.designer.processor.grid.entity.arithmetic'),
label: $t('re.processor.grid.entity.arithmetic'),
type: 'w-code-mirror',
lang: 'java',
rows: 5,
@ -60,7 +60,7 @@ class Arithmetic extends Processor {
}
public getViewerFields(): any {
return [{ name: 'arithmetic', label: $t('re.resources.designer.processor.grid.entity.arithmetic') }];
return [{ name: 'arithmetic', label: $t('re.processor.grid.entity.arithmetic') }];
}
public beforeEditorDataSubmit(args: any): void {}

4
io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts

@ -45,7 +45,7 @@ class ConditionRange extends Processor {
{
colSpan: 12,
name: 'conditionRange',
label: $t('re.resources.designer.processor.grid.entity.conditionRange'),
label: $t('re.processor.grid.entity.conditionRange'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -140,7 +140,7 @@ class ConditionRange extends Processor {
}
public getViewerFields(): any {
return [{ name: 'conditionRange', label: $t('re.resources.designer.processor.grid.entity.conditionRange') }];
return [{ name: 'conditionRange', label: $t('re.processor.grid.entity.conditionRange') }];
}
public beforeEditorDataSubmit(args: any): void {

16
io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts

@ -57,7 +57,7 @@ class DecisionTable extends Processor {
{
colSpan: 12,
name: 'decisionTable',
label: $t('re.resources.designer.processor.grid.entity.decisionTable'),
label: $t('re.processor.grid.entity.decisionTable'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -80,7 +80,7 @@ class DecisionTable extends Processor {
},
{
name: 'addCol2Left',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Left'),
label: $t('re.processor.decisionTable.toolbar.addCol2Left'),
enableIf: (args: any) => {
if (args.selectedColName !== 'type' && args.selectedColName !== 'C0') {
return true;
@ -93,7 +93,7 @@ class DecisionTable extends Processor {
},
{
name: 'addCol2Right',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Right'),
label: $t('re.processor.decisionTable.toolbar.addCol2Right'),
enableIf: (args: any) => {
if (args.selectedColName !== 'type') {
return true;
@ -107,7 +107,7 @@ class DecisionTable extends Processor {
'separator',
{
name: 'addConditionRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addConditionRow'),
label: $t('re.processor.decisionTable.toolbar.addConditionRow'),
click: (args: any) => {
let rowNum = 0;
const rows = args.grid.getRows();
@ -124,7 +124,7 @@ class DecisionTable extends Processor {
},
{
name: 'addResultRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addResultRow'),
label: $t('re.processor.decisionTable.toolbar.addResultRow'),
click: (args: any) => {
args.grid.addLocalData({ type: 'result' });
},
@ -137,7 +137,7 @@ class DecisionTable extends Processor {
},
{
name: 'removeCol',
label: $t('re.resources.designer.processor.decisionTable.toolbar.removeCol'),
label: $t('re.processor.decisionTable.toolbar.removeCol'),
enableIf: (args: any) => {
if (args.selectedColName !== 'type' && args.selectedColName !== 'C0') {
return true;
@ -150,7 +150,7 @@ class DecisionTable extends Processor {
},
{
name: 'removeRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.removeRow'),
label: $t('re.processor.decisionTable.toolbar.removeRow'),
enableIf: (args: any) => {
if (args.selected) {
return true;
@ -198,7 +198,7 @@ class DecisionTable extends Processor {
}
public getViewerFields(): any {
return [{ name: 'decisionTable', label: $t('re.resources.designer.processor.grid.entity.decisionTable') }];
return [{ name: 'decisionTable', label: $t('re.processor.grid.entity.decisionTable') }];
}
public beforeEditorDataSubmit(args: any): void {

14
io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts

@ -50,7 +50,7 @@ class DecisionTable2C extends DecisionTable {
{
colSpan: 12,
name: 'decisionTable2C',
label: $t('re.resources.designer.processor.grid.entity.decisionTable2C'),
label: $t('re.processor.grid.entity.decisionTable2C'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -73,7 +73,7 @@ class DecisionTable2C extends DecisionTable {
},
{
name: 'addCol2Left',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Left'),
label: $t('re.processor.decisionTable.toolbar.addCol2Left'),
enableIf: (args: any) => {
if (args.selectedColName) {
return true;
@ -86,7 +86,7 @@ class DecisionTable2C extends DecisionTable {
},
{
name: 'addCol2Right',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Right'),
label: $t('re.processor.decisionTable.toolbar.addCol2Right'),
enableIf: (args: any) => {
if (args.selectedColName) {
return true;
@ -100,7 +100,7 @@ class DecisionTable2C extends DecisionTable {
'separator',
{
name: 'addRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addRow'),
label: $t('re.processor.decisionTable.toolbar.addRow'),
click: (args: any) => {
args.grid.addLocalData({});
},
@ -113,7 +113,7 @@ class DecisionTable2C extends DecisionTable {
},
{
name: 'removeCol',
label: $t('re.resources.designer.processor.decisionTable.toolbar.removeCol'),
label: $t('re.processor.decisionTable.toolbar.removeCol'),
enableIf: (args: any) => {
if (args.selectedColName) {
return true;
@ -126,7 +126,7 @@ class DecisionTable2C extends DecisionTable {
},
{
name: 'removeRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.removeRow'),
label: $t('re.processor.decisionTable.toolbar.removeRow'),
enableIf: (args: any) => {
if (args.selected) {
return true;
@ -173,7 +173,7 @@ class DecisionTable2C extends DecisionTable {
}
public getViewerFields(): any {
return [{ name: 'decisionTable2C', label: $t('re.resources.designer.processor.grid.entity.decisionTable2C') }];
return [{ name: 'decisionTable2C', label: $t('re.processor.grid.entity.decisionTable2C') }];
}
public beforeEditorDataSubmit(args: any): void {

2
io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts

@ -36,7 +36,7 @@ class DecisionTree extends Processor {
{
colSpan: 12,
name: 'decisionTree',
label: $t('re.resources.designer.processor.grid.entity.decisionTree'),
label: $t('re.processor.grid.entity.decisionTree'),
type: 'w-code-mirror',
rows: 20,
lineNumber: true,

2
io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts

@ -36,7 +36,7 @@ class ExecutionFlow extends Processor {
{
colSpan: 12,
name: 'executionFlow',
label: $t('re.resources.designer.processor.grid.entity.executionFlow'),
label: $t('re.processor.grid.entity.executionFlow'),
type: 'w-code-mirror',
rows: 20,
lineNumber: true,

4
io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts

@ -36,7 +36,7 @@ class GroovyScript extends Processor {
{
colSpan: 12,
name: 'groovyScript',
label: $t('re.resources.designer.processor.grid.entity.groovyScript'),
label: $t('re.processor.grid.entity.groovyScript'),
type: 'w-code-mirror',
rows: 20,
lineNumber: true,
@ -54,7 +54,7 @@ class GroovyScript extends Processor {
}
public getViewerFields(): any {
return [{ name: 'groovyScript', label: $t('re.resources.designer.processor.grid.entity.groovyScript') }];
return [{ name: 'groovyScript', label: $t('re.processor.grid.entity.groovyScript') }];
}
public beforeEditorDataSubmit(args: any): void {}

42
io.sc.engine.rule.frontend/src/views/shared/processors/HttpRequest.ts

@ -46,7 +46,7 @@ class HttpRequest extends Processor {
{
colSpan: 3,
name: 'httpMethod',
label: $t('re.resources.designer.processor.grid.entity.httpMethod'),
label: $t('re.processor.grid.entity.httpMethod'),
type: 'w-select',
options: this.#httpMethodTypeOptionsRef,
rows: 1,
@ -57,7 +57,7 @@ class HttpRequest extends Processor {
{
colSpan: 9,
name: 'httpUrl',
label: $t('re.resources.designer.processor.grid.entity.httpUrl'),
label: $t('re.processor.grid.entity.httpUrl'),
type: 'w-text',
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
@ -66,7 +66,7 @@ class HttpRequest extends Processor {
{
colSpan: 3,
name: 'httpAuthType',
label: $t('re.resources.designer.processor.grid.entity.httpAuthType'),
label: $t('re.processor.grid.entity.httpAuthType'),
type: 'w-select',
options: this.#httpAuthorizationTypeOptionsRef,
showIf: (args: any) => {
@ -76,7 +76,7 @@ class HttpRequest extends Processor {
{
colSpan: 3,
name: 'httpAuthApikey',
label: $t('re.resources.designer.processor.grid.entity.httpAuthApikey'),
label: $t('re.processor.grid.entity.httpAuthApikey'),
type: 'w-text',
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE && args.form.getFieldValue('httpAuthType') === 'API_KEY';
@ -85,7 +85,7 @@ class HttpRequest extends Processor {
{
colSpan: 6,
name: 'httpAuthApiValue',
label: $t('re.resources.designer.processor.grid.entity.httpAuthApiValue'),
label: $t('re.processor.grid.entity.httpAuthApiValue'),
type: 'w-text',
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE && args.form.getFieldValue('httpAuthType') === 'API_KEY';
@ -94,7 +94,7 @@ class HttpRequest extends Processor {
{
colSpan: 3,
name: 'httpAuthBasicUsername',
label: $t('re.resources.designer.processor.grid.entity.httpAuthBasicUsername'),
label: $t('re.processor.grid.entity.httpAuthBasicUsername'),
type: 'w-text',
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE && args.form.getFieldValue('httpAuthType') === 'BASIC_AUTH';
@ -103,7 +103,7 @@ class HttpRequest extends Processor {
{
colSpan: 6,
name: 'httpAuthBasicPassword',
label: $t('re.resources.designer.processor.grid.entity.httpAuthBasicPassword'),
label: $t('re.processor.grid.entity.httpAuthBasicPassword'),
type: 'w-text',
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE && args.form.getFieldValue('httpAuthType') === 'BASIC_AUTH';
@ -112,7 +112,7 @@ class HttpRequest extends Processor {
{
colSpan: 9,
name: 'httpAuthBearerToken',
label: $t('re.resources.designer.processor.grid.entity.httpAuthBearerToken'),
label: $t('re.processor.grid.entity.httpAuthBearerToken'),
type: 'w-text',
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE && args.form.getFieldValue('httpAuthType') === 'BEARER';
@ -121,7 +121,7 @@ class HttpRequest extends Processor {
{
colSpan: 12,
name: 'httpRequestBody',
label: $t('re.resources.designer.processor.grid.entity.httpRequestBody'),
label: $t('re.processor.grid.entity.httpRequestBody'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -139,7 +139,7 @@ class HttpRequest extends Processor {
{
colSpan: 12,
name: 'httpResponseBody',
label: $t('re.resources.designer.processor.grid.entity.httpResponseBody'),
label: $t('re.processor.grid.entity.httpResponseBody'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -154,7 +154,7 @@ class HttpRequest extends Processor {
{
colSpan: 12,
name: 'httpResponseMapping',
label: $t('re.resources.designer.processor.grid.entity.httpResponseMapping'),
label: $t('re.processor.grid.entity.httpResponseMapping'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -174,16 +174,16 @@ class HttpRequest extends Processor {
public getViewerFields(): any {
return [
{ name: 'httpMethod', label: $t('re.resources.designer.processor.grid.entity.httpMethod') },
{ name: 'httpUrl', label: $t('re.resources.designer.processor.grid.entity.httpUrl') },
{ name: 'httpAuthType', label: $t('re.resources.designer.processor.grid.entity.httpAuthType') },
{ name: 'httpAuthApikey', label: $t('re.resources.designer.processor.grid.entity.httpAuthApikey') },
{ name: 'httpAuthApiValue', label: $t('re.resources.designer.processor.grid.entity.httpAuthApiValue') },
{ name: 'httpAuthBasicUsername', label: $t('re.resources.designer.processor.grid.entity.httpAuthBasicUsername') },
{ name: 'httpAuthBasicPassword', label: $t('re.resources.designer.processor.grid.entity.httpAuthBasicPassword') },
{ name: 'httpAuthBearerToken', label: $t('re.resources.designer.processor.grid.entity.httpAuthBearerToken') },
{ name: 'httpRequestBody', label: $t('re.resources.designer.processor.grid.entity.httpRequestBody') },
{ name: 'httpResponseMapping', label: $t('re.resources.designer.processor.grid.entity.httpResponseMapping') },
{ name: 'httpMethod', label: $t('re.processor.grid.entity.httpMethod') },
{ name: 'httpUrl', label: $t('re.processor.grid.entity.httpUrl') },
{ name: 'httpAuthType', label: $t('re.processor.grid.entity.httpAuthType') },
{ name: 'httpAuthApikey', label: $t('re.processor.grid.entity.httpAuthApikey') },
{ name: 'httpAuthApiValue', label: $t('re.processor.grid.entity.httpAuthApiValue') },
{ name: 'httpAuthBasicUsername', label: $t('re.processor.grid.entity.httpAuthBasicUsername') },
{ name: 'httpAuthBasicPassword', label: $t('re.processor.grid.entity.httpAuthBasicPassword') },
{ name: 'httpAuthBearerToken', label: $t('re.processor.grid.entity.httpAuthBearerToken') },
{ name: 'httpRequestBody', label: $t('re.processor.grid.entity.httpRequestBody') },
{ name: 'httpResponseMapping', label: $t('re.processor.grid.entity.httpResponseMapping') },
];
}

2
io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts

@ -40,7 +40,7 @@ class MathFormula extends Processor {
{
colSpan: 12,
name: 'mathFormula',
label: $t('re.resources.designer.processor.grid.entity.mathFormula'),
label: $t('re.processor.grid.entity.mathFormula'),
type: 'w-math',
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),

7
io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts

@ -49,10 +49,11 @@ class NumberRange extends Processor {
result.push({
colSpan: 12,
name: 'numberRangeVar',
label: $t('re.resources.designer.processor.grid.entity.numberRangeVar'),
label: $t('re.processor.grid.entity.numberRangeVar'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
requiredIf: true,
type: 'w-code-mirror',
lang: 'java',
rows: 3,
@ -66,7 +67,7 @@ class NumberRange extends Processor {
result.push({
colSpan: 12,
name: 'numberRange',
label: $t('re.resources.designer.processor.grid.entity.numberRange'),
label: $t('re.processor.grid.entity.numberRange'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -157,7 +158,7 @@ class NumberRange extends Processor {
}
public getViewerFields(): any {
return [{ name: 'numberRange', label: $t('re.resources.designer.processor.grid.entity.numberRange') }];
return [{ name: 'numberRange', label: $t('re.processor.grid.entity.numberRange') }];
}
public beforeEditorDataSubmit(args: any): void {

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

@ -49,7 +49,7 @@ class ObjectProperties extends Processor {
{
colSpan: 12,
name: 'objectCondition',
label: $t('re.resources.designer.processor.grid.entity.objectCondition'),
label: $t('re.processor.grid.entity.objectCondition'),
type: 'w-code-mirror',
lang: 'java',
rows: 3,
@ -64,12 +64,12 @@ class ObjectProperties extends Processor {
{
colSpan: 12,
name: 'objectProperties',
label: $t('re.resources.designer.processor.grid.entity.objectProperties'),
label: $t('re.processor.grid.entity.objectProperties'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
type: 'w-grid',
title: $t('re.resources.designer.processor.grid.entity.objectProperties'),
title: $t('re.processor.grid.entity.objectProperties'),
height: 400,
autoFetchData: false,
dbClickOperation: 'edit',
@ -137,7 +137,7 @@ class ObjectProperties extends Processor {
sortable: false,
format: (value: any, row: any) => {
if (row.expression) {
const expression = row.expression.replace(/\$\{(.+?)\.(.+?)\}/g, '$2');
const expression = row.expression.replace(/\$\{(.+?)\}\.\$\{(.+?)\}/g, '$2');
if (expression.trim() !== value.trim()) {
return `<span class='text-red-500'>` + value + '</span>';
}

4
io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts

@ -36,7 +36,7 @@ class OptionValue extends Processor {
{
colSpan: 12,
name: 'optionCode',
label: $t('re.resources.designer.processor.grid.entity.optionCode'),
label: $t('re.processor.grid.entity.optionCode'),
type: 'w-select',
options: this.optionOptionsRef,
showIf: (args: any) => {
@ -47,7 +47,7 @@ class OptionValue extends Processor {
}
public getViewerFields(): any {
return [{ name: 'optionCode', label: $t('re.resources.designer.processor.grid.entity.optionCode') }];
return [{ name: 'optionCode', label: $t('re.processor.grid.entity.optionCode') }];
}
public beforeEditorDataSubmit(args: any): void {}

2
io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts

@ -37,7 +37,7 @@ class Pmml extends Processor {
{
colSpan: 12,
name: 'pmml',
label: $t('re.resources.designer.processor.grid.entity.pmml'),
label: $t('re.processor.grid.entity.pmml'),
type: 'w-code-mirror',
rows: 20,
tabSize: 2,

4
io.sc.engine.rule.frontend/src/views/shared/processors/Rule.ts

@ -61,7 +61,7 @@ class Rule extends Processor {
{
colSpan: 12,
name: 'rule',
label: $t('re.resources.designer.processor.grid.entity.rule'),
label: $t('re.processor.grid.entity.rule'),
showIf: (args: any) => {
return args.form.getFieldValue('type') === this.PROCESSOR_TYPE;
},
@ -211,7 +211,7 @@ class Rule extends Processor {
}
public getViewerFields(): any {
return [{ name: 'rule', label: $t('re.resources.designer.processor.grid.entity.rule') }];
return [{ name: 'rule', label: $t('re.processor.grid.entity.rule') }];
}
public beforeEditorDataSubmit(args: any): void {

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save