Browse Source

update

main
wangshaoping 7 months ago
parent
commit
b097bce2a6
  1. 2
      erm.frontend/package.json
  2. 2
      gradle.properties
  3. 2
      io.sc.engine.mv.frontend/package.json
  4. 1
      io.sc.engine.rule.client.spring/build.gradle
  5. 23
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java
  6. 3
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/util/EngineSpringApplicationContextUtil.java
  7. 71
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/NumberRange.java
  8. 56
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Option.java
  9. 64
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ScoreCardItem.java
  10. 25
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ProcessorType.java
  11. 20
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ValueType.java
  12. 39
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterProcessor.java
  13. 25
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/ScoreCardParameterProcessor.java
  14. 14
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/Resource.java
  15. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ScoreCardResource.java
  16. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/NumberRangeScoreCardIndicatorVar.java
  17. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/NumberRangeScoreCardVar.java
  18. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/OptionScoreCardIndicatorVar.java
  19. 29
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/OptionScoreCardVar.java
  20. 21
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/ScoreCardIndicatorValueVar.java
  21. 36
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/ScoreCardIndicatorVar.java
  22. 53
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/ScoreCardVar.java
  23. 46
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties
  24. 48
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties
  25. 48
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties
  26. 2
      io.sc.engine.rule.frontend/package.json
  27. 5
      io.sc.engine.rule.frontend/src/i18n/messages.json
  28. 5
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  29. 5
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  30. 30
      io.sc.engine.rule.frontend/src/utils/ValueTypeUtil.ts
  31. 29
      io.sc.engine.rule.frontend/src/views/dictionary/dictionary.vue
  32. 17
      io.sc.engine.rule.frontend/src/views/lib/IndicatorGrid.vue
  33. 122
      io.sc.engine.rule.frontend/src/views/lib/ProcessorGrid.vue
  34. 14
      io.sc.engine.rule.frontend/src/views/resources/Resources.vue
  35. 2
      io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue
  36. 2
      io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue
  37. 144
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  38. 242
      io.sc.engine.rule.frontend/src/views/resources/designer/Processor.vue
  39. 6
      io.sc.engine.rule.frontend/src/views/shared/AutoCompletionManager.ts
  40. 32
      io.sc.engine.rule.frontend/src/views/shared/ObjectPropertiesMatcherDialog.vue
  41. 80
      io.sc.engine.rule.frontend/src/views/shared/Processor.ts
  42. 154
      io.sc.engine.rule.frontend/src/views/shared/ProcessorManager.ts
  43. 36
      io.sc.engine.rule.frontend/src/views/shared/processors/Arithmetic.ts
  44. 75
      io.sc.engine.rule.frontend/src/views/shared/processors/ConditionRange.ts
  45. 278
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable.ts
  46. 59
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTable2c.ts
  47. 17
      io.sc.engine.rule.frontend/src/views/shared/processors/DecisionTree.ts
  48. 17
      io.sc.engine.rule.frontend/src/views/shared/processors/ExecutionFlow.ts
  49. 38
      io.sc.engine.rule.frontend/src/views/shared/processors/GroovyScript.ts
  50. 38
      io.sc.engine.rule.frontend/src/views/shared/processors/MathFormula.ts
  51. 255
      io.sc.engine.rule.frontend/src/views/shared/processors/NumberRange.ts
  52. 87
      io.sc.engine.rule.frontend/src/views/shared/processors/ObjectProperties.ts
  53. 20
      io.sc.engine.rule.frontend/src/views/shared/processors/OptionValue.ts
  54. 22
      io.sc.engine.rule.frontend/src/views/shared/processors/Pmml.ts
  55. 17
      io.sc.engine.rule.frontend/src/views/shared/processors/Rule.ts
  56. 230
      io.sc.engine.rule.frontend/src/views/shared/processors/ScoreCard.ts
  57. 18
      io.sc.engine.rule.frontend/src/views/shared/processors/SingleRule.ts
  58. 59
      io.sc.engine.rule.frontend/src/views/shared/processors/Sql.ts
  59. 44
      io.sc.engine.rule.frontend/src/views/shared/processors/Ternary.ts
  60. 40
      io.sc.engine.rule.frontend/src/views/shared/processors/WhenThen.ts
  61. 3
      io.sc.engine.rule.frontend/src/views/shared/processors/index.ts
  62. 8
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java
  63. 70
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorEntityEventHandler.java
  64. 50
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/LibEntityEventHandler.java
  65. 96
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ScoreCardVarEntityEventHandler.java
  66. 21
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/LibServiceImpl.java
  67. 24
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/migration/service/impl/MigrationServiceImpl.java
  68. 14
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/migration/support/AllInOne.java
  69. 246
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterProcessorEntityConverter.java
  70. 19
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterProcessorEntity.java
  71. 97
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/ScoreCardParameterProcessorEntity.java
  72. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/ScoreCardParameterProcessorVo.java
  73. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/converter/ResourceEntityConverter.java
  74. 3
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ResourceEntity.java
  75. 120
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ScoreCardResourceEntity.java
  76. 17
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/repository/ResourceRepository.java
  77. 2
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/impl/ResourceServiceImpl.java
  78. 16
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/controller/ScoreCardVarWebController.java
  79. 171
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/converter/ScoreCardVarEntityConverter.java
  80. 66
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/NumberRangeScoreCardIndicatorVarEntity.java
  81. 66
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/NumberRangeScoreCardVarEntity.java
  82. 66
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/OptionScoreCardIndicatorVarEntity.java
  83. 69
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/OptionScoreCardVarEntity.java
  84. 50
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/ScoreCardIndicatorValueVarEntity.java
  85. 77
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/ScoreCardIndicatorVarEntity.java
  86. 155
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/ScoreCardVarEntity.java
  87. 28
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/exception/ScoreCardVarAlreadyExistsException.java
  88. 28
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/exception/ScoreCardVarCodeAndIndicatorCodeSameException.java
  89. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/repository/ScoreCardVarRepository.java
  90. 17
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/service/ScoreCardVarService.java
  91. 151
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/service/impl/ScoreCardVarServiceImpl.java
  92. 11
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/service/support/ScoreCardVarEntityChangedEvent.java
  93. 26
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/NumberRangeScoreCardIndicatorVarVo.java
  94. 23
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/NumberRangeScoreCardVarVo.java
  95. 24
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/OptionScoreCardIndicatorVarVo.java
  96. 24
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/OptionScoreCardVarVo.java
  97. 13
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/ScoreCardIndicatorValueVarVo.java
  98. 41
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/ScoreCardIndicatorVarVo.java
  99. 64
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/ScoreCardVarVo.java
  100. 136
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/bean/ScoreCardTestCaseParameterBuilder.java

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.414",
"platform-core": "8.1.416",
"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.414
platform_core_frontend_version=8.1.416
###########################################################
# dependencies version

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.414",
"platform-core": "8.1.416",
"quasar": "2.17.0",
"svg-path-commander": "2.0.10",
"tailwindcss": "3.4.10",

1
io.sc.engine.rule.client.spring/build.gradle

@ -2,7 +2,6 @@ dependencies {
api(
project(":io.sc.engine.rule.core"),
project(":io.sc.engine.rule.client"),
project(":io.sc.platform.mvc"),
)
}

23
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java

@ -1,19 +1,20 @@
package io.sc.engine.rule.client.spring.service.impl;
import io.sc.engine.rule.client.spring.service.LocalLoader;
import io.sc.engine.rule.core.classes.ResourceAbstract;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.client.spring.service.LocalLoader;
import io.sc.engine.rule.core.classes.ResourceAbstract;
import io.sc.engine.rule.core.code.impl.support.ResourceWrapper;
@Service("io.sc.engine.rule.client.spring.service.impl.LocalLoaderImpl")
public class LocalLoaderImpl implements LocalLoader{
private static final String RESOURCE_SERVICE_BEAN_NAME ="io.sc.engine.rule.server.resource.service.impl.ResourceServiceImpl";
@Autowired private ApplicationContext applicationContext;
private Map<String,ResourceWrapper> cache =new ConcurrentHashMap<String,ResourceWrapper>();
@ -24,7 +25,7 @@ public class LocalLoaderImpl implements LocalLoader{
@Override
public ResourceWrapper getResourceById(String resourceId) throws Exception {
Object bean =applicationContext.getBean("reResourceService");
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineById", String.class);
ResourceWrapper result =(ResourceWrapper)method.invoke(bean, resourceId);
@ -36,7 +37,7 @@ public class LocalLoaderImpl implements LocalLoader{
@Override
public ResourceWrapper getResourceByCode(String resourceCode, Integer version) throws Exception {
if(version==null) {//未指定版本时,不缓存,加载最新的
Object bean =applicationContext.getBean("reResourceService");
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class);
return (ResourceWrapper)method.invoke(bean, resourceCode,version);
@ -48,7 +49,7 @@ public class LocalLoaderImpl implements LocalLoader{
if(wrapper!=null) {
return wrapper;
}else {
Object bean =applicationContext.getBean("reResourceService");
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class);
wrapper =(ResourceWrapper)method.invoke(bean, resourceCode,version);
@ -71,7 +72,7 @@ public class LocalLoaderImpl implements LocalLoader{
@Override
@SuppressWarnings("unchecked")
public List<ResourceAbstract> getAllReleasableResourceAbstract() throws Exception {
Object bean =applicationContext.getBean("reResourceService");
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getAllReleasableResourceAbstract");
if(method!=null) {

3
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/util/EngineSpringApplicationContextUtil.java

@ -11,6 +11,7 @@ import org.springframework.context.ApplicationContext;
* 决策引擎中用于支持 spring 应用上下文辅助类
*/
public class EngineSpringApplicationContextUtil {
private static final String DATASOURCE_SERVICE_BEAN_NAME ="io.sc.platform.jdbc.service.impl.DatasourceServiceImpl";
private static ApplicationContext applicationContext; //静态属性,用于在脚本中直接通过静态类获取 spring 应用上下文
/**
@ -44,7 +45,7 @@ public class EngineSpringApplicationContextUtil {
* @throws Exception 违例
*/
public static DataSource getDataSource(String name) throws Exception {
Object datasourceService =applicationContext.getBean("frDatasourceService");
Object datasourceService =applicationContext.getBean(DATASOURCE_SERVICE_BEAN_NAME);
Method method =datasourceService.getClass().getMethod("getDatasource", String.class);
return (DataSource)method.invoke(datasourceService,name);
}

71
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/NumberRange.java

@ -1,22 +1,18 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.po.lib.Indicator;
import io.sc.engine.rule.core.po.lib.processor.NumberRangeIndicatorProcessor;
import io.sc.engine.rule.core.po.model.Parameter;
import io.sc.engine.rule.core.po.model.processor.NumberRangeParameterProcessor;
import io.sc.engine.rule.core.po.scorecard.NumberRangeScoreCardIndicatorVar;
import io.sc.engine.rule.core.po.scorecard.NumberRangeScoreCardVar;
import io.sc.engine.rule.core.po.scorecard.ScoreCardVar;
import io.sc.engine.rule.core.util.CodeReplacer;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.JacksonObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class NumberRange {
@ -157,62 +153,7 @@ public class NumberRange {
}
return null;
}
public static String generateGroovyCode(ScoreCardVar scoreCardVar) throws Exception{
try {
List<NumberRange> _numberRanges =null;
if(scoreCardVar instanceof NumberRangeScoreCardVar) {
_numberRanges =parse(((NumberRangeScoreCardVar)scoreCardVar).getNumberRange());
}else if(scoreCardVar instanceof NumberRangeScoreCardIndicatorVar) {
_numberRanges =parse(((NumberRangeScoreCardIndicatorVar)scoreCardVar).getNumberRange());
}else {
return null;
}
String parameterName =scoreCardVar.getCode();
String var ="${" + parameterName + "}";
String valueType ="java.math.BigDecimal";
if(_numberRanges!=null && _numberRanges.size()>0) {
StringBuilder sb =new StringBuilder();
int size =_numberRanges.size();
for(int i=0;i<size;i++) {
NumberRange numberRange =_numberRanges.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
if(numberRange.min==null && numberRange.max==null) {
sb.append(ExpressionReplacer.groovy(var, null)).append("==null");
}else if(numberRange.min!=null) {
if(numberRange.minIncluded!=null && numberRange.minIncluded) {
sb.append(ExpressionReplacer.groovy(var, null)).append(">=").append(numberRange.min);
}else {
sb.append(ExpressionReplacer.groovy(var, null)).append(">").append(numberRange.min);
}
}
if(numberRange.min!=null && numberRange.max!=null) {
sb.append(" && ");
}
if(numberRange.max!=null) {
if(numberRange.maxIncluded!=null && numberRange.maxIncluded) {
sb.append(ExpressionReplacer.groovy(var, null)).append("<=").append(numberRange.max);
}else {
sb.append(ExpressionReplacer.groovy(var, null)).append("<").append(numberRange.max);
}
}
sb.append(")").append("{").append("\n");
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".R_").append(parameterName).append(" =").append(ExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n");
sb.append("\t\t}");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + scoreCardVar.getName()+ "'s NumberRange groovy source code.", e);
}
return null;
}
public Boolean getMinIncluded() {
return minIncluded;
}

56
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Option.java

@ -1,15 +1,10 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import java.util.List;
import io.sc.engine.rule.core.po.scorecard.OptionScoreCardIndicatorVar;
import io.sc.engine.rule.core.po.scorecard.OptionScoreCardVar;
import io.sc.engine.rule.core.po.scorecard.ScoreCardVar;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.JacksonObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.util.JacksonObjectMapper;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class Option {
@ -26,51 +21,6 @@ public class Option {
return null;
}
public static String generateGroovyCode(ScoreCardVar scoreCardVar) throws Exception{
try {
List<Option> _options =null;
if(scoreCardVar instanceof OptionScoreCardVar) {
_options =parse(((OptionScoreCardVar)scoreCardVar).getOption());
}else if(scoreCardVar instanceof OptionScoreCardIndicatorVar) {
_options =parse(((OptionScoreCardIndicatorVar)scoreCardVar).getOption());
}else {
return null;
}
String parameterName =scoreCardVar.getCode();
String var ="${" + parameterName + "}";
String valueType ="java.lang.String";
String returnValueType ="java.math.BigDecimal";
if(_options!=null && _options.size()>0) {
StringBuilder sb =new StringBuilder();
int size =_options.size();
for(int i=0;i<size;i++) {
Option option =_options.get(i);
if(i==0) {
sb.append("if(");
}else {
sb.append("else if(");
}
if(option.value==null) {
sb.append(ExpressionReplacer.groovy(var, null)).append("==null || ").append(ExpressionReplacer.groovy(var, null)).append(".trim().isEmpty()");
}else {
if("java.lang.String".equals(valueType)) {
sb.append(ExpressionReplacer.groovy(var, null)).append("=='''").append(option.getValue()).append("'''");
}else {
sb.append(ExpressionReplacer.groovy(var, null)).append("==").append(option.getValue());
}
}
sb.append(")").append("{").append("\n");
sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".R_").append(parameterName).append(" =").append(ExpressionReplacer.groovy(option.score, returnValueType)).append(";\n");
sb.append("\t\t}");
}
return sb.toString();
}
}catch(Exception e) {
throw new RuntimeException("There was a Error when generate " + scoreCardVar.getName()+ "'s Option groovy source code.", e);
}
return null;
}
public String getUuid() {
return uuid;
}

64
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/ScoreCardItem.java

@ -0,0 +1,64 @@
package io.sc.engine.rule.core.code.impl.support.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.sc.engine.rule.core.enums.ProcessorType;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
public class ScoreCardItem {
private String code;
private String name;
private Double weight;
private ProcessorType type;
private List<ConditionRange> conditionRange;
private List<NumberRange> numberRange;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public ProcessorType getType() {
return type;
}
public void setType(ProcessorType type) {
this.type = type;
}
public List<ConditionRange> getConditionRange() {
return conditionRange;
}
public void setConditionRange(List<ConditionRange> conditionRange) {
this.conditionRange = conditionRange;
}
public List<NumberRange> getNumberRange() {
return numberRange;
}
public void setNumberRange(List<NumberRange> numberRange) {
this.numberRange = numberRange;
}
}

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

@ -4,23 +4,24 @@ package io.sc.engine.rule.core.enums;
* 处理器类型
*/
public enum ProcessorType {
EMPTY, //空操作
OBJECT_PROPERTIES, //对象属性, 处理对象的所有属性
OPTION_VALUE, //选项值
MATH_FORMULA, //数学公式
EMPTY, //空
ARITHMETIC, //算数运算
TERNARY, //三元操作
WHEN_THEN, //When then 运算
RULE, //规则
SINGLE_RULE, //单规则
NUMBER_RANGE, //数值分段函数
CONDITION_RANGE, //条件分段函数
DECISION_TABLE_2C, //简单决策表
DECISION_TABLE, //决策表
DECISION_TABLE_2C, //简单决策表
DECISION_TREE, //决策树
EXECUTION_FLOW, //执行流
PMML, //预测模型标记语言
GROOVY_SCRIPT, //groovy脚本
HTTP_REQUEST, //http 请求
MATH_FORMULA, //数学公式
NUMBER_RANGE, //数值分段函数
OBJECT_PROPERTIES, //对象属性, 处理对象的所有属性
OPTION_VALUE, //选项值
PMML, //pmml
RULE, //规则
SCORE_CARD, //评分卡
SINGLE_RULE, //单规则
SQL, //sql
HTTP_REQUEST //http 请求
TERNARY, //三元操作
WHEN_THEN; //When then 运算
}

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

@ -22,6 +22,8 @@ public enum ValueType {
Decimal, //小数
String, //字符串
Date, //日期
List, //列表
Map, //字典
RuleResult, //规则结果值
SingleRuleResult, //单规则结果值
ResourceAbstract; //资源摘要
@ -40,6 +42,10 @@ public enum ValueType {
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:
@ -65,6 +71,10 @@ public enum ValueType {
return "String";
case Date:
return "Date";
case List:
return "List";
case Map:
return "Map";
case RuleResult:
return "RuleResult";
case SingleRuleResult:
@ -89,6 +99,10 @@ public enum ValueType {
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)) {
@ -108,6 +122,8 @@ public enum ValueType {
|| 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)
@ -130,6 +146,10 @@ public enum ValueType {
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());

39
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/ParameterProcessor.java

@ -14,25 +14,26 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
*/
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=EmptyParameterProcessor.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=ObjectPropertiesParameterProcessor.class), //对象属性处理器
@JsonSubTypes.Type(value=OptionValueParameterProcessor.class), //选项操作处理器
@JsonSubTypes.Type(value=MathFormulaParameterProcessor.class), //数学公式处理器
@JsonSubTypes.Type(value=ArithmeticParameterProcessor.class), //算数操作处理器
@JsonSubTypes.Type(value=ConditionRangeParameterProcessor.class), //条件范围处理器
@JsonSubTypes.Type(value=DecisionTable2CParameterProcessor.class), //简单决策表处理器
@JsonSubTypes.Type(value=DecisionTableParameterProcessor.class), //决策表处理器
@JsonSubTypes.Type(value=DecisionTreeParameterProcessor.class), //决策树处理器
@JsonSubTypes.Type(value=EmptyParameterProcessor.class), //空处理器
@JsonSubTypes.Type(value=ExecutionFlowParameterProcessor.class), //执行流处理器
@JsonSubTypes.Type(value=NumberRangeParameterProcessor.class), //数值范围处理器
@JsonSubTypes.Type(value=PmmlParameterProcessor.class), //PMML处理器
@JsonSubTypes.Type(value=GroovyScriptParameterProcessor.class), //脚本代码处理器
@JsonSubTypes.Type(value=TernaryParameterProcessor.class), //三元操作处理器
@JsonSubTypes.Type(value=WhenThenParameterProcessor.class), //When-Then 操作处理器
@JsonSubTypes.Type(value=RuleParameterProcessor.class), //规则处理器
@JsonSubTypes.Type(value=SingleRuleParameterProcessor.class), //规则处理器
@JsonSubTypes.Type(value=SqlParameterProcessor.class), //SQL赋值处理器
@JsonSubTypes.Type(value=HttpRequestParameterProcessor.class) //Http请求处理器
@JsonSubTypes.Type(value=EmptyParameterProcessor.class), //空处理器
@JsonSubTypes.Type(value=ArithmeticParameterProcessor.class), //算数操作处理器
@JsonSubTypes.Type(value=ConditionRangeParameterProcessor.class), //条件范围处理器
@JsonSubTypes.Type(value=DecisionTableParameterProcessor.class), //决策表处理器
@JsonSubTypes.Type(value=DecisionTable2CParameterProcessor.class), //简单决策表处理器
@JsonSubTypes.Type(value=DecisionTreeParameterProcessor.class), //决策树处理器
@JsonSubTypes.Type(value=ExecutionFlowParameterProcessor.class), //执行流处理器
@JsonSubTypes.Type(value=GroovyScriptParameterProcessor.class), //脚本代码处理器
@JsonSubTypes.Type(value=HttpRequestParameterProcessor.class), //Http请求处理器
@JsonSubTypes.Type(value=MathFormulaParameterProcessor.class), //数学公式处理器
@JsonSubTypes.Type(value=NumberRangeParameterProcessor.class), //数值范围处理器
@JsonSubTypes.Type(value=ObjectPropertiesParameterProcessor.class), //对象属性处理器
@JsonSubTypes.Type(value=OptionValueParameterProcessor.class), //选项值处理器
@JsonSubTypes.Type(value=PmmlParameterProcessor.class), //PMML处理器
@JsonSubTypes.Type(value=RuleParameterProcessor.class), //规则处理器
@JsonSubTypes.Type(value=ScoreCardParameterProcessor.class), //评分卡处理器
@JsonSubTypes.Type(value=SingleRuleParameterProcessor.class), //单规则处理器
@JsonSubTypes.Type(value=SqlParameterProcessor.class), //Sql处理器
@JsonSubTypes.Type(value=TernaryParameterProcessor.class), //三元操作处理器
@JsonSubTypes.Type(value=WhenThenParameterProcessor.class), //When-Then 操作处理器
})
public abstract class ParameterProcessor {
protected String id; //ID,主键

25
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/processor/ScoreCardParameterProcessor.java

@ -0,0 +1,25 @@
package io.sc.engine.rule.core.po.model.processor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.po.model.ParameterProcessor;
@JsonTypeName("SCORE_CARD")
@JsonIgnoreProperties(ignoreUnknown=true)
public class ScoreCardParameterProcessor extends ParameterProcessor {
private String scoreCard;
public String getScoreCard() {
return scoreCard;
}
public void setScoreCard(String scoreCard) {
this.scoreCard = scoreCard;
}
@Override
public ProcessorType getType() {
return ProcessorType.SCORE_CARD;
}
}

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

@ -1,22 +1,20 @@
package io.sc.engine.rule.core.po.resource;
import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.core.po.testcase.ResourceTestCase;
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.ResourceType;
import io.sc.engine.rule.core.po.testcase.ResourceTestCase;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=FolderResource.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=FolderResource.class),
@JsonSubTypes.Type(value=ModelResource.class),
@JsonSubTypes.Type(value=ScoreCardResource.class)
@JsonSubTypes.Type(value=ModelResource.class)
})
public abstract class Resource {
protected String id; //Id

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ScoreCardResource.java

@ -1,29 +0,0 @@
package io.sc.engine.rule.core.po.resource;
import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.core.po.scorecard.ScoreCardVar;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("SCORE_CARD")
@JsonIgnoreProperties(ignoreUnknown=true)
public class ScoreCardResource extends ReleasableResource {
protected List<ScoreCardVar> scoreCardVars =new ArrayList<ScoreCardVar>();
public List<ScoreCardVar> getScoreCardVars() {
return scoreCardVars;
}
public void setScoreCardVars(List<ScoreCardVar> scoreCardVars) {
this.scoreCardVars = scoreCardVars;
}
@Override
public ResourceType getType() {
return ResourceType.SCORE_CARD;
}
}

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/NumberRangeScoreCardIndicatorVar.java

@ -1,29 +0,0 @@
package io.sc.engine.rule.core.po.scorecard;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 评分卡变量(数值分段)
* @author wangshaoping
*
*/
@JsonTypeName("INDICATOR_NUMBER_RANGE")
@JsonIgnoreProperties(ignoreUnknown=true)
public class NumberRangeScoreCardIndicatorVar extends ScoreCardIndicatorVar {
private String numberRange;//数值分段
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_NUMBER_RANGE;
}
public String getNumberRange() {
return numberRange;
}
public void setNumberRange(String numberRange) {
this.numberRange = numberRange;
}
}

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/NumberRangeScoreCardVar.java

@ -1,29 +0,0 @@
package io.sc.engine.rule.core.po.scorecard;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 评分卡变量(数值分段)
* @author wangshaoping
*
*/
@JsonTypeName("NUMBER_RANGE")
@JsonIgnoreProperties(ignoreUnknown=true)
public class NumberRangeScoreCardVar extends ScoreCardVar {
private String numberRange;//数值分段
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.NUMBER_RANGE;
}
public String getNumberRange() {
return numberRange;
}
public void setNumberRange(String numberRange) {
this.numberRange = numberRange;
}
}

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/OptionScoreCardIndicatorVar.java

@ -1,29 +0,0 @@
package io.sc.engine.rule.core.po.scorecard;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 评分卡变量(选项)
* @author wangshaoping
*
*/
@JsonTypeName("INDICATOR_OPTION")
@JsonIgnoreProperties(ignoreUnknown=true)
public class OptionScoreCardIndicatorVar extends ScoreCardIndicatorVar {
private String option;//选项
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_OPTION;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
}

29
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/OptionScoreCardVar.java

@ -1,29 +0,0 @@
package io.sc.engine.rule.core.po.scorecard;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 评分卡变量(选项)
* @author wangshaoping
*
*/
@JsonTypeName("OPTION")
@JsonIgnoreProperties(ignoreUnknown=true)
public class OptionScoreCardVar extends ScoreCardVar {
private String option;//选项
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.OPTION;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
}

21
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/ScoreCardIndicatorValueVar.java

@ -1,21 +0,0 @@
package io.sc.engine.rule.core.po.scorecard;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonTypeName;
/**
* 评分卡变量(指标值)
* @author wangshaoping
*
*/
@JsonTypeName("INDICATOR_VALUE")
@JsonIgnoreProperties(ignoreUnknown=true)
public class ScoreCardIndicatorValueVar extends ScoreCardIndicatorVar {
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_VALUE;
}
}

36
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/ScoreCardIndicatorVar.java

@ -1,36 +0,0 @@
package io.sc.engine.rule.core.po.scorecard;
/**
* 评分卡变量(指标)
* @author wangshaoping
*
*/
public abstract class ScoreCardIndicatorVar extends ScoreCardVar{
protected String libCode;//库代码
protected Integer libVersion;//库版本
protected String indicatorCode;//指标代码
public String getLibCode() {
return libCode;
}
public void setLibCode(String libCode) {
this.libCode = libCode;
}
public Integer getLibVersion() {
return libVersion;
}
public void setLibVersion(Integer libVersion) {
this.libVersion = libVersion;
}
public String getIndicatorCode() {
return indicatorCode;
}
public void setIndicatorCode(String indicatorCode) {
this.indicatorCode = indicatorCode;
}
}

53
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/scorecard/ScoreCardVar.java

@ -1,53 +0,0 @@
package io.sc.engine.rule.core.po.scorecard;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
* 评分卡变量
* @author wangshaoping
*
*/
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=OptionScoreCardVar.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=NumberRangeScoreCardVar.class), //数值分段
@JsonSubTypes.Type(value=OptionScoreCardVar.class), //选项
@JsonSubTypes.Type(value=NumberRangeScoreCardIndicatorVar.class), //数值分段(指标)
@JsonSubTypes.Type(value=OptionScoreCardIndicatorVar.class), //选项(指标)
@JsonSubTypes.Type(value=ScoreCardIndicatorValueVar.class) //指标值
})
public abstract class ScoreCardVar {
protected String id;//ID,主键
protected String code;//代码
protected String name;//名称
protected Integer order;//排序
public abstract ScoreCardVarType getType();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
}

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

@ -47,24 +47,25 @@ io.sc.engine.rule.core.enums.ParameterType.CONSTANT=Constant
# \u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ProcessorType.EMPTY=Empty
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=Object Properties
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=Option Value
io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA=Math Formula
io.sc.engine.rule.core.enums.ProcessorType.ARITHMETIC=Arithmetic
io.sc.engine.rule.core.enums.ProcessorType.TERNARY=Ternary
io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN=When-Then
io.sc.engine.rule.core.enums.ProcessorType.RULE=Rule
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=Single Rule
io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=Number Range
io.sc.engine.rule.core.enums.ProcessorType.CONDITION_RANGE=Condition Range
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE_2C=Simple Decision Table
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE=Decision Table
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TREE=Decision Tree
io.sc.engine.rule.core.enums.ProcessorType.EXECUTION_FLOW=Execution Flow
io.sc.engine.rule.core.enums.ProcessorType.PMML=PMML
io.sc.engine.rule.core.enums.ProcessorType.GROOVY_SCRIPT=Groovy Script
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL Asignment Value
io.sc.engine.rule.core.enums.ProcessorType.HTTP_REQUEST=Http Request
io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA=Math Formula
io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=Number Range
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=Object Properties
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=Option Value
io.sc.engine.rule.core.enums.ProcessorType.PMML=PMML
io.sc.engine.rule.core.enums.ProcessorType.RULE=Rule
io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=Score Card
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=Single Rule
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL Asignment Value
io.sc.engine.rule.core.enums.ProcessorType.TERNARY=Ternary
io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN=When-Then
#================================================
# HTTP \u8BF7\u6C42\u65B9\u6CD5\u679A\u4E3E
@ -86,23 +87,6 @@ io.sc.engine.rule.core.enums.HttpAuthorizationType.API_KEY=API Key
io.sc.engine.rule.core.enums.HttpAuthorizationType.BASIC_AUTH=Basic Auth
io.sc.engine.rule.core.enums.HttpAuthorizationType.BEARER=Bearer Token
#================================================
# \u53C2\u6570\u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ParameterProcessorType.optionParameterCode=Option Value
io.sc.engine.rule.core.enums.ParameterProcessorType.MATH_FORMULA=Math Formula
io.sc.engine.rule.core.enums.ParameterProcessorType.ARITHMETIC=Arithmetic
io.sc.engine.rule.core.enums.ParameterProcessorType.TERNARY=Ternary
io.sc.engine.rule.core.enums.ParameterProcessorType.WHEN_THEN=When-Then
io.sc.engine.rule.core.enums.ParameterProcessorType.NUMBER_RANGE=Number Range
io.sc.engine.rule.core.enums.ParameterProcessorType.CONDITION_RANGE=Condition Range
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TABLE_2C=Simple Decision Table
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TABLE=Decision Table
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TREE=Decision Tree
io.sc.engine.rule.core.enums.ParameterProcessorType.EXECUTION_FLOW=Execution Flow
io.sc.engine.rule.core.enums.ParameterProcessorType.PMML=PMML
io.sc.engine.rule.core.enums.ParameterProcessorType.SCRIPT=Script
#================================================
# \u6570\u636E\u5B57\u5178\u7C7B\u578B\u679A\u4E3E
#================================================
@ -130,14 +114,6 @@ io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE=Length Range
io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE=Date Range
io.sc.engine.rule.core.enums.ValidatorType.PATTERN=Regular Expression
# \u6307\u6807\u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
io.sc.engine.rule.core.enums.IndicatorProcessorType.ARITHMETIC=Arithmetic
io.sc.engine.rule.core.enums.IndicatorProcessorType.TERNARY=Ternary
io.sc.engine.rule.core.enums.IndicatorProcessorType.WHEN_THEN=When-Then
io.sc.engine.rule.core.enums.IndicatorProcessorType.NUMBER_RANGE=Number Range
io.sc.engine.rule.core.enums.IndicatorProcessorType.CONDITION_RANGE=Condition Range
io.sc.engine.rule.core.enums.IndicatorProcessorType.SCRIPT=Script
# \u6307\u6807\u7C7B\u578B\u679A\u4E3E
io.sc.engine.rule.core.enums.IndicatorType.INTERFACE=Interface
io.sc.engine.rule.core.enums.IndicatorType.INDICATOR=Indicator

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

@ -47,24 +47,25 @@ io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF
# \u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ProcessorType.EMPTY=\u7A7A
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5C0D\u8C61\u5C6C\u6027\u8CE6\u503C
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9078\u9805\u503C
io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA=\u6578\u5B78\u516C\u5F0F
io.sc.engine.rule.core.enums.ProcessorType.ARITHMETIC=\u7B97\u6578\u904B\u7B97
io.sc.engine.rule.core.enums.ProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN=When Then \u904B\u7B97
io.sc.engine.rule.core.enums.ProcessorType.RULE=\u898F\u5247
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u55AE\u898F\u5247
io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=\u6578\u503C\u5206\u6BB5\u51FD\u6578
io.sc.engine.rule.core.enums.ProcessorType.CONDITION_RANGE=\u689D\u4EF6\u5206\u6BB5\u51FD\u6578
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE_2C=\u7C21\u55AE\u6C7A\u7B56\u8868
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE=\u6C7A\u7B56\u8868
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TREE=\u6C7A\u7B56\u6A39
io.sc.engine.rule.core.enums.ProcessorType.EXECUTION_FLOW=\u57F7\u884C\u6D41
io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9810\u6E2C\u6A21\u578B\u6A19\u8A18\u8A9E\u8A00
io.sc.engine.rule.core.enums.ProcessorType.GROOVY_SCRIPT=Groovy \u8173\u672C\u4EE3\u78BC
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8CE6\u503C
io.sc.engine.rule.core.enums.ProcessorType.HTTP_REQUEST=Http \u8ACB\u6C42
io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA=\u6578\u5B78\u516C\u5F0F
io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=\u6578\u503C\u5206\u6BB5\u51FD\u6578
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5C0D\u8C61\u5C6C\u6027\u8CE6\u503C
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9078\u9805\u503C
io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9810\u6E2C\u6A21\u578B\u6A19\u8A18\u8A9E\u8A00
io.sc.engine.rule.core.enums.ProcessorType.RULE=\u898F\u5247
io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=\u8A55\u5206\u5361
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u55AE\u898F\u5247
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8CE6\u503C
io.sc.engine.rule.core.enums.ProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN=When Then \u904B\u7B97
#================================================
# HTTP \u8BF7\u6C42\u65B9\u6CD5\u679A\u4E3E
@ -86,23 +87,6 @@ io.sc.engine.rule.core.enums.HttpAuthorizationType.API_KEY=API Key
io.sc.engine.rule.core.enums.HttpAuthorizationType.BASIC_AUTH=Basic Auth
io.sc.engine.rule.core.enums.HttpAuthorizationType.BEARER=Bearer Token
#================================================
# \u53C2\u6570\u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ParameterProcessorType.OPTION_VALUE=\u9078\u9805\u503C
io.sc.engine.rule.core.enums.ParameterProcessorType.MATH_FORMULA=\u6578\u5B78\u516C\u5F0F
io.sc.engine.rule.core.enums.ParameterProcessorType.ARITHMETIC=\u7B97\u6578\u904B\u7B97
io.sc.engine.rule.core.enums.ParameterProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.ParameterProcessorType.WHEN_THEN=When Then \u904B\u7B97
io.sc.engine.rule.core.enums.ParameterProcessorType.NUMBER_RANGE=\u6578\u503C\u5206\u6BB5\u51FD\u6578
io.sc.engine.rule.core.enums.ParameterProcessorType.CONDITION_RANGE=\u689D\u4EF6\u5206\u6BB5\u51FD\u6578
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TABLE_2C=\u7C21\u55AE\u6C7A\u7B56\u8868
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TABLE=\u6C7A\u7B56\u8868
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TREE=\u6C7A\u7B56\u6A39
io.sc.engine.rule.core.enums.ParameterProcessorType.EXECUTION_FLOW=\u57F7\u884C\u6D41
io.sc.engine.rule.core.enums.ParameterProcessorType.PMML=\u9810\u6E2C\u6A21\u578B\u6A19\u8A18\u8A9E\u8A00
io.sc.engine.rule.core.enums.ParameterProcessorType.SCRIPT=\u8173\u672C\u4EE3\u78BC
#================================================
# \u6570\u636E\u5B57\u5178\u7C7B\u578B\u679A\u4E3E
#================================================
@ -130,16 +114,6 @@ io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE=\u9577\u5EA6\u7BC4\u570D
io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE=\u65E5\u671F\u7BC4\u570D
io.sc.engine.rule.core.enums.ValidatorType.PATTERN=\u6B63\u5247\u8868\u9054\u5F0F
# \u6307\u6807\u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
io.sc.engine.rule.core.enums.IndicatorProcessorType.ARITHMETIC=\u7B97\u6578\u904B\u7B97
io.sc.engine.rule.core.enums.IndicatorProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.IndicatorProcessorType.WHEN_THEN=When Then \u904B\u7B97
io.sc.engine.rule.core.enums.IndicatorProcessorType.NUMBER_RANGE=\u6578\u503C\u5206\u6BB5\u51FD\u6578
io.sc.engine.rule.core.enums.IndicatorProcessorType.CONDITION_RANGE=\u689D\u4EF6\u5206\u6BB5\u51FD\u6578
io.sc.engine.rule.core.enums.IndicatorProcessorType.DECISION_TABLE_2C=\u7C21\u55AE\u6C7A\u7B56\u8868
io.sc.engine.rule.core.enums.IndicatorProcessorType.DECISION_TABLE=\u6C7A\u7B56\u8868
io.sc.engine.rule.core.enums.IndicatorProcessorType.SCRIPT=\u8173\u672C\u4EE3\u78BC
# \u6307\u6807\u7C7B\u578B\u679A\u4E3E
io.sc.engine.rule.core.enums.IndicatorType.INTERFACE=\u63A5\u53E3
io.sc.engine.rule.core.enums.IndicatorType.INDICATOR=\u6307\u6A19

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

@ -47,24 +47,25 @@ io.sc.engine.rule.core.enums.ParameterType.CONSTANT=\u5E38\u91CF
# \u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ProcessorType.EMPTY=\u7A7A
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5BF9\u8C61\u5C5E\u6027\u8D4B\u503C
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9009\u9879\u503C
io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA=\u6570\u5B66\u516C\u5F0F
io.sc.engine.rule.core.enums.ProcessorType.ARITHMETIC=\u7B97\u6570\u8FD0\u7B97
io.sc.engine.rule.core.enums.ProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN=When Then \u8FD0\u7B97
io.sc.engine.rule.core.enums.ProcessorType.RULE=\u89C4\u5219
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u5355\u89C4\u5219
io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=\u6570\u503C\u5206\u6BB5\u51FD\u6570
io.sc.engine.rule.core.enums.ProcessorType.CONDITION_RANGE=\u6761\u4EF6\u5206\u6BB5\u51FD\u6570
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE_2C=\u7B80\u5355\u51B3\u7B56\u8868
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE=\u51B3\u7B56\u8868
io.sc.engine.rule.core.enums.ProcessorType.DECISION_TREE=\u51B3\u7B56\u6811
io.sc.engine.rule.core.enums.ProcessorType.EXECUTION_FLOW=\u6267\u884C\u6D41
io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9884\u6D4B\u6A21\u578B\u6807\u8BB0\u8BED\u8A00
io.sc.engine.rule.core.enums.ProcessorType.GROOVY_SCRIPT=Groovy \u811A\u672C\u4EE3\u7801
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8D4B\u503C
io.sc.engine.rule.core.enums.ProcessorType.HTTP_REQUEST=Http \u8BF7\u6C42
io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA=\u6570\u5B66\u516C\u5F0F
io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE=\u6570\u503C\u5206\u6BB5\u51FD\u6570
io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES=\u5BF9\u8C61\u5C5E\u6027\u8D4B\u503C
io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE=\u9009\u9879\u503C
io.sc.engine.rule.core.enums.ProcessorType.PMML=\u9884\u6D4B\u6A21\u578B\u6807\u8BB0\u8BED\u8A00
io.sc.engine.rule.core.enums.ProcessorType.RULE=\u89C4\u5219
io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD=\u8BC4\u5206\u5361
io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE=\u5355\u89C4\u5219
io.sc.engine.rule.core.enums.ProcessorType.SQL=SQL \u8D4B\u503C
io.sc.engine.rule.core.enums.ProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN=When Then \u8FD0\u7B97
#================================================
# HTTP \u8BF7\u6C42\u65B9\u6CD5\u679A\u4E3E
@ -86,23 +87,6 @@ io.sc.engine.rule.core.enums.HttpAuthorizationType.API_KEY=API Key
io.sc.engine.rule.core.enums.HttpAuthorizationType.BASIC_AUTH=Basic Auth
io.sc.engine.rule.core.enums.HttpAuthorizationType.BEARER=Bearer Token
#================================================
# \u53C2\u6570\u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ParameterProcessorType.OPTION_VALUE=\u9009\u9879\u503C
io.sc.engine.rule.core.enums.ParameterProcessorType.MATH_FORMULA=\u6570\u5B66\u516C\u5F0F
io.sc.engine.rule.core.enums.ParameterProcessorType.ARITHMETIC=\u7B97\u6570\u8FD0\u7B97
io.sc.engine.rule.core.enums.ParameterProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.ParameterProcessorType.WHEN_THEN=When Then \u8FD0\u7B97
io.sc.engine.rule.core.enums.ParameterProcessorType.NUMBER_RANGE=\u6570\u503C\u5206\u6BB5\u51FD\u6570
io.sc.engine.rule.core.enums.ParameterProcessorType.CONDITION_RANGE=\u6761\u4EF6\u5206\u6BB5\u51FD\u6570
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TABLE_2C=\u7B80\u5355\u51B3\u7B56\u8868
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TABLE=\u51B3\u7B56\u8868
io.sc.engine.rule.core.enums.ParameterProcessorType.DECISION_TREE=\u51B3\u7B56\u6811
io.sc.engine.rule.core.enums.ParameterProcessorType.EXECUTION_FLOW=\u6267\u884C\u6D41
io.sc.engine.rule.core.enums.ParameterProcessorType.PMML=\u9884\u6D4B\u6A21\u578B\u6807\u8BB0\u8BED\u8A00
io.sc.engine.rule.core.enums.ParameterProcessorType.SCRIPT=\u811A\u672C\u4EE3\u7801
#================================================
# \u6570\u636E\u5B57\u5178\u7C7B\u578B\u679A\u4E3E
#================================================
@ -130,16 +114,6 @@ io.sc.engine.rule.core.enums.ValidatorType.LENGTH_RANGE=\u957F\u5EA6\u8303\u56F4
io.sc.engine.rule.core.enums.ValidatorType.DATE_RANGE=\u65E5\u671F\u8303\u56F4
io.sc.engine.rule.core.enums.ValidatorType.PATTERN=\u6B63\u5219\u8868\u8FBE\u5F0F
# \u6307\u6807\u5904\u7406\u5668\u7C7B\u578B\u679A\u4E3E
io.sc.engine.rule.core.enums.IndicatorProcessorType.ARITHMETIC=\u7B97\u6570\u8FD0\u7B97
io.sc.engine.rule.core.enums.IndicatorProcessorType.TERNARY=\u4E09\u5143\u64CD\u4F5C
io.sc.engine.rule.core.enums.IndicatorProcessorType.WHEN_THEN=When Then \u8FD0\u7B97
io.sc.engine.rule.core.enums.IndicatorProcessorType.NUMBER_RANGE=\u6570\u503C\u5206\u6BB5\u51FD\u6570
io.sc.engine.rule.core.enums.IndicatorProcessorType.CONDITION_RANGE=\u6761\u4EF6\u5206\u6BB5\u51FD\u6570
io.sc.engine.rule.core.enums.IndicatorProcessorType.DECISION_TABLE_2C=\u7B80\u5355\u51B3\u7B56\u8868
io.sc.engine.rule.core.enums.IndicatorProcessorType.DECISION_TABLE=\u51B3\u7B56\u8868
io.sc.engine.rule.core.enums.IndicatorProcessorType.SCRIPT=\u811A\u672C\u4EE3\u7801
# \u6307\u6807\u7C7B\u578B\u679A\u4E3E
io.sc.engine.rule.core.enums.IndicatorType.INTERFACE=\u63A5\u53E3
io.sc.engine.rule.core.enums.IndicatorType.INDICATOR=\u6307\u6807

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.416",
"platform-core": "8.1.418",
"quasar": "2.17.0",
"svg-path-commander": "2.0.10",
"tailwindcss": "3.4.10",

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

@ -55,7 +55,7 @@
"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 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?",
@ -108,6 +108,8 @@
"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",
@ -232,6 +234,7 @@
"re.lib.tab.indicator.title": "Feature",
"re.lib.tab.testcase.title": "Test Case",
"re.indicator.grid.title": "Feature List",
"re.indicator.grid.toolbar.addInterface": "Interface",
"re.indicator.grid.toolbar.addIndicator": "Indicator",

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

@ -55,7 +55,7 @@
"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.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": "您確定要深度複製參數嗎?",
@ -108,6 +108,8 @@
"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": "添加條件行",
@ -232,6 +234,7 @@
"re.lib.tab.indicator.title": "特征",
"re.lib.tab.testcase.title": "試算用例",
"re.indicator.grid.title": "特征列表",
"re.indicator.grid.toolbar.addInterface": "接口",
"re.indicator.grid.toolbar.addIndicator": "指標",

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

@ -55,7 +55,7 @@
"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.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": "您确定要深度复制参数吗?",
@ -108,6 +108,8 @@
"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": "添加条件行",
@ -232,6 +234,7 @@
"re.lib.tab.indicator.title": "特征",
"re.lib.tab.testcase.title": "试算用例",
"re.indicator.grid.title": "特征列表",
"re.indicator.grid.toolbar.addInterface": "接口",
"re.indicator.grid.toolbar.addIndicator": "指标",

30
io.sc.engine.rule.frontend/src/utils/ValueTypeUtil.ts

@ -0,0 +1,30 @@
class ValueTypeUtil {
/**
*
* @param valueType
* @returns
*/
public static isBase(valueType: string) {
return (
valueType == 'java.lang.Boolean' ||
valueType == 'Boolean' ||
valueType == 'java.lang.Long' ||
valueType == 'Long' ||
valueType == 'java.lang.Float' ||
valueType == 'Float' ||
valueType == 'java.math.BigDecimal' ||
valueType == 'java.lang.String' ||
valueType == 'String' ||
valueType == 'java.util.Date' ||
valueType == 'java.util.List' ||
valueType == 'List' ||
valueType == 'java.util.Map' ||
valueType == 'Map' ||
valueType == 'io.sc.engine.rule.core.classes.ResourceAbstract' ||
valueType == 'io.sc.engine.rule.core.classes.RuleResult' ||
valueType == 'io.sc.engine.rule.core.classes.SingleRuleResult'
);
}
}
export { ValueTypeUtil };

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

@ -428,17 +428,7 @@
clearable: true,
options: valueTypeVersionOptionsRef,
showIf: (arg) => {
var type = arg.form.getFieldValue('valueType');
if (
type == 'java.lang.Boolean' ||
type == 'java.lang.Long' ||
type == 'java.math.BigDecimal' ||
type == 'java.lang.String' ||
type == 'java.util.Date'
) {
return false;
}
return true;
return !ValueTypeUtil.isBase();
},
},
{
@ -505,21 +495,7 @@
const valueType = fieldGridRef.getEditorForm().getFieldValue('valueType');
if (valueType) {
if (
valueType !== 'java.lang.Boolean' &&
valueType !== 'java.lang.Long' &&
valueType !== 'java.lang.Float' &&
valueType !== 'Float' &&
valueType !== 'java.math.BigDecimal' &&
valueType !== 'java.lang.String' &&
valueType !== 'java.util.Date' &&
valueType !== 'io.sc.engine.rule.core.classes.ResourceAbstract' &&
valueType !== 'io.sc.engine.rule.core.classes.RuleResult' &&
valueType !== 'io.sc.engine.rule.core.classes.SingleRuleResult' &&
!valueType.startsWith('List') &&
!valueType.startsWith('Map') &&
ValueTypeMap[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 = [];
@ -609,6 +585,7 @@
import 'tailwindcss/utilities.css';
import { ref, reactive } from 'vue';
import { axios, Environment, Formater, EnumTools, DialogManager, Downloader } from 'platform-core';
import { ValueTypeUtil } from '@/utils/ValueTypeUtil';
import UserDefinedJavaClassDictionaryJsonDialog from './UserDefinedJavaClassDictionaryJsonDialog.vue';
import ImportDialog from './ImportDialog.vue';
import ImportSampleDialog from './ImportSampleDialog.vue';

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

@ -2,7 +2,7 @@
<div style="height: 100%">
<w-grid
ref="gridRef"
:title="$t('re.lib.tab.indicator.title')"
:title="$t('re.indicator.grid.title')"
draggable="server"
dense
hide-bottom
@ -162,20 +162,7 @@
showIf: (arg) => {
const valueType = arg.form.getFieldValue('valueType');
if (valueType) {
if (
valueType == 'java.lang.Boolean' ||
valueType == 'java.lang.Long' ||
valueType == 'java.lang.Float' ||
valueType == 'Float' ||
valueType == 'java.math.BigDecimal' ||
valueType == 'java.lang.String' ||
valueType == 'java.util.Date' ||
valueType == 'io.sc.engine.rule.core.classes.ResourceAbstract' ||
valueType == 'io.sc.engine.rule.core.classes.RuleResult' ||
valueType == 'io.sc.engine.rule.core.classes.SingleRuleResult' ||
valueType.startsWith('List') ||
valueType.startsWith('Map')
) {
if (ValueTypeUtil.isBase(valueType)) {
return false;
} else if (Tools.isUndefinedOrNull(ValueTypeMap[valueType])) {
return false;

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

@ -26,15 +26,15 @@
return !readOnly;
},
},
ObjectProperties.getToolbarAction(indicator),
MathFormula.getToolbarAction(indicator),
Arithmetic.getToolbarAction(indicator),
Ternary.getToolbarAction(indicator),
WhenThen.getToolbarAction(indicator),
NumberRange.getToolbarAction(indicator),
ConditionRange.getToolbarAction(indicator),
GroovyScript.getToolbarAction(indicator),
Sql.getToolbarAction(indicator),
objectProperties.getToolbarAction(indicator),
mathFormula.getToolbarAction(indicator),
arithmetic.getToolbarAction(indicator),
ternary.getToolbarAction(indicator),
whenThen.getToolbarAction(indicator),
numberRange.getToolbarAction(indicator),
conditionRange.getToolbarAction(indicator),
groovyScript.getToolbarAction(indicator),
sql.getToolbarAction(indicator),
],
{
extend: 'clone',
@ -78,23 +78,23 @@
format: (value, row) => {
switch (row.type) {
case 'ARITHMETIC':
return Arithmetic.format(row);
return arithmetic.format(row);
case 'CONDITION_RANGE':
return ConditionRange.format(row);
return conditionRange.format(row);
case 'GROOVY_SCRIPT':
return GroovyScript.format(row);
return groovyScript.format(row);
case 'MATH_FORMULA':
return MathFormula.format(row);
return mathFormula.format(row);
case 'NUMBER_RANGE':
return NumberRange.format(row);
return numberRange.format(row);
case 'OBJECT_PROPERTIES':
return ObjectProperties.format(row);
return objectProperties.format(row);
case 'SQL':
return Sql.format(row);
return sql.format(row);
case 'TERNARY':
return Ternary.format(row);
return ternary.format(row);
case 'WHEN_THEN':
return WhenThen.format(row);
return whenThen.format(row);
}
return '';
},
@ -112,15 +112,15 @@
{ colSpan: 5, name: 'order', label: $t('order'), type: 'w-number', showIf: false },
{ colSpan: 5, name: 'type', label: $t('type'), type: 'w-text', showIf: false },
...Arithmetic.getEditorFields(),
...ConditionRange.getEditorFields({ gridRef }),
...GroovyScript.getEditorFields(),
...MathFormula.getEditorFields(),
...NumberRange.getEditorFields({ gridRef }),
...ObjectProperties.getEditorFields({ gridRef, objectPropertiesMatcherDialogRef }),
...Sql.getEditorFields({ gridRef }),
...Ternary.getEditorFields(),
...WhenThen.getEditorFields(),
...arithmetic.getEditorFields(),
...conditionRange.getEditorFields(),
...groovyScript.getEditorFields(),
...mathFormula.getEditorFields(),
...numberRange.getEditorFields(),
...objectProperties.getEditorFields({ objectPropertiesMatcherDialogRef }),
...sql.getEditorFields(),
...ternary.getEditorFields(),
...whenThen.getEditorFields(),
],
},
}"
@ -135,15 +135,15 @@
{ name: 'enable', label: $t('enable') },
{ name: 'type', label: $t('type') },
...Arithmetic.getViewerFields(),
...ConditionRange.getViewerFields(),
...GroovyScript.getViewerFields(),
...MathFormula.getViewerFields(),
...NumberRange.getViewerFields(),
...ObjectProperties.getViewerFields(),
...Sql.getViewerFields(),
...Ternary.getViewerFields(),
...WhenThen.getViewerFields(),
...arithmetic.getViewerFields(),
...conditionRange.getViewerFields(),
...groovyScript.getViewerFields(),
...mathFormula.getViewerFields(),
...numberRange.getViewerFields(),
...objectProperties.getViewerFields(),
...sql.getViewerFields(),
...ternary.getViewerFields(),
...whenThen.getViewerFields(),
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
@ -157,49 +157,48 @@
(args) => {
switch (args.data.type) {
case 'ARITHMETIC':
return Arithmetic.beforeEditorDataSubmit(args);
return arithmetic.beforeEditorDataSubmit(args);
case 'CONDITION_RANGE':
return ConditionRange.beforeEditorDataSubmit(args);
return conditionRange.beforeEditorDataSubmit(args);
case 'GROOVY_SCRIPT':
return GroovyScript.beforeEditorDataSubmit(args);
return groovyScript.beforeEditorDataSubmit(args);
case 'MATH_FORMULA':
return MathFormula.beforeEditorDataSubmit(args);
return mathFormula.beforeEditorDataSubmit(args);
case 'NUMBER_RANGE':
return NumberRange.beforeEditorDataSubmit(args);
return numberRange.beforeEditorDataSubmit(args);
case 'OBJECT_PROPERTIES':
return ObjectProperties.beforeEditorDataSubmit(args);
return objectProperties.beforeEditorDataSubmit(args);
case 'SQL':
return Sql.beforeEditorDataSubmit(args);
return sql.beforeEditorDataSubmit(args);
case 'TERNARY':
return Ternary.beforeEditorDataSubmit(args);
return ternary.beforeEditorDataSubmit(args);
case 'WHEN_THEN':
return WhenThen.beforeEditorDataSubmit(args);
return whenThen.beforeEditorDataSubmit(args);
}
}
"
@after-editor-open="
(args) => {
args.type = 'indicator';
args.indicator = indicator;
args.target = indicator;
switch (args.grid.getEditorForm().getFieldValue('type')) {
case 'ARITHMETIC':
return Arithmetic.afterEditorOpen(args);
return arithmetic.afterEditorOpen(args);
case 'CONDITION_RANGE':
return ConditionRange.afterEditorOpen(args);
return conditionRange.afterEditorOpen(args);
case 'GROOVY_SCRIPT':
return GroovyScript.afterEditorOpen(args);
return groovyScript.afterEditorOpen(args);
case 'MATH_FORMULA':
return MathFormula.afterEditorOpen(args);
return mathFormula.afterEditorOpen(args);
case 'NUMBER_RANGE':
return NumberRange.afterEditorOpen(args);
return numberRange.afterEditorOpen(args);
case 'OBJECT_PROPERTIES':
return ObjectProperties.afterEditorOpen(args);
return objectProperties.afterEditorOpen(args);
case 'SQL':
return Sql.afterEditorOpen(args);
return sql.afterEditorOpen(args);
case 'TERNARY':
return Ternary.afterEditorOpen(args);
return ternary.afterEditorOpen(args);
case 'WHEN_THEN':
return WhenThen.afterEditorOpen(args);
return whenThen.afterEditorOpen(args);
}
}
"
@ -221,10 +220,21 @@
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { axios, Environment, Formater } from 'platform-core';
import { Processor } from '@/views/shared/Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import ObjectPropertiesMatcherDialog from '@/views/shared/ObjectPropertiesMatcherDialog.vue';
import { Arithmetic, ConditionRange, GroovyScript, MathFormula, NumberRange, ObjectProperties, Sql, Ternary, WhenThen } from '@/views/shared/processors';
const arithmetic = new Arithmetic(Processor.INDICATOR);
const conditionRange = new ConditionRange(Processor.INDICATOR);
const groovyScript = new GroovyScript(Processor.INDICATOR);
const mathFormula = new MathFormula(Processor.INDICATOR);
const numberRange = new NumberRange(Processor.INDICATOR);
const objectProperties = new ObjectProperties(Processor.INDICATOR);
const sql = new Sql(Processor.INDICATOR);
const ternary = new Ternary(Processor.INDICATOR);
const whenThen = new WhenThen(Processor.INDICATOR);
const props = defineProps({
indicator: { type: Object, default: undefined },
readOnly: { type: Boolean, default: false },

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

@ -15,8 +15,6 @@
return { name: 'folder', color: 'amber' };
} else if (row.type === 'MODEL') {
return { name: 'bi-boxes' };
} else if (row.type === 'SCORE_CARD') {
return { name: 'bi-card-list' };
} else {
return { name: row.icon };
}
@ -65,18 +63,6 @@
arg.grid.getEditorForm().setFieldValue('type', 'MODEL');
},
},
{
extend: 'addChild',
name: 'addScoreCard',
label: $t('re.resources.grid.toolbar.addScoreCard'),
icon: 'bi-card-list',
enableIf: (arg) => {
return arg.selected && arg.selected.type === 'FOLDER';
},
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'SCORE_CARD');
},
},
'separator',
'clone',
{

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

@ -351,7 +351,7 @@ const findResourceAbstractByCodeAndVersion = (code, version) => {
};
const open = async (parameterId, processorId) => {
autoCompletionManager.load(parameterId);
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + parameterId));
userDefinedFunctionsManager.load();
processorIdRef.value = processorId;

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

@ -533,7 +533,7 @@ const findResourceAbstractByCodeAndVersion = (code, version) => {
};
const open = async (parameterId, processorId) => {
autoCompletionManager.load(parameterId);
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + parameterId));
userDefinedFunctionsManager.load();
processorIdRef.value = processorId;

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

@ -23,7 +23,7 @@
{
extend: 'add',
click: undefined,
enableIf: (arg) => {
enableIf: (args) => {
return !readOnly;
},
},
@ -32,8 +32,8 @@
name: 'constant',
label: $t('re.resources.designer.parameter.grid.toolbar.add.constant'),
icon: 'bi-tag',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'CONSTANT');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'CONSTANT');
},
},
'separator',
@ -42,8 +42,8 @@
name: 'in',
label: $t('re.resources.designer.parameter.grid.toolbar.add.in'),
icon: 'bi-terminal',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'IN');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'IN');
},
},
{
@ -51,8 +51,9 @@
name: 'inOption',
label: $t('re.resources.designer.parameter.grid.toolbar.add.inOption'),
icon: 'bi-list-check',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'IN_OPTION');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'IN_OPTION');
args.grid.getEditorForm().setFieldValue('valueType', 'java.lang.String');
},
},
{
@ -60,7 +61,7 @@
name: 'indicator',
label: $t('re.resources.designer.parameter.grid.toolbar.add.indicator'),
icon: 'bi-link',
click: (arg) => {
click: (args) => {
selectIndicatorDialogRef.open();
},
},
@ -70,8 +71,8 @@
name: 'intermediate',
label: $t('re.resources.designer.parameter.grid.toolbar.add.intermediate'),
icon: 'bi-superscript',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'INTERMEDIATE');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'INTERMEDIATE');
},
},
{
@ -79,8 +80,8 @@
name: 'out',
label: $t('re.resources.designer.parameter.grid.toolbar.add.out'),
icon: 'bi-shuffle',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'OUT');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'OUT');
},
},
'separator',
@ -89,8 +90,8 @@
name: 'ruleResult',
label: $t('re.resources.designer.parameter.grid.toolbar.add.ruleResult'),
icon: 'bi-sliders',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'RULE_RESULT');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'RULE_RESULT');
},
},
{
@ -98,8 +99,8 @@
name: 'singleRuleResult',
label: $t('re.resources.designer.parameter.grid.toolbar.add.singleRuleResult'),
icon: 'bi-lightning',
afterClick: (arg) => {
arg.grid.getEditorForm().setFieldValue('type', 'SINGLE_RULE_RESULT');
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'SINGLE_RULE_RESULT');
},
},
'separator',
@ -112,8 +113,8 @@
'separator',
{
extend: 'clone',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args) => {
return !readOnly && args.selected;
},
},
{
@ -121,12 +122,12 @@
name: 'deepClone',
label: $t('deepClone'),
icon: 'bi-copy',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args) => {
return !readOnly && args.selected;
},
click: (arg) => {
click: (args) => {
DialogManager.confirm($t('re.resources.designer.parameter.grid.toolbar.deepClone.tip'), () => {
axios.post(Environment.apiContextPath('/api/re/model/parameter/deepClone/' + arg.selected.id)).then(() => {
axios.post(Environment.apiContextPath('/api/re/model/parameter/deepClone/' + args.selected.id)).then(() => {
gridRef.refresh();
});
});
@ -134,14 +135,14 @@
},
{
extend: 'edit',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args) => {
return !readOnly && args.selected;
},
},
{
extend: 'remove',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args) => {
return !readOnly && args.selected;
},
},
'separator',
@ -149,10 +150,10 @@
name: 'move',
label: $t('re.resources.designer.parameter.grid.toolbar.move'),
icon: 'bi-share-fill',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args) => {
return !readOnly && args.selected;
},
click: (arg) => {
click: (args) => {
moveParameterDialogRef.open();
},
},
@ -217,8 +218,8 @@
label: $t('re.resources.designer.parameter.grid.entity.libCode'),
type: 'w-select',
options: libCodeOptionsRef,
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'INDICATOR';
},
'onUpdate:modelValue': (value) => {
@ -230,8 +231,8 @@
label: $t('re.resources.designer.parameter.grid.entity.libVersion'),
type: 'w-select',
options: libVersionOptionsRef,
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'INDICATOR';
},
'onUpdate:modelValue': (value) => {
@ -244,8 +245,8 @@
label: $t('re.resources.designer.parameter.grid.entity.indicatorCode'),
type: 'w-select',
options: indicatorCodeOptionsRef,
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
showIf: (args) => {
const type = args.form.getFieldValue('type');
return type === 'INDICATOR';
},
},
@ -255,8 +256,8 @@
type: 'w-select',
options: ValueTypeList,
defaultValue: 'java.math.BigDecimal',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
showIf: (args) => {
const type = args.form.getFieldValue('type');
if (type == 'INDICATOR' || type == 'IN_OPTION' || type == 'RULE_RESULT' || type == 'SINGLE_RULE_RESULT') {
return false;
}
@ -280,27 +281,14 @@
type: 'w-select',
clearable: true,
options: valueTypeVersionOptionsRef,
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
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 = arg.form.getFieldValue('valueType');
const valueType = args.form.getFieldValue('valueType');
if (valueType) {
if (
valueType == 'java.lang.Boolean' ||
valueType == 'java.lang.Long' ||
valueType == 'java.lang.Float' ||
valueType == 'Float' ||
valueType == 'java.math.BigDecimal' ||
valueType == 'java.lang.String' ||
valueType == 'java.util.Date' ||
valueType == 'io.sc.engine.rule.core.classes.ResourceAbstract' ||
valueType == 'io.sc.engine.rule.core.classes.RuleResult' ||
valueType == 'io.sc.engine.rule.core.classes.SingleRuleResult' ||
valueType.startsWith('List') ||
valueType.startsWith('Map')
) {
if (ValueTypeUtil.isBase(valueType)) {
return false;
} else if (Tools.isUndefinedOrNull(ValueTypeMap[valueType])) {
return false;
@ -316,9 +304,9 @@
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');
showIf: (args) => {
const valueType = args.form.getFieldValue('valueType');
const type = args.form.getFieldValue('type');
if (
valueType == 'java.math.BigDecimal' &&
type != 'INDICATOR' &&
@ -337,9 +325,9 @@
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');
showIf: (args) => {
const valueType = args.form.getFieldValue('valueType');
const type = args.form.getFieldValue('type');
if (
valueType == 'java.math.BigDecimal' &&
type != 'INDICATOR' &&
@ -357,8 +345,8 @@
label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'),
type: 'w-checkbox',
defaultValue: false,
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
showIf: (args) => {
const type = args.form.getFieldValue('type');
if (type == 'IN_OPTION' || type == 'INDICATOR' || type == 'RULE_RESULT' || type == 'SINGLE_RULE_RESULT') {
return false;
}
@ -369,9 +357,9 @@
name: 'defaultValue',
label: $t('defaultValue'),
type: 'w-text',
showIf: (arg) => {
const type = arg.form.getFieldValue('type');
const valueTypeIsList = arg.form.getFieldValue('valueTypeIsList');
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;
}
@ -418,13 +406,13 @@
}
"
@before-request-data="
() => {
(args) => {
emit('beforeRequestData');
}
"
@after-editor-open="
(row) => {
const type = gridRef.getEditorForm().getFieldValue('type');
(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);
@ -433,24 +421,9 @@
indicatorCodeOptionsRef = IndicatorManager.getIndicatorMap(row.libCode, row.libVersion);
});
}
const valueType = gridRef.getEditorForm().getFieldValue('valueType');
const valueType = args.grid.getEditorForm().getFieldValue('valueType');
if (valueType) {
if (
valueType !== 'java.lang.Boolean' &&
valueType !== 'java.lang.Long' &&
valueType !== 'java.lang.Float' &&
valueType !== 'Float' &&
valueType !== 'java.math.BigDecimal' &&
valueType !== 'java.lang.String' &&
valueType !== 'java.util.Date' &&
valueType !== 'io.sc.engine.rule.core.classes.ResourceAbstract' &&
valueType !== 'io.sc.engine.rule.core.classes.RuleResult' &&
valueType !== 'io.sc.engine.rule.core.classes.SingleRuleResult' &&
!valueType.startsWith('List') &&
!valueType.startsWith('Map') &&
ValueTypeMap[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 = [];
@ -472,6 +445,7 @@
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 SelectIndicatorDialog from '@/views/shared/SelectIndicatorDialog.vue';
import MoveParameterDialog from '@/views/shared/MoveParameterDialog.vue';

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

@ -3,7 +3,7 @@
<w-grid
ref="gridRef"
:title="$t('re.resources.designer.processor.grid.title')"
draggable="server"
dnd-mode="server"
dense-body
class="px-1"
hide-bottom
@ -22,72 +22,56 @@
[
{
extend: 'add',
enableIf: (arg) => {
enableIf: (args: any) => {
return !readOnly;
},
click: undefined,
},
ObjectProperties.getToolbarAction(parameter),
OptionValue.getToolbarAction(parameter),
MathFormula.getToolbarAction(parameter),
Arithmetic.getToolbarAction(parameter),
Ternary.getToolbarAction(parameter),
WhenThen.getToolbarAction(parameter),
NumberRange.getToolbarAction(parameter),
ConditionRange.getToolbarAction(parameter),
DecisionTable2c.getToolbarAction(parameter),
DecisionTable.getToolbarAction(parameter),
DecisionTree.getToolbarAction(parameter),
ExecutionFlow.getToolbarAction(parameter),
Pmml.getToolbarAction(parameter),
GroovyScript.getToolbarAction(parameter),
Sql.getToolbarAction(parameter),
Rule.getToolbarAction(parameter),
SingleRule.getToolbarAction(parameter),
...processorManager.getToolbarAction(parameter),
],
{
extend: 'edit',
name: 'customEdit',
enableIf: (arg) => {
return arg.selected;
enableIf: (args: any) => {
return args.selected;
},
click: (arg) => {
const type = arg.selected?.type;
click: (args: any) => {
const type = args.selected?.type;
if ('DECISION_TREE' === type) {
decisionTreeDialogRef.open(parameter.id, arg.selected?.id);
decisionTreeDialogRef.open(parameter.id, args.selected?.id);
} else if ('EXECUTION_FLOW' === type) {
executionFlowDialogRef.open(parameter.id, arg.selected?.id);
executionFlowDialogRef.open(parameter.id, args.selected?.id);
} else {
arg._click(arg);
args._click(args);
}
},
},
{
extend: 'remove',
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args: any) => {
return !readOnly && args.selected;
},
},
'separator',
{
name: 'enable',
label: (arg) => {
if (arg.selected?.enable) {
label: (args: any) => {
if (args.selected?.enable) {
return $t('disable');
}
return $t('enable');
},
icon: (arg) => {
if (arg.selected?.enable) {
icon: (args: any) => {
if (args.selected?.enable) {
return 'bi-x';
}
return 'bi-check';
},
enableIf: (arg) => {
return !readOnly && arg.selected;
enableIf: (args: any) => {
return !readOnly && args.selected;
},
click: (arg) => {
const data = arg.selected;
click: (args: any) => {
const data = args.selected;
data.enable = !data.enable;
axios.put(Environment.apiContextPath('/api/re/model/parameter/processor/' + data.id), data).then((response) => {
gridRef.updateLocalData(response.data);
@ -116,50 +100,15 @@
name: 'content',
label: $t('re.resources.designer.processor.grid.entity.content'),
sortable: false,
title: () => {},
format: (value, row) => {
switch (row.type) {
case 'ARITHMETIC':
return Arithmetic.format(row);
case 'CONDITION_RANGE':
return ConditionRange.format(row);
case 'DECISION_TABLE':
return DecisionTable.format(row);
case 'DECISION_TABLE_2C':
return DecisionTable2c.format(row);
case 'DECISION_TREE':
return DecisionTree.format(row);
case 'EXECUTION_FLOW':
return ExecutionFlow.format(row);
case 'GROOVY_SCRIPT':
return GroovyScript.format(row);
case 'MATH_FORMULA':
return MathFormula.format(row);
case 'NUMBER_RANGE':
return NumberRange.format(row);
case 'OBJECT_PROPERTIES':
return ObjectProperties.format(row);
case 'OPTION_VALUE':
return OptionValue.format(row);
case 'PMML':
return Pmml.format(row);
case 'RULE':
return Rule.format(row);
case 'SINGLE_RULE':
return SingleRule.format(row);
case 'SQL':
return Sql.format(row);
case 'TERNARY':
return Ternary.format(row);
case 'WHEN_THEN':
return WhenThen.format(row);
}
return '';
return processorManager.format(value, row);
},
},
]"
:editor="{
dialog: {
width: editorDialogWidthRef,
width: '50%',
},
form: {
colsNum: 5,
@ -170,24 +119,7 @@
{ colSpan: 5, name: 'type', label: $t('type'), type: 'w-text', showIf: false },
{ colSpan: 5, name: 'description', label: $t('description'), type: 'w-text', showIf: false },
{ colSpan: 5, name: 'enable', label: $t('enable'), type: 'w-checkbox', defaultValue: true, showIf: false },
...Arithmetic.getEditorFields(),
...ConditionRange.getEditorFields({ gridRef }),
...DecisionTable.getEditorFields({ gridRef }),
...DecisionTable2c.getEditorFields({ gridRef }),
...DecisionTree.getEditorFields(),
...ExecutionFlow.getEditorFields(),
...GroovyScript.getEditorFields(),
...MathFormula.getEditorFields(),
...NumberRange.getEditorFields({ gridRef }),
...ObjectProperties.getEditorFields({ gridRef, objectPropertiesMatcherDialogRef }),
...OptionValue.getEditorFields(),
...Pmml.getEditorFields({}),
...Rule.getEditorFields({}),
...SingleRule.getEditorFields({}),
...Sql.getEditorFields({ gridRef }),
...Ternary.getEditorFields(),
...WhenThen.getEditorFields(),
...processorManager.getEditorFields({ objectPropertiesMatcherDialogRef }),
],
},
}"
@ -201,25 +133,7 @@
{ name: 'description', label: $t('description') },
{ name: 'enable', label: $t('enable') },
{ name: 'type', label: $t('type') },
...Arithmetic.getViewerFields(),
...ConditionRange.getViewerFields(),
...DecisionTable.getViewerFields(),
...DecisionTable2c.getViewerFields(),
...DecisionTree.getViewerFields(),
...ExecutionFlow.getViewerFields(),
...GroovyScript.getViewerFields(),
...MathFormula.getViewerFields(),
...NumberRange.getViewerFields(),
...ObjectProperties.getViewerFields(),
...OptionValue.getViewerFields(),
...Pmml.getViewerFields(),
...Rule.getViewerFields(),
...SingleRule.getViewerFields(),
...Sql.getViewerFields(),
...Ternary.getViewerFields(),
...WhenThen.getViewerFields(),
...processorManager.getViewerFields(),
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
@ -230,88 +144,13 @@
}"
@before-editor-data-submit="
(args) => {
switch (args.data.type) {
case 'ARITHMETIC':
return Arithmetic.beforeEditorDataSubmit(args);
case 'CONDITION_RANGE':
return ConditionRange.beforeEditorDataSubmit(args);
case 'DECISION_TABLE':
return DecisionTable.beforeEditorDataSubmit(args);
case 'DECISION_TABLE_2C':
return DecisionTable2c.beforeEditorDataSubmit(args);
case 'DECISION_TREE':
return DecisionTree.beforeEditorDataSubmit(args);
case 'EXECUTION_FLOW':
return ExecutionFlow.beforeEditorDataSubmit(args);
case 'GROOVY_SCRIPT':
return GroovyScript.beforeEditorDataSubmit(args);
case 'MATH_FORMULA':
return MathFormula.beforeEditorDataSubmit(args);
case 'NUMBER_RANGE':
return NumberRange.beforeEditorDataSubmit(args);
case 'OBJECT_PROPERTIES':
return ObjectProperties.beforeEditorDataSubmit(args);
case 'OPTION_VALUE':
return OptionValue.beforeEditorDataSubmit(args);
case 'PMML':
return Pmml.beforeEditorDataSubmit(args);
case 'RULE':
return Rule.beforeEditorDataSubmit(args);
case 'SINGLE_RULE':
return SingleRule.beforeEditorDataSubmit(args);
case 'SQL':
return Sql.beforeEditorDataSubmit(args);
case 'TERNARY':
return Ternary.beforeEditorDataSubmit(args);
case 'WHEN_THEN':
return WhenThen.beforeEditorDataSubmit(args);
}
processorManager.beforeEditorDataSubmit(args);
}
"
@after-editor-open="
(args) => {
args.type = 'parameter';
args.parameter = parameter;
editorDialogWidthRef = '70%';
switch (args.grid.getEditorForm().getFieldValue('type')) {
case 'ARITHMETIC':
return Arithmetic.afterEditorOpen(args);
case 'CONDITION_RANGE':
return ConditionRange.afterEditorOpen(args);
case 'DECISION_TABLE':
return DecisionTable.afterEditorOpen(args);
case 'DECISION_TABLE_2C':
return DecisionTable2c.afterEditorOpen(args);
case 'DECISION_TREE':
return DecisionTree.afterEditorOpen(args);
case 'EXECUTION_FLOW':
return ExecutionFlow.afterEditorOpen(args);
case 'GROOVY_SCRIPT':
return GroovyScript.afterEditorOpen(args);
case 'MATH_FORMULA':
return MathFormula.afterEditorOpen(args);
case 'NUMBER_RANGE':
return NumberRange.afterEditorOpen(args);
case 'OBJECT_PROPERTIES':
return ObjectProperties.afterEditorOpen(args);
case 'OPTION_VALUE':
editorDialogWidthRef = '40%';
return OptionValue.afterEditorOpen(args);
case 'PMML':
return Pmml.afterEditorOpen(args);
case 'RULE':
return Rule.afterEditorOpen(args);
case 'SINGLE_RULE':
return SingleRule.afterEditorOpen(args);
case 'SQL':
editorDialogWidthRef = '80%';
return Sql.afterEditorOpen(args);
case 'TERNARY':
return Ternary.afterEditorOpen(args);
case 'WHEN_THEN':
return WhenThen.afterEditorOpen(args);
}
args.target = parameter;
processorManager.afterEditorOpen(args);
}
"
></w-grid>
@ -319,7 +158,7 @@
<ExecutionFlowDialog ref="executionFlowDialogRef"></ExecutionFlowDialog>
<ObjectPropertiesMatcherDialog
ref="objectPropertiesMatcherDialogRef"
target-type="parameter"
:target-type="Processor.PARAMETER"
:target="parameter"
@after-matched="
(objectProperties) => {
@ -334,29 +173,12 @@
import 'tailwindcss/utilities.css';
import { ref, onMounted } from 'vue';
import { $t, axios, Environment, Formater } from 'platform-core';
import { ProcessorManager } from '@/views/shared/ProcessorManager';
import { Processor } from '@/views/shared/Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import DecisionTreeDialog from './DecisionTreeDialog.vue';
import ExecutionFlowDialog from './ExecutionFlowDialog.vue';
import ObjectPropertiesMatcherDialog from '@/views/shared/ObjectPropertiesMatcherDialog.vue';
import {
Arithmetic,
ConditionRange,
DecisionTable,
DecisionTable2c,
DecisionTree,
ExecutionFlow,
GroovyScript,
MathFormula,
NumberRange,
ObjectProperties,
OptionValue,
Pmml,
Rule,
SingleRule,
Sql,
Ternary,
WhenThen,
} from '@/views/shared/processors';
const props = defineProps({
fetchDataUrl: { type: String, default: '' },
@ -366,10 +188,10 @@ const props = defineProps({
});
const gridRef = ref();
const editorDialogWidthRef = ref('50%');
const decisionTreeDialogRef = ref();
const executionFlowDialogRef = ref();
const objectPropertiesMatcherDialogRef = ref();
const processorManager = new ProcessorManager(Processor.PARAMETER);
const refresh = () => {
gridRef.value.refresh();

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

@ -89,8 +89,10 @@ class AutoCompletionManager {
const options: any[] = [];
for (const parameter of this.parameters) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info });
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 });
}
}
return options;
}

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

@ -1,7 +1,7 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('re.resources.designer.parameter.grid.title')"
:title="dialogTitleRef"
:can-maximize="false"
:maximized="false"
:buttons="[
@ -19,7 +19,9 @@
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, Environment, Tools } from 'platform-core';
import { $t, axios, Environment, Tools } from 'platform-core';
import { Processor } from './Processor';
import { ValueTypeUtil } from '@/utils/ValueTypeUtil';
const props = defineProps({
targetType: { type: String, default: undefined },
@ -32,15 +34,16 @@ const emit = defineEmits<{
}>();
const dialogRef = ref();
const dialogTitleRef = ref();
const modelValueRef = ref('');
const modelValueOptionsRef = ref([]);
let currentObjectProperties = {};
const click = () => {
let url = '';
if (props.targetType === 'parameter') {
if (props.targetType === Processor.PARAMETER) {
url = Environment.apiContextPath('/api/re/model/parameter/processor/autoMatch');
} else if (props.targetType === 'indicator') {
} else if (props.targetType === Processor.INDICATOR) {
url = Environment.apiContextPath('/api/re/indicator/processor/autoMatch');
}
@ -61,29 +64,18 @@ const open = (objectProperties) => {
dialogRef.value.show();
let url = '';
if (props.targetType === 'parameter') {
if (props.targetType === Processor.PARAMETER) {
dialogTitleRef.value = $t('re.resources.designer.parameter.grid.title');
url = Environment.apiContextPath('/api/re/model/parameter/findParametersByParameterId?parameterId=' + props.target.id);
} else if (props.targetType === 'indicator') {
} else if (props.targetType === Processor.INDICATOR) {
dialogTitleRef.value = $t('re.indicator.grid.title');
url = Environment.apiContextPath('/api/re/indicator/findIndicatorsByIndicatorId?indicatorId=' + props.target.id);
}
axios.get(url).then((response) => {
const options = [];
response.data.forEach((item) => {
const valueType = item.valueType;
if (
valueType !== 'java.lang.Boolean' &&
valueType !== 'java.lang.Long' &&
valueType !== 'java.lang.Float' &&
valueType !== 'Float' &&
valueType !== 'java.math.BigDecimal' &&
valueType !== 'java.lang.String' &&
valueType !== 'java.util.Date' &&
valueType !== 'io.sc.engine.rule.core.classes.ResourceAbstract' &&
valueType !== 'io.sc.engine.rule.core.classes.RuleResult' &&
valueType !== 'io.sc.engine.rule.core.classes.SingleRuleResult' &&
!valueType.startsWith('List') &&
!valueType.startsWith('Map')
) {
if (!ValueTypeUtil.isBase(valueType)) {
options.push({ value: item.id, label: item.name });
}
});

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

@ -0,0 +1,80 @@
import { axios, Environment } from 'platform-core';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
/**
*
*/
abstract class Processor {
public static PARAMETER: string = 'parameter';
public static INDICATOR: string = 'indicator';
public static SCORE_CARD: string = 'scoreCard';
targetType: string;
autoCompletionManager: any;
userDefinedFunctionsManager: any;
constructor(targetType: string) {
this.targetType = targetType;
this.autoCompletionManager = new AutoCompletionManager();
this.userDefinedFunctionsManager = new UserDefinedFunctionsManager();
}
/**
*
* @param target
*/
abstract getToolbarAction(target: any): any;
/**
*
* @param row
*/
abstract format(row: any): any;
/**
*
* @param context
*/
abstract getEditorFields(context?: any): any;
/**
*
* @param context
*/
abstract getViewerFields(context?: any): any;
/**
*
* @param args
*/
abstract beforeEditorDataSubmit(args: any): void;
/**
*
* @param args
*/
abstract afterEditorOpen(args: any): void;
/**
* code-mirror
* @param args
*/
initAutoCompletionManager(args: any) {
if (this.targetType === Processor.PARAMETER) {
this.autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.target.id));
} else if (this.targetType === Processor.INDICATOR) {
this.autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.target.id));
}
}
/**
*
* @param args
*/
initUserDefinedFunctionsManager(args: any) {
this.userDefinedFunctionsManager.load();
}
}
export { Processor };

154
io.sc.engine.rule.frontend/src/views/shared/ProcessorManager.ts

@ -0,0 +1,154 @@
import { Processor } from './Processor';
import {
Arithmetic,
ConditionRange,
DecisionTable,
DecisionTable2C,
DecisionTree,
ExecutionFlow,
GroovyScript,
MathFormula,
NumberRange,
ObjectProperties,
OptionValue,
Pmml,
Rule,
ScoreCard,
SingleRule,
Sql,
Ternary,
WhenThen,
} from './processors';
class ProcessorManager {
static PROCESSOR_TYPES_PARAMETER: string[] = [
'OBJECT_PROPERTIES',
'OPTION_VALUE',
'MATH_FORMULA',
'ARITHMETIC',
'TERNARY',
'WHEN_THEN',
'NUMBER_RANGE',
'CONDITION_RANGE',
'SCORE_CARD',
'DECISION_TABLE_2C',
'DECISION_TABLE',
'DECISION_TREE',
'EXECUTION_FLOW',
'PMML',
'GROOVY_SCRIPT',
'SQL',
'RULE',
'SINGLE_RULE',
];
static PROCESSOR_TYPES_INDICATOR = [
'OBJECT_PROPERTIES',
'MATH_FORMULA',
'ARITHMETIC',
'TERNARY',
'WHEN_THEN',
'NUMBER_RANGE',
'CONDITION_RANGE',
'GROOVY_SCRIPT',
'SQL',
];
targetType: string;
processors: any;
constructor(targetType: string) {
this.targetType = targetType;
this.processors = {};
this.processors.ARITHMETIC = new Arithmetic(this.targetType);
this.processors.CONDITION_RANGE = new ConditionRange(this.targetType);
this.processors.DECISION_TABLE = new DecisionTable(this.targetType);
this.processors.DECISION_TABLE_2C = new DecisionTable2C(this.targetType);
this.processors.DECISION_TREE = new DecisionTree(this.targetType);
this.processors.EXECUTION_FLOW = new ExecutionFlow(this.targetType);
this.processors.GROOVY_SCRIPT = new GroovyScript(this.targetType);
this.processors.MATH_FORMULA = new MathFormula(this.targetType);
this.processors.NUMBER_RANGE = new NumberRange(this.targetType);
this.processors.OBJECT_PROPERTIES = new ObjectProperties(this.targetType);
this.processors.OPTION_VALUE = new OptionValue(this.targetType);
this.processors.PMML = new Pmml(this.targetType);
this.processors.RULE = new Rule(this.targetType);
this.processors.SCORE_CARD = new ScoreCard(this.targetType);
this.processors.SINGLE_RULE = new SingleRule(this.targetType);
this.processors.SQL = new Sql(this.targetType);
this.processors.TERNARY = new Ternary(this.targetType);
this.processors.WHEN_THEN = new WhenThen(this.targetType);
}
public getToolbarAction(target: any): any {
const result: any = [];
switch (this.targetType) {
case Processor.PARAMETER:
ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => {
result.push(this.processors[name].getToolbarAction(target));
});
break;
case Processor.INDICATOR:
ProcessorManager.PROCESSOR_TYPES_INDICATOR.forEach((name) => {
result.push(this.processors[name].getToolbarAction(target));
});
break;
}
return result;
}
public format(value: any, row: any): any {
if (this.processors[row.type]) {
return this.processors[row.type].format(row);
}
return value;
}
public getEditorFields(context?: any): any {
const result: any = [];
switch (this.targetType) {
case Processor.PARAMETER:
ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => {
result.push(...this.processors[name].getEditorFields(context));
});
break;
case Processor.INDICATOR:
ProcessorManager.PROCESSOR_TYPES_INDICATOR.forEach((name) => {
result.push(...this.processors[name].getEditorFields(context));
});
break;
}
return result;
}
public getViewerFields(context?: any): any {
const result: any = [];
switch (this.targetType) {
case Processor.PARAMETER:
ProcessorManager.PROCESSOR_TYPES_PARAMETER.forEach((name) => {
result.push(...this.processors[name].getViewerFields(context));
});
break;
case Processor.INDICATOR:
ProcessorManager.PROCESSOR_TYPES_INDICATOR.forEach((name) => {
result.push(...this.processors[name].getViewerFields(context));
});
break;
}
return result;
}
public beforeEditorDataSubmit(args: any): void {
if (this.processors[args.data.type]) {
this.processors[args.data.type].beforeEditorDataSubmit(args);
}
}
public afterEditorOpen(args: any): void {
//const type = args.grid.getEditorForm().getFieldValue('type');
const type = 'OPTION_VALUE';
if (this.processors[type]) {
this.processors[type].afterEditorOpen(args);
}
}
}
export { ProcessorManager };

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

@ -1,19 +1,15 @@
import { $t, Environment } from 'platform-core';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { $t } from 'platform-core';
import { Processor } from '../Processor';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class Arithmetic {
public static getToolbarAction(parameter: any) {
class Arithmetic extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'arithmetic',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.ARITHMETIC'),
icon: 'bi-calculator',
enableIf: (args) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'ARITHMETIC');
@ -21,7 +17,7 @@ class Arithmetic {
};
}
public static format(row: any) {
public format(row: any): any {
return {
componentType: 'w-code-mirror',
attrs: {
@ -35,7 +31,7 @@ class Arithmetic {
};
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -47,8 +43,8 @@ class Arithmetic {
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'ARITHMETIC' === args.form.getFieldValue('type');
},
@ -56,19 +52,15 @@ class Arithmetic {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'arithmetic', label: $t('re.resources.designer.processor.grid.entity.arithmetic') }];
}
public static beforeEditorDataSubmit(args) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
}
}

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

@ -1,20 +1,16 @@
import { $t, Environment, Tools } from 'platform-core';
import { $t, Tools, MarkupTableUtil } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class ConditionRange {
public static getToolbarAction(parameter: any) {
class ConditionRange extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'conditionRange',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.CONDITION_RANGE'),
icon: 'bi-rainbow',
icon: 'bi-card-checklist',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'CONDITION_RANGE');
@ -22,25 +18,22 @@ class ConditionRange {
};
}
public static format(row: any) {
const objs = Tools.json2Object(row.conditionRange);
if (objs) {
let str = `<div class='border border-b-0 overflow-auto' style='max-height:100px'>`;
str += `<table width='100%' height='100%'>`;
objs.forEach((obj: any) => {
public format(row: any): any {
const objs: any[] = Tools.json2Object(row.conditionRange);
if (objs && objs.length > 0) {
let str = '';
objs.forEach((obj) => {
str += '<tr>';
str += ' <td>' + PlaceHolder.replace(obj.condition) + '</td>';
str += ' <td><span>' + ('' + PlaceHolder.replace(obj.value)) + '</span></td>';
str += '</tr>';
});
str += '</table>';
str += `</div>`;
return str;
return MarkupTableUtil.markupTable(null, '', str);
}
return '';
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -65,7 +58,7 @@ class ConditionRange {
{
extend: 'remove',
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('conditionRange');
const grid = args.grid.getEditorForm().getFieldComponent('conditionRange');
grid.removeLocalData(args.selecteds);
},
},
@ -74,8 +67,7 @@ class ConditionRange {
name: 'example',
label: $t('example'),
icon: 'bi-balloon',
click: (args) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('conditionRange');
click: (args: any) => {
const sampleData = [
{ uuid: Tools.uuid(), condition: '${变量名}<=0', value: '0' },
{ uuid: Tools.uuid(), condition: '${变量名}>0 && ${变量名}<=50', value: '50' },
@ -83,7 +75,7 @@ class ConditionRange {
{ uuid: Tools.uuid(), condition: '${变量名}>80 && ${变量名}<=100', value: '100' },
{ uuid: Tools.uuid(), condition: '${变量名}>100', value: '60' },
];
grid.setLocalData(sampleData);
args.grid.setLocalData(sampleData);
},
},
],
@ -125,8 +117,8 @@ class ConditionRange {
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
},
{
name: 'value',
@ -137,14 +129,14 @@ class ConditionRange {
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
},
],
},
},
onBeforeEditorDataSubmit: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('conditionRange');
const grid = args.grid.getEditorForm().getFieldComponent('conditionRange');
const form = grid.getEditorForm();
if ('add' == form.getStatus() || 'clone' == form.getStatus()) {
args.data.uuid = Tools.uuid();
@ -159,13 +151,12 @@ class ConditionRange {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'conditionRange', label: $t('re.resources.designer.processor.grid.entity.conditionRange') }];
}
public static beforeEditorDataSubmit(args) {
const form = args.grid.getEditorForm();
const grid = form.getFieldComponent('conditionRange');
public beforeEditorDataSubmit(args: any): void {
const grid = args.grid.getEditorForm().getFieldComponent('conditionRange');
const localData: any[] = grid.getRows();
const ranges: any[] = [];
localData.forEach((item) => {
@ -178,19 +169,13 @@ class ConditionRange {
args.data.conditionRange = Tools.object2Json(ranges);
}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
const form = args.grid.getEditorForm();
const row = args.data;
const grid = form.getFieldComponent('conditionRange');
const rows = Tools.json2Object(row.conditionRange);
grid.setLocalData(rows);
const grid = args.grid.getEditorForm().getFieldComponent('conditionRange');
const data = Tools.json2Object(args.data.conditionRange);
grid.setLocalData(data);
}
}

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

@ -1,18 +1,19 @@
import { ref } from 'vue';
import { $t, Tools } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
const tableHeaderColumnsRef = ref([]);
const columnsRef = ref(<any>[]);
class DecisionTable {
public static getToolbarAction(parameter: any) {
class DecisionTable extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'decisionTable',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE'),
icon: 'bi-grid-3x3',
enableIf: (args) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args) => {
args.grid.getEditorForm().setFieldValue('type', 'DECISION_TABLE');
@ -20,15 +21,21 @@ class DecisionTable {
};
}
public static format(row) {
const objs = Tools.json2Object(row.decisionTable);
public format(row: any): any {
const objs: any[] = Tools.json2Object(row.decisionTable);
if (objs) {
let str = `<div class='border border-b-0 overflow-auto' style='max-height:100px'>`;
str += `<table width='100%' height='100%'>`;
objs.forEach((obj) => {
str += '<tr>';
Object.keys(obj).forEach((key) => {
if (key !== 'uuid' && typeof obj[key] === 'string') {
if (key === 'type') {
if (obj[key] === 'condition') {
str += ' <td>' + $t(obj[key]) + '</td>';
} else {
str += ' <td class="text-blue-500">' + $t(obj[key]) + '</td>';
}
} else if (key.startsWith('C')) {
str += ' <td>' + PlaceHolder.replace(obj[key]) + '</td>';
}
});
@ -41,18 +48,19 @@ class DecisionTable {
return '';
}
public static getEditorFields(properties) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
name: 'decisionTable',
label: $t('re.resources.designer.processor.grid.entity.decisionTable'),
showIf: (arg) => {
return 'DECISION_TABLE' === arg.form.getFieldValue('type');
showIf: (args: any) => {
return 'DECISION_TABLE' === args.form.getFieldValue('type');
},
type: 'w-grid',
height: 300,
dbClickOperation: 'edit',
selectedMode: 'cell',
autoFetchData: false,
denseBody: true,
draggable: 'local',
@ -68,24 +76,63 @@ class DecisionTable {
{
name: 'addCol2Left',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Left'),
enableIf: (args) => {
return true;
enableIf: (args: any) => {
if (args.selectedColName !== 'type' && args.selectedColName !== 'C0') {
return true;
}
return false;
},
click: (args: any) => {
addCol(args.grid, args.selectedColName, /C[\d]/, 'left');
},
click: () => {},
},
{
name: 'addCol2Right',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addCol2Right'),
enableIf: (args) => {
return true;
enableIf: (args: any) => {
if (args.selectedColName !== 'type') {
return true;
}
return false;
},
click: (args: any) => {
addCol(args.grid, args.selectedColName, /C[\d]/, 'right');
},
click: () => {},
},
'separator',
{
name: 'addRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addRow'),
click: () => {},
name: 'addConditionRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addConditionRow'),
click: (args: any) => {
const rows = args.grid.getRows();
const propertyNames = Tools.extractAllPropertyNames(rows, /C[\d]/);
propertyNames.sort();
const row: any = {
uuid: Tools.uuid(),
type: 'condition',
};
propertyNames.forEach((name) => {
row[name] = '';
});
args.grid.addLocalData(row);
},
},
{
name: 'addResultRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.addResultRow'),
click: (args: any) => {
const rows = args.grid.getRows();
const propertyNames = Tools.extractAllPropertyNames(rows, /C[\d]/);
propertyNames.sort();
const row: any = {
uuid: Tools.uuid(),
type: 'result',
};
propertyNames.forEach((name) => {
row[name] = '';
});
args.grid.addLocalData(row);
},
},
],
[
@ -96,94 +143,130 @@ class DecisionTable {
{
name: 'removeCol',
label: $t('re.resources.designer.processor.decisionTable.toolbar.removeCol'),
click: () => {},
enableIf: (args: any) => {
if (args.selectedColName !== 'type' && args.selectedColName !== 'C0') {
return true;
}
return false;
},
click: (args: any) => {
removeCol(args.grid, args.selectedColName, /C[\d]/);
},
},
{
name: 'removeRow',
label: $t('re.resources.designer.processor.decisionTable.toolbar.removeRow'),
click: (args) => {},
enableIf: (args: any) => {
if (args.selected) {
return true;
}
return false;
},
click: (args: any) => {
args.grid.removeLocalData(args.selected);
},
},
],
'separator',
'rowEdit',
'separator',
{
name: 'example',
label: $t('example'),
icon: 'bi-balloon',
click: (args) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('decisionTable2C');
click: (args: any) => {
const sampleData = [
{ uuid: Tools.uuid(), C0: '', C1: "${客户类型}=='普通客户'", C2: "${客户类型}=='VIP客户'", C3: "${客户类型}=='临时客户'" },
{ uuid: Tools.uuid(), C0: '${评分结果}<60', C1: '1', C2: '3', C3: '5' },
{ uuid: Tools.uuid(), C0: '${评分结果}>=60', C1: '2', C2: '4', C3: '6' },
{ uuid: Tools.uuid(), type: 'condition', C0: '${客户类型}="普通客户"', C1: 'Y', C2: 'Y', C3: null, C4: null },
{ uuid: Tools.uuid(), type: 'condition', C0: '${评分结果}>=60', C1: 'Y', C2: null, C3: 'Y', C4: null },
{ uuid: Tools.uuid(), type: 'result', C0: '${风险等级}', C1: 'A', C2: 'B', C3: 'B', C4: 'C' },
{ uuid: Tools.uuid(), type: 'result', C0: '${决策结果}', C1: '直接通过', C2: '人工审查', C3: '人工审查', C4: '直接拒绝' },
];
grid.setLocalData(sampleData);
args.grid.setLocalData(sampleData);
},
},
],
primaryKey: 'uuid',
columns: [
{ name: 'uuid', label: 'uuid', hidden: true },
{
name: 'C0',
label: $t('C0'),
align: 'left',
sortable: false,
format: (value) => {
return PlaceHolder.replace(value);
},
columns: columnsRef,
editor: {
dialog: {
width: '600px',
},
{
name: 'C1',
label: $t('C1'),
sortable: false,
format: (value) => {
return PlaceHolder.replace(value);
},
form: {
colsNum: 1,
fields: columnsRef,
},
{
name: 'C2',
label: $t('C2'),
sortable: false,
format: (value) => {
return PlaceHolder.replace(value);
},
},
{
name: 'C3',
label: $t('C3'),
sortable: false,
format: (value) => {
return PlaceHolder.replace(value);
},
},
],
},
},
];
}
public static getViewerFields(properties) {
public getViewerFields(context?: any): any {
return [{ name: 'decisionTable', label: $t('re.resources.designer.processor.grid.entity.decisionTable') }];
}
public static beforeEditorDataSubmit(args) {
public beforeEditorDataSubmit(args: any): void {
const form = args.grid.getEditorForm();
const grid = form.getFieldComponent('decisionTable');
const localData = grid.getRows();
args.data.decisionTable2C = Tools.object2Json(localData);
const localData: any[] = grid.getRows();
const fieldNames: any[] = [];
fieldNames.push('uuid');
fieldNames.push('type');
const propertyNames: any[] = Tools.extractAllPropertyNames(localData, /C[\d]/);
propertyNames.sort();
propertyNames.forEach((name) => {
fieldNames.push(name);
});
const data: any = [];
localData.forEach((row) => {
const _row = {};
fieldNames.forEach((name) => {
_row[name] = row[name];
});
data.push(_row);
});
args.data.decisionTable = Tools.object2Json(data);
}
public static afterEditorOpen(args) {}
public afterEditorOpen(args: any): void {
const form = args.grid.getEditorForm();
const row = args.data;
// 构建表格的头
const rows = Tools.json2Object(row.decisionTable);
const fieldNames = Tools.extractAllPropertyNames(rows, /C[\d]/);
fieldNames.sort();
const fields: any = [];
addFixedFields(fields);
fieldNames.forEach((name) => {
fields.push({
name: name,
label: $t(name),
sortable: false,
type: 'w-code-mirror',
attrs: {
toolbar: false,
rows: 1,
},
format: (value: any) => {
return PlaceHolder.replace(value);
},
});
});
columnsRef.value = fields;
// 设置表格数据
const grid = form.getFieldComponent('decisionTable');
grid.setLocalData(rows);
}
}
const addDecisionTable2CCol = (grid, currentSelectedColName, colNamePattern, mode) => {
const addCol = (grid: any, currentSelectedColName: string, colNamePattern: any, mode: string) => {
//更新表数据
const rows = grid.getRows();
const propertyNames = Tools.extractAllPropertyNames(rows, colNamePattern);
const rows: any[] = grid.getRows();
const propertyNames: string[] = Tools.extractAllPropertyNames(rows, colNamePattern);
propertyNames.sort();
const selectedColIndex = propertyNames.indexOf(currentSelectedColName) + (mode === 'left' ? 0 : 1);
rows.forEach((row) => {
let i;
let i = 0;
for (i = propertyNames.length; i > selectedColIndex; i--) {
row['C' + i] = row['C' + (i - 1)];
}
@ -191,21 +274,68 @@ const addDecisionTable2CCol = (grid, currentSelectedColName, colNamePattern, mod
});
// 更新表头
const fields = [];
fields.push({ name: 'uuid', label: 'uuid', hidden: true });
const fields: any[] = [];
addFixedFields(fields);
let i = 0;
for (i = 0; i <= propertyNames.length; i++) {
fields.push({
name: 'C' + i,
label: $t('C' + i),
sortable: false,
format: (value) => {
format: (value: any) => {
return PlaceHolder.replace(value);
},
});
}
tableHeaderColumnsRef.value = fields;
columnsRef.value = fields;
grid.setLocalData(rows);
};
const removeCol = (grid: any, currentSelectedColName: string, colNamePattern: any) => {
//更新表数据
const rows: any[] = grid.getRows();
const propertyNames: string[] = Tools.extractAllPropertyNames(rows, colNamePattern);
propertyNames.sort();
const selectedColIndex = propertyNames.indexOf(currentSelectedColName);
rows.forEach((row) => {
let i = 0;
for (i = selectedColIndex; i < propertyNames.length; i++) {
row['C' + i] = row['C' + (i + 1)];
}
delete row['C' + (propertyNames.length - 1)];
});
// 更新表头
const fields: any[] = [];
addFixedFields(fields);
let i = 0;
for (i = 0; i < propertyNames.length - 1; i++) {
fields.push({
name: 'C' + i,
label: $t('C' + i),
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
});
}
columnsRef.value = fields;
grid.setLocalData(rows);
};
const addFixedFields = (fields: any[]) => {
fields.push({ name: 'uuid', label: 'uuid', hidden: true });
fields.push({
name: 'type',
label: $t('type'),
format: (value: any) => {
if (value === 'result') {
return '<span class="text-blue-500">' + $t(value) + '</span>';
}
return $t(value);
},
});
};
export { DecisionTable };

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

@ -1,18 +1,19 @@
import { ref } from 'vue';
import { $t, Tools } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
const tableHeaderColumnsRef = ref(<any>[]);
const columnsRef = ref(<any>[]);
class DecisionTable2c {
public static getToolbarAction(parameter: any) {
class DecisionTable2C extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'decisionTable2c',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.DECISION_TABLE_2C'),
icon: 'bi-grid-3x2',
enableIf: (args) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'DECISION_TABLE_2C');
@ -20,7 +21,7 @@ class DecisionTable2c {
};
}
public static format(row: any) {
public format(row: any): any {
const objs: any[] = Tools.json2Object(row.decisionTable2C);
if (objs) {
let str = `<div class='border border-b-0 overflow-auto' style='max-height:100px'>`;
@ -41,7 +42,7 @@ class DecisionTable2c {
return '';
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -76,7 +77,7 @@ class DecisionTable2c {
return false;
},
click: (args: any) => {
addDecisionTable2CCol(args.grid, args.selectedColName, /C[\d]/, 'left');
addCol(args.grid, args.selectedColName, /C[\d]/, 'left');
},
},
{
@ -89,7 +90,7 @@ class DecisionTable2c {
return false;
},
click: (args: any) => {
addDecisionTable2CCol(args.grid, args.selectedColName, /C[\d]/, 'right');
addCol(args.grid, args.selectedColName, /C[\d]/, 'right');
},
},
'separator',
@ -125,7 +126,7 @@ class DecisionTable2c {
return false;
},
click: (args: any) => {
deleteDecisionTable2CCol(args.grid, args.selectedColName, /C[\d]/);
removeCol(args.grid, args.selectedColName, /C[\d]/);
},
},
{
@ -150,43 +151,53 @@ class DecisionTable2c {
label: $t('example'),
icon: 'bi-balloon',
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('decisionTable2C');
const sampleData = [
{ uuid: Tools.uuid(), C0: '', C1: "${客户类型}=='普通客户'", C2: "${客户类型}=='VIP客户'", C3: "${客户类型}=='临时客户'" },
{ uuid: Tools.uuid(), C0: '${评分结果}<60', C1: '1', C2: '3', C3: '5' },
{ uuid: Tools.uuid(), C0: '${评分结果}>=60', C1: '2', C2: '4', C3: '6' },
];
grid.setLocalData(sampleData);
args.grid.setLocalData(sampleData);
},
},
],
primaryKey: 'uuid',
columns: tableHeaderColumnsRef,
columns: columnsRef,
editor: {
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: tableHeaderColumnsRef,
fields: columnsRef,
},
},
},
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'decisionTable2C', label: $t('re.resources.designer.processor.grid.entity.decisionTable2C') }];
}
public static beforeEditorDataSubmit(args: any) {
public beforeEditorDataSubmit(args: any): void {
const form = args.grid.getEditorForm();
const grid = form.getFieldComponent('decisionTable2C');
const localData = grid.getRows();
args.data.decisionTable2C = Tools.object2Json(localData);
const localData: any[] = grid.getRows();
const fieldNames: any[] = Tools.extractAllPropertyNames(localData, /C[\d]/);
fieldNames.push('uuid');
fieldNames.sort();
const data: any = [];
localData.forEach((row) => {
const _row = {};
fieldNames.forEach((name) => {
_row[name] = row[name];
});
data.push(_row);
});
args.data.decisionTable2C = Tools.object2Json(data);
}
public static afterEditorOpen(args: any) {
public afterEditorOpen(args: any): void {
const form = args.grid.getEditorForm();
const row = args.data;
// 构建表格的头
@ -210,14 +221,14 @@ class DecisionTable2c {
},
});
});
tableHeaderColumnsRef.value = fields;
columnsRef.value = fields;
// 设置表格数据
const grid = form.getFieldComponent('decisionTable2C');
grid.setLocalData(rows);
}
}
const addDecisionTable2CCol = (grid: any, currentSelectedColName: string, colNamePattern: any, mode: string) => {
const addCol = (grid: any, currentSelectedColName: string, colNamePattern: any, mode: string) => {
//更新表数据
const rows: any[] = grid.getRows();
const propertyNames: string[] = Tools.extractAllPropertyNames(rows, colNamePattern);
@ -246,11 +257,11 @@ const addDecisionTable2CCol = (grid: any, currentSelectedColName: string, colNam
},
});
}
tableHeaderColumnsRef.value = fields;
columnsRef.value = fields;
grid.setLocalData(rows);
};
const deleteDecisionTable2CCol = (grid: any, currentSelectedColName: string, colNamePattern: any) => {
const removeCol = (grid: any, currentSelectedColName: string, colNamePattern: any) => {
//更新表数据
const rows: any[] = grid.getRows();
const propertyNames: string[] = Tools.extractAllPropertyNames(rows, colNamePattern);
@ -279,8 +290,8 @@ const deleteDecisionTable2CCol = (grid: any, currentSelectedColName: string, col
},
});
}
tableHeaderColumnsRef.value = fields;
columnsRef.value = fields;
grid.setLocalData(rows);
};
export { DecisionTable2c };
export { DecisionTable2C };

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

@ -1,14 +1,15 @@
import { $t } from 'platform-core';
import { Processor } from '../Processor';
class DecisionTree {
public static getToolbarAction(parameter: any) {
class DecisionTree extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'decisionTree',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.DECISION_TREE'),
icon: 'bi-tree',
enableIf: (args) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'DECISION_TREE');
@ -16,7 +17,7 @@ class DecisionTree {
};
}
public static format(row: any) {
public format(row: any): any {
const div = document.createElement('div');
div.textContent = row.decisionTree;
const result = div.outerHTML;
@ -24,7 +25,7 @@ class DecisionTree {
return result;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -41,13 +42,13 @@ class DecisionTree {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {}
public afterEditorOpen(args: any): void {}
}
export { DecisionTree };

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

@ -1,14 +1,15 @@
import { $t } from 'platform-core';
import { Processor } from '../Processor';
class ExecutionFlow {
public static getToolbarAction(parameter: any) {
class ExecutionFlow extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'executionFlow',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.EXECUTION_FLOW'),
icon: 'bi-bounding-box-circles',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'EXECUTION_FLOW');
@ -16,7 +17,7 @@ class ExecutionFlow {
};
}
public static format(row: any) {
public format(row: any): any {
const div = document.createElement('div');
div.textContent = row.executionFlow;
const result = div.outerHTML;
@ -24,7 +25,7 @@ class ExecutionFlow {
return result;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -41,13 +42,13 @@ class ExecutionFlow {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {}
public afterEditorOpen(args: any): void {}
}
export { ExecutionFlow };

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

@ -1,26 +1,22 @@
import { $t, Environment } from 'platform-core';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { $t } from 'platform-core';
import { Processor } from '../Processor';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class GroovyScript {
public static getToolbarAction(parameter: any) {
class GroovyScript extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'groovyScript',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.GROOVY_SCRIPT'),
icon: 'bi-code',
enableIf: (args) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args) => {
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'GROOVY_SCRIPT');
},
};
}
public static format(row: any) {
public format(row: any): any {
const div = document.createElement('div');
div.textContent = row.groovyScript;
const result = div.outerHTML;
@ -28,7 +24,7 @@ class GroovyScript {
return result;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -41,8 +37,8 @@ class GroovyScript {
lineWrap: false,
lineBreak: true,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args) => {
return 'GROOVY_SCRIPT' === args.form.getFieldValue('type');
},
@ -50,19 +46,15 @@ class GroovyScript {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'groovyScript', label: $t('re.resources.designer.processor.grid.entity.groovyScript') }];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
}
}

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

@ -1,19 +1,15 @@
import { $t, Environment } from 'platform-core';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { $t } from 'platform-core';
import { Processor } from '../Processor';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class MathFormula {
public static getToolbarAction(parameter: any) {
class MathFormula extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'mathFormula',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.MATH_FORMULA'),
icon: 'bi-calculator',
icon: 'bi-superscript',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'MATH_FORMULA');
@ -21,7 +17,7 @@ class MathFormula {
};
}
public static format(row: any) {
public format(row: any): any {
return {
componentType: 'w-math',
attrs: {
@ -32,15 +28,15 @@ class MathFormula {
};
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
name: 'mathFormula',
label: $t('re.resources.designer.processor.grid.entity.mathFormula'),
type: 'w-math',
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'MATH_FORMULA' === args.form.getFieldValue('type');
},
@ -48,19 +44,15 @@ class MathFormula {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
}
}

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

@ -1,20 +1,16 @@
import { $t, Environment, Tools } from 'platform-core';
import { $t, Tools } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class NumberRange {
public static getToolbarAction(parameter: any) {
class NumberRange extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'numberRange',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE'),
icon: 'bi-justify',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'NUMBER_RANGE');
@ -22,14 +18,14 @@ class NumberRange {
};
}
public static format(row: any) {
public format(row: any): any {
const objs: any[] = Tools.json2Object(row.numberRange);
if (objs) {
let str = `<div class='border border-b-0 overflow-auto' style='max-height:100px'>`;
if (objs && objs.length > 0) {
let str = `<div class='border border-b-0'>`;
str += `<table width='100%' height='100%'>`;
objs.forEach((obj, index) => {
str += '<tr>';
if (index == 0) {
if (index == 0 && this.targetType !== Processor.SCORE_CARD) {
str += ' <td rowspan=' + objs.length + '>' + PlaceHolder.replace(row.numberRangeVar) + '</td>';
}
str += ' <td>' + Tools.generateIntervalRange(obj.minIncluded, obj.min, obj.max, obj.maxIncluded) + '</td>';
@ -43,9 +39,10 @@ class NumberRange {
return '';
}
public static getEditorFields(properties: any) {
return [
{
public getEditorFields(context?: any): any {
const result: any[] = [];
if (this.targetType !== Processor.SCORE_CARD) {
result.push({
colSpan: 5,
name: 'numberRangeVar',
label: $t('re.resources.designer.processor.grid.entity.numberRangeVar'),
@ -58,127 +55,127 @@ class NumberRange {
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
});
}
result.push({
colSpan: 5,
name: 'numberRange',
label: $t('re.resources.designer.processor.grid.entity.numberRange'),
showIf: (args: any) => {
return 'NUMBER_RANGE' === args.form.getFieldValue('type');
},
{
colSpan: 5,
name: 'numberRange',
label: $t('re.resources.designer.processor.grid.entity.numberRange'),
showIf: (args: any) => {
return 'NUMBER_RANGE' === args.form.getFieldValue('type');
},
type: 'w-grid',
height: 300,
dbClickOperation: 'edit',
autoFetchData: false,
denseBody: true,
draggable: 'local',
pageable: false,
configButton: false,
toolbarConfigure: { noIcon: false },
toolbarActions: [
'add',
'clone',
'edit',
{
extend: 'remove',
click: (arg: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('numberRange');
grid.removeLocalData(arg.selecteds);
},
},
'separator',
{
name: 'example',
label: $t('example'),
icon: 'bi-balloon',
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('numberRange');
const sampleData = [
{ uuid: Tools.uuid(), minIncluded: false, min: null, max: 0, maxIncluded: false, value: 1 },
{ uuid: Tools.uuid(), minIncluded: true, min: 0, max: 1, maxIncluded: false, value: 2 },
{ uuid: Tools.uuid(), minIncluded: true, min: 1, max: 2, maxIncluded: false, value: 3 },
{ uuid: Tools.uuid(), minIncluded: true, min: 2, max: 3, maxIncluded: false, value: 4 },
{ uuid: Tools.uuid(), minIncluded: true, min: 3, max: null, maxIncluded: false, value: 5 },
{ uuid: Tools.uuid(), minIncluded: false, min: null, max: null, maxIncluded: false, value: 0 },
];
grid.setLocalData(sampleData);
},
type: 'w-grid',
height: 300,
dbClickOperation: 'edit',
autoFetchData: false,
denseBody: true,
draggable: 'local',
pageable: false,
configButton: false,
toolbarConfigure: { noIcon: false },
toolbarActions: [
'add',
'clone',
'edit',
{
extend: 'remove',
click: (args: any) => {
const grid = args.grid.getEditorForm().getFieldComponent('numberRange');
grid.removeLocalData(args.selecteds);
},
],
primaryKey: 'uuid',
columns: [
{ width: 200, name: 'uuid', label: 'uuid', hidden: true },
{
width: 60,
name: 'minIncluded',
label: $t('include'),
align: 'center',
sortable: false,
format: (value: any) => {
if (value) {
return '[';
} else {
return '(';
}
},
},
{ width: 150, name: 'min', label: $t('minValue'), align: 'right', sortable: false },
{ width: 150, name: 'max', label: $t('maxValue'), align: 'right', sortable: false },
{
width: 60,
name: 'maxIncluded',
label: $t('include'),
align: 'center',
sortable: false,
format: (value: any) => {
if (value) {
return ']';
} else {
return ')';
}
},
},
'separator',
{
name: 'example',
label: $t('example'),
icon: 'bi-balloon',
click: (args: any) => {
const sampleData = [
{ uuid: Tools.uuid(), minIncluded: false, min: null, max: 0, maxIncluded: false, value: 1 },
{ uuid: Tools.uuid(), minIncluded: true, min: 0, max: 1, maxIncluded: false, value: 2 },
{ uuid: Tools.uuid(), minIncluded: true, min: 1, max: 2, maxIncluded: false, value: 3 },
{ uuid: Tools.uuid(), minIncluded: true, min: 2, max: 3, maxIncluded: false, value: 4 },
{ uuid: Tools.uuid(), minIncluded: true, min: 3, max: null, maxIncluded: false, value: 5 },
{ uuid: Tools.uuid(), minIncluded: false, min: null, max: null, maxIncluded: false, value: 0 },
];
args.grid.setLocalData(sampleData);
},
{ width: '100%', name: 'value', label: $t('value'), sortable: false },
],
editor: {
dialog: {
width: '600px',
},
],
primaryKey: 'uuid',
columns: [
{ width: 200, name: 'uuid', label: 'uuid', hidden: true },
{
width: 60,
name: 'minIncluded',
label: $t('include'),
align: 'center',
sortable: false,
format: (value: any) => {
if (value) {
return '[';
} else {
return '(';
}
},
form: {
colsNum: 4,
fields: [
{ name: 'uuid', label: 'uuid', showIf: false, colSpan: 4 },
{ name: 'min', label: $t('minValue'), type: 'w-text', colSpan: 3 },
{ name: 'minIncluded', label: $t('include'), type: 'w-checkbox' },
{ name: 'max', label: $t('maxValue'), type: 'w-text', colSpan: 3 },
{ name: 'maxIncluded', label: $t('include'), type: 'w-checkbox' },
{ name: 'value', label: $t('value'), type: 'w-number', colSpan: 3 },
],
},
{ width: 150, name: 'min', label: $t('minValue'), align: 'right', sortable: false },
{ width: 150, name: 'max', label: $t('maxValue'), align: 'right', sortable: false },
{
width: 60,
name: 'maxIncluded',
label: $t('include'),
align: 'center',
sortable: false,
format: (value: any) => {
if (value) {
return ']';
} else {
return ')';
}
},
},
onBeforeEditorDataSubmit: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('numberRange');
const form = grid.getEditorForm();
if ('add' == form.getStatus() || 'clone' == form.getStatus()) {
args.data.uuid = Tools.uuid();
grid.addLocalData(args.data);
args.callback(false);
} else if ('edit' == form.getStatus()) {
grid.updateLocalData(args.data);
args.callback(false);
}
{ width: '100%', name: 'value', label: $t('value'), sortable: false },
],
editor: {
dialog: {
width: '600px',
},
form: {
colsNum: 4,
fields: [
{ name: 'uuid', label: 'uuid', showIf: false, colSpan: 4 },
{ name: 'min', label: $t('minValue'), type: 'w-text', colSpan: 3 },
{ name: 'minIncluded', label: $t('include'), type: 'w-checkbox' },
{ name: 'max', label: $t('maxValue'), type: 'w-text', colSpan: 3 },
{ name: 'maxIncluded', label: $t('include'), type: 'w-checkbox' },
{ name: 'value', label: $t('value'), type: 'w-number', colSpan: 3 },
],
},
},
];
onBeforeEditorDataSubmit: (args: any) => {
const grid = args.grid.getEditorForm().getFieldComponent('numberRange');
const form = grid.getEditorForm();
if ('add' == form.getStatus() || 'clone' == form.getStatus()) {
args.data.uuid = Tools.uuid();
grid.addLocalData(args.data);
args.callback(false);
} else if ('edit' == form.getStatus()) {
grid.updateLocalData(args.data);
args.callback(false);
}
},
});
return result;
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'numberRange', label: $t('re.resources.designer.processor.grid.entity.numberRange') }];
}
public static beforeEditorDataSubmit(args: any) {
public beforeEditorDataSubmit(args: any): void {
const form = args.grid.getEditorForm();
const grid = form.getFieldComponent('numberRange');
const localData: any[] = grid.getRows();
@ -196,13 +193,9 @@ class NumberRange {
args.data.numberRange = Tools.object2Json(ranges);
}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
const form = args.grid.getEditorForm();
const row = args.data;

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

@ -1,34 +1,17 @@
import { $t, axios, Environment, Tools } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
import { ValueTypeUtil } from '@/utils/ValueTypeUtil';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class ObjectProperties {
public static getToolbarAction(parameter: any) {
class ObjectProperties extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'objectProperties',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.OBJECT_PROPERTIES'),
icon: 'bi-card-list',
icon: 'bi-list-task',
enableIf: (args: any) => {
const valueType = parameter.valueType;
return (
valueType !== 'java.lang.Boolean' &&
valueType !== 'java.lang.Long' &&
valueType !== 'java.lang.Float' &&
valueType !== 'Float' &&
valueType !== 'java.math.BigDecimal' &&
valueType !== 'java.lang.String' &&
valueType !== 'java.util.Date' &&
valueType !== 'io.sc.engine.rule.core.classes.ResourceAbstract' &&
valueType !== 'io.sc.engine.rule.core.classes.RuleResult' &&
valueType !== 'io.sc.engine.rule.core.classes.SingleRuleResult' &&
!valueType.startsWith('List') &&
!valueType.startsWith('Map')
);
return !ValueTypeUtil.isBase(target.valueType);
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'OBJECT_PROPERTIES');
@ -36,7 +19,7 @@ class ObjectProperties {
};
}
public static format(row: any) {
public format(row: any): any {
let str = '';
if (row.objectCondition) {
str += `<div class='py-2'>When ` + PlaceHolder.replace(row.objectCondition) + ' Then</div>';
@ -57,7 +40,7 @@ class ObjectProperties {
return str;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -68,8 +51,8 @@ class ObjectProperties {
rows: 3,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'OBJECT_PROPERTIES' === args.form.getFieldValue('type');
},
@ -98,8 +81,7 @@ class ObjectProperties {
label: $t('autoMatch'),
icon: 'bi-link-45deg',
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties');
const localData = grid.getRows();
const localData = args.grid.getRows();
const objectProperties: any[] = [];
localData.forEach((item: any) => {
objectProperties.push({
@ -108,18 +90,17 @@ class ObjectProperties {
expression: item.expression,
});
});
properties.objectPropertiesMatcherDialogRef.open(objectProperties);
context.objectPropertiesMatcherDialogRef.open(objectProperties);
},
},
'edit',
{
extend: 'remove',
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties');
const selecteds: any[] = args.selecteds;
selecteds.forEach((selected) => {
selected.expression = '';
grid.updateLocalData(selected);
args.grid.updateLocalData(selected);
});
},
},
@ -132,13 +113,12 @@ class ObjectProperties {
enableIf: () => {
return true;
},
click: (args) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties');
const rows: any[] = grid.getRows();
click: (args: any) => {
const rows: any[] = args.grid.getRows();
rows.forEach((row) => {
row.expression = '';
});
grid.setLocalData(rows);
args.grid.setLocalData(rows);
},
},
],
@ -188,17 +168,16 @@ class ObjectProperties {
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
},
],
},
},
onBeforeEditorDataSubmit: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('objectProperties');
const form = grid.getEditorForm();
const form = args.grid.getEditorForm();
if ('edit' == form.getStatus()) {
grid.updateLocalData(args.data);
args.grid.updateLocalData(args.data);
args.callback(false);
}
},
@ -206,11 +185,11 @@ class ObjectProperties {
];
}
public static getViewerFields(properties) {
public getViewerFields(context?: any): any {
return [];
}
public static beforeEditorDataSubmit(args: any) {
public beforeEditorDataSubmit(args: any): void {
const form = args.grid.getEditorForm();
const grid = form.getFieldComponent('objectProperties');
const localData: any[] = grid.getRows();
@ -225,22 +204,18 @@ class ObjectProperties {
args.data.objectProperties = Tools.object2Json(objectProperties);
}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
const form = args.grid.getEditorForm();
const row = args.data;
if ('add' == form.getStatus()) {
let listObejctPropertiesUrl = '';
if (args.type === 'parameter') {
listObejctPropertiesUrl = '/api/re/model/parameter/listObejctPropertiesByParameterId/' + args.parameter.id;
} else if (args.type === 'indicator') {
listObejctPropertiesUrl = '/api/re/indicator/listObejctPropertiesByIndicatorId/' + args.indicator.id;
if (this.targetType === Processor.PARAMETER) {
listObejctPropertiesUrl = '/api/re/model/parameter/listObejctPropertiesByParameterId/' + args.target.id;
} else if (this.targetType === Processor.INDICATOR) {
listObejctPropertiesUrl = '/api/re/indicator/listObejctPropertiesByIndicatorId/' + args.target.id;
}
axios.get(Environment.apiContextPath(listObejctPropertiesUrl)).then((response) => {
const properties = response.data;
@ -249,9 +224,9 @@ class ObjectProperties {
});
} else if ('edit' == form.getStatus()) {
let listObejctPropertiesUrl = '';
if (args.type === 'parameter') {
if (this.targetType === Processor.PARAMETER) {
listObejctPropertiesUrl = '/api/re/model/parameter/processor/listObejctPropertiesByProcessorId/' + row.id;
} else if (args.type === 'indicator') {
} else if (this.targetType === Processor.INDICATOR) {
listObejctPropertiesUrl = '/api/re/indicator/processor/listObejctPropertiesByProcessorId/' + row.id;
}
axios.get(Environment.apiContextPath(listObejctPropertiesUrl)).then((response) => {

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

@ -1,17 +1,18 @@
import { ref } from 'vue';
import { $t, axios, Environment } from 'platform-core';
import { Processor } from '../Processor';
const optionOptionsRef = ref(<any>[]);
class OptionValue {
public static getToolbarAction(parameter: any) {
class OptionValue extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'optionValue',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.OPTION_VALUE'),
icon: 'bi-card-list',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'OPTION_VALUE');
@ -19,11 +20,11 @@ class OptionValue {
};
}
public static format(row: any) {
public format(row: any): any {
return row.optionCode;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -38,15 +39,16 @@ class OptionValue {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'optionCode', label: $t('re.resources.designer.processor.grid.entity.optionCode') }];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {
public afterEditorOpen(args: any): void {
args.grid.getEditorDialog().setWidth('40%');
// 获取选项输入参数列表
axios.get(Environment.apiContextPath('/api/re/model/parameter/listParemtersByParameterId/' + args.parameter.id)).then((response) => {
axios.get(Environment.apiContextPath('/api/re/model/parameter/listParemtersByParameterId/' + args.target.id)).then((response) => {
const parameters: any[] = response.data;
const options: any[] = [];
parameters.forEach((item) => {

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

@ -1,14 +1,15 @@
import { $t } from 'platform-core';
import { Processor } from '../Processor';
class Pmml {
public static getToolbarAction(parameter: any) {
class Pmml extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'pmml',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.PMML'),
icon: 'bi-filetype-xml',
enableIf: (args) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'PMML');
@ -16,7 +17,7 @@ class Pmml {
};
}
public static format(row: any) {
public format(row: any): any {
const div = document.createElement('div');
div.textContent = row.pmml;
const result = div.outerHTML;
@ -24,7 +25,7 @@ class Pmml {
return result;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -35,6 +36,8 @@ class Pmml {
lineNumber: true,
toolbar: false,
lang: 'xml',
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'PMML' === args.form.getFieldValue('type');
},
@ -42,13 +45,16 @@ class Pmml {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {}
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
}
}
export { Pmml };

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

@ -1,14 +1,15 @@
import { $t } from 'platform-core';
import { Processor } from '../Processor';
class Rule {
public static getToolbarAction(parameter: any) {
class Rule extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'rule',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.RULE'),
icon: 'bi-shadows',
enableIf: (args: any) => {
return parameter.type === 'RULE_RESULT' || parameter.type === 'SINGLE_RULE_RESULT';
return target.type === 'RULE_RESULT' || target.type === 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'RULE');
@ -16,21 +17,21 @@ class Rule {
};
}
public static format(row: any) {
public format(row: any): any {
return row.rule;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'rule', label: $t('re.resources.designer.processor.grid.entity.rule') }];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {}
public afterEditorOpen(args: any): void {}
}
export { Rule };

230
io.sc.engine.rule.frontend/src/views/shared/processors/ScoreCard.ts

@ -0,0 +1,230 @@
import { ref, toRaw } from 'vue';
import { $t, axios, Environment, Tools } from 'platform-core';
import { Processor } from '../Processor';
import { ConditionRange } from './ConditionRange';
import { NumberRange } from './NumberRange';
const parameterOptionsRef = ref(<any>[]);
const varProcessorTypeOptionsRef = ref(<any>[]);
const conditionRange = new ConditionRange(Processor.SCORE_CARD);
const numberRange = new NumberRange(Processor.SCORE_CARD);
class ScoreCard extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'scoreCard',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.SCORE_CARD'),
icon: 'bi-credit-card-2-front',
enableIf: (args) => {
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'SCORE_CARD');
},
};
}
public format(row: any): any {
const objs = Tools.json2Object(row.scoreCard);
if (objs) {
let str = `<div class='border border-b-0'>`;
str += `<table width='100%' height='100%'>`;
objs.forEach((obj: any) => {
str += '<tr>';
str += ' <td>' + $t('io.sc.engine.rule.core.enums.ProcessorType.' + obj.type) + '</td>';
str += ' <td>' + obj.name + '</td>';
if (obj.type === 'CONDITION_RANGE') {
str += ' <td style="pading:0px">' + conditionRange.format({ conditionRange: Tools.object2Json(obj.conditionRange) }) + '</td>';
} else if (obj.type === 'NUMBER_RANGE') {
str += ' <td>' + numberRange.format({ numberRange: Tools.object2Json(obj.numberRange) }) + '</td>';
}
str += '</tr>';
});
str += '</table>';
str += `</div>`;
return str;
}
return '';
}
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
name: 'scoreCard',
label: $t('re.resources.designer.processor.grid.entity.scoreCard'),
type: 'w-grid',
showIf: (args: any) => {
return 'SCORE_CARD' === args.form.getFieldValue('type');
},
height: 600,
dbClickOperation: 'edit',
autoFetchData: false,
denseBody: true,
draggable: 'local',
pageable: false,
configButton: false,
toolbarConfigure: { noIcon: false },
toolbarActions: [
[
{
extend: 'add',
click: undefined,
},
conditionRange.getToolbarAction({}),
numberRange.getToolbarAction({}),
],
'clone',
'edit',
{
extend: 'remove',
click: (args: any) => {
const grid = args.grid.getEditorForm().getFieldComponent('scoreCard');
grid.removeLocalData(args.selecteds);
},
},
],
primaryKey: 'uuid',
columns: [
{ width: 200, name: 'uuid', label: 'uuid', hidden: true },
{
width: 120,
name: 'code',
label: $t('code'),
sortable: false,
},
{
width: 120,
name: 'name',
label: $t('name'),
sortable: false,
},
{
width: 80,
name: 'weight',
label: $t('weight'),
sortable: false,
},
{
width: 100,
name: 'type',
label: $t('type'),
sortable: false,
format: (value, row: any) => {
return $t('io.sc.engine.rule.core.enums.ProcessorType.' + row.type);
},
},
{
width: '100%',
name: 'content',
label: $t('content'),
sortable: false,
format: (value, row: any) => {
const data = JSON.parse(JSON.stringify(row));
data.conditionRange = Tools.object2Json(data.conditionRange);
data.numberRange = Tools.object2Json(data.numberRange);
switch (data.type) {
case 'CONDITION_RANGE':
return conditionRange.format(data);
case 'NUMBER_RANGE':
return numberRange.format(data);
}
return '';
},
},
],
editor: {
dialog: {
width: '800px',
},
form: {
colsNum: 5,
fields: [
{ name: 'uuid', label: 'uuid', showIf: false, colSpan: 4 },
{ colSpan: 3, name: 'name', label: $t('name'), type: 'w-select', options: parameterOptionsRef.value },
{ colSpan: 2, name: 'weight', label: $t('weight'), type: 'w-number', precision: 6 },
{ name: 'type', label: $t('type'), type: 'w-text', showIf: false },
...conditionRange.getEditorFields(),
...numberRange.getEditorFields(),
],
},
},
// 评分卡变量对话框
onBeforeEditorDataSubmit: (args: any) => {
switch (args.data.type) {
case 'CONDITION_RANGE':
// args.data.conditionRange = Tools.object2Json(args.data.conditionRange);
return conditionRange.beforeEditorDataSubmit(data);
case 'NUMBER_RANGE':
//args.data.numberRange = Tools.object2Json(args.data.numberRange);
return numberRange.beforeEditorDataSubmit(data);
}
},
onAfterEditorOpen: (args: any) => {
// const args: any = {};
// args.grid = _args.grid;
// args.data = Tools.deepClone(toValue(_args.data));
// args.data.conditionRange = Tools.object2Json(args.data.conditionRange);
// args.data.numberRange = Tools.object2Json(args.data.numberRange);
// const data = Tools.deepClone(toValue(args.data));
// data.conditionRange = Tools.object2Json(data.conditionRange);
// data.numberRange = Tools.object2Json(data.numberRange);
// args.data = data;
const newArgs: any = {};
newArgs.grid = args.grid;
newArgs.data = {
conditionRange: Tools.object2Json(JSON.parse(JSON.stringify(args.data.conditionRange))),
numberRange: Tools.object2Json(JSON.parse(JSON.stringify(args.data.numberRange))),
};
switch (args.grid.getEditorForm().getFieldValue('type')) {
case 'CONDITION_RANGE':
//args.data.conditionRange = Tools.object2Json(JSON.parse(JSON.stringify(args.data.conditionRange)));
return conditionRange.afterEditorOpen(newArgs);
case 'NUMBER_RANGE':
//args.data.numberRange = Tools.object2Json(JSON.parse(JSON.stringify(args.data.numberRange)));
return numberRange.afterEditorOpen(newArgs);
}
},
},
];
}
public getViewerFields(context?: any): any {
return [{ name: 'scoreCard', label: $t('re.resources.designer.processor.grid.entity.scoreCard') }];
}
public beforeEditorDataSubmit(args: any): void {
console.log(args);
}
public afterEditorOpen(args: any): void {
varProcessorTypeOptionsRef.value = [
{ label: $t('io.sc.engine.rule.core.enums.ProcessorType.CONDITION_RANGE'), value: 'CONDITION_RANGE' },
{ label: $t('io.sc.engine.rule.core.enums.ProcessorType.NUMBER_RANGE'), value: 'NUMBER_RANGE' },
];
axios.get(Environment.apiContextPath('/api/re/model/parameter/listParemtersByParameterId/' + args.target.id)).then((response) => {
const data: any[] = response.data;
const options: any[] = [];
if (data && data.length > 0) {
data.forEach((item) => {
options.push({
label: item.name,
value: item.code,
});
});
}
parameterOptionsRef.value = options;
});
const grid = args.grid.getEditorForm().getFieldComponent('scoreCard');
const row = args.data;
const rows = Tools.json2Object(row.scoreCard);
grid.setLocalData(rows);
}
}
export { ScoreCard };

18
io.sc.engine.rule.frontend/src/views/shared/processors/SingleRule.ts

@ -1,15 +1,15 @@
import { $t } from 'platform-core';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { Processor } from '../Processor';
class SingleRule {
public static getToolbarAction(parameter: any) {
class SingleRule extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'singleRule',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.SINGLE_RULE'),
icon: 'bi-noise-reduction',
enableIf: (args: any) => {
return parameter.type === 'RULE_RESULT' || parameter.type === 'SINGLE_RULE_RESULT';
return target.type === 'RULE_RESULT' || target.type === 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'SINGLE_RULE');
@ -17,21 +17,21 @@ class SingleRule {
};
}
public static format(row: any) {
public format(row: any): any {
return row.singleRule;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [{ name: 'singleRule', label: $t('re.resources.designer.processor.grid.entity.singleRule') }];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {}
public afterEditorOpen(args: any): void {}
}
export { SingleRule };

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

@ -1,23 +1,21 @@
import { ref, computed } from 'vue';
import { axios, Environment, $t, Tools } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
const autoCompletionManager = new AutoCompletionManager();
const dsOptionsRef = ref(<any>[]);
const parameterOptionsRef = ref(<any>[]);
const sqlQueryResultFieldsRef = ref(<any>[]);
class Sql {
public static getToolbarAction(parameter: any) {
class Sql extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'sql',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.SQL'),
icon: 'bi-filetype-sql',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'SQL');
@ -25,7 +23,7 @@ class Sql {
};
}
public static format(row: any) {
public format(row: any): any {
return {
componentType: 'w-code-mirror',
attrs: {
@ -38,7 +36,7 @@ class Sql {
};
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -61,7 +59,7 @@ class Sql {
lang: 'sql',
toolbar: false,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
showIf: (args: any) => {
return 'SQL' === args.form.getFieldValue('type');
},
@ -89,14 +87,14 @@ class Sql {
label: $t('analyze'),
icon: 'bi-tag',
click: (args: any) => {
const sql = properties.gridRef.getEditorForm().getFieldValue('sql');
const sql = args.grid.getEditorForm().getFieldValue('sql');
const regex = /\$\{[\u0000-\uFFFF]+?\}/g;
const array: any[] = sql.match(regex);
const rows: any[] = [];
array.forEach((item) => {
rows.push({ uuid: Tools.uuid(), name: item, value: '' });
});
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues');
const grid = args.grid.getEditorForm().getFieldComponent('sqlParameterValues');
grid.setLocalData(rows);
},
},
@ -107,7 +105,7 @@ class Sql {
{
extend: 'remove',
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues');
const grid = args.grid.getEditorForm().getFieldComponent('sqlParameterValues');
grid.removeRows(args.selecteds);
},
},
@ -116,7 +114,7 @@ class Sql {
name: 'removeAll',
label: $t('deleteAll'),
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues');
const grid = args.grid.getEditorForm().getFieldComponent('sqlParameterValues');
grid.setLocalData([]);
},
},
@ -158,7 +156,7 @@ class Sql {
lang: 'java',
rows: 1,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
},
{
name: 'value',
@ -169,7 +167,7 @@ class Sql {
},
},
onBeforeEditorDataSubmit: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues');
const grid = args.grid.getEditorForm().getFieldComponent('sqlParameterValues');
const form = grid.getEditorForm();
if ('add' == form.getStatus() || 'clone' == form.getStatus()) {
args.data.uuid = Tools.uuid();
@ -204,8 +202,8 @@ class Sql {
label: $t('execute'),
icon: 'bi-caret-right',
click: (args: any) => {
const sql = properties.gridRef.getEditorForm().getFieldValue('sql');
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlParameterValues');
const sql = args.grid.getEditorForm().getFieldValue('sql');
const grid = args.grid.getEditorForm().getFieldComponent('sqlParameterValues');
const sqlParameterValues = grid?.getRows();
axios
.post(Environment.apiContextPath('/api/re/model/parameter/processor/executeSql'), {
@ -219,7 +217,7 @@ class Sql {
field.label = field.name;
});
const data = response.data.data;
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlQueryResult');
const grid = args.grid.getEditorForm().getFieldComponent('sqlQueryResult');
sqlQueryResultFieldsRef.value = fieldMetaDatas;
grid.setLocalData(data);
});
@ -255,7 +253,7 @@ class Sql {
{
extend: 'remove',
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlFieldMapping');
const grid = args.grid.getEditorForm().getFieldComponent('sqlFieldMapping');
grid.removeLocalData(args.selecteds);
},
},
@ -264,7 +262,7 @@ class Sql {
name: 'removeAll',
label: $t('deleteAll'),
click: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlFieldMapping');
const grid = args.grid.getEditorForm().getFieldComponent('sqlFieldMapping');
grid.setLocalData([]);
},
},
@ -302,7 +300,7 @@ class Sql {
name: 'parameter',
label: $t('parameterName'),
type: 'w-select',
options: properties.parameterOptionsRef,
options: parameterOptionsRef.value,
},
{
name: 'field',
@ -314,7 +312,7 @@ class Sql {
},
},
onBeforeEditorDataSubmit: (args: any) => {
const grid = properties.gridRef.getEditorForm().getFieldComponent('sqlFieldMapping');
const grid = args.grid.getEditorForm().getFieldComponent('sqlFieldMapping');
const form = grid.getEditorForm();
if ('add' == form.getStatus() || 'clone' == form.getStatus()) {
args.data.uuid = Tools.uuid();
@ -329,7 +327,7 @@ class Sql {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [
{ name: 'sqlDatasourceName', label: $t('re.resources.designer.processor.grid.entity.sqlDatasourceName') },
{ name: 'sql', label: $t('re.resources.designer.processor.grid.entity.sql') },
@ -338,7 +336,7 @@ class Sql {
];
}
public static beforeEditorDataSubmit(args: any) {
public beforeEditorDataSubmit(args: any): void {
axios.get(Environment.apiContextPath('/api/system/datasource')).then((response) => {
const items: any[] = response.data?.content;
if (items) {
@ -376,12 +374,10 @@ class Sql {
args.data.sqlFieldMapping = Tools.object2Json(sqlFieldMapping);
}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
public afterEditorOpen(args: any): void {
args.editorDialogWidthRef.value = '80%';
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
const form = args.grid.getEditorForm();
const row = args.data;
@ -399,7 +395,8 @@ class Sql {
axios.get(Environment.apiContextPath('api/re/model/parameter/findParametersByParameterId?parameterId=' + args.parameter.id)).then((response) => {
const options: any[] = [];
response.data.forEach((parameter) => {
const data: any[] = response.data;
data.forEach((parameter) => {
options.push({ label: parameter.name, value: '${' + parameter.name + '}' });
});
parameterOptionsRef.value = options;

44
io.sc.engine.rule.frontend/src/views/shared/processors/Ternary.ts

@ -1,20 +1,16 @@
import { $t, Environment } from 'platform-core';
import { $t } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class Ternary {
public static getToolbarAction(parameter: any) {
class Ternary extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'ternary',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.TERNARY'),
icon: 'bi-question',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'TERNARY');
@ -22,7 +18,7 @@ class Ternary {
};
}
public static format(row: any) {
public format(row: any): any {
return (
PlaceHolder.replace(row.ternaryCondition) +
' <b><span>?</span></b> ' +
@ -32,7 +28,7 @@ class Ternary {
);
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -44,8 +40,8 @@ class Ternary {
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'TERNARY' === args.form.getFieldValue('type');
},
@ -60,8 +56,8 @@ class Ternary {
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'TERNARY' === args.form.getFieldValue('type');
},
@ -76,8 +72,8 @@ class Ternary {
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'TERNARY' === args.form.getFieldValue('type');
},
@ -85,7 +81,7 @@ class Ternary {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [
{ name: 'ternaryCondition', label: $t('re.resources.designer.processor.grid.entity.ternaryCondition') },
{ name: 'ternaryTrue', label: $t('re.resources.designer.processor.grid.entity.ternaryTrue') },
@ -93,15 +89,11 @@ class Ternary {
];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
}
}

40
io.sc.engine.rule.frontend/src/views/shared/processors/WhenThen.ts

@ -1,20 +1,16 @@
import { $t, Environment } from 'platform-core';
import { $t } from 'platform-core';
import { Processor } from '../Processor';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { UserDefinedFunctionsManager } from '@/views/shared/UserDefinedFunctionsManager';
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
class WhenThen {
public static getToolbarAction(parameter: any) {
class WhenThen extends Processor {
public getToolbarAction(target: any): any {
return {
extend: 'add',
name: 'whenThen',
label: $t('io.sc.engine.rule.core.enums.ProcessorType.WHEN_THEN'),
icon: 'bi-sliders',
enableIf: (args: any) => {
return parameter.type !== 'RULE_RESULT' && parameter.type !== 'SINGLE_RULE_RESULT';
return target.type !== 'RULE_RESULT' && target.type !== 'SINGLE_RULE_RESULT';
},
afterClick: (args: any) => {
args.grid.getEditorForm().setFieldValue('type', 'WHEN_THEN');
@ -22,7 +18,7 @@ class WhenThen {
};
}
public static format(row: any) {
public format(row: any): any {
let str = '';
if (row.isWhenThenShorted) {
str += '<span>' + $t('re.resources.designer.processor.grid.entity.isWhenThenShorted') + ', </span>';
@ -36,7 +32,7 @@ class WhenThen {
return str;
}
public static getEditorFields(properties: any) {
public getEditorFields(context?: any): any {
return [
{
colSpan: 5,
@ -48,8 +44,8 @@ class WhenThen {
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'WHEN_THEN' === args.form.getFieldValue('type');
},
@ -64,8 +60,8 @@ class WhenThen {
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
autoCompletion: this.autoCompletionManager.autoCompletion(),
userDefinedFunctions: this.userDefinedFunctionsManager.userDefinedFunctions(),
showIf: (args: any) => {
return 'WHEN_THEN' === args.form.getFieldValue('type');
},
@ -82,7 +78,7 @@ class WhenThen {
];
}
public static getViewerFields(properties: any) {
public getViewerFields(context?: any): any {
return [
{ name: 'when', label: $t('re.resources.designer.processor.grid.entity.when') },
{ name: 'then', label: $t('re.resources.designer.processor.grid.entity.then') },
@ -90,15 +86,11 @@ class WhenThen {
];
}
public static beforeEditorDataSubmit(args: any) {}
public beforeEditorDataSubmit(args: any): void {}
public static afterEditorOpen(args: any) {
if (args.type === 'parameter') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + args.parameter.id));
} else if (args.type === 'indicator') {
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByIndicatorId/' + args.indicator.id));
}
userDefinedFunctionsManager.load();
public afterEditorOpen(args: any): void {
this.initAutoCompletionManager(args);
this.initUserDefinedFunctionsManager(args);
}
}

3
io.sc.engine.rule.frontend/src/views/shared/processors/index.ts

@ -1,7 +1,7 @@
export { Arithmetic } from './Arithmetic';
export { ConditionRange } from './ConditionRange';
export { DecisionTable } from './DecisionTable';
export { DecisionTable2c } from './DecisionTable2c';
export { DecisionTable2C } from './DecisionTable2C';
export { DecisionTree } from './DecisionTree';
export { ExecutionFlow } from './ExecutionFlow';
export { GroovyScript } from './GroovyScript';
@ -11,6 +11,7 @@ export { ObjectProperties } from './ObjectProperties';
export { OptionValue } from './OptionValue';
export { Pmml } from './Pmml';
export { Rule } from './Rule';
export { ScoreCard } from './ScoreCard';
export { SingleRule } from './SingleRule';
export { Sql } from './Sql';
export { Ternary } from './Ternary';

8
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java

@ -49,13 +49,13 @@ public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeSe
valueTypeAndMessages.add(new KeyValue<String,String>("java.math.BigDecimal","java.math.BigDecimal"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.String","java.lang.String"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.util.Date","java.util.Date"));
valueTypeAndMessages.add(new KeyValue<String,String>("List","java.util.List"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.util.List","java.util.List"));
valueTypeAndMessages.add(new KeyValue<String,String>("Map","java.util.Map"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.util.Map","java.util.Map"));
valueTypeAndMessages.add(new KeyValue<String,String>("io.sc.engine.rule.core.classes.ResourceAbstract","io.sc.engine.rule.core.classes.ResourceAbstract"));
valueTypeAndMessages.add(new KeyValue<String,String>("io.sc.engine.rule.core.classes.RuleResult","io.sc.engine.rule.core.classes.RuleResult"));
valueTypeAndMessages.add(new KeyValue<String,String>("io.sc.engine.rule.core.classes.SingleRuleResult","io.sc.engine.rule.core.classes.SingleRuleResult"));
valueTypeAndMessages.add(new KeyValue<String,String>("List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.List","java.lang.List"));
valueTypeAndMessages.add(new KeyValue<String,String>("Map","java.lang.Map"));
valueTypeAndMessages.add(new KeyValue<String,String>("java.lang.Map","java.lang.Map"));
}
@Override

70
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/IndicatorEntityEventHandler.java

@ -1,13 +1,5 @@
package io.sc.engine.rule.server.jpa.listener.handler;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.server.lib.entity.IndicatorEntity;
import io.sc.engine.rule.server.lib.entity.IndicatorLibEntity;
import io.sc.engine.rule.server.lib.entity.IndicatorProcessorEntity;
@ -16,9 +8,11 @@ import io.sc.engine.rule.server.lib.service.IndicatorProcessorService;
import io.sc.engine.rule.server.lib.service.LibService;
import io.sc.engine.rule.server.model.entity.parameter.IndicatorParameterEntity;
import io.sc.engine.rule.server.model.service.ParameterService;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.service.ScoreCardVarService;
import io.sc.platform.orm.entity.support.AbstractJpaEntityPersistentEventHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 指标实体持久化事件处理器
@ -28,7 +22,6 @@ public class IndicatorEntityEventHandler extends AbstractJpaEntityPersistentEven
@Autowired private LibService libService;
@Autowired private IndicatorProcessorService indicatorProcessorService;
@Autowired private ParameterService parameterService;
@Autowired private ScoreCardVarService scoreCardVarService;
@Override
protected void afterAdd(IndicatorEntity newEntity) {
@ -39,7 +32,6 @@ public class IndicatorEntityEventHandler extends AbstractJpaEntityPersistentEven
protected void beforeUpdate(IndicatorEntity oldEntity, IndicatorEntity newEntity) {
updateIndicatorProcessor(oldEntity,newEntity);//更新指标处理器
updateParameterIndicatorCode(oldEntity,newEntity);//更新指标参数的指标代码
updateScoreCardVarIndicatorCode(oldEntity,newEntity);//更新评分卡变量的指标代码
updateLibEntityLastModifyDate(oldEntity);
}
@ -110,19 +102,19 @@ public class IndicatorEntityEventHandler extends AbstractJpaEntityPersistentEven
* @param newEntity 新对象
*/
private void updateParameterIndicatorCode(IndicatorEntity oldEntity,IndicatorEntity newEntity) {
if(oldEntity!=null && newEntity!=null) {
boolean indicatorCodeChanged =!oldEntity.getCode().equals(newEntity.getCode());
IndicatorLibEntity indicatorLibEntity =libService.findIndicatorLibByIndicatorId(oldEntity.getId());
if(indicatorLibEntity!=null) {
String libCode =indicatorLibEntity.getCode();
Integer libVersion =indicatorLibEntity.getVersion();
List<IndicatorParameterEntity> entities =parameterService.getRepository().findIndicatorParameterEntityByIndicatorCode(libCode,libVersion,oldEntity.getCode());
if(entities!=null && entities.size()>0) {
for(IndicatorParameterEntity entity : entities) {
if(indicatorCodeChanged) {
if (oldEntity != null && newEntity != null) {
boolean indicatorCodeChanged = !oldEntity.getCode().equals(newEntity.getCode());
IndicatorLibEntity indicatorLibEntity = libService.findIndicatorLibByIndicatorId(oldEntity.getId());
if (indicatorLibEntity != null) {
String libCode = indicatorLibEntity.getCode();
Integer libVersion = indicatorLibEntity.getVersion();
List<IndicatorParameterEntity> entities = parameterService.getRepository().findIndicatorParameterEntityByIndicatorCode(libCode, libVersion, oldEntity.getCode());
if (entities != null && entities.size() > 0) {
for (IndicatorParameterEntity entity : entities) {
if (indicatorCodeChanged) {
entity.setIndicatorCode(newEntity.getCode());
}else {
} else {
entity.setLastModifyDate(new Date());
}
}
@ -131,34 +123,4 @@ public class IndicatorEntityEventHandler extends AbstractJpaEntityPersistentEven
}
}
}
/**
* 更新评分卡变量的指标代码
* 当指标的代码发生改变后,那么引用了该指标的评分卡变量的指标代码也需要更新
* 目的: 保持一致性
* @param oldEntity 原对象
* @param newEntity 新对象
*/
private void updateScoreCardVarIndicatorCode(IndicatorEntity oldEntity,IndicatorEntity newEntity) {
if(oldEntity!=null && newEntity!=null) {
boolean indicatorCodeChanged =!oldEntity.getCode().equals(newEntity.getCode());
IndicatorLibEntity indicatorLibEntity =libService.findIndicatorLibByIndicatorId(oldEntity.getId());
if(indicatorLibEntity!=null) {
String libCode =indicatorLibEntity.getCode();
Integer libVersion =indicatorLibEntity.getVersion();
List<ScoreCardIndicatorVarEntity> entities =scoreCardVarService.getRepository().findScoreCardIndicatorVarEntityByIndicatorCode(libCode, libVersion, oldEntity.getCode());
if(entities!=null && entities.size()>0) {
for(ScoreCardIndicatorVarEntity entity : entities) {
if(indicatorCodeChanged) {
entity.setIndicatorCode(newEntity.getCode());
}else {
entity.setLastModifyDate(new Date());
}
}
scoreCardVarService.getRepository().saveAll(entities);
}
}
}
}
}

50
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/LibEntityEventHandler.java

@ -1,26 +1,24 @@
package io.sc.engine.rule.server.jpa.listener.handler;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.server.lib.entity.LibEntity;
import io.sc.engine.rule.server.lib.entity.ReleasableLibEntity;
import io.sc.engine.rule.server.lib.service.LibService;
import io.sc.engine.rule.server.model.entity.parameter.IndicatorParameterEntity;
import io.sc.engine.rule.server.model.service.ParameterService;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.service.ScoreCardVarService;
import io.sc.platform.orm.entity.support.AbstractJpaEntityPersistentEventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.stereotype.Service;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/**
* 库实体持久化事件处理器
@ -30,7 +28,6 @@ public class LibEntityEventHandler extends AbstractJpaEntityPersistentEventHandl
private static final Logger log =LoggerFactory.getLogger(LibEntityEventHandler.class);
@Autowired private LibService libService;
@Autowired private ParameterService parameterService;
@Autowired private ScoreCardVarService scoreCardVarService;
@Autowired private JdbcTemplate jdbcTemplate;
@Override
@ -47,7 +44,6 @@ public class LibEntityEventHandler extends AbstractJpaEntityPersistentEventHandl
//更新引用了该指标库的实体的值类型代码,这些实体包括: 参数、评分卡
updateIndicatorParameterLibCode(oldEntity,newEntity);//更新指标参数的指标库代码
updateScoreCardIndicatorVarLibCode(oldEntity,newEntity);//更新评分卡变量的指标库代码
}
}
updateParentLibEntityLastModifyDate(oldEntity);
@ -157,24 +153,4 @@ public class LibEntityEventHandler extends AbstractJpaEntityPersistentEventHandl
}
}
}
/**
* 更新评分卡变量的指标库代码
* 当可版本化的指标库(非文件夹)[代码]发生改变后,那么引用了该指标库中指标的评分卡变量的指标库代码也需要更新
* 目的: 保持一致性
* @param oldEntity 原对象
* @param newEntity 新对象
*/
private void updateScoreCardIndicatorVarLibCode(LibEntity oldEntity,LibEntity newEntity) {
if(oldEntity!=null && newEntity!=null && !oldEntity.getCode().equals(newEntity.getCode())) {
if(log.isDebugEnabled()) {log.debug("更新 [评分卡变量:选项(指标),分段(指标),值(指标)] 引用的库的代码");}
List<ScoreCardIndicatorVarEntity> entities =scoreCardVarService.getRepository().findScoreCardIndicatorVarEntityByLibCode(oldEntity.getCode());
if(entities!=null && entities.size()>0) {
for(ScoreCardIndicatorVarEntity entity : entities) {
entity.setLibCode(newEntity.getCode());
}
scoreCardVarService.getRepository().saveAll(entities);
}
}
}
}

96
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/jpa/listener/handler/ScoreCardVarEntityEventHandler.java

@ -1,96 +0,0 @@
package io.sc.engine.rule.server.jpa.listener.handler;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.resource.service.ResourceService;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.engine.rule.server.testcase.entity.ResourceTestCaseEntity;
import io.sc.engine.rule.server.testcase.entity.TestCaseEntity;
import io.sc.platform.orm.entity.support.AbstractJpaEntityPersistentEventHandler;
/**
* 评分卡变量实体持久化事件处理器
*/
@Service("io.sc.engine.rule.server.jpa.listener.handler.ScoreCardVarEntityEventHandler")
public class ScoreCardVarEntityEventHandler extends AbstractJpaEntityPersistentEventHandler<ScoreCardVarEntity>{
@Autowired private ResourceService resourceService;
@Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Override
protected void afterAdd(ScoreCardVarEntity newEntity) {
updateResourceEntityLastModifyDate(newEntity);
}
@Override
protected void beforeUpdate(ScoreCardVarEntity oldEntity, ScoreCardVarEntity newEntity) {
updateTestCaseParameterCode(oldEntity,newEntity);//更新测试用例参数代码
}
@Override
protected void beforeDelete(ScoreCardVarEntity oldEntity) {
updateResourceEntityLastModifyDate(oldEntity);
}
@Override
protected void beforeDelete(Iterable<ScoreCardVarEntity> iterable) {
updateResourceEntityLastModifyDate(iterable.iterator().next());
}
/**
* 更新评分卡变量所属资源的最后更新日期
* @param entity 评分卡变量实体
*/
private void updateResourceEntityLastModifyDate(ScoreCardVarEntity entity) {
if(entity!=null) {
ResourceEntity resourceEntity =entity.getResource();
if(resourceEntity!=null) {
resourceEntity =resourceService.findById(resourceEntity.getId());
}
if(resourceEntity!=null) {
resourceEntity.setLastModifyDate(new Date());
resourceService.getRepository().save(resourceEntity);
}
}
}
/**
* 更新测试用例参数代码
* 当评分卡变量代码发生改变后,那么生成的测试用例参数也需要更新
* 目的: 保持一致性
* @param oldEntity 原对象
* @param newEntity 新对象
*/
private void updateTestCaseParameterCode(ScoreCardVarEntity oldEntity,ScoreCardVarEntity newEntity) {
if(oldEntity!=null && newEntity!=null && !oldEntity.getCode().equals(newEntity.getCode())) {
ResourceEntity resourceEntity =oldEntity.getResource();
if(resourceEntity!=null) {
List<ResourceTestCaseEntity> testCaseEntities =resourceEntity.getTestCases();
if(testCaseEntities!=null && testCaseEntities.size()>0) {
List<String> testCaseIds =new ArrayList<String>(testCaseEntities.size());
for(TestCaseEntity testCaseEntity : testCaseEntities) {
testCaseIds.add(testCaseEntity.getId());
}
String sql ="update RE_TEST_CASE_PARAMETER set"
+ " CODE_=:newCode"
+ " where CODE_=:oldCode and TEST_CASE_ID_ in (:testCaseIds)";
Map<String, Object> params = new HashMap<String, Object>();
params.put("newCode", newEntity.getCode());
params.put("oldCode", oldEntity.getCode());
params.put("testCaseIds", testCaseIds);
namedParameterJdbcTemplate.update(sql, params);
}
}
}
}
}

21
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/service/impl/LibServiceImpl.java

@ -20,10 +20,7 @@ import io.sc.engine.rule.server.plugins.PluginManager;
import io.sc.engine.rule.server.plugins.item.LibExampleItem;
import io.sc.engine.rule.server.resource.entity.ModelResourceEntity;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.resource.entity.ScoreCardResourceEntity;
import io.sc.engine.rule.server.resource.service.ResourceService;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.util.ObjectMapper4Json;
import io.sc.platform.orm.entity.support.EntityChangedEventType;
@ -304,24 +301,6 @@ public class LibServiceImpl extends DaoServiceImpl<LibEntity, String, LibReposit
}
return new ArrayList<ReleasableLibEntity>(result);
}
}else if(ResourceType.SCORE_CARD.equals(resourceEntity.getType())) {
ScoreCardResourceEntity scoreCardResourceEntity =resourceService.getRepository().findScoreCardResourceById(resourceId);
List<ScoreCardVarEntity> vars =scoreCardResourceEntity.getScoreCardVars();
if(vars!=null && vars.size()>0) {
Set<ReleasableLibEntity> result =new HashSet<ReleasableLibEntity>();
for(ScoreCardVarEntity var : vars) {
if(var instanceof ScoreCardIndicatorVarEntity) {
ScoreCardIndicatorVarEntity _var =(ScoreCardIndicatorVarEntity)var;
String libCode =_var.getLibCode();
Integer libVersion =_var.getLibVersion();
ReleasableLibEntity libEntity =repository.findReleasableLibByCodeAndVersion(libCode, libVersion);
if(libEntity!=null) {
result.add(libEntity);
}
}
}
return new ArrayList<ReleasableLibEntity>(result);
}
}
}
return null;

24
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/migration/service/impl/MigrationServiceImpl.java

@ -3,6 +3,10 @@ package io.sc.engine.rule.server.migration.service.impl;
import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.po.function.Function;
import io.sc.engine.rule.server.function.converter.FunctionEntityConverter;
import io.sc.engine.rule.server.function.entity.FunctionEntity;
import io.sc.engine.rule.server.function.service.FunctionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -29,6 +33,7 @@ public class MigrationServiceImpl implements MigrationService{
@Autowired private DictionaryService dictionaryService;
@Autowired private LibService libService;
@Autowired private ModelService modelService;
@Autowired private FunctionService functionService;
@Autowired private TestCaseService testCaseService;
@Override
@ -37,6 +42,7 @@ public class MigrationServiceImpl implements MigrationService{
allInOne.setResources(ResourceEntityConverter.toPo(resourceService.getRepository().findRootResources(),true));
allInOne.setDictionaries(DictionaryEntityConverter.toPo(dictionaryService.getRepository().findRootDictionaries()));
allInOne.setLibs(LibEntityConverter.toPo(libService.getRepository().findRootLibs()));
allInOne.setFunctions(FunctionEntityConverter.toPo(functionService.getRepository().findAll()));
return allInOne;
}
@ -45,7 +51,7 @@ public class MigrationServiceImpl implements MigrationService{
public void imports(AllInOne allInOne) {
if(allInOne!=null) {
List<Resource> resources =allInOne.getResources();
List<ResourceEntity> resourceEntities =new ArrayList<ResourceEntity>();
List<ResourceEntity> resourceEntities =new ArrayList<>();
if(resources!=null && resources.size()>0) {
for(Resource resource : resources) {
ResourceEntity entity =ResourceEntityConverter.fromPo(resource);
@ -56,7 +62,7 @@ public class MigrationServiceImpl implements MigrationService{
resourceService.getRepository().saveAll(resourceEntities);
List<Dictionary> dictionaries =allInOne.getDictionaries();
List<DictionaryEntity> dictionaryEntities =new ArrayList<DictionaryEntity>();
List<DictionaryEntity> dictionaryEntities =new ArrayList<>();
if(dictionaries!=null && dictionaries.size()>0) {
for(Dictionary dictionary : dictionaries) {
DictionaryEntity entity =DictionaryEntityConverter.fromPo(dictionary);
@ -67,7 +73,7 @@ public class MigrationServiceImpl implements MigrationService{
dictionaryService.getRepository().saveAll(dictionaryEntities);
List<Lib> libs =allInOne.getLibs();
List<LibEntity> libEntities =new ArrayList<LibEntity>();
List<LibEntity> libEntities =new ArrayList<>();
if(libs!=null && libs.size()>0) {
for(Lib lib : libs) {
LibEntity entity =LibEntityConverter.fromPo(lib);
@ -76,6 +82,17 @@ public class MigrationServiceImpl implements MigrationService{
}
}
libService.getRepository().saveAll(libEntities);
List<Function> functions =allInOne.getFunctions();
List<FunctionEntity> functionEntities =new ArrayList<>();
if(functions!=null && functions.size()>0) {
for(Function function : functions) {
FunctionEntity entity =FunctionEntityConverter.fromPo(function);
entity.clearId();
functionEntities.add(entity);
}
}
functionService.getRepository().saveAll(functionEntities);
}
}
@ -86,5 +103,6 @@ public class MigrationServiceImpl implements MigrationService{
libService.getRepository().deleteAllInBatch();
modelService.getRepository().deleteAllInBatch();
testCaseService.getRepository().deleteAllInBatch();
functionService.getRepository().deleteAllInBatch();
}
}

14
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/migration/support/AllInOne.java

@ -4,13 +4,15 @@ import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.po.dictionary.Dictionary;
import io.sc.engine.rule.core.po.function.Function;
import io.sc.engine.rule.core.po.lib.Lib;
import io.sc.engine.rule.core.po.resource.Resource;
public class AllInOne {
private List<Resource> resources =new ArrayList<Resource>();
private List<Lib> libs =new ArrayList<Lib>();
private List<Dictionary> dictionaries =new ArrayList<Dictionary>();
private List<Resource> resources =new ArrayList<>();
private List<Lib> libs =new ArrayList<>();
private List<Dictionary> dictionaries =new ArrayList<>();
private List<Function> functions =new ArrayList<>();
public List<Resource> getResources() {
return resources;
@ -30,4 +32,10 @@ public class AllInOne {
public void setDictionaries(List<Dictionary> dictionaries) {
this.dictionaries = dictionaries;
}
public List<Function> getFunctions() {
return functions;
}
public void setFunctions(List<Function> functions) {
this.functions = functions;
}
}

246
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterProcessorEntityConverter.java

@ -1,13 +1,13 @@
package io.sc.engine.rule.server.model.converter;
import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.po.model.ParameterProcessor;
import io.sc.engine.rule.core.po.model.processor.*;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
import io.sc.engine.rule.server.model.entity.processor.*;
import java.util.ArrayList;
import java.util.List;
/**
* 参数处理器实体转换器
*/
@ -20,23 +20,7 @@ public class ParameterProcessorEntityConverter {
public static ParameterProcessor toPo(ParameterProcessorEntity entity) {
if(entity!=null) {
ParameterProcessor po =null;
if(entity instanceof ObjectPropertiesParameterProcessorEntity) {
ObjectPropertiesParameterProcessorEntity _entity=(ObjectPropertiesParameterProcessorEntity)entity;
ObjectPropertiesParameterProcessor _po =new ObjectPropertiesParameterProcessor();
_po.setObjectCondition(_entity.getObjectCondition());
_po.setObjectProperties(_entity.getObjectProperties());
po =_po;
}else if(entity instanceof OptionValueParameterProcessorEntity) {
OptionValueParameterProcessorEntity _entity=(OptionValueParameterProcessorEntity)entity;
OptionValueParameterProcessor _po =new OptionValueParameterProcessor();
_po.setOptionCode(_entity.getOptionCode());
po =_po;
}else if(entity instanceof MathFormulaParameterProcessorEntity) {
MathFormulaParameterProcessorEntity _entity=(MathFormulaParameterProcessorEntity)entity;
MathFormulaParameterProcessor _po =new MathFormulaParameterProcessor();
_po.setMathFormula(_entity.getMathFormula());
po =_po;
}else if(entity instanceof ArithmeticParameterProcessorEntity) {
if(entity instanceof ArithmeticParameterProcessorEntity) {
ArithmeticParameterProcessorEntity _entity=(ArithmeticParameterProcessorEntity)entity;
ArithmeticParameterProcessor _po =new ArithmeticParameterProcessor();
_po.setArithmetic(_entity.getArithmetic());
@ -46,64 +30,84 @@ public class ParameterProcessorEntityConverter {
ConditionRangeParameterProcessor _po =new ConditionRangeParameterProcessor();
_po.setConditionRange(_entity.getConditionRange());
po =_po;
}else if(entity instanceof DecisionTable2CParameterProcessorEntity) {
DecisionTable2CParameterProcessorEntity _entity=(DecisionTable2CParameterProcessorEntity)entity;
DecisionTable2CParameterProcessor _po =new DecisionTable2CParameterProcessor();
_po.setDecisionTable2C(_entity.getDecisionTable2C());
po =_po;
}else if(entity instanceof DecisionTableParameterProcessorEntity) {
DecisionTableParameterProcessorEntity _entity=(DecisionTableParameterProcessorEntity)entity;
DecisionTableParameterProcessor _po =new DecisionTableParameterProcessor();
_po.setDecisionTable(_entity.getDecisionTable());
po =_po;
}else if(entity instanceof DecisionTable2CParameterProcessorEntity) {
DecisionTable2CParameterProcessorEntity _entity=(DecisionTable2CParameterProcessorEntity)entity;
DecisionTable2CParameterProcessor _po =new DecisionTable2CParameterProcessor();
_po.setDecisionTable2C(_entity.getDecisionTable2C());
po =_po;
}else if(entity instanceof DecisionTreeParameterProcessorEntity) {
DecisionTreeParameterProcessorEntity _entity=(DecisionTreeParameterProcessorEntity)entity;
DecisionTreeParameterProcessor _po =new DecisionTreeParameterProcessor();
_po.setDecisionTree(_entity.getDecisionTree());
po =_po;
}else if(entity instanceof EmptyParameterProcessorEntity) {
EmptyParameterProcessor _po =new EmptyParameterProcessor();
po =_po;
}else if(entity instanceof ExecutionFlowParameterProcessorEntity) {
ExecutionFlowParameterProcessorEntity _entity=(ExecutionFlowParameterProcessorEntity)entity;
ExecutionFlowParameterProcessor _po =new ExecutionFlowParameterProcessor();
_po.setExecutionFlow(_entity.getExecutionFlow());
po =_po;
}else if(entity instanceof GroovyScriptParameterProcessorEntity) {
GroovyScriptParameterProcessorEntity _entity=(GroovyScriptParameterProcessorEntity)entity;
GroovyScriptParameterProcessor _po =new GroovyScriptParameterProcessor();
_po.setGroovyScript(_entity.getGroovyScript());
po =_po;
}else if(entity instanceof HttpRequestParameterProcessorEntity) {
HttpRequestParameterProcessorEntity _entity=(HttpRequestParameterProcessorEntity)entity;
HttpRequestParameterProcessor _po =new HttpRequestParameterProcessor();
_po.setHttpMethod(_entity.getHttpMethod());
_po.setHttpUrl(_entity.getHttpUrl());
_po.setHttpAuthType(_entity.getHttpAuthType());
_po.setHttpAuthApikey(_entity.getHttpAuthApikey());
_po.setHttpAuthApiValue(_entity.getHttpAuthApiValue());
_po.setHttpAuthApiAddTo(_entity.getHttpAuthApiAddTo());
_po.setHttpAuthBasicUsername(_entity.getHttpAuthBasicUsername());
_po.setHttpAuthBasicPassword(_entity.getHttpAuthBasicPassword());
_po.setHttpAuthBearerToken(_entity.getHttpAuthBearerToken());
_po.setHttpParams(_entity.getHttpParams());
_po.setHttpBody(_entity.getHttpBody());
_po.setHttpResponseMapping(_entity.getHttpResponseMapping());
po =_po;
}else if(entity instanceof MathFormulaParameterProcessorEntity) {
MathFormulaParameterProcessorEntity _entity=(MathFormulaParameterProcessorEntity)entity;
MathFormulaParameterProcessor _po =new MathFormulaParameterProcessor();
_po.setMathFormula(_entity.getMathFormula());
po =_po;
}else if(entity instanceof NumberRangeParameterProcessorEntity) {
NumberRangeParameterProcessorEntity _entity=(NumberRangeParameterProcessorEntity)entity;
NumberRangeParameterProcessor _po =new NumberRangeParameterProcessor();
_po.setNumberRangeVar(_entity.getNumberRangeVar());
_po.setNumberRange(_entity.getNumberRange());
po =_po;
}else if(entity instanceof ObjectPropertiesParameterProcessorEntity) {
ObjectPropertiesParameterProcessorEntity _entity=(ObjectPropertiesParameterProcessorEntity)entity;
ObjectPropertiesParameterProcessor _po =new ObjectPropertiesParameterProcessor();
_po.setObjectCondition(_entity.getObjectCondition());
_po.setObjectProperties(_entity.getObjectProperties());
po =_po;
}else if(entity instanceof OptionValueParameterProcessorEntity) {
OptionValueParameterProcessorEntity _entity=(OptionValueParameterProcessorEntity)entity;
OptionValueParameterProcessor _po =new OptionValueParameterProcessor();
_po.setOptionCode(_entity.getOptionCode());
po =_po;
}else if(entity instanceof PmmlParameterProcessorEntity) {
PmmlParameterProcessorEntity _entity=(PmmlParameterProcessorEntity)entity;
PmmlParameterProcessor _po =new PmmlParameterProcessor();
_po.setPmml(_entity.getPmml());
po =_po;
}else if(entity instanceof GroovyScriptParameterProcessorEntity) {
GroovyScriptParameterProcessorEntity _entity=(GroovyScriptParameterProcessorEntity)entity;
GroovyScriptParameterProcessor _po =new GroovyScriptParameterProcessor();
_po.setGroovyScript(_entity.getGroovyScript());
po =_po;
}else if(entity instanceof TernaryParameterProcessorEntity) {
TernaryParameterProcessorEntity _entity=(TernaryParameterProcessorEntity)entity;
TernaryParameterProcessor _po =new TernaryParameterProcessor();
_po.setTernaryCondition(_entity.getTernaryCondition());
_po.setTernaryTrue(_entity.getTernaryTrue());
_po.setTernaryFalse(_entity.getTernaryFalse());
po =_po;
}else if(entity instanceof WhenThenParameterProcessorEntity) {
WhenThenParameterProcessorEntity _entity=(WhenThenParameterProcessorEntity)entity;
WhenThenParameterProcessor _po =new WhenThenParameterProcessor();
_po.setWhen(_entity.getWhen());
_po.setThen(_entity.getThen());
_po.setIsWhenThenShorted(_entity.getIsWhenThenShorted());
po =_po;
}else if(entity instanceof RuleParameterProcessorEntity) {
RuleParameterProcessorEntity _entity=(RuleParameterProcessorEntity)entity;
RuleParameterProcessor _po =new RuleParameterProcessor();
_po.setRule(_entity.getRule());
po =_po;
}else if(entity instanceof ScoreCardParameterProcessorEntity){
ScoreCardParameterProcessorEntity _entity=(ScoreCardParameterProcessorEntity)entity;
ScoreCardParameterProcessor _po =new ScoreCardParameterProcessor();
_po.setScoreCard(_entity.getScoreCard());
po =_po;
}else if(entity instanceof SingleRuleParameterProcessorEntity) {
SingleRuleParameterProcessorEntity _entity=(SingleRuleParameterProcessorEntity)entity;
SingleRuleParameterProcessor _po =new SingleRuleParameterProcessor();
@ -117,21 +121,19 @@ public class ParameterProcessorEntityConverter {
_po.setSqlParameterValues(_entity.getSqlParameterValues());
_po.setSqlFieldMapping(_entity.getSqlFieldMapping());
po =_po;
}else if(entity instanceof HttpRequestParameterProcessorEntity) {
HttpRequestParameterProcessorEntity _entity=(HttpRequestParameterProcessorEntity)entity;
HttpRequestParameterProcessor _po =new HttpRequestParameterProcessor();
_po.setHttpMethod(_entity.getHttpMethod());
_po.setHttpUrl(_entity.getHttpUrl());
_po.setHttpAuthType(_entity.getHttpAuthType());
_po.setHttpAuthApikey(_entity.getHttpAuthApikey());
_po.setHttpAuthApiValue(_entity.getHttpAuthApiValue());
_po.setHttpAuthApiAddTo(_entity.getHttpAuthApiAddTo());
_po.setHttpAuthBasicUsername(_entity.getHttpAuthBasicUsername());
_po.setHttpAuthBasicPassword(_entity.getHttpAuthBasicPassword());
_po.setHttpAuthBearerToken(_entity.getHttpAuthBearerToken());
_po.setHttpParams(_entity.getHttpParams());
_po.setHttpBody(_entity.getHttpBody());
_po.setHttpResponseMapping(_entity.getHttpResponseMapping());
}else if(entity instanceof TernaryParameterProcessorEntity) {
TernaryParameterProcessorEntity _entity=(TernaryParameterProcessorEntity)entity;
TernaryParameterProcessor _po =new TernaryParameterProcessor();
_po.setTernaryCondition(_entity.getTernaryCondition());
_po.setTernaryTrue(_entity.getTernaryTrue());
_po.setTernaryFalse(_entity.getTernaryFalse());
po =_po;
}else if(entity instanceof WhenThenParameterProcessorEntity) {
WhenThenParameterProcessorEntity _entity=(WhenThenParameterProcessorEntity)entity;
WhenThenParameterProcessor _po =new WhenThenParameterProcessor();
_po.setWhen(_entity.getWhen());
_po.setThen(_entity.getThen());
_po.setIsWhenThenShorted(_entity.getIsWhenThenShorted());
po =_po;
}else {
EmptyParameterProcessor _po =new EmptyParameterProcessor();
@ -171,23 +173,7 @@ public class ParameterProcessorEntityConverter {
public static ParameterProcessorEntity fromPo(ParameterProcessor po) {
if(po!=null) {
ParameterProcessorEntity entity =null;
if(po instanceof ObjectPropertiesParameterProcessor) {
ObjectPropertiesParameterProcessor _po =(ObjectPropertiesParameterProcessor)po;
ObjectPropertiesParameterProcessorEntity _entity =new ObjectPropertiesParameterProcessorEntity();
_entity.setObjectCondition(_po.getObjectCondition());
_entity.setObjectProperties(_po.getObjectProperties());
entity =_entity;
}else if(po instanceof OptionValueParameterProcessor) {
OptionValueParameterProcessor _po =(OptionValueParameterProcessor)po;
OptionValueParameterProcessorEntity _entity =new OptionValueParameterProcessorEntity();
_entity.setOptionCode(_po.getOptionCode());
entity =_entity;
}else if(po instanceof MathFormulaParameterProcessor) {
MathFormulaParameterProcessor _po =(MathFormulaParameterProcessor)po;
MathFormulaParameterProcessorEntity _entity =new MathFormulaParameterProcessorEntity();
_entity.setMathFormula(_po.getMathFormula());
entity =_entity;
}else if(po instanceof ArithmeticParameterProcessor) {
if(po instanceof ArithmeticParameterProcessor) {
ArithmeticParameterProcessor _po =(ArithmeticParameterProcessor)po;
ArithmeticParameterProcessorEntity _entity =new ArithmeticParameterProcessorEntity();
_entity.setArithmetic(_po.getArithmetic());
@ -197,64 +183,84 @@ public class ParameterProcessorEntityConverter {
ConditionRangeParameterProcessorEntity _entity =new ConditionRangeParameterProcessorEntity();
_entity.setConditionRange(_po.getConditionRange());
entity =_entity;
}else if(po instanceof DecisionTable2CParameterProcessor) {
DecisionTable2CParameterProcessor _po =(DecisionTable2CParameterProcessor)po;
DecisionTable2CParameterProcessorEntity _entity =new DecisionTable2CParameterProcessorEntity();
_entity.setDecisionTable2C(_po.getDecisionTable2C());
entity =_entity;
}else if(po instanceof DecisionTableParameterProcessor) {
DecisionTableParameterProcessor _po =(DecisionTableParameterProcessor)po;
DecisionTableParameterProcessorEntity _entity =new DecisionTableParameterProcessorEntity();
_entity.setDecisionTable(_po.getDecisionTable());
entity =_entity;
}else if(po instanceof DecisionTable2CParameterProcessor) {
DecisionTable2CParameterProcessor _po =(DecisionTable2CParameterProcessor)po;
DecisionTable2CParameterProcessorEntity _entity =new DecisionTable2CParameterProcessorEntity();
_entity.setDecisionTable2C(_po.getDecisionTable2C());
entity =_entity;
}else if(po instanceof DecisionTreeParameterProcessor) {
DecisionTreeParameterProcessor _po =(DecisionTreeParameterProcessor)po;
DecisionTreeParameterProcessorEntity _entity =new DecisionTreeParameterProcessorEntity();
_entity.setDecisionTree(_po.getDecisionTree());
entity =_entity;
}else if(po instanceof EmptyParameterProcessor) {
EmptyParameterProcessorEntity _entity =new EmptyParameterProcessorEntity();
entity =_entity;
}else if(po instanceof ExecutionFlowParameterProcessor) {
ExecutionFlowParameterProcessor _po =(ExecutionFlowParameterProcessor)po;
ExecutionFlowParameterProcessorEntity _entity=new ExecutionFlowParameterProcessorEntity();
_entity.setExecutionFlow(_po.getExecutionFlow());
entity =_entity;
}else if(po instanceof GroovyScriptParameterProcessor) {
GroovyScriptParameterProcessor _po =(GroovyScriptParameterProcessor)po;
GroovyScriptParameterProcessorEntity _entity =new GroovyScriptParameterProcessorEntity();
_entity.setGroovyScript(_po.getGroovyScript());
entity =_entity;
}else if(po instanceof HttpRequestParameterProcessor){
HttpRequestParameterProcessor _po =(HttpRequestParameterProcessor)po;
HttpRequestParameterProcessorEntity _entity =new HttpRequestParameterProcessorEntity();
_entity.setHttpMethod(_po.getHttpMethod());
_entity.setHttpUrl(_po.getHttpUrl());
_entity.setHttpAuthType(_po.getHttpAuthType());
_entity.setHttpAuthApikey(_po.getHttpAuthApikey());
_entity.setHttpAuthApiValue(_po.getHttpAuthApiValue());
_entity.setHttpAuthApiAddTo(_po.getHttpAuthApiAddTo());
_entity.setHttpAuthBasicUsername(_po.getHttpAuthBasicUsername());
_entity.setHttpAuthBasicPassword(_po.getHttpAuthBasicPassword());
_entity.setHttpAuthBearerToken(_po.getHttpAuthBearerToken());
_entity.setHttpParams(_po.getHttpParams());
_entity.setHttpBody(_po.getHttpBody());
_entity.setHttpResponseMapping(_po.getHttpResponseMapping());
entity =_entity;
}else if(po instanceof MathFormulaParameterProcessor) {
MathFormulaParameterProcessor _po =(MathFormulaParameterProcessor)po;
MathFormulaParameterProcessorEntity _entity =new MathFormulaParameterProcessorEntity();
_entity.setMathFormula(_po.getMathFormula());
entity =_entity;
}else if(po instanceof NumberRangeParameterProcessor) {
NumberRangeParameterProcessor _po =(NumberRangeParameterProcessor)po;
NumberRangeParameterProcessorEntity _entity =new NumberRangeParameterProcessorEntity();
_entity.setNumberRangeVar(_po.getNumberRangeVar());
_entity.setNumberRange(_po.getNumberRange());
entity =_entity;
}else if(po instanceof ObjectPropertiesParameterProcessor) {
ObjectPropertiesParameterProcessor _po =(ObjectPropertiesParameterProcessor)po;
ObjectPropertiesParameterProcessorEntity _entity =new ObjectPropertiesParameterProcessorEntity();
_entity.setObjectCondition(_po.getObjectCondition());
_entity.setObjectProperties(_po.getObjectProperties());
entity =_entity;
}else if(po instanceof OptionValueParameterProcessor) {
OptionValueParameterProcessor _po =(OptionValueParameterProcessor)po;
OptionValueParameterProcessorEntity _entity =new OptionValueParameterProcessorEntity();
_entity.setOptionCode(_po.getOptionCode());
entity =_entity;
}else if(po instanceof PmmlParameterProcessor) {
PmmlParameterProcessor _po =(PmmlParameterProcessor)po;
PmmlParameterProcessorEntity _entity =new PmmlParameterProcessorEntity();
_entity.setPmml(_po.getPmml());
entity =_entity;
}else if(po instanceof GroovyScriptParameterProcessor) {
GroovyScriptParameterProcessor _po =(GroovyScriptParameterProcessor)po;
GroovyScriptParameterProcessorEntity _entity =new GroovyScriptParameterProcessorEntity();
_entity.setGroovyScript(_po.getGroovyScript());
entity =_entity;
}else if(po instanceof TernaryParameterProcessor) {
TernaryParameterProcessor _po =(TernaryParameterProcessor)po;
TernaryParameterProcessorEntity _entity =new TernaryParameterProcessorEntity();
_entity.setTernaryCondition(_po.getTernaryCondition());
_entity.setTernaryTrue(_po.getTernaryTrue());
_entity.setTernaryFalse(_po.getTernaryFalse());
entity =_entity;
}else if(po instanceof WhenThenParameterProcessor) {
WhenThenParameterProcessor _po =(WhenThenParameterProcessor)po;
WhenThenParameterProcessorEntity _entity =new WhenThenParameterProcessorEntity();
_entity.setWhen(_po.getWhen());
_entity.setThen(_po.getThen());
_entity.setIsWhenThenShorted(_po.getIsWhenThenShorted());
entity =_entity;
}else if(po instanceof RuleParameterProcessor) {
RuleParameterProcessor _po =(RuleParameterProcessor)po;
RuleParameterProcessorEntity _entity =new RuleParameterProcessorEntity();
_entity.setRule(_po.getRule());
entity =_entity;
}else if(po instanceof ScoreCardParameterProcessor) {
ScoreCardParameterProcessor _po =(ScoreCardParameterProcessor)po;
ScoreCardParameterProcessorEntity _entity =new ScoreCardParameterProcessorEntity();
_entity.setScoreCard(_po.getScoreCard());
entity =_entity;
}else if(po instanceof SingleRuleParameterProcessor) {
SingleRuleParameterProcessor _po =(SingleRuleParameterProcessor)po;
SingleRuleParameterProcessorEntity _entity =new SingleRuleParameterProcessorEntity();
@ -268,21 +274,19 @@ public class ParameterProcessorEntityConverter {
_entity.setSqlParameterValues(_po.getSqlParameterValues());
_entity.setSqlFieldMapping(_po.getSqlFieldMapping());
entity =_entity;
}else if(po instanceof HttpRequestParameterProcessor){
HttpRequestParameterProcessor _po =(HttpRequestParameterProcessor)po;
HttpRequestParameterProcessorEntity _entity =new HttpRequestParameterProcessorEntity();
_entity.setHttpMethod(_po.getHttpMethod());
_entity.setHttpUrl(_po.getHttpUrl());
_entity.setHttpAuthType(_po.getHttpAuthType());
_entity.setHttpAuthApikey(_po.getHttpAuthApikey());
_entity.setHttpAuthApiValue(_po.getHttpAuthApiValue());
_entity.setHttpAuthApiAddTo(_po.getHttpAuthApiAddTo());
_entity.setHttpAuthBasicUsername(_po.getHttpAuthBasicUsername());
_entity.setHttpAuthBasicPassword(_po.getHttpAuthBasicPassword());
_entity.setHttpAuthBearerToken(_po.getHttpAuthBearerToken());
_entity.setHttpParams(_po.getHttpParams());
_entity.setHttpBody(_po.getHttpBody());
_entity.setHttpResponseMapping(_po.getHttpResponseMapping());
}else if(po instanceof TernaryParameterProcessor) {
TernaryParameterProcessor _po =(TernaryParameterProcessor)po;
TernaryParameterProcessorEntity _entity =new TernaryParameterProcessorEntity();
_entity.setTernaryCondition(_po.getTernaryCondition());
_entity.setTernaryTrue(_po.getTernaryTrue());
_entity.setTernaryFalse(_po.getTernaryFalse());
entity =_entity;
}else if(po instanceof WhenThenParameterProcessor) {
WhenThenParameterProcessor _po =(WhenThenParameterProcessor)po;
WhenThenParameterProcessorEntity _entity =new WhenThenParameterProcessorEntity();
_entity.setWhen(_po.getWhen());
_entity.setThen(_po.getThen());
_entity.setIsWhenThenShorted(_po.getIsWhenThenShorted());
entity =_entity;
}else {
EmptyParameterProcessorEntity _entity =new EmptyParameterProcessorEntity();

19
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterProcessorEntity.java

@ -27,25 +27,26 @@ import java.util.Map;
@Table(name="RE_MODEL_PARAMETER_PROCESSOR")
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=EmptyParameterProcessorEntity.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=ObjectPropertiesParameterProcessorEntity.class), //对象属性处理器
@JsonSubTypes.Type(value=OptionValueParameterProcessorEntity.class), //选项值处理器
@JsonSubTypes.Type(value=MathFormulaParameterProcessorEntity.class), //数学公式处理器
@JsonSubTypes.Type(value=EmptyParameterProcessorEntity.class), //空处理器
@JsonSubTypes.Type(value=ArithmeticParameterProcessorEntity.class), //算数操作处理器
@JsonSubTypes.Type(value=ConditionRangeParameterProcessorEntity.class), //条件范围处理器
@JsonSubTypes.Type(value=DecisionTable2CParameterProcessorEntity.class), //简单决策表处理器
@JsonSubTypes.Type(value=DecisionTableParameterProcessorEntity.class), //决策表处理器
@JsonSubTypes.Type(value=DecisionTable2CParameterProcessorEntity.class), //简单决策表处理器
@JsonSubTypes.Type(value=DecisionTreeParameterProcessorEntity.class), //决策树处理器
@JsonSubTypes.Type(value=EmptyParameterProcessorEntity.class), //空处理器
@JsonSubTypes.Type(value=ExecutionFlowParameterProcessorEntity.class), //执行流处理器
@JsonSubTypes.Type(value=GroovyScriptParameterProcessorEntity.class), //脚本代码处理器
@JsonSubTypes.Type(value=HttpRequestParameterProcessorEntity.class), //Http请求处理器
@JsonSubTypes.Type(value=MathFormulaParameterProcessorEntity.class), //数学公式处理器
@JsonSubTypes.Type(value=NumberRangeParameterProcessorEntity.class), //数值范围处理器
@JsonSubTypes.Type(value=ObjectPropertiesParameterProcessorEntity.class), //对象属性处理器
@JsonSubTypes.Type(value=OptionValueParameterProcessorEntity.class), //选项值处理器
@JsonSubTypes.Type(value=PmmlParameterProcessorEntity.class), //PMML处理器
@JsonSubTypes.Type(value=GroovyScriptParameterProcessorEntity.class), //脚本代码处理器
@JsonSubTypes.Type(value=TernaryParameterProcessorEntity.class), //三元操作处理器
@JsonSubTypes.Type(value=WhenThenParameterProcessorEntity.class), //When-Then 操作处理器
@JsonSubTypes.Type(value=RuleParameterProcessorEntity.class), //规则处理器
@JsonSubTypes.Type(value=ScoreCardParameterProcessorEntity.class), //评分卡处理器
@JsonSubTypes.Type(value=SingleRuleParameterProcessorEntity.class), //单规则处理器
@JsonSubTypes.Type(value=SqlParameterProcessorEntity.class), //Sql处理器
@JsonSubTypes.Type(value=HttpRequestParameterProcessorEntity.class), //Http请求处理器
@JsonSubTypes.Type(value=TernaryParameterProcessorEntity.class), //三元操作处理器
@JsonSubTypes.Type(value=WhenThenParameterProcessorEntity.class), //When-Then 操作处理器
})
public class ParameterProcessorEntity extends AuditorEntity<ParameterProcessorVo> implements DeepClone, IdClearable, CodeAndNameReplacer{
//ID,主键

97
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/processor/ScoreCardParameterProcessorEntity.java

@ -0,0 +1,97 @@
package io.sc.engine.rule.server.model.entity.processor;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.code.impl.support.processor.ConditionRange;
import io.sc.engine.rule.core.code.impl.support.processor.NumberRange;
import io.sc.engine.rule.core.code.impl.support.processor.ScoreCardItem;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.core.util.ExpressionReplacer;
import io.sc.engine.rule.core.util.JacksonObjectMapper;
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity;
import io.sc.engine.rule.server.model.vo.processor.ScoreCardParameterProcessorVo;
import io.sc.platform.core.util.ObjectMapper4Json;
import org.springframework.util.StringUtils;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 模型参数处理器算数运算操作实体类
*/
@Entity
@DiscriminatorValue("SCORE_CARD")
@JsonTypeName("SCORE_CARD")
public class ScoreCardParameterProcessorEntity extends ParameterProcessorEntity {
//算数表达式
@Column(name="SCORE_CARD_")
private String scoreCard;
@Override
public ScoreCardParameterProcessorVo toVo() {
ScoreCardParameterProcessorVo vo =new ScoreCardParameterProcessorVo();
super.toVo(vo);
vo.setScoreCard(this.getScoreCard());
return vo;
}
@Override
public ProcessorType getType() {
return ProcessorType.SCORE_CARD;
}
public String getScoreCard() {
return scoreCard;
}
public void setScoreCard(String scoreCard) {
this.scoreCard = scoreCard;
}
@Override
public boolean replace(Map<String, String> mapping) {
List<ScoreCardItem> scoreCardItems =new ArrayList<>();
try {
if(StringUtils.hasText(this.scoreCard)) {
scoreCardItems = ObjectMapper4Json.getMapper().readValue(this.scoreCard, new TypeReference<List<ScoreCardItem>>() {});
}
}catch (Exception e){
}
if(scoreCardItems!=null && !scoreCardItems.isEmpty()){
for(ScoreCardItem scoreCardItem : scoreCardItems){
scoreCardItem.setName(ExpressionReplacer.replace(scoreCardItem.getCode(), mapping));
List<ConditionRange> conditionRanges =scoreCardItem.getConditionRange();
if(conditionRanges!=null && !conditionRanges.isEmpty()){
for(ConditionRange conditionRange : conditionRanges){
conditionRange.setCondition(ExpressionReplacer.replace(conditionRange.getCondition(), mapping));
conditionRange.setValue(ExpressionReplacer.replace(conditionRange.getValue(), mapping));
}
}
List<NumberRange> numberRanges =scoreCardItem.getNumberRange();
if(numberRanges!=null && !numberRanges.isEmpty()){
for(NumberRange numberRange : numberRanges){
numberRange.setValue(ExpressionReplacer.replace(numberRange.getValue(), mapping));
}
}
}
}
String replaced ="";
try {
replaced = ObjectMapper4Json.getMapper().writeValueAsString(scoreCardItems);
}catch (Exception e){
}
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.scoreCard)) {
result =true;
}
this.scoreCard =replaced;
return result;
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/processor/ScoreCardParameterProcessorVo.java

@ -0,0 +1,26 @@
package io.sc.engine.rule.server.model.vo.processor;
import io.sc.engine.rule.core.enums.ProcessorType;
import io.sc.engine.rule.server.model.vo.ParameterProcessorVo;
/**
* 模型参数处理器评分卡操作Vo
*/
public class ScoreCardParameterProcessorVo extends ParameterProcessorVo {
//评分卡配置
private String scoreCard;
@Override
public ProcessorType getType() {
return ProcessorType.SCORE_CARD;
}
public String getScoreCard() {
return scoreCard;
}
public void setScoreCard(String scoreCard) {
this.scoreCard = scoreCard;
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/converter/ResourceEntityConverter.java

@ -1,25 +1,21 @@
package io.sc.engine.rule.server.resource.converter;
import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.po.resource.FolderResource;
import io.sc.engine.rule.core.po.resource.ModelResource;
import io.sc.engine.rule.core.po.resource.ReleasableResource;
import io.sc.engine.rule.core.po.resource.Resource;
import io.sc.engine.rule.core.po.resource.ScoreCardResource;
import io.sc.engine.rule.server.model.converter.ModelEntityConverter;
import io.sc.engine.rule.server.model.entity.ModelEntity;
import io.sc.engine.rule.server.resource.entity.FolderResourceEntity;
import io.sc.engine.rule.server.resource.entity.ModelResourceEntity;
import io.sc.engine.rule.server.resource.entity.ReleasableResourceEntity;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.resource.entity.ScoreCardResourceEntity;
import io.sc.engine.rule.server.scorecard.converter.ScoreCardVarEntityConverter;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.engine.rule.server.testcase.converter.ResourceTestCaseEntityConverter;
import io.sc.engine.rule.server.testcase.entity.ResourceTestCaseEntity;
import java.util.ArrayList;
import java.util.List;
/**
* 资源实体转换器
*/
@ -40,11 +36,6 @@ public class ResourceEntityConverter {
ModelResource _po =new ModelResource();
_po.setModel(ModelEntityConverter.toPo(_entity.getModel()));
po =_po;
}else if(entity instanceof ScoreCardResourceEntity) {
ScoreCardResourceEntity _entity =(ScoreCardResourceEntity)entity;
ScoreCardResource _po =new ScoreCardResource();
_po.setScoreCardVars(ScoreCardVarEntityConverter.toPo(_entity.getScoreCardVars()));
po =_po;
}else {
po =new FolderResource();
}
@ -108,17 +99,6 @@ public class ResourceEntityConverter {
_entity.setModel(modelEntity);
}
entity =_entity;
}else if(po instanceof ScoreCardResource) {
ScoreCardResource _po =(ScoreCardResource)po;
ScoreCardResourceEntity _entity =new ScoreCardResourceEntity();
List<ScoreCardVarEntity> scoreCardVars =ScoreCardVarEntityConverter.fromPo(_po.getScoreCardVars());
if(scoreCardVars!=null && scoreCardVars.size()>0) {
for(ScoreCardVarEntity scoreCardVar : scoreCardVars) {
scoreCardVar.setResource(_entity);
}
}
_entity.setScoreCardVars(scoreCardVars);
entity =_entity;
}else {
entity =new FolderResourceEntity();
}

3
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ResourceEntity.java

@ -54,8 +54,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",visible=true,defaultImpl=FolderResourceEntity.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=FolderResourceEntity.class), //文件夹实体
@JsonSubTypes.Type(value=ModelResourceEntity.class), //模型实体
@JsonSubTypes.Type(value=ScoreCardResourceEntity.class) //评分卡实体
@JsonSubTypes.Type(value=ModelResourceEntity.class) //模型实体
})
public class ResourceEntity extends AuditorEntity<ResourceVo> implements DeepClone, IdClearable {
//ID,主键

120
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ScoreCardResourceEntity.java

@ -1,120 +0,0 @@
package io.sc.engine.rule.server.resource.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.server.resource.vo.ScoreCardResourceVo;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.engine.rule.server.testcase.entity.ResourceTestCaseEntity;
import org.springframework.beans.BeanUtils;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
/**
* 评分卡资源实体类
*/
@Entity
@DiscriminatorValue("SCORE_CARD")
@JsonTypeName("SCORE_CARD")
public class ScoreCardResourceEntity extends ReleasableResourceEntity {
//模型包含的评分卡变量
@OneToMany(mappedBy="resource",cascade= {CascadeType.PERSIST})
@OrderBy("order")
protected List<ScoreCardVarEntity> scoreCardVars =new ArrayList<ScoreCardVarEntity>();
@Override
public ScoreCardResourceVo toVo() {
ScoreCardResourceVo vo =new ScoreCardResourceVo();
super.toVo(vo);
vo.setType(this.getType());
return vo;
}
public ScoreCardResourceEntity() {}
public ScoreCardResourceEntity(String id) {
this.id =id;
}
@Override
public ResourceType getType() {
return ResourceType.SCORE_CARD;
}
public List<ScoreCardVarEntity> getScoreCardVars() {
return scoreCardVars;
}
public void setScoreCardVars(List<ScoreCardVarEntity> scoreCardVars) {
this.scoreCardVars = scoreCardVars;
}
@Override
public Object deepClone() throws Exception {
ScoreCardResourceEntity entity =new ScoreCardResourceEntity();
BeanUtils.copyProperties(this, entity, "children","testCases","scoreCardVars","roles");
//children
List<ResourceEntity> children =this.getChildren();
if(children!=null && children.size()>0) {
for(ResourceEntity child : children) {
ResourceEntity clone =(ResourceEntity)child.deepClone();
clone.setParent(entity);
entity.getChildren().add(clone);
}
}
//testCases
List<ResourceTestCaseEntity> testCases =this.getTestCases();
if(testCases!=null && testCases.size()>0) {
for(ResourceTestCaseEntity testCase : testCases) {
ResourceTestCaseEntity clone =(ResourceTestCaseEntity)testCase.deepClone();
clone.setOwner(entity);
entity.getTestCases().add(clone);
}
}
//scoreCardVars
List<ScoreCardVarEntity> vars =this.getScoreCardVars();
if(vars!=null && vars.size()>0) {
for(ScoreCardVarEntity var : vars) {
ScoreCardVarEntity clone =(ScoreCardVarEntity)var.deepClone();
clone.setResource(entity);
entity.getScoreCardVars().add(clone);
}
}
return entity;
}
@Override
public void clearId() {
super.clearId();
//scoreCardVars
List<ScoreCardVarEntity> scoreCardVars =this.getScoreCardVars();
if(scoreCardVars!=null && scoreCardVars.size()>0) {
for(ScoreCardVarEntity scoreCardVar : scoreCardVars) {
scoreCardVar.clearId();
}
}
}
@Override
public String toString() {
return "ScoreCardResourceEntity ["
+ " type=" + type
+ " id=" + id
+ ", code=" + code
+ ", name=" + name
+ ", description=" + description
+ ", order=" + order
+ ", status=" + status
+ ", version=" + version
+ ", effectiveDate=" + effectiveDate
+ ", imports=" + imports
+ ", creator=" + creator
+ ", createDate=" + createDate
+ ", lastModifier=" + lastModifier
+ ", lastModifyDate=" + lastModifyDate
+ "]";
}
}

17
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/repository/ResourceRepository.java

@ -1,19 +1,18 @@
package io.sc.engine.rule.server.resource.repository;
import java.util.List;
import java.util.Set;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import io.sc.engine.rule.core.enums.DeployStatus;
import io.sc.engine.rule.server.resource.entity.FolderResourceEntity;
import io.sc.engine.rule.server.resource.entity.ModelResourceEntity;
import io.sc.engine.rule.server.resource.entity.ReleasableResourceEntity;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.resource.entity.ScoreCardResourceEntity;
import io.sc.platform.orm.repository.DaoRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Set;
@Repository("io.sc.engine.rule.server.resource.repository.ResourceRepository")
public interface ResourceRepository extends DaoRepository<ResourceEntity,String>{
//====================================================================================
@ -87,10 +86,4 @@ public interface ResourceRepository extends DaoRepository<ResourceEntity,String>
//====================================================================================
@Query("select entity from ModelResourceEntity entity where entity.id=:id")
public ModelResourceEntity findModelResourceById(@Param("id") String id);
//====================================================================================
// ResourceEntity <-- ReleasableResourceEntity <-- ScoreCardResrouceEntity
//====================================================================================
@Query("select entity from ScoreCardResourceEntity entity where entity.id=:id")
public ScoreCardResourceEntity findScoreCardResourceById(@Param("id") String id);
}

2
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/impl/ResourceServiceImpl.java

@ -213,7 +213,7 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
}
}
}
if(!isAdminRole) {
if(!isAdminRole && !roleIds.isEmpty()) {
InSet inSet =new InSet();
inSet.setFieldName("roles");
inSet.setValue(roleIds.toArray(new String[]{}));

16
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/controller/ScoreCardVarWebController.java

@ -1,16 +0,0 @@
package io.sc.engine.rule.server.scorecard.controller;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.engine.rule.server.scorecard.repository.ScoreCardVarRepository;
import io.sc.engine.rule.server.scorecard.service.ScoreCardVarService;
import io.sc.engine.rule.server.scorecard.vo.ScoreCardVarVo;
import io.sc.platform.mvc.controller.support.RestCrudController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController("io.sc.engine.rule.server.scorecard.controller.ScoreCardVarWebController")
@RequestMapping("/api/re/scoreCardVar")
public class ScoreCardVarWebController extends RestCrudController<ScoreCardVarVo,ScoreCardVarEntity,String,ScoreCardVarRepository,ScoreCardVarService> {
}

171
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/converter/ScoreCardVarEntityConverter.java

@ -1,171 +0,0 @@
package io.sc.engine.rule.server.scorecard.converter;
import java.util.ArrayList;
import java.util.List;
import io.sc.engine.rule.core.po.scorecard.NumberRangeScoreCardIndicatorVar;
import io.sc.engine.rule.core.po.scorecard.NumberRangeScoreCardVar;
import io.sc.engine.rule.core.po.scorecard.OptionScoreCardIndicatorVar;
import io.sc.engine.rule.core.po.scorecard.OptionScoreCardVar;
import io.sc.engine.rule.core.po.scorecard.ScoreCardIndicatorValueVar;
import io.sc.engine.rule.core.po.scorecard.ScoreCardIndicatorVar;
import io.sc.engine.rule.core.po.scorecard.ScoreCardVar;
import io.sc.engine.rule.server.scorecard.entity.NumberRangeScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.entity.NumberRangeScoreCardVarEntity;
import io.sc.engine.rule.server.scorecard.entity.OptionScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.entity.OptionScoreCardVarEntity;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorValueVarEntity;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
/**
* 评分卡变量实体转换器
* @author wangshaoping
*
*/
public class ScoreCardVarEntityConverter {
/**
* 将实体转换成 PO 对象
* @param entity 实体对象
* @return PO 对象
*/
public static ScoreCardVar toPo(ScoreCardVarEntity entity) {
if(entity!=null) {
ScoreCardVar po =null;
if(entity instanceof NumberRangeScoreCardVarEntity) {
NumberRangeScoreCardVarEntity _entity =(NumberRangeScoreCardVarEntity)entity;
NumberRangeScoreCardVar _po =new NumberRangeScoreCardVar();
_po.setNumberRange(_entity.getNumberRange());
po =_po;
}else if(entity instanceof NumberRangeScoreCardIndicatorVarEntity) {
NumberRangeScoreCardIndicatorVarEntity _entity =(NumberRangeScoreCardIndicatorVarEntity)entity;
NumberRangeScoreCardIndicatorVar _po =new NumberRangeScoreCardIndicatorVar();
_po.setNumberRange(_entity.getNumberRange());
po =_po;
}else if(entity instanceof OptionScoreCardVarEntity) {
OptionScoreCardVarEntity _entity =(OptionScoreCardVarEntity)entity;
OptionScoreCardVar _po =new OptionScoreCardVar();
_po.setOption(_entity.getOption());
po =_po;
}else if(entity instanceof OptionScoreCardIndicatorVarEntity) {
OptionScoreCardIndicatorVarEntity _entity =(OptionScoreCardIndicatorVarEntity)entity;
OptionScoreCardIndicatorVar _po =new OptionScoreCardIndicatorVar();
_po.setOption(_entity.getOption());
po =_po;
}else if(entity instanceof ScoreCardIndicatorValueVarEntity) {
po =new ScoreCardIndicatorValueVar();
}else {
OptionScoreCardVarEntity _entity =(OptionScoreCardVarEntity)entity;
OptionScoreCardVar _po =new OptionScoreCardVar();
_po.setOption(_entity.getOption());
po =_po;
}
if(entity instanceof ScoreCardIndicatorVarEntity) {
ScoreCardIndicatorVarEntity _entity =(ScoreCardIndicatorVarEntity)entity;
((ScoreCardIndicatorVar)po).setLibCode(_entity.getLibCode());
((ScoreCardIndicatorVar)po).setLibVersion(_entity.getLibVersion());
((ScoreCardIndicatorVar)po).setIndicatorCode(_entity.getIndicatorCode());
}
po.setId(entity.getId());
po.setCode(entity.getCode());
po.setName(entity.getName());
po.setOrder(entity.getOrder());
return po;
}
return null;
}
/**
* 将实体集合转换成 PO 对象集合
* @param entities 实体集合
* @return PO 对象集合
*/
public static List<ScoreCardVar> toPo(List<ScoreCardVarEntity> entities){
if(entities!=null && entities.size()>0) {
List<ScoreCardVar> pos =new ArrayList<ScoreCardVar>(entities.size());
for(ScoreCardVarEntity entity : entities) {
pos.add(toPo(entity));
}
return pos;
}
return null;
}
/**
* PO 对象转换成实体对象
* @param po PO 对象
* @return 实体对象
*/
public static ScoreCardVarEntity fromPo(ScoreCardVar po) {
if(po!=null) {
ScoreCardVarEntity entity =null;
if(po instanceof NumberRangeScoreCardVar) {
NumberRangeScoreCardVar _po =(NumberRangeScoreCardVar)po;
NumberRangeScoreCardVarEntity _entity =new NumberRangeScoreCardVarEntity();
_entity.setNumberRange(_po.getNumberRange());
entity =_entity;
}else if(po instanceof NumberRangeScoreCardIndicatorVar) {
NumberRangeScoreCardIndicatorVar _po =(NumberRangeScoreCardIndicatorVar)po;
NumberRangeScoreCardIndicatorVarEntity _entity =new NumberRangeScoreCardIndicatorVarEntity();
_entity.setNumberRange(_po.getNumberRange());
entity =_entity;
}else if(po instanceof OptionScoreCardVar) {
OptionScoreCardVar _po =(OptionScoreCardVar)po;
OptionScoreCardVarEntity _entity =new OptionScoreCardVarEntity();
_entity.setOption(_po.getOption());
entity =_entity;
}else if(po instanceof OptionScoreCardIndicatorVar) {
OptionScoreCardIndicatorVar _po =(OptionScoreCardIndicatorVar)po;
OptionScoreCardIndicatorVarEntity _entity =new OptionScoreCardIndicatorVarEntity();
_entity.setOption(_po.getOption());
entity =_entity;
}else if(po instanceof ScoreCardIndicatorValueVar) {
ScoreCardIndicatorValueVar _po =(ScoreCardIndicatorValueVar)po;
ScoreCardIndicatorValueVarEntity _entity =new ScoreCardIndicatorValueVarEntity();
_entity.setLibCode(_po.getLibCode());
_entity.setLibVersion(_po.getLibVersion());
_entity.setIndicatorCode(_po.getIndicatorCode());
entity =_entity;
}else {
OptionScoreCardVar _po =(OptionScoreCardVar)po;
OptionScoreCardVarEntity _entity =new OptionScoreCardVarEntity();
_entity.setOption(_po.getOption());
entity =_entity;
}
if(entity!=null) {
if(po instanceof ScoreCardIndicatorVar) {
ScoreCardIndicatorVar _po =(ScoreCardIndicatorVar)po;
((ScoreCardIndicatorVarEntity)entity).setLibCode(_po.getLibCode());
((ScoreCardIndicatorVarEntity)entity).setLibVersion(_po.getLibVersion());
((ScoreCardIndicatorVarEntity)entity).setIndicatorCode(_po.getIndicatorCode());
}
entity.setId(po.getId());
entity.setCode(po.getCode());
entity.setName(po.getName());
entity.setOrder(po.getOrder());
return entity;
}
}
return null;
}
/**
* PO 对象集合转换成实体对象集合
* @param pos PO 对象集合
* @return 实体对象集合
*/
public static List<ScoreCardVarEntity> fromPo(List<ScoreCardVar> pos){
if(pos!=null && pos.size()>0) {
List<ScoreCardVarEntity> entities =new ArrayList<ScoreCardVarEntity>(pos.size());
for(ScoreCardVar po : pos) {
entities.add(fromPo(po));
}
return entities;
}
return null;
}
}

66
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/NumberRangeScoreCardIndicatorVarEntity.java

@ -1,66 +0,0 @@
package io.sc.engine.rule.server.scorecard.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.engine.rule.server.scorecard.vo.NumberRangeScoreCardIndicatorVarVo;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 评分卡变量(指标选项)实体类
*/
@Entity
@DiscriminatorValue("INDICATOR_NUMBER_RANGE")
@JsonTypeName("INDICATOR_NUMBER_RANGE")
public class NumberRangeScoreCardIndicatorVarEntity extends ScoreCardIndicatorVarEntity {
//数值分段
@Column(name="NUMBER_RANGE_")
private String numberRange;
@Override
public NumberRangeScoreCardIndicatorVarVo toVo() {
NumberRangeScoreCardIndicatorVarVo vo =new NumberRangeScoreCardIndicatorVarVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setNumberRange(this.getNumberRange());
return vo;
}
public NumberRangeScoreCardIndicatorVarEntity() {}
public NumberRangeScoreCardIndicatorVarEntity(String id) {
this.id =id;
}
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_NUMBER_RANGE;
}
public String getNumberRange() {
return numberRange;
}
public void setNumberRange(String numberRange) {
this.numberRange = numberRange;
}
@Override
public TestCaseParameterWrapper toTestCaseParameterWrapper() {
TestCaseParameterWrapper wrapper =new TestCaseParameterWrapper(this.getId(),this.getCode(),null,null,null,null,false);
wrapper.setTestCaseId(null);
wrapper.setParent(null);
wrapper.setCategory("P");
wrapper.setName(this.getName());
wrapper.setParameterType(null);
wrapper.setScoreCardVarType(this.getType());
wrapper.setIndicatorType(null);
wrapper.setValueType("java.math.BigDecimal");
wrapper.setDefaultValue(null);
wrapper.setOrder(this.getOrder());
return wrapper;
}
}

66
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/NumberRangeScoreCardVarEntity.java

@ -1,66 +0,0 @@
package io.sc.engine.rule.server.scorecard.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.engine.rule.server.scorecard.vo.NumberRangeScoreCardVarVo;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 评分卡变量(数值分段)实体类
*/
@Entity
@DiscriminatorValue("NUMBER_RANGE")
@JsonTypeName("NUMBER_RANGE")
public class NumberRangeScoreCardVarEntity extends ScoreCardVarEntity {
//数值分段
@Column(name="NUMBER_RANGE_")
private String numberRange;
@Override
public NumberRangeScoreCardVarVo toVo() {
NumberRangeScoreCardVarVo vo =new NumberRangeScoreCardVarVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setNumberRange(this.getNumberRange());
return vo;
}
public NumberRangeScoreCardVarEntity() {}
public NumberRangeScoreCardVarEntity(String id) {
this.id =id;
}
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.NUMBER_RANGE;
}
public String getNumberRange() {
return numberRange;
}
public void setNumberRange(String numberRange) {
this.numberRange = numberRange;
}
@Override
public TestCaseParameterWrapper toTestCaseParameterWrapper() {
TestCaseParameterWrapper wrapper =new TestCaseParameterWrapper(this.getId(),this.getCode(),null,null,null,null,false);
wrapper.setTestCaseId(null);
wrapper.setParent(null);
wrapper.setCategory("P");
wrapper.setName(this.getName());
wrapper.setParameterType(null);
wrapper.setScoreCardVarType(this.getType());
wrapper.setIndicatorType(null);
wrapper.setValueType("java.math.BigDecimal");
wrapper.setDefaultValue(null);
wrapper.setOrder(this.getOrder());
return wrapper;
}
}

66
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/OptionScoreCardIndicatorVarEntity.java

@ -1,66 +0,0 @@
package io.sc.engine.rule.server.scorecard.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.engine.rule.server.scorecard.vo.OptionScoreCardIndicatorVarVo;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 评分卡变量(指标选项)实体类
*/
@Entity
@DiscriminatorValue("INDICATOR_OPTION")
@JsonTypeName("INDICATOR_OPTION")
public class OptionScoreCardIndicatorVarEntity extends ScoreCardIndicatorVarEntity {
//选项
@Column(name="OPTION_")
private String option;
@Override
public OptionScoreCardIndicatorVarVo toVo() {
OptionScoreCardIndicatorVarVo vo =new OptionScoreCardIndicatorVarVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setOption(this.getOption());
return vo;
}
public OptionScoreCardIndicatorVarEntity() {}
public OptionScoreCardIndicatorVarEntity(String id) {
this.id =id;
}
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_OPTION;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
@Override
public TestCaseParameterWrapper toTestCaseParameterWrapper() {
TestCaseParameterWrapper wrapper =new TestCaseParameterWrapper(this.getId(),this.getCode(),null,null,null,null,false);
wrapper.setTestCaseId(null);
wrapper.setParent(null);
wrapper.setCategory("P");
wrapper.setName(this.getName());
wrapper.setParameterType(null);
wrapper.setScoreCardVarType(this.getType());
wrapper.setIndicatorType(null);
wrapper.setValueType("java.lang.String");
wrapper.setDefaultValue(null);
wrapper.setOrder(this.getOrder());
return wrapper;
}
}

69
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/OptionScoreCardVarEntity.java

@ -1,69 +0,0 @@
package io.sc.engine.rule.server.scorecard.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.engine.rule.server.scorecard.vo.OptionScoreCardVarVo;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 评分卡变量(选项)实体类
* @author wangshaoping
*
*/
@Entity
@DiscriminatorValue("OPTION")
@JsonTypeName("OPTION")
public class OptionScoreCardVarEntity extends ScoreCardVarEntity {
//选项
@Column(name="OPTION_")
private String option;
@Override
public OptionScoreCardVarVo toVo() {
OptionScoreCardVarVo vo =new OptionScoreCardVarVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setOption(this.getOption());
return vo;
}
public OptionScoreCardVarEntity() {}
public OptionScoreCardVarEntity(String id) {
this.id =id;
}
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.OPTION;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
@Override
public TestCaseParameterWrapper toTestCaseParameterWrapper() {
TestCaseParameterWrapper wrapper =new TestCaseParameterWrapper(this.getId(),this.getCode(),null,null,null,null,false);
wrapper.setTestCaseId(null);
wrapper.setParent(null);
wrapper.setCategory("P");
wrapper.setName(this.getName());
wrapper.setParameterType(null);
wrapper.setScoreCardVarType(this.getType());
wrapper.setIndicatorType(null);
wrapper.setValueType("java.lang.String");
wrapper.setDefaultValue(null);
wrapper.setOrder(this.getOrder());
return wrapper;
}
}

50
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/ScoreCardIndicatorValueVarEntity.java

@ -1,50 +0,0 @@
package io.sc.engine.rule.server.scorecard.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.engine.rule.server.scorecard.vo.ScoreCardIndicatorValueVarVo;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 评分卡变量(指标值)实体类
* @author wangshaoping
*
*/
@Entity
@DiscriminatorValue("INDICATOR_VALUE")
@JsonTypeName("INDICATOR_VALUE")
public class ScoreCardIndicatorValueVarEntity extends ScoreCardIndicatorVarEntity {
@Override
public ScoreCardIndicatorValueVarVo toVo() {
ScoreCardIndicatorValueVarVo vo =new ScoreCardIndicatorValueVarVo();
super.toVo(vo);
vo.setType(this.getType());
return vo;
}
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_VALUE;
}
@Override
public TestCaseParameterWrapper toTestCaseParameterWrapper() {
TestCaseParameterWrapper wrapper =new TestCaseParameterWrapper(this.getId(),this.getCode(),null,null,null,null,false);
wrapper.setTestCaseId(null);
wrapper.setParent(null);
wrapper.setCategory("P");
wrapper.setName(this.getName());
wrapper.setParameterType(null);
wrapper.setScoreCardVarType(this.getType());
wrapper.setIndicatorType(null);
wrapper.setValueType("java.math.BigDecimal");
wrapper.setDefaultValue(null);
wrapper.setOrder(this.getOrder());
return wrapper;
}
}

77
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/ScoreCardIndicatorVarEntity.java

@ -1,77 +0,0 @@
package io.sc.engine.rule.server.scorecard.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import io.sc.engine.rule.server.scorecard.vo.ScoreCardIndicatorValueVarVo;
import io.sc.engine.rule.server.scorecard.vo.ScoreCardIndicatorVarVo;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
@Entity
public class ScoreCardIndicatorVarEntity extends ScoreCardVarEntity{
//库代码
@Column(name="LIB_CODE_")
protected String libCode;
//库版本
@Column(name="LIB_VERSION_")
protected Integer libVersion;
//指标代码
@Column(name="INDICATOR_CODE_")
protected String indicatorCode;
@Override
public ScoreCardIndicatorVarVo toVo() {
ScoreCardIndicatorVarVo vo =new ScoreCardIndicatorVarVo();
super.toVo(vo);
vo.setType(this.getType());
vo.setLibCode(this.getLibCode());
vo.setLibVersion(this.getLibVersion());
vo.setIndicatorCode(this.getIndicatorCode());
return vo;
}
public String getLibCode() {
return libCode;
}
public void setLibCode(String libCode) {
this.libCode = libCode;
}
public Integer getLibVersion() {
return libVersion;
}
public void setLibVersion(Integer libVersion) {
this.libVersion = libVersion;
}
public String getIndicatorCode() {
return indicatorCode;
}
public void setIndicatorCode(String indicatorCode) {
this.indicatorCode = indicatorCode;
}
@Override
public TestCaseParameterWrapper toTestCaseParameterWrapper() {
TestCaseParameterWrapper wrapper =new TestCaseParameterWrapper(this.getId(),this.getCode(),null,null,null,null,false);
wrapper.setTestCaseId(null);
wrapper.setParent(null);
wrapper.setCategory("P");
wrapper.setName(this.getName());
wrapper.setParameterType(null);
wrapper.setScoreCardVarType(this.getType());
wrapper.setIndicatorType(null);
wrapper.setValueType("java.math.BigDecimal");
wrapper.setDefaultValue(null);
wrapper.setOrder(this.getOrder());
return wrapper;
}
}

155
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/entity/ScoreCardVarEntity.java

@ -1,155 +0,0 @@
package io.sc.engine.rule.server.scorecard.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import io.sc.engine.rule.server.scorecard.vo.ScoreCardVarVo;
import io.sc.platform.orm.DeepClone;
import io.sc.platform.orm.IdClearable;
import io.sc.platform.orm.api.vo.AuditorVo;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.beans.BeanUtils;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.testcase.annotation.TestCaseParameterAble;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import io.sc.platform.orm.entity.AuditorEntity;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
* 评分卡变量实体类
*/
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE_",discriminatorType=DiscriminatorType.STRING,length=20)
@Table(name="RE_SCORE_CARD_VAR")
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=OptionScoreCardVarEntity.class)
@JsonSubTypes({
@JsonSubTypes.Type(value=NumberRangeScoreCardIndicatorVarEntity.class), //指标数值分段
@JsonSubTypes.Type(value=NumberRangeScoreCardVarEntity.class), //数值分段
@JsonSubTypes.Type(value=OptionScoreCardIndicatorVarEntity.class), //指标选项
@JsonSubTypes.Type(value=OptionScoreCardVarEntity.class), //选项
@JsonSubTypes.Type(value=ScoreCardIndicatorValueVarEntity.class) //值
})
public abstract class ScoreCardVarEntity extends AuditorEntity<ScoreCardVarVo> implements DeepClone, IdClearable, TestCaseParameterAble {
//ID,主键
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@Column(name="ID_", length=36)
@Size(max=36)
protected String id;
//代码
@Column(name="CODE_")
protected String code;
//名称
@Column(name="NAME_", length=254)
@Size(max=254)
protected String name;
//类型
@Column(name="TYPE_",insertable = false,updatable = false)
@Enumerated(EnumType.STRING)
protected ScoreCardVarType type;
//排序
@Column(name="ORDER_")
protected Integer order;
//所属资源
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="RESOURCE_ID_")
protected ResourceEntity resource;
public void toVo(ScoreCardVarVo vo) {
if(vo!=null) {
super.toVo(vo);
vo.setId(this.getId());
vo.setCode(this.getCode());
vo.setName(this.getName());
vo.setType(this.getType());
vo.setOrder(this.getOrder());
vo.setResource(this.getResource()==null?null:this.getResource().getId());
}
}
public ScoreCardVarEntity() {}
public ScoreCardVarEntity(String id) {
this.id =id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ScoreCardVarType getType() {
return type;
}
public void setType(ScoreCardVarType type) {
this.type = type;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public ResourceEntity getResource() {
return resource;
}
public void setResource(ResourceEntity resource) {
this.resource = resource;
}
@Override
public Object deepClone() throws Exception{
ScoreCardVarEntity entity =this.getClass().newInstance();
BeanUtils.copyProperties(this, entity);
return entity;
}
@Override
public void clearId() {
this.setId(null);
}
@Override
public TestCaseParameterWrapper toTestCaseParameterWrapper() {
return null;
}
}

28
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/exception/ScoreCardVarAlreadyExistsException.java

@ -1,28 +0,0 @@
package io.sc.engine.rule.server.scorecard.exception;
/**
* 评分卡变量已经存在违例类
*/
public class ScoreCardVarAlreadyExistsException extends RuntimeException{
private static final long serialVersionUID = 3989145728367307746L;
public ScoreCardVarAlreadyExistsException() {
super();
}
public ScoreCardVarAlreadyExistsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public ScoreCardVarAlreadyExistsException(String message, Throwable cause) {
super(message, cause);
}
public ScoreCardVarAlreadyExistsException(String message) {
super(message);
}
public ScoreCardVarAlreadyExistsException(Throwable cause) {
super(cause);
}
}

28
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/exception/ScoreCardVarCodeAndIndicatorCodeSameException.java

@ -1,28 +0,0 @@
package io.sc.engine.rule.server.scorecard.exception;
/**
* 评分卡变量代码和指标代码相同违例类
*/
public class ScoreCardVarCodeAndIndicatorCodeSameException extends RuntimeException{
private static final long serialVersionUID = -5557697135493816729L;
public ScoreCardVarCodeAndIndicatorCodeSameException() {
super();
}
public ScoreCardVarCodeAndIndicatorCodeSameException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public ScoreCardVarCodeAndIndicatorCodeSameException(String message, Throwable cause) {
super(message, cause);
}
public ScoreCardVarCodeAndIndicatorCodeSameException(String message) {
super(message);
}
public ScoreCardVarCodeAndIndicatorCodeSameException(Throwable cause) {
super(cause);
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/repository/ScoreCardVarRepository.java

@ -1,26 +0,0 @@
package io.sc.engine.rule.server.scorecard.repository;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.platform.orm.repository.DaoRepository;
import org.springframework.stereotype.Repository;
@Repository("io.sc.engine.rule.server.scorecard.repository.ScoreCardVarRepository")
public interface ScoreCardVarRepository extends DaoRepository<ScoreCardVarEntity,String>{
@Query("select max(e.order)+1 from ScoreCardVarEntity e where e.resource.id=:id")
public Integer getNextOrder(@Param("id") String id);
@Query("select e from ScoreCardVarEntity e where e.resource.id=:resourceId")
public List<ScoreCardVarEntity> findByResourceId(@Param("resourceId")String resourceId);
@Query("select e from ScoreCardIndicatorVarEntity e where e.libCode=:libCode")
public List<ScoreCardIndicatorVarEntity> findScoreCardIndicatorVarEntityByLibCode(@Param("libCode")String libCode);
@Query("select e from ScoreCardIndicatorVarEntity e where e.libCode=:libCode and e.libVersion=:libVersion and e.indicatorCode=:indicatorCode")
public List<ScoreCardIndicatorVarEntity> findScoreCardIndicatorVarEntityByIndicatorCode(@Param("libCode")String libCode,@Param("libVersion")Integer libVersion,@Param("indicatorCode")String indicatorCode);
}

17
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/service/ScoreCardVarService.java

@ -1,17 +0,0 @@
package io.sc.engine.rule.server.scorecard.service;
import java.util.List;
import org.springframework.data.repository.query.Param;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.engine.rule.server.scorecard.repository.ScoreCardVarRepository;
import io.sc.platform.orm.service.DaoService;
public interface ScoreCardVarService extends DaoService<ScoreCardVarEntity, String, ScoreCardVarRepository>{
/**
* 通过资源ID查询评分卡变量集合
* @param resourceId 资源ID
* @return 评分卡变量集合
*/
public List<ScoreCardVarEntity> findByResourceId(@Param("resourceId")String resourceId);
}

151
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/service/impl/ScoreCardVarServiceImpl.java

@ -1,151 +0,0 @@
package io.sc.engine.rule.server.scorecard.service.impl;
import io.sc.engine.rule.core.util.Strings;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.resource.entity.ScoreCardResourceEntity;
import io.sc.engine.rule.server.resource.service.ResourceService;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.engine.rule.server.scorecard.exception.ScoreCardVarAlreadyExistsException;
import io.sc.engine.rule.server.scorecard.exception.ScoreCardVarCodeAndIndicatorCodeSameException;
import io.sc.engine.rule.server.scorecard.repository.ScoreCardVarRepository;
import io.sc.engine.rule.server.scorecard.service.ScoreCardVarService;
import io.sc.engine.rule.server.scorecard.service.support.ScoreCardVarEntityChangedEvent;
import io.sc.platform.orm.entity.support.EntityChangedEventType;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.List;
@Service("io.sc.engine.rule.server.scorecard.service.impl.ScoreCardVarServiceImpl")
public class ScoreCardVarServiceImpl extends DaoServiceImpl<ScoreCardVarEntity, String, ScoreCardVarRepository> implements ScoreCardVarService{
@Autowired private ApplicationContext applicationContext;
@Autowired private ResourceService resourceService;
@Override
public ScoreCardVarEntity add(ScoreCardVarEntity entity) throws Exception {
if(entity!=null) {
if(entity instanceof ScoreCardIndicatorVarEntity) {
ScoreCardIndicatorVarEntity scoreCardIndicatorVarEntity =(ScoreCardIndicatorVarEntity)entity;
if(scoreCardIndicatorVarEntity.getCode()!=null && scoreCardIndicatorVarEntity.getCode().equals(scoreCardIndicatorVarEntity.getIndicatorCode())) {
throw new ScoreCardVarCodeAndIndicatorCodeSameException();
}
}
entity.setName(Strings.replaceCR_LF(entity.getName()));
if(!StringUtils.hasText(entity.getCode())) {
entity.setCode("V"+System.currentTimeMillis());
}
String resourceId =entity.getResource().getId();
ResourceEntity resourceEntity =resourceService.findById(resourceId);
if(resourceEntity!=null && resourceEntity instanceof ScoreCardResourceEntity) {
ScoreCardResourceEntity scoreCardResourceEntity =(ScoreCardResourceEntity)resourceEntity;
List<ScoreCardVarEntity> vars =scoreCardResourceEntity.getScoreCardVars();
if(vars!=null && vars.size()>0) {
for(ScoreCardVarEntity var : vars) {
if(var.getCode().equals(entity.getCode()) || var.getName().equals(entity.getName())) {
throw new ScoreCardVarAlreadyExistsException();
}
}
}
}
Integer nextOrder =repository.getNextOrder(entity.getResource().getId());
if(nextOrder!=null) {
entity.setOrder(nextOrder);
}else {
entity.setOrder(1);
}
ScoreCardVarEntity newEntity =super.add(entity);
//通知其他实体进行相应的更新
applicationContext.publishEvent(new ScoreCardVarEntityChangedEvent(EntityChangedEventType.ADD,null, newEntity));
return newEntity;
}
return null;
}
@Override
@Transactional
public ScoreCardVarEntity update(String primaryKey, ScoreCardVarEntity entity) throws Exception {
if(primaryKey==null){
throw exceptionProvider.getUpdateNullOldObjectPrimaryKeyException();
}
if(entity==null){
throw exceptionProvider.getUpdateNullNewObjectException();
}
//当参数变化时,通知其他监听器
ScoreCardVarEntity oldEntity =findById(primaryKey);
applicationContext.publishEvent(new ScoreCardVarEntityChangedEvent(EntityChangedEventType.UPDATE,oldEntity, entity));
entity.setName(Strings.replaceCR_LF(entity.getName()));
if(!StringUtils.hasText(entity.getCode())) {
entity.setCode("V"+System.currentTimeMillis());
}
String resourceId =entity.getResource().getId();
ResourceEntity resourceEntity =resourceService.findById(resourceId);
if(resourceEntity!=null && resourceEntity instanceof ScoreCardResourceEntity) {
ScoreCardResourceEntity scoreCardResourceEntity =(ScoreCardResourceEntity)resourceEntity;
List<ScoreCardVarEntity> vars =scoreCardResourceEntity.getScoreCardVars();
if(vars!=null && vars.size()>0) {
for(ScoreCardVarEntity var : vars) {
if(!var.getId().equals(entity.getId())) {
if(var.getCode().equals(entity.getCode()) || var.getName().equals(entity.getName())) {
throw new ScoreCardVarAlreadyExistsException();
}
}
}
}
}
//如果没有顺序则自动生成顺序
if(entity.getOrder()==null) {
Integer nextOrder =repository.getNextOrder(entity.getResource().getId());
if(nextOrder!=null) {
entity.setOrder(nextOrder);
}else {
entity.setOrder(1);
}
}
//通知其他实体进行相应的更新
applicationContext.publishEvent(new ScoreCardVarEntityChangedEvent(EntityChangedEventType.UPDATE,oldEntity, entity));
return super.update(primaryKey, entity);
}
@Override
public String remove(String primaryKey) throws Exception {
ScoreCardVarEntity oldEntity =findById(primaryKey);
//通知其他实体进行相应的更新
applicationContext.publishEvent(new ScoreCardVarEntityChangedEvent(EntityChangedEventType.DELETE,oldEntity, null));
return super.remove(primaryKey);
}
@Override
public List<String> remove(List<String> primaryKeys) throws Exception {
if(primaryKeys!=null && !primaryKeys.isEmpty()) {
List<ScoreCardVarEntity> willBeDeleted =repository.findAllById(primaryKeys);
if(willBeDeleted!=null && willBeDeleted.size()>0) {
for(ScoreCardVarEntity entity : willBeDeleted) {
//通知其他实体进行相应的更新
applicationContext.publishEvent(new ScoreCardVarEntityChangedEvent(EntityChangedEventType.DELETE,entity, null));
}
}
}
return super.remove(primaryKeys);
}
@Override
public List<ScoreCardVarEntity> findByResourceId(String resourceId) {
return repository.findByResourceId(resourceId);
}
}

11
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/service/support/ScoreCardVarEntityChangedEvent.java

@ -1,11 +0,0 @@
package io.sc.engine.rule.server.scorecard.service.support;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.platform.orm.entity.support.EntityChangedEvent;
import io.sc.platform.orm.entity.support.EntityChangedEventType;
public class ScoreCardVarEntityChangedEvent extends EntityChangedEvent<ScoreCardVarEntity>{
public ScoreCardVarEntityChangedEvent(EntityChangedEventType type, ScoreCardVarEntity oldEntity, ScoreCardVarEntity newEntity) {
super(type, oldEntity, newEntity);
}
}

26
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/NumberRangeScoreCardIndicatorVarVo.java

@ -1,26 +0,0 @@
package io.sc.engine.rule.server.scorecard.vo;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
/**
* 评分卡变量(指标选项) Vo
*/
public class NumberRangeScoreCardIndicatorVarVo extends ScoreCardIndicatorVarVo {
//数值分段
private String numberRange;
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_NUMBER_RANGE;
}
public String getNumberRange() {
return numberRange;
}
public void setNumberRange(String numberRange) {
this.numberRange = numberRange;
}
}

23
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/NumberRangeScoreCardVarVo.java

@ -1,23 +0,0 @@
package io.sc.engine.rule.server.scorecard.vo;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
/**
* 评分卡变量(数值分段) Vo
*/
public class NumberRangeScoreCardVarVo extends ScoreCardVarVo {
//数值分段
private String numberRange;
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.NUMBER_RANGE;
}
public String getNumberRange() {
return numberRange;
}
public void setNumberRange(String numberRange) {
this.numberRange = numberRange;
}
}

24
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/OptionScoreCardIndicatorVarVo.java

@ -1,24 +0,0 @@
package io.sc.engine.rule.server.scorecard.vo;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
/**
* 评分卡变量(指标选项) Vo
*/
public class OptionScoreCardIndicatorVarVo extends ScoreCardIndicatorVarVo {
//选项
private String option;
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_OPTION;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
}

24
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/OptionScoreCardVarVo.java

@ -1,24 +0,0 @@
package io.sc.engine.rule.server.scorecard.vo;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
/**
* 评分卡变量(选项) Vo
*/
public class OptionScoreCardVarVo extends ScoreCardVarVo {
//选项
private String option;
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.OPTION;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
}

13
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/ScoreCardIndicatorValueVarVo.java

@ -1,13 +0,0 @@
package io.sc.engine.rule.server.scorecard.vo;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
/**
* 评分卡变量(指标值) Vo
*/
public class ScoreCardIndicatorValueVarVo extends ScoreCardIndicatorVarVo {
@Override
public ScoreCardVarType getType() {
return ScoreCardVarType.INDICATOR_VALUE;
}
}

41
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/ScoreCardIndicatorVarVo.java

@ -1,41 +0,0 @@
package io.sc.engine.rule.server.scorecard.vo;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import javax.persistence.Column;
import javax.persistence.Entity;
public class ScoreCardIndicatorVarVo extends ScoreCardVarVo {
//库代码
protected String libCode;
//库版本
protected Integer libVersion;
//指标代码
protected String indicatorCode;
public String getLibCode() {
return libCode;
}
public void setLibCode(String libCode) {
this.libCode = libCode;
}
public Integer getLibVersion() {
return libVersion;
}
public void setLibVersion(Integer libVersion) {
this.libVersion = libVersion;
}
public String getIndicatorCode() {
return indicatorCode;
}
public void setIndicatorCode(String indicatorCode) {
this.indicatorCode = indicatorCode;
}
}

64
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/scorecard/vo/ScoreCardVarVo.java

@ -1,64 +0,0 @@
package io.sc.engine.rule.server.scorecard.vo;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.platform.orm.api.vo.AuditorVo;
/**
* 评分卡变量 Vo
*/
public class ScoreCardVarVo extends AuditorVo {
//ID,主键
protected String id;
//代码
protected String code;
//名称
protected String name;
//类型
protected ScoreCardVarType type;
//排序
protected Integer order;
//所属资源
protected String resource;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ScoreCardVarType getType() {
return type;
}
public void setType(ScoreCardVarType type) {
this.type = type;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public String getResource() {
return resource;
}
public void setResource(String resource) {
this.resource = resource;
}
}

136
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/bean/ScoreCardTestCaseParameterBuilder.java

@ -1,136 +0,0 @@
package io.sc.engine.rule.server.testcase.bean;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import io.sc.engine.rule.core.enums.IndicatorType;
import io.sc.engine.rule.core.enums.ScoreCardVarType;
import io.sc.engine.rule.core.enums.TestCaseOwnerType;
import io.sc.engine.rule.server.lib.entity.IndicatorEntity;
import io.sc.engine.rule.server.lib.service.IndicatorService;
import io.sc.engine.rule.server.model.service.ModelService;
import io.sc.engine.rule.server.resource.service.ResourceService;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardIndicatorVarEntity;
import io.sc.engine.rule.server.scorecard.entity.ScoreCardVarEntity;
import io.sc.engine.rule.server.scorecard.service.ScoreCardVarService;
import io.sc.engine.rule.server.testcase.annotation.TestCaseParameterBuilderType;
import io.sc.engine.rule.server.testcase.entity.TestCaseParameterEntity;
import io.sc.engine.rule.server.testcase.service.TestCaseParameterBuilder;
import io.sc.engine.rule.server.testcase.service.TestCaseParameterService;
import io.sc.engine.rule.server.testcase.service.TestCaseService;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
@Component
@TestCaseParameterBuilderType(TestCaseOwnerType.SCORE_CARD)
public class ScoreCardTestCaseParameterBuilder implements TestCaseParameterBuilder{
@Autowired ResourceService resourceService;
@Autowired ModelService modelService;
@Autowired private ScoreCardVarService scoreCardVarService;
@Autowired private TestCaseParameterService testCaseParameterService;
@Autowired TestCaseService testCaseService;
@Autowired IndicatorService indicatorService;
public List<TestCaseParameterWrapper> buildTestCaseParameterWrappers(String ownerId, String testCaseId) throws Exception {
if(StringUtils.hasText(ownerId)) {
List<TestCaseParameterWrapper> wrappers =new ArrayList<TestCaseParameterWrapper>();
//通过评分卡实体所定义的结构构建测试用例参数树
buildTestCaseParameterList(wrappers,null,scoreCardVarService.findByResourceId(ownerId));
//将已经配置的测试用例参数合并到上述树型结构中
mergeTestCaseParameterList(testCaseId,wrappers);
return wrappers;
}
return null;
}
private void buildTestCaseParameterList(List<TestCaseParameterWrapper> list,TestCaseParameterWrapper parentNode,List<ScoreCardVarEntity> scoreCardVars) {
if(list!=null) {
if(scoreCardVars!=null && scoreCardVars.size()>0) {
for(ScoreCardVarEntity scoreCardVar : scoreCardVars) {
if(ScoreCardVarType.INDICATOR_NUMBER_RANGE.equals(scoreCardVar.getType())
|| ScoreCardVarType.INDICATOR_OPTION.equals(scoreCardVar.getType())
|| ScoreCardVarType.INDICATOR_VALUE.equals(scoreCardVar.getType())
){
ScoreCardIndicatorVarEntity scoreCardIndicatorVarEntity =(ScoreCardIndicatorVarEntity)scoreCardVar;
String libCode =scoreCardIndicatorVarEntity.getLibCode();
Integer libVersion =scoreCardIndicatorVarEntity.getLibVersion();
String indicatorCode =scoreCardIndicatorVarEntity.getIndicatorCode();
IndicatorEntity indicatorEntity =indicatorService.getRepository().findByLibCodeAndVersionAndIndicatorCode(libCode, libVersion, indicatorCode);
if(indicatorEntity!=null && IndicatorType.INTERFACE.equals(indicatorEntity.getType())) {
list.add(indicatorEntity.toTestCaseParameterWrapper());
}
}
list.add(scoreCardVar.toTestCaseParameterWrapper());
}
//添加评分卡最终结果测试用例参数
TestCaseParameterWrapper wrapper =new TestCaseParameterWrapper();
wrapper.setId(UUID.randomUUID().toString());
wrapper.setCode("_SCORE_");
wrapper.setName("评分卡结果值");
wrapper.setCategory("P");
wrapper.setParameterType(null);
wrapper.setScoreCardVarType(ScoreCardVarType.RESULT);
wrapper.setOrder(Integer.MAX_VALUE);
list.add(wrapper);
}
}
}
private void mergeTestCaseParameterList(String testCaseId,List<TestCaseParameterWrapper> wrappers) throws Exception {
//根据评分卡结构构建的测试用例参数列表
Map<String,TestCaseParameterWrapper> modelStructMap =new HashMap<String,TestCaseParameterWrapper>();
for(TestCaseParameterWrapper wrapper : wrappers) {
wrapper.setTestCaseId(testCaseId);
modelStructMap.put(wrapper.getCode(), wrapper);
}
//已经配置的测试用例参数
Map<String,TestCaseParameterEntity> configuredMap =new HashMap<String,TestCaseParameterEntity>();
List<TestCaseParameterEntity> entities =testCaseParameterService.getRepository().findByTestCase(testCaseId);
for(TestCaseParameterEntity entity : entities) {
configuredMap.put(entity.getCode(), entity);
}
//将要删除的
List<String> deleteds =new ArrayList<String>();
for(String key : configuredMap.keySet()) {
if(!modelStructMap.containsKey(key)) {
TestCaseParameterEntity entity =configuredMap.get(key);
deleteds.add(entity.getId());
}
}
testCaseParameterService.remove(deleteds);
//将要插入的
List<TestCaseParameterEntity> inserts =new ArrayList<TestCaseParameterEntity>();
for(String key : modelStructMap.keySet()) {
TestCaseParameterWrapper wrapper =modelStructMap.get(key);
if(!configuredMap.containsKey(key) && "P".equals(wrapper.getCategory())) {
inserts.add(wrapper.toTestCaseParameterEntity());
}
}
testCaseParameterService.getRepository().saveAll(inserts);
//合并
entities =testCaseParameterService.findByTestCase(testCaseId);
if(entities!=null && entities.size()>0) {
for(TestCaseParameterEntity entity : entities) {
TestCaseParameterWrapper wrapper =modelStructMap.get(entity.getCode());
if(wrapper!=null) {
wrapper.setId(entity.getId());
wrapper.setSkipCheck(entity.getSkipCheck());
wrapper.setInputValue(entity.getInputValue());
wrapper.setExpectValue(entity.getExpectValue());
wrapper.setResultValue(entity.getResultValue());
wrapper.setTestResult(entity.getTestResult());
}
}
}
}
}

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

Loading…
Cancel
Save