137 changed files with 378859 additions and 591 deletions
@ -0,0 +1,16 @@ |
|||
/* |
|||
* 国际化消息源插件配置 |
|||
* 功能: 该插件配置为框架提供国际化消息资源 |
|||
* 使用说明: |
|||
* includes: 包含国际化消息资源列表 |
|||
* excludes: 排除国际化消息资源列表 |
|||
* 注意: 当一个包名同时存在于 includes 和 excludes 中, excludes 优先, 即该包不会被自动扫描 |
|||
*/ |
|||
|
|||
|
|||
{ |
|||
"includes":[ |
|||
"io/sc/engine/rule/client/spring/i18n/parameters" |
|||
], |
|||
"excludes":[] |
|||
} |
@ -0,0 +1,61 @@ |
|||
/* |
|||
* 系统参数贡献项配置示例 |
|||
* 功能说明: 为系统提供参数配置 |
|||
* 使用说明: |
|||
* id: 参数唯一标识 |
|||
* parentId: 父唯一标识,用于进行参数分类 |
|||
* code: 参数代码,应用可通过该代码获取参数值 |
|||
* defaultValue: 默认值 |
|||
* order: 排序 |
|||
*/ |
|||
|
|||
[ |
|||
//模型引擎客户端 |
|||
{"id":"parameter.re.client","order":1010}, |
|||
//模型引擎客户端/执行器执行模式 |
|||
{ |
|||
"id" :"parameter.re.client.executorMode", |
|||
"parentId" :"parameter.re.client", |
|||
"code" :"parameter.re.client.executorMode", |
|||
"defaultValue" :"Local", |
|||
"order" : 0, |
|||
"options" :{ |
|||
"Local" : "parameter.re.client.executorMode.Local", |
|||
"Remote" : "parameter.re.client.executorMode.Remote" |
|||
} |
|||
}, |
|||
//模型引擎客户端/模型定义加载器执行模式 |
|||
{ |
|||
"id" :"parameter.re.client.loaderMode", |
|||
"parentId" :"parameter.re.client", |
|||
"code" :"parameter.re.client.loaderMode", |
|||
"defaultValue" :"Local", |
|||
"order" : 10, |
|||
"options" :{ |
|||
"Local" : "parameter.re.client.loaderMode.Local", |
|||
"Remote" : "parameter.re.client.loaderMode.Remote" |
|||
} |
|||
}, |
|||
//模型引擎客户端/远程模型引擎 API URL |
|||
{ |
|||
"id" :"parameter.re.client.remoteApiUrl", |
|||
"parentId" :"parameter.re.client", |
|||
"code" :"parameter.re.client.remoteApiUrl", |
|||
"defaultValue" :"http://localhost:8080/api/re/resource", |
|||
"order" : 20 |
|||
}, |
|||
//模型引擎客户端/系统启动时自动编译模式 |
|||
{ |
|||
"id" :"parameter.re.client.autoCompile", |
|||
"parentId" :"parameter.re.client", |
|||
"code" :"parameter.re.client.autoCompile", |
|||
"defaultValue" :"none", |
|||
"order" : 30, |
|||
"options" :{ |
|||
"none" : "parameter.re.client.autoCompile.none", /* 系统启动时不自动编译资源 */ |
|||
"deployed" : "parameter.re.client.autoCompile.deployed", /* 系统启动时自动编译[已发布]的资源 */ |
|||
"last" : "parameter.re.client.autoCompile.last", /* 系统启动时自动编译[最新版本]的资源 */ |
|||
"deployed-and-last" : "parameter.re.client.autoCompile.deployed_and_last" /* 系统启动时自动编译[已发布和最新版本]的资源 */ |
|||
} |
|||
} |
|||
] |
@ -0,0 +1,17 @@ |
|||
parameter.re.client=Rule Engine(Client) |
|||
|
|||
parameter.re.client.executorMode=Executor Mode |
|||
parameter.re.client.executorMode.Local=Local |
|||
parameter.re.client.executorMode.Remote=Remote |
|||
|
|||
parameter.re.client.loaderMode=Loader Mode |
|||
parameter.re.client.loaderMode.Local=Local |
|||
parameter.re.client.loaderMode.Remote=Remote |
|||
|
|||
parameter.re.client.remoteApiUrl=Remote Server API URL |
|||
|
|||
parameter.re.client.autoCompile=Auto Compile Resource Model after System Launched |
|||
parameter.re.client.autoCompile.none=None |
|||
parameter.re.client.autoCompile.deployed=Deployed |
|||
parameter.re.client.autoCompile.last=Last |
|||
parameter.re.client.autoCompile.deployed_and_last=Deployed And Last |
@ -0,0 +1,17 @@ |
|||
parameter.re.client=\u51b3\u7b56\u5f15\u64ce(\u5ba2\u6237\u7aef) |
|||
|
|||
parameter.re.client.executorMode=\u6267\u884c\u5668\u6267\u884c\u6a21\u5f0f |
|||
parameter.re.client.executorMode.Local=\u672c\u5730 |
|||
parameter.re.client.executorMode.Remote=\u8fdc\u7a0b |
|||
|
|||
parameter.re.client.loaderMode=\u8d44\u6e90\u5b9a\u4e49\u52a0\u8f7d\u5668\u6267\u884c\u6a21\u5f0f |
|||
parameter.re.client.loaderMode.Local=\u672c\u5730 |
|||
parameter.re.client.loaderMode.Remote=\u8fdc\u7a0b |
|||
|
|||
parameter.re.client.remoteApiUrl=\u8fdc\u7a0b\u51b3\u7b56\u5f15\u64ce API URL\u5730\u5740 |
|||
|
|||
parameter.re.client.autoCompile=\u7cfb\u7edf\u542f\u52a8\u65f6\u81ea\u52a8\u7f16\u8bd1\u6a21\u5f0f |
|||
parameter.re.client.autoCompile.none=\u4e0d\u81ea\u52a8\u7f16\u8bd1 |
|||
parameter.re.client.autoCompile.deployed=\u81ea\u52a8\u7f16\u8bd1[\u5df2\u53d1\u5e03]\u7684\u8d44\u6e90 |
|||
parameter.re.client.autoCompile.last=\u81ea\u52a8\u7f16\u8bd1[\u6700\u65b0\u7248\u672c]\u7684\u8d44\u6e90 |
|||
parameter.re.client.autoCompile.deployed_and_last=\u81ea\u52a8\u7f16\u8bd1[\u5df2\u53d1\u5e03\u548c\u6700\u65b0\u7248\u672c]\u7684\u8d44\u6e90 |
@ -0,0 +1,73 @@ |
|||
package io.sc.engine.rule.client.test; |
|||
|
|||
import io.sc.engine.rule.client.Executor; |
|||
import io.sc.engine.rule.client.ExecutorBuilder; |
|||
import io.sc.engine.rule.client.ExecutorFactory; |
|||
import io.sc.engine.rule.client.enums.ExecutorMode; |
|||
import io.sc.engine.rule.client.enums.LoaderMode; |
|||
import io.sc.engine.rule.core.code.impl.support.ParameterResult; |
|||
import io.sc.engine.rule.core.code.impl.support.ResourceResult; |
|||
import io.sc.engine.rule.core.util.TimeTracer; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
public class Test { |
|||
private static final String MODEL_API_URL ="http://localhost:8080/api/re/resource"; //远程模型引擎 API URL 地址
|
|||
private static final String EXECUTOR_NAME ="executor"; //执行器名称
|
|||
private static final String MODEL_CODE ="M1628257024598"; //需要执行的模型代码
|
|||
private static final Integer MODEL_VERSION =null; //需要执行的模型版本
|
|||
private static final int COUNT =1; //需要执行的次数
|
|||
|
|||
private static TimeTracer tracer =TimeTracer.getInstance("tracer"); //创建一个时间跟踪器,用于跟踪执行时间,在生产环境中不要这样做
|
|||
|
|||
public static void main(String[] args) throws Exception{ |
|||
init(); |
|||
testLocalExecutorRemoteLoader_map(); |
|||
} |
|||
|
|||
public static void init() throws Exception{ |
|||
//创建执行器(本地执行,远程获取模型定义)
|
|||
Executor executor =new ExecutorBuilder().build(ExecutorMode.LOCAL, LoaderMode.REMOTE, MODEL_API_URL); |
|||
|
|||
//注册执行器,便于之后获取,如果每次都构建一个新的执行器,将显著影响性能
|
|||
ExecutorFactory.register(EXECUTOR_NAME, executor); |
|||
|
|||
//第一次执行,消除缓存对性能对比测试的影响
|
|||
//executor.executeByCode(MODEL_CODE, MODEL_VERSION,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(prepareData()));
|
|||
ResourceResult result =executor.executeByCode(MODEL_CODE, MODEL_VERSION,prepareData()); |
|||
List<ParameterResult> parameters =result.getData(); |
|||
for(ParameterResult parameter : parameters) { |
|||
System.out.println(parameter); |
|||
} |
|||
//tracer.log("初始化完毕====================================");
|
|||
|
|||
} |
|||
|
|||
/** |
|||
* 测试本地执行器,远程模型定义加载器,输入参数为 map 对象 |
|||
* @throws Exception 违例 |
|||
*/ |
|||
public static void testLocalExecutorRemoteLoader_map() throws Exception{ |
|||
//从注册器中获取执行器
|
|||
Executor executor =ExecutorFactory.getExecutor(EXECUTOR_NAME); |
|||
tracer.log("开始执行(采用 map 对象作为参数)===================================="); |
|||
for(int i=0;i<COUNT;i++) { |
|||
//准备执行的数据(输入参数)
|
|||
Map<String,Object> data =prepareData(); |
|||
//executor.getLoader().getResourceByCode(MODEL_CODE, MODEL_VERSION);
|
|||
executor.executeByCode(MODEL_CODE, MODEL_VERSION,data); |
|||
} |
|||
tracer.log("执行完毕(采用 map 对象作为参数)"); |
|||
tracer.log("采用 map 对象作为输入参数将执行效率提高 20+ 倍!!!"); |
|||
} |
|||
|
|||
|
|||
private static Map<String,Object> prepareData() throws Exception{ |
|||
Map<String,Object> map =new HashMap<String,Object>(); |
|||
map.put("P1628257063367", 10);//得分,整数
|
|||
return map; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,33 @@ |
|||
<#assign dictionaries=($wrapper.dictionaries)!> |
|||
<#list (dictionaries)! as dictionary> |
|||
/** |
|||
* 数据字典类 |
|||
* @author auto generated by engine |
|||
*/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class ${CodeReplacer.className(dictionary.code)}_V${dictionary.version}{ |
|||
<#list (dictionary.getFields())! as field> |
|||
<#if field.defaultValue??> |
|||
<#if "java.lang.String"==(field.valueType)!> |
|||
String ${CodeReplacer.fieldName(field.code)} ="${field.defaultValue}";//${field.name} |
|||
<#else> |
|||
${ValueType.getSimpleJavaType(field.valueType)} ${CodeReplacer.fieldName(field.code)} =${field.defaultValue};//${field.name} |
|||
</#if> |
|||
<#else> |
|||
<#if (field.valueTypeIsList)!> |
|||
List<${ValueType.getSimpleJavaType(field.valueType)}> ${CodeReplacer.fieldName(field.code)};//${field.name} |
|||
<#else> |
|||
${ValueType.getSimpleJavaType(field.valueType)} ${CodeReplacer.fieldName(field.code)};//${field.name} |
|||
</#if> |
|||
</#if> |
|||
</#list> |
|||
|
|||
public void init(){ |
|||
<#list (dictionary.getFields())! as field> |
|||
<#if field?? && field.valueCalculation?? && field.valueCalculation!=""> |
|||
${CodeReplacer.fieldName(field.code)} =(${ExpressionReplacer.groovyWithNoArgumentName(field.valueCalculation,null)}); |
|||
</#if> |
|||
</#list> |
|||
} |
|||
} |
|||
</#list> |
@ -0,0 +1,99 @@ |
|||
<#ftl strip_whitespace=true> |
|||
package io.sc.engine.rule.core.code; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; |
|||
import com.fasterxml.jackson.core.type.TypeReference; |
|||
|
|||
import groovy.transform.Canonical; |
|||
|
|||
import java.math.*; |
|||
|
|||
import java.util.Random; |
|||
import java.util.Map; |
|||
|
|||
import io.sc.engine.rule.core.classes.RuleResult; |
|||
import io.sc.engine.rule.core.classes.SingleRuleResult; |
|||
import io.sc.engine.rule.core.classes.ResourceAbstract; |
|||
|
|||
import io.sc.engine.rule.core.code.impl.support.ResourceResult; |
|||
import io.sc.engine.rule.core.code.impl.support.ParameterResult; |
|||
import io.sc.engine.rule.core.code.impl.support.FieldValidator; |
|||
import io.sc.engine.rule.core.code.impl.support.ValidateResult; |
|||
import io.sc.engine.rule.core.enums.ParameterType; |
|||
import io.sc.engine.rule.core.enums.RuntimeInputParameterType; |
|||
import io.sc.engine.rule.core.util.DateUtil; |
|||
import io.sc.engine.rule.core.util.DataTypeConvertor; |
|||
import io.sc.engine.rule.core.util.ESql; |
|||
import io.sc.engine.rule.core.util.JacksonObjectMapper; |
|||
import io.sc.engine.rule.core.util.CodeReplacer; |
|||
import io.sc.engine.rule.core.util.Strings; |
|||
|
|||
import io.sc.engine.rule.client.Executor; |
|||
|
|||
import static java.lang.Math.PI; |
|||
import static java.lang.Math.E; |
|||
import static java.lang.Math.abs; |
|||
import static java.lang.Math.acos; |
|||
import static java.lang.Math.asin; |
|||
import static java.lang.Math.atan; |
|||
import static java.lang.Math.atan2; |
|||
import static java.lang.Math.cbrt; |
|||
import static java.lang.Math.ceil; |
|||
import static java.lang.Math.cos; |
|||
import static java.lang.Math.cosh; |
|||
import static java.lang.Math.exp; |
|||
import static java.lang.Math.expm1; |
|||
import static java.lang.Math.floor; |
|||
import static java.lang.Math.IEEEremainder; |
|||
import static java.lang.Math.log; |
|||
import static java.lang.Math.pow; |
|||
import static java.lang.Math.random; |
|||
import static java.lang.Math.rint; |
|||
import static java.lang.Math.round; |
|||
import static java.lang.Math.sin; |
|||
import static java.lang.Math.sinh; |
|||
import static java.lang.Math.sqrt; |
|||
import static java.lang.Math.tan; |
|||
import static java.lang.Math.tanh; |
|||
import static java.lang.Math.toDegrees; |
|||
import static java.lang.Math.toRadians; |
|||
|
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import io.sc.engine.rule.core.function.JpmmlEvaluator; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.max; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.min; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.sum; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing; |
|||
import static io.sc.engine.rule.core.function.DateFunction.now; |
|||
import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd; |
|||
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd; |
|||
import static io.sc.engine.rule.core.function.StringFunction.join; |
|||
import static io.sc.engine.rule.core.function.NormalDistributionFunction.normalDistributioin; |
|||
import static io.sc.engine.rule.core.function.NormalDistributionFunction.inverseNormalDistributioin; |
|||
|
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal1; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal2; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal3; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal4; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal5; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal6; |
|||
|
|||
import static io.sc.engine.rule.core.util.NumberFormater.money; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.money2; |
|||
|
|||
import static io.sc.engine.rule.core.util.NumberFormater.rmb; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.rmb2; |
|||
|
|||
import static io.sc.engine.rule.core.util.NumberFormater.percent; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.percent2; |
|||
|
|||
|
|||
<#if $wrapper.type=="RESOURCE"> |
|||
<#include "/resource_groovy.ftl"/> |
|||
<#elseif $wrapper.type=="LIB"> |
|||
<#include "/lib_groovy.ftl"/> |
|||
</#if> |
@ -0,0 +1,111 @@ |
|||
<#assign libs=($wrapper.libs)!> |
|||
<#list (libs)! as lib> |
|||
/** |
|||
* 库类 |
|||
* @author auto generated by engine |
|||
*/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class ${CodeReplacer.className(lib.code,lib.version)}{ |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(lib.code,lib.version)}.class); |
|||
<#list (lib.indicators)! as indicator> |
|||
${indicator.forArgumentField($wrapper)} |
|||
</#list> |
|||
|
|||
//通过输入参数构建指标库对象 |
|||
public void convertArgument(Map<String,Object> map){ |
|||
Object obj =null; |
|||
<#list (lib.indicators)! as indicator> |
|||
${indicator.forConvertArgumentFromMap($wrapper,"this")} |
|||
</#list> |
|||
} |
|||
|
|||
public void convertArgument(String json){ |
|||
${CodeReplacer.className(lib.code)}_V${lib.version} result =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, ${CodeReplacer.className(lib.code,lib.version)}.class); |
|||
<#list (lib.indicators)! as indicator> |
|||
<#if "INTERFACE"==(indicator.type)!> |
|||
this.${CodeReplacer.fieldName(indicator.code)} =result.${CodeReplacer.fieldName(indicator.code)}; |
|||
<#if ValueType.isBaseType(indicator.valueType)> |
|||
<#else> |
|||
this.${CodeReplacer.fieldName(indicator.code)}.init(); |
|||
</#if> |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
public void execute() throws Exception{ |
|||
<#-- 处理指标值 --> |
|||
<#list (lib.indicators)! as indicator> |
|||
<#if "INDICATOR"==(indicator.type)!> |
|||
${CodeReplacer.fieldName(indicator.code)}();//${indicator.name},${indicator.type} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
public void validate(ValidateResult result) { |
|||
<#list (lib.indicators)! as indicator> |
|||
<#list (indicator.validators)! as validator> |
|||
<#if "EMPTY"==(validator.type)!> |
|||
FieldValidator.empty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "NOT_EMPTY"==(validator.type)!> |
|||
FieldValidator.notEmpty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "TRUE"==(validator.type)!> |
|||
FieldValidator.trueValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "FALSE"==(validator.type)!> |
|||
FieldValidator.falseValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "INTEGER_RANGE"==(validator.type)!> |
|||
FieldValidator.integerRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null</#if>,<#if validator.maxValue??>${validator.maxValue}<#else>null</#if>,result); |
|||
<#elseif "DECIMAL_RANGE"==(validator.type)!> |
|||
FieldValidator.decimalRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>new Double(${validator.minValue})<#else>null</#if>,<#if validator.maxValue??>new Double(${validator.maxValue})<#else>null</#if>,result); |
|||
<#elseif "LENGTH_RANGE"==(validator.type)!> |
|||
FieldValidator.lengthRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null</#if>,<#if validator.maxValue??>${validator.maxValue}<#else>null</#if>,result); |
|||
<#elseif "DATE_RANGE"==(validator.type)!> |
|||
FieldValidator.dateRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>DateUtil.parseDate("${validator.minValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null</#if>,<#if validator.maxValue??>DateUtil.parseDate("${validator.maxValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null</#if>,result); |
|||
<#elseif "EMAIL"==(validator.type)!> |
|||
FieldValidator.mail("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "PATTERN"==(validator.type)!> |
|||
FieldValidator.pattern("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},"${validator.pattern}",result); |
|||
</#if> |
|||
</#list> |
|||
</#list> |
|||
} |
|||
|
|||
<#list (lib.indicators)! as indicator> |
|||
<#if "INDICATOR"==(indicator.type)!> |
|||
<#assign parameter=indicator> |
|||
public void ${CodeReplacer.fieldName(indicator.code)}(){ |
|||
${CodeReplacer.className(lib.code)}_V${lib.version} arg =this; |
|||
<#list (indicator.processors)! as processor> |
|||
if(log.isDebugEnabled()){log.debug(" {}","${parameter.name}(${parameter.type})");} |
|||
<#if "OPTION_VALUE"==(processor.type)!> |
|||
<#include "/processor/OPTION_VALUE.ftl"/> |
|||
<#elseif "ARITHMETIC"==(processor.type)!> |
|||
<#include "/processor/ARITHMETIC.ftl"/> |
|||
<#elseif "TERNARY"==(processor.type)!> |
|||
<#include "/processor/TERNARY.ftl"/> |
|||
<#elseif "WHEN_THEN"==(processor.type)!> |
|||
<#include "/processor/WHEN_THEN.ftl"/> |
|||
<#elseif "NUMBER_RANGE"==(processor.type)!> |
|||
<#include "/processor/NUMBER_RANGE.ftl"/> |
|||
<#elseif "CONDITION_RANGE"==(processor.type)!> |
|||
<#include "/processor/CONDITION_RANGE.ftl"/> |
|||
<#elseif "DECISION_TABLE_2C"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE_2C.ftl"/> |
|||
<#elseif "DECISION_TABLE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE.ftl"/> |
|||
<#elseif "DECISION_TREE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TREE.ftl"/> |
|||
<#elseif "EXECUTION_FLOW"==(processor.type)!> |
|||
<#include "/processor/EXECUTION_FLOW.ftl"/> |
|||
<#elseif "PMML"==(processor.type)!> |
|||
<#include "/processor/PMML.ftl"/> |
|||
<#elseif "GROOVY_SCRIPT"==(processor.type)!> |
|||
<#include "/processor/GROOVY_SCRIPT.ftl"/> |
|||
<#elseif "SQL"==(processor.type)!> |
|||
<#include "/processor/SQL.ftl"/> |
|||
</#if> |
|||
</#list> |
|||
} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
</#list> |
@ -0,0 +1,197 @@ |
|||
<#assign lib=$wrapper.lib> |
|||
/** |
|||
* 指标库类(name:${lib.name}, code:${lib.code}, version:${lib.version}) |
|||
* ${(lib.description)!} |
|||
* @author auto generated by engine |
|||
*/ |
|||
class ${CodeReplacer.className(lib.code,lib.version)}{ |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(lib.code,lib.version)}.class); |
|||
|
|||
/** |
|||
* 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) |
|||
* @param map 输入参数封装器 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Map<String,Object> map) throws Exception{ |
|||
return execute(map["executor"],map["subModelCode"],map["argument"]); |
|||
} |
|||
|
|||
<#-- 执行方法(Map作为输入参数) --> |
|||
/** |
|||
* 执行方法 |
|||
* @param executor 执行器对象 |
|||
* @param subModelCode 子模型代码 |
|||
* @param data 输入参数 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{ |
|||
if(log.isDebugEnabled()){log.debug("开始执行指标库 : ${CodeReplacer.className(lib.code,lib.version)}");} |
|||
if(data instanceof Map){ |
|||
if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(data));} |
|||
}else if(data instanceof String){ |
|||
if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);} |
|||
} |
|||
//初始化模型参数 |
|||
if(log.isDebugEnabled()){log.debug("初始化指标库参数");} |
|||
Argument argument =Argument.convertArgument(data); |
|||
|
|||
//输入参数合法性检查(指标库) |
|||
ValidateResult validateResult =new ValidateResult(); |
|||
|
|||
//输入参数合法性检查(模型) |
|||
if(log.isDebugEnabled()){log.debug("开始检查指标库输入参数数据合法性");} |
|||
argument.validate(validateResult); |
|||
if(validateResult.hasError()){ |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} |
|||
ResourceResult result =new ResourceResult(); |
|||
result.setValidateResult(validateResult); |
|||
return result; |
|||
} |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} |
|||
|
|||
//执行指标库中的所有指标 |
|||
<#list (lib.indicators)! as indicator> |
|||
<#if "INDICATOR"==(indicator.type)!> |
|||
${CodeReplacer.methodName(indicator.code)}(executor,argument);//${indicator.name},${indicator.type} |
|||
</#if> |
|||
</#list> |
|||
|
|||
//返回结果 |
|||
ResourceResult result =argument.toResult(); |
|||
if(log.isDebugEnabled()){log.debug("指标库调用成功,返回结果:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(result));} |
|||
return result; |
|||
} |
|||
|
|||
<#list (lib.indicators)! as indicator> |
|||
<#if "INDICATOR"==(indicator.type)!> |
|||
public static void ${CodeReplacer.methodName(indicator.code)}(Executor executor,Argument arg){ |
|||
<#list (indicator.processors)! as processor> |
|||
<#assign parameter=indicator> |
|||
if(log.isDebugEnabled()){log.debug(" {}","${parameter.name}(${parameter.type})");} |
|||
<#if "OPTION_VALUE"==(processor.type)!> |
|||
<#include "/processor/OPTION_VALUE.ftl"/> |
|||
<#elseif "ARITHMETIC"==(processor.type)!> |
|||
<#include "/processor/ARITHMETIC.ftl"/> |
|||
<#elseif "TERNARY"==(processor.type)!> |
|||
<#include "/processor/TERNARY.ftl"/> |
|||
<#elseif "WHEN_THEN"==(processor.type)!> |
|||
<#include "/processor/WHEN_THEN.ftl"/> |
|||
<#elseif "NUMBER_RANGE"==(processor.type)!> |
|||
<#include "/processor/NUMBER_RANGE.ftl"/> |
|||
<#elseif "CONDITION_RANGE"==(processor.type)!> |
|||
<#include "/processor/CONDITION_RANGE.ftl"/> |
|||
<#elseif "DECISION_TABLE_2C"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE_2C.ftl"/> |
|||
<#elseif "DECISION_TABLE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE.ftl"/> |
|||
<#elseif "DECISION_TREE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TREE.ftl"/> |
|||
<#elseif "EXECUTION_FLOW"==(processor.type)!> |
|||
<#include "/processor/EXECUTION_FLOW.ftl"/> |
|||
<#elseif "PMML"==(processor.type)!> |
|||
<#include "/processor/PMML.ftl"/> |
|||
<#elseif "GROOVY_SCRIPT"==(processor.type)!> |
|||
<#include "/processor/GROOVY_SCRIPT.ftl"/> |
|||
<#elseif "SQL"==(processor.type)!> |
|||
<#include "/processor/SQL.ftl"/> |
|||
</#if> |
|||
</#list> |
|||
} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
/** |
|||
* 模型参数类 |
|||
* @author auto generated by engine |
|||
*/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class Argument{ |
|||
<#list (lib.indicators)! as indicator> |
|||
${indicator.forArgumentField($wrapper)} |
|||
</#list> |
|||
|
|||
<#-- 参数转换 --> |
|||
public static Argument convertArgument(Map<String,Object> map){ |
|||
if(map!=null){ |
|||
Argument argument =new Argument(); |
|||
Object obj =null; |
|||
|
|||
<#list (lib.indicators)! as indicator> |
|||
${indicator.forConvertArgumentFromMap($wrapper,"argument")} |
|||
</#list> |
|||
|
|||
return argument; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
<#-- 参数转换 --> |
|||
public static Argument convertArgument(String json){ |
|||
if(json!=null && !"".equals(json.trim())){ |
|||
Argument argument =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, Argument.class); |
|||
|
|||
<#list (lib.indicators)! as indicator> |
|||
${indicator.forConvertArgumentFromJson($wrapper,"argument")} |
|||
</#list> |
|||
|
|||
return argument; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public void validate(ValidateResult result) { |
|||
<#list (lib.indicators)! as indicator> |
|||
<#list (indicator.validators)! as validator> |
|||
<#if "EMPTY"==(validator.type)!> |
|||
FieldValidator.empty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "NOT_EMPTY"==(validator.type)!> |
|||
FieldValidator.notEmpty("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "TRUE"==(validator.type)!> |
|||
FieldValidator.trueValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "FALSE"==(validator.type)!> |
|||
FieldValidator.falseValue("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "INTEGER_RANGE"==(validator.type)!> |
|||
FieldValidator.integerRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null</#if>,<#if validator.maxValue??>${validator.maxValue}<#else>null</#if>,result); |
|||
<#elseif "DECIMAL_RANGE"==(validator.type)!> |
|||
FieldValidator.decimalRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>new Double(${validator.minValue})<#else>null</#if>,<#if validator.maxValue??>new Double(${validator.maxValue})<#else>null</#if>,result); |
|||
<#elseif "LENGTH_RANGE"==(validator.type)!> |
|||
FieldValidator.lengthRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>${validator.minValue}<#else>null</#if>,<#if validator.maxValue??>${validator.maxValue}<#else>null</#if>,result); |
|||
<#elseif "DATE_RANGE"==(validator.type)!> |
|||
FieldValidator.dateRange("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},<#if validator.minValue??>DateUtil.parseDate("${validator.minValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null</#if>,<#if validator.maxValue??>DateUtil.parseDate("${validator.maxValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null</#if>,result); |
|||
<#elseif "EMAIL"==(validator.type)!> |
|||
FieldValidator.mail("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},result); |
|||
<#elseif "PATTERN"==(validator.type)!> |
|||
FieldValidator.pattern("${indicator.code}",'''${indicator.name}''',this.${CodeReplacer.fieldName(indicator.code)},"${validator.pattern}",result); |
|||
</#if> |
|||
</#list> |
|||
</#list> |
|||
} |
|||
|
|||
public ResourceResult toResult(){ |
|||
ResourceResult result =new ResourceResult(); |
|||
<#list (lib.indicators)! as indicator> |
|||
<#if "INDICATOR"==(indicator.type)!> |
|||
<#if indicator.valueType==ValueType.Decimal.getJavaType()> |
|||
result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${indicator.type},"${indicator.valueType}",${indicator.valueScale!"8"},RoundingMode.${indicator.valueRoundingMode!"HALF_UP"},this.${CodeReplacer.fieldName(indicator.code)}==null?null:${CodeReplacer.fieldName(indicator.code)}.setScale(${indicator.valueScale!"8"},RoundingMode.${indicator.valueRoundingMode!"HALF_UP"}).toString())); |
|||
<#elseif |
|||
indicator.valueType==ValueType.Boolean.getJavaType() |
|||
|| indicator.valueType==ValueType.Long.getJavaType() |
|||
|| indicator.valueType==ValueType.String.getJavaType() |
|||
|| indicator.valueType==ValueType.Date.getJavaType() |
|||
> |
|||
result.addParameterResult(new ParameterResult("${indicator.code}","""${indicator.name}""",ParameterType.${indicator.type},"${indicator.valueType}",${indicator.valueScale!"null"},<#if indicator.valueRoundingMode??>RoundingMode.${indicator.valueRoundingMode}<#else>null</#if>,this.${CodeReplacer.fieldName(indicator.code)}==null?null:this.${CodeReplacer.fieldName(indicator.code)}.toString())); |
|||
<#else> |
|||
result.addParameterResult(new ParameterResult("${indicator.code}","""${indicator.name}""",ParameterType.${indicator.type},"${indicator.valueType}",${indicator.valueScale!"null"},<#if indicator.valueRoundingMode??>RoundingMode.${indicator.valueRoundingMode}<#else>null</#if>,this.${CodeReplacer.fieldName(indicator.code)}==null?null:JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this.${CodeReplacer.fieldName(indicator.code)}))); |
|||
</#if> |
|||
</#if> |
|||
</#list> |
|||
return result; |
|||
} |
|||
} |
|||
|
|||
<#-- 数据字典类 --> |
|||
<#include "/dictionary/dictionary.ftl"/> |
|||
|
|||
//执行并返回 |
|||
${CodeReplacer.className(lib.code)}_V${lib.version}.execute(INPUT_PARAMETER); |
@ -0,0 +1,153 @@ |
|||
/** |
|||
* 模型参数类 |
|||
* @author auto generated by engine |
|||
*/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class Argument{ |
|||
<#list (model.getAllParameters())! as parameter> |
|||
${parameter.forArgumentField($wrapper)} |
|||
</#list> |
|||
|
|||
<#-- 参数转换 --> |
|||
public static Argument convertArgument(Map<String,Object> map){ |
|||
if(map!=null){ |
|||
Argument argument =new Argument(); |
|||
|
|||
Object obj =null; |
|||
|
|||
<#list (model.getAllParameters())! as parameter> |
|||
${parameter.forConvertArgumentFromMap($wrapper,"argument")} |
|||
</#list> |
|||
|
|||
return argument; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
<#-- 参数转换 --> |
|||
public static Argument convertArgument(String json){ |
|||
if(json!=null && !"".equals(json.trim())){ |
|||
Argument argument =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, Argument.class); |
|||
|
|||
<#list (model.getAllParameters())! as parameter> |
|||
${parameter.forConvertArgumentFromJson($wrapper,"argument")} |
|||
</#list> |
|||
|
|||
return argument; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public void validate(ValidateResult result) { |
|||
<#list (model.getAllParameters())! as parameter> |
|||
<#list (parameter.getValidators())! as validator> |
|||
${validator.type!} |
|||
<#if "EMPTY"==(validator.type)!> |
|||
FieldValidator.empty("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); |
|||
<#elseif "NOT_EMPTY"==(validator.type)!> |
|||
FieldValidator.notEmpty("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); |
|||
<#elseif "TRUE"==(validator.type)!> |
|||
FieldValidator.trueValue("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); |
|||
<#elseif "FALSE"==(validator.type)!> |
|||
FieldValidator.falseValue("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); |
|||
<#elseif "INTEGER_RANGE"==(validator.type)!> |
|||
FieldValidator.integerRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>${validator.minValue}<#else>null</#if>,<#if validator.maxValue??>${validator.maxValue}<#else>null</#if>,result); |
|||
<#elseif "DECIMAL_RANGE"==(validator.type)!> |
|||
FieldValidator.decimalRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>new Double(${validator.minValue})<#else>null</#if>,<#if validator.maxValue??>new Double(${validator.maxValue})<#else>null</#if>,result); |
|||
<#elseif "LENGTH_RANGE"==(validator.type)!> |
|||
FieldValidator.lengthRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>${validator.minValue}<#else>null</#if>,<#if validator.maxValue??>${validator.maxValue}<#else>null</#if>,result); |
|||
<#elseif "DATE_RANGE"==(validator.type)!> |
|||
FieldValidator.dateRange("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},<#if validator.minValue??>DateUtil.parseDate("${validator.minValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null</#if>,<#if validator.maxValue??>DateUtil.parseDate("${validator.maxValue?string("yyyy-MM-dd HH:mm:ss")}")<#else>null</#if>,result); |
|||
<#elseif "EMAIL"==(validator.type)!> |
|||
FieldValidator.mail("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},result); |
|||
<#elseif "PATTERN"==(validator.type)!> |
|||
FieldValidator.pattern("${parameter.code}",'''${parameter.name}''',this.${CodeReplacer.fieldName(parameter.code)},"${validator.pattern}",result); |
|||
</#if> |
|||
</#list> |
|||
</#list> |
|||
} |
|||
|
|||
public void mergeParameterValueFromIndicatorLib(Map<String,Object> libs){ |
|||
<#list (model.getAllParameters())! as parameter> |
|||
<#if "INDICATOR"==(parameter.type)!> |
|||
<#-- 如果直接给模型参数(类型为指标)设置过非空值,则直接采用设置过的值,否则采用指标库计算结果值 --> |
|||
<#if $wrapper.isExecuteTestCase> |
|||
if(this.${CodeReplacer.fieldName(parameter.code)}==null){this.${CodeReplacer.fieldName(parameter.code)} =libs.get("${CodeReplacer.varName(parameter.libCode,parameter.libVersion)}").${CodeReplacer.fieldName(parameter.indicatorCode)};}//${parameter.name} |
|||
<#else> |
|||
this.${CodeReplacer.fieldName(parameter.code)} =libs.get("${CodeReplacer.varName(parameter.libCode,parameter.libVersion)}").${CodeReplacer.fieldName(parameter.indicatorCode)};//${parameter.name} |
|||
</#if> |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
public ResourceResult toResult(){ |
|||
ResourceResult result =new ResourceResult(); |
|||
<#list model.getAllParameters() as parameter> |
|||
<#if 'OUT'==(parameter.type)! || 'INTERMEDIATE'==(parameter.type)!> |
|||
<#if parameter.valueType==ValueType.Decimal.getJavaType()> |
|||
result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},"${parameter.valueType}",${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"},this.${CodeReplacer.fieldName(parameter.code)}==null?null:${CodeReplacer.fieldName(parameter.code)}.setScale(${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"}).toString())); |
|||
<#elseif |
|||
parameter.valueType==ValueType.Boolean.getJavaType() |
|||
|| parameter.valueType==ValueType.Long.getJavaType() |
|||
|| parameter.valueType==ValueType.String.getJavaType() |
|||
|| parameter.valueType==ValueType.Date.getJavaType() |
|||
> |
|||
result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:this.${CodeReplacer.fieldName(parameter.code)}.toString())); |
|||
<#else> |
|||
result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this.${CodeReplacer.fieldName(parameter.code)}))); |
|||
</#if> |
|||
<#elseif 'INDICATOR'==(parameter.type)!> |
|||
<#assign indicator=LibUtil.findIndicator($wrapper.libs,parameter.libCode,parameter.libVersion,parameter.indicatorCode)> |
|||
<#if "INDICATOR"==(indicator.type)!> |
|||
<#if parameter.valueType==ValueType.Decimal.getJavaType()> |
|||
result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${parameter.type},"${parameter.valueType}",${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"},this.${CodeReplacer.fieldName(parameter.code)}==null?null:${CodeReplacer.fieldName(parameter.code)}.setScale(${parameter.valueScale!"8"},RoundingMode.${parameter.valueRoundingMode!"HALF_UP"}).toString())); |
|||
<#elseif |
|||
parameter.valueType==ValueType.Boolean.getJavaType() |
|||
|| parameter.valueType==ValueType.Long.getJavaType() |
|||
|| parameter.valueType==ValueType.String.getJavaType() |
|||
|| parameter.valueType==ValueType.Date.getJavaType() |
|||
> |
|||
result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:this.${CodeReplacer.fieldName(parameter.code)}.toString())); |
|||
<#else> |
|||
result.addParameterResult(new ParameterResult("${indicator.code}","${indicator.name}",ParameterType.${parameter.type},"${parameter.valueType}",null,null,this.${CodeReplacer.fieldName(parameter.code)}==null?null:JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this.${CodeReplacer.fieldName(parameter.code)}))); |
|||
</#if> |
|||
</#if> |
|||
<#elseif 'RULE_RESULT'==(parameter.type)!> |
|||
result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},this.${CodeReplacer.fieldName(parameter.code)})); |
|||
<#elseif 'SINGLE_RULE_RESULT'==(parameter.type)!> |
|||
result.addParameterResult(new ParameterResult("${parameter.code}","${parameter.name}",ParameterType.${parameter.type},this.${CodeReplacer.fieldName(parameter.code)})); |
|||
</#if> |
|||
</#list> |
|||
return result; |
|||
} |
|||
|
|||
public Map<String,Object> toMap(){ |
|||
Map<String,Object> map =new HashMap<String,Object>(); |
|||
<#list model.getAllParameters() as parameter> |
|||
map.put("${parameter.code}",this.${CodeReplacer.fieldName(parameter.code)});//${parameter.type}, ${parameter.name} |
|||
</#list> |
|||
return map; |
|||
} |
|||
|
|||
public void mergeResult(ResourceResult result){ |
|||
if(result!=null){ |
|||
<#list model.getAllParameters() as parameter> |
|||
<#if |
|||
parameter.valueType==ValueType.Boolean.getJavaType() |
|||
|| parameter.valueType==ValueType.Long.getJavaType() |
|||
|| parameter.valueType==ValueType.Decimal.getJavaType() |
|||
|| parameter.valueType==ValueType.String.getJavaType() |
|||
|| parameter.valueType==ValueType.Date.getJavaType() |
|||
> |
|||
if(result.exists("${parameter.code}")){ |
|||
this.${CodeReplacer.fieldName(parameter.code)} =DataTypeConvertor.convert(result.getValueByParameterCode("${parameter.code}"),${ValueType.getSimpleJavaType(parameter.valueType)}.class); |
|||
} |
|||
<#else> |
|||
if(result.exists("${parameter.code}")){ |
|||
this.${CodeReplacer.fieldName(parameter.code)} =result.getValueByParameterCode("${parameter.code}"); |
|||
} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,224 @@ |
|||
<#assign model=resource.model> |
|||
/** |
|||
* 资源类(name:${resource.name}, code:${resource.code}, version:${resource.version}) |
|||
* @author auto generated by engine |
|||
*/ |
|||
class ${CodeReplacer.className(resource.code,resource.version)} { |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(resource.code,resource.version)}.class); |
|||
|
|||
/** |
|||
* 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) |
|||
* @param map 输入参数封装器 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Map<String,Object> map) throws Exception{ |
|||
return execute(map["executor"],map["subModelCode"],map["argument"]); |
|||
} |
|||
|
|||
<#-- 执行方法(Map作为输入参数) --> |
|||
/** |
|||
* 执行方法 |
|||
* @param executor 执行器对象 |
|||
* @param subModelCode 子模型代码 |
|||
* @param data 输入参数 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{ |
|||
if(log.isDebugEnabled()){log.debug("开始执行模型 : ${CodeReplacer.className(resource.code,resource.version)}");} |
|||
if(data instanceof Map){ |
|||
if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(data));} |
|||
}else if(data instanceof String){ |
|||
if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);} |
|||
} |
|||
|
|||
<#if $wrapper.isExecuteTestCase> |
|||
<#else> |
|||
<#list ($wrapper.libs)! as lib> |
|||
if(log.isDebugEnabled()){log.debug("初始化指标库 : ${lib.name}_V${lib.version}");} |
|||
${CodeReplacer.className(lib.code,lib.version)} ${CodeReplacer.varName(lib.code,lib.version)} =new ${CodeReplacer.className(lib.code,lib.version)}(); |
|||
${CodeReplacer.varName(lib.code,lib.version)}.convertArgument(data); |
|||
</#list> |
|||
</#if> |
|||
|
|||
//初始化模型参数 |
|||
if(log.isDebugEnabled()){log.debug("从 {} 初始化模型参数","java.lang.String"==data.class?"Json":"Map");} |
|||
Argument argument =Argument.convertArgument(data); |
|||
|
|||
//输入参数合法性检查 |
|||
ValidateResult validateResult =new ValidateResult(); |
|||
|
|||
<#if $wrapper.isExecuteTestCase> |
|||
<#else> |
|||
//输入参数合法性检查(指标库) |
|||
<#list ($wrapper.libs)! as lib> |
|||
if(log.isDebugEnabled()){log.debug("开始检查输入参数数据合法性(指标库: ${lib.name}_V${lib.version})");} |
|||
${CodeReplacer.varName(lib.code,lib.version)}.validate(validateResult); |
|||
if(validateResult.hasError()){ |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} |
|||
ResourceResult result =new ResourceResult(); |
|||
result.setValidateResult(validateResult); |
|||
return result; |
|||
} |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} |
|||
</#list> |
|||
</#if> |
|||
//输入参数合法性检查(模型) |
|||
if(log.isDebugEnabled()){log.debug("开始检查模型输入参数数据合法性");} |
|||
argument.validate(validateResult); |
|||
if(validateResult.hasError()){ |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} |
|||
ResourceResult result =new ResourceResult(); |
|||
result.setValidateResult(validateResult); |
|||
return result; |
|||
} |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} |
|||
|
|||
<#if $wrapper.isExecuteTestCase> |
|||
<#else> |
|||
//执行指标库 |
|||
<#list ($wrapper.libs)! as lib> |
|||
if(log.isDebugEnabled()){log.debug("开始执行指标库: ${lib.name}_V${lib.version}");} |
|||
${CodeReplacer.varName(lib.code,lib.version)}.execute(); |
|||
</#list> |
|||
</#if> |
|||
|
|||
<#if $wrapper.isExecuteTestCase> |
|||
<#else> |
|||
//合并指标库指标 |
|||
if(log.isDebugEnabled()){log.debug("开始合并指标库指标");} |
|||
Map<String,Object> indicatorLibs =new HashMap<String,Object>(); |
|||
<#list ($wrapper.libs)! as lib> |
|||
indicatorLibs.put("${CodeReplacer.varName(lib.code,lib.version)}",${CodeReplacer.varName(lib.code,lib.version)}); |
|||
</#list> |
|||
argument.mergeParameterValueFromIndicatorLib(indicatorLibs); |
|||
if(log.isDebugEnabled()){log.debug("显示合并后输入参数:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(argument));} |
|||
</#if> |
|||
|
|||
//执行模型 |
|||
if(subModelCode){ |
|||
subModelCode =CodeReplacer.methodName(subModelCode); |
|||
"${r'${subModelCode}'}"(executor,argument);//调用子模型 |
|||
}else{ |
|||
${CodeReplacer.methodName(model.code)}(executor,argument);//调用顶级模型(${model.name}) |
|||
} |
|||
|
|||
//返回结果 |
|||
ResourceResult result =argument.toResult(); |
|||
if(log.isDebugEnabled()){log.debug("模型调用成功,返回结果:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(result));} |
|||
return result; |
|||
} |
|||
|
|||
//顶级模型(${model.fullName}) |
|||
private static void ${CodeReplacer.methodName(model.code)}(Executor executor,Argument argument){ |
|||
if(log.isDebugEnabled()){log.debug("开始调用顶级模型: {}","${model.name}");} |
|||
<#if (model.enable)!> |
|||
<#else> |
|||
if(log.isDebugEnabled()){log.debug("开始调用顶级模型: enable==false");} |
|||
return; |
|||
</#if> |
|||
<#if "DOWN_TOP"==(model.executeMode)!> |
|||
<#-- 模型的执行模式为:自下而上,首先执行子模型 --> |
|||
<#list (model.children)! as subModel> |
|||
${CodeReplacer.methodName(subModel.code)}(executor,argument);//${subModel.name} |
|||
</#list> |
|||
</#if> |
|||
<#-- 处理顶级模型的中间值和结果值 --> |
|||
<#list (model.parameters)! as parameter> |
|||
<#if "INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!> |
|||
${CodeReplacer.methodName(parameter.code)}(executor,argument);//${parameter.name},${parameter.type} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
<#-- 递归生成所有子模型执行方法 --> |
|||
<#list (model.children)! as subModel> |
|||
//子模型(${subModel.fullName}) |
|||
private static void ${CodeReplacer.methodName(subModel.code)}(Executor executor,Argument argument){ |
|||
if(log.isDebugEnabled()){log.debug("开始调用子模型: {}","${subModel.fullName}");} |
|||
<#if (subModel.enable)!> |
|||
<#else> |
|||
if(log.isDebugEnabled()){log.debug("开始调用子模型: enable==false");} |
|||
return; |
|||
</#if> |
|||
<#if "DOWN_TOP"==(subModel.executeMode)!> |
|||
<#-- 子模型的执行模式为:自下而上,首先执行子模型的子模型 --> |
|||
<#list (subModel.children)! as _subModel> |
|||
${CodeReplacer.methodName(_subModel.code)}(executor,argument);//${_subModel.name} |
|||
</#list> |
|||
</#if> |
|||
<#-- 处理子模型的中间值和结果值 --> |
|||
<#list (subModel.getParameters())! as parameter> |
|||
<#if "INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!> |
|||
${CodeReplacer.methodName(parameter.code)}(executor,argument);//${parameter.name},${parameter.type} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
<#include "/model/sub-model.ftl"/> |
|||
</#list> |
|||
<#-- 生成所有参数处理器方法 --> |
|||
|
|||
<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> |
|||
<#if ("INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!)> |
|||
//参数处理器, ${parameter.name}(${parameter.type}) |
|||
private static void ${CodeReplacer.methodName(parameter.code)}(Executor executor,Argument ${ExpressionReplacer.ARGUMENT_NAME}){ |
|||
if(log.isDebugEnabled()){log.debug(" {}","${parameter.name}(${parameter.type})");} |
|||
<#list (parameter.processors)! as processor><#-- 循环将每个处理器转换成 java 语句 --> |
|||
<#if (processor.enable)!> |
|||
<#if "OPTION_VALUE"==(processor.type)!> |
|||
<#include "/processor/OPTION_VALUE.ftl"/> |
|||
<#elseif "ARITHMETIC"==(processor.type)!> |
|||
<#include "/processor/ARITHMETIC.ftl"/> |
|||
<#elseif "TERNARY"==(processor.type)!> |
|||
<#include "/processor/TERNARY.ftl"/> |
|||
<#elseif "WHEN_THEN"==(processor.type)!> |
|||
<#include "/processor/WHEN_THEN.ftl"/> |
|||
<#elseif "RULE"==(processor.type)!> |
|||
<#include "/processor/RULE.ftl"/> |
|||
<#elseif "SINGLE_RULE"==(processor.type)!> |
|||
<#include "/processor/SINGLE_RULE.ftl"/> |
|||
<#elseif "NUMBER_RANGE"==(processor.type)!> |
|||
<#include "/processor/NUMBER_RANGE.ftl"/> |
|||
<#elseif "CONDITION_RANGE"==(processor.type)!> |
|||
<#include "/processor/CONDITION_RANGE.ftl"/> |
|||
<#elseif "DECISION_TABLE_2C"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE_2C.ftl"/> |
|||
<#elseif "DECISION_TABLE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE.ftl"/> |
|||
<#elseif "DECISION_TREE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TREE.ftl"/> |
|||
<#elseif "EXECUTION_FLOW"==(processor.type)!> |
|||
<#include "/processor/EXECUTION_FLOW.ftl"/> |
|||
<#elseif "PMML"==(processor.type)!> |
|||
<#include "/processor/PMML.ftl"/> |
|||
<#elseif "GROOVY_SCRIPT"==(processor.type)!> |
|||
<#include "/processor/GROOVY_SCRIPT.ftl"/> |
|||
<#elseif "SQL"==(processor.type)!> |
|||
<#include "/processor/SQL.ftl"/> |
|||
</#if> |
|||
</#if> |
|||
</#list> |
|||
if(log.isDebugEnabled()){log.debug(" 参数结果值 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
} |
|||
|
|||
</#if> |
|||
</#list> |
|||
|
|||
<#-- 决策树函数 --> |
|||
<#include "/processor/DECISION_TREE_FUNCTION.ftl"/> |
|||
|
|||
<#-- 执行流函数 --> |
|||
<#include "/processor/EXECUTION_FLOW_FUNCTION.ftl"/> |
|||
} |
|||
|
|||
<#-- 参数类 --> |
|||
<#include "/model/argument.ftl"/> |
|||
|
|||
<#-- 库类 --> |
|||
<#include "/lib/lib.ftl"/> |
|||
|
|||
<#-- 数据字典类 --> |
|||
<#include "/dictionary/dictionary.ftl"/> |
|||
|
|||
//执行并返回 |
|||
${CodeReplacer.className(resource.code)}_V${resource.version}.execute(INPUT_PARAMETER); |
@ -0,0 +1,25 @@ |
|||
<#list (subModel.children)! as subModel> |
|||
//子模型(${subModel.fullName}) |
|||
private static void ${subModel.code}(Executor executor,Argument argument){ |
|||
if(log.isDebugEnabled()){log.debug("开始调用子模型: {}","${subModel.fullName}");} |
|||
<#if (subModel.enable)!> |
|||
<#else> |
|||
if(log.isDebugEnabled()){log.debug("开始调用子模型: enable==false");} |
|||
return; |
|||
</#if> |
|||
<#if "DOWN_TOP"==(subModel.executeMode)!> |
|||
<#-- 子模型的执行模式为:自下而上,首先执行子模型的子模型 --> |
|||
<#list (subModel.children)! as _subModel> |
|||
${_subModel.code}(executor,argument);//${_subModel.name} |
|||
</#list> |
|||
</#if> |
|||
<#-- 处理子模型的中间值和结果值 --> |
|||
<#list (subModel.getParameters())! as parameter> |
|||
<#if "INTERMEDIATE"==(parameter.type)! || "OUT"==(parameter.type)! || "RULE_RESULT"==(parameter.type)! || "SINGLE_RULE_RESULT"==(parameter.type)!> |
|||
${parameter.code}(executor,argument);//${parameter.name},${parameter.type} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
<#include "/model/sub-model.ftl"/> |
|||
</#list> |
@ -0,0 +1,4 @@ |
|||
//算数运算 |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${ExpressionReplacer.groovy(processor.arithmetic,parameter.valueType<#-- 算数运算,需要进行相关逻辑处理,即使参数类型为字符串也需要执行算数运算表达式 -->)};//${parameter.type}, ${parameter.name} |
|||
if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,4 @@ |
|||
//条件分段函数 |
|||
${ConditionRange.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,4 @@ |
|||
//决策表 |
|||
${DecisionTable.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,4 @@ |
|||
//简单决策表 |
|||
${DecisionTable2C.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 简单决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,4 @@ |
|||
//决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成) |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =Tree_${CodeReplacer.fieldName(parameter.code)}_${DecisionTree.parse(processor.decisionTree).id}(executor,${ExpressionReplacer.ARGUMENT_NAME}); |
|||
if(log.isDebugEnabled()){log.debug(" 决策树运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,13 @@ |
|||
/*-------------------------------------------------------------------------------* |
|||
* 决策树函数 * |
|||
*-------------------------------------------------------------------------------*/ |
|||
<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> |
|||
<#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)> |
|||
<#list (parameter.processors)! as processor> |
|||
<#if "DECISION_TREE"==processor.type> |
|||
//${parameter.name}(${parameter.type}) |
|||
${DecisionTree.generateGroovyCode(parameter,processor)} |
|||
</#if> |
|||
</#list> |
|||
</#if> |
|||
</#list> |
@ -0,0 +1,4 @@ |
|||
//执行流(此处只是入口,真正的执行流计算逻辑在后面通过一系列方法完成) |
|||
Flow_${CodeReplacer.fieldName(parameter.code)}_${ExecutionFlow.parse(processor.executionFlow).id}(executor,${ExpressionReplacer.ARGUMENT_NAME}); |
|||
if(log.isDebugEnabled()){log.debug(" 执行流运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,13 @@ |
|||
/*-------------------------------------------------------------------------------* |
|||
* 执行流函数 * |
|||
*-------------------------------------------------------------------------------*/ |
|||
<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> |
|||
<#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)> |
|||
<#list (parameter.processors)! as processor> |
|||
<#if "EXECUTION_FLOW"==processor.type> |
|||
//${parameter.name}(${parameter.type}) |
|||
${ExecutionFlow.generateGroovyCode(parameter,processor)} |
|||
</#if> |
|||
</#list> |
|||
</#if> |
|||
</#list> |
@ -0,0 +1,3 @@ |
|||
<#if processor.groovyScript??> |
|||
${ExpressionReplacer.groovy(processor.groovyScript,null)} |
|||
</#if> |
@ -0,0 +1,4 @@ |
|||
//数值分段函数 |
|||
${NumberRange.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,34 @@ |
|||
//选项值运算 |
|||
<#assign optionParameter=model.getParameterByOptionParameterCode(processor.optionCode)> |
|||
<#if optionParameter??> |
|||
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}!=null){ |
|||
<#list model.getParameterOptionsByOptionParameterCode(processor.optionCode) as option> |
|||
<#if option_index==0> |
|||
<#if optionParameter.valueType=='java.lang.String'> |
|||
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}=="""${option.inputValue}"""){ |
|||
<#else> |
|||
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}==${option.inputValue}){ |
|||
</#if> |
|||
<#else> |
|||
<#if optionParameter.valueType=='java.lang.String'> |
|||
}else if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}=="""${option.inputValue}"""){ |
|||
<#else> |
|||
}else if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}==${option.inputValue}){ |
|||
</#if> |
|||
</#if> |
|||
<#if parameter.valueType=='java.lang.String'> |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} ="""${option.value}"""; |
|||
if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
<#else> |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${option.value}; |
|||
if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
</#if> |
|||
</#list> |
|||
}else{ |
|||
if(log.isDebugEnabled()){log.debug(" !!!未匹配到选项列表,选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
} |
|||
}else{ |
|||
if(log.isDebugEnabled()){log.debug(" !!!未提供选项输入值,选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
} |
|||
</#if> |
|||
|
@ -0,0 +1,3 @@ |
|||
<#if processor.pmml??> |
|||
arg.${CodeReplacer.fieldName(parameter.code)} =JpmmlEvaluator.evaluate('${parameter.id}_${processor.id}','''${processor.pmml}''',arg.toMap()); |
|||
</#if> |
@ -0,0 +1,4 @@ |
|||
//规则运算 |
|||
${Rule.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,4 @@ |
|||
//单规则运算 |
|||
${SingleRule.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,17 @@ |
|||
//SQL 运算 |
|||
<#if processor.sqlDatasourceName??> |
|||
javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDataSource('${processor.sqlDatasourceName}'); |
|||
<#else> |
|||
javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDefaultDataSource(); |
|||
</#if> |
|||
String sql =${ExpressionReplacer.groovy("\n"+processor.sql,"java.lang.String")}; |
|||
<#if processor.sql??> |
|||
ESql.withInstance(ds){ db-> |
|||
db.query(sql) { rs -> |
|||
if (rs.next()) { |
|||
${SqlFieldMapping.generateGroovyCode(parameter,processor)} |
|||
} |
|||
} |
|||
} |
|||
</#if> |
|||
|
@ -0,0 +1,4 @@ |
|||
//三元运算 |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =(${ExpressionReplacer.groovy(processor.ternaryCondition,null)}) ? (${ExpressionReplacer.groovy(processor.ternaryTrue,parameter.valueType)}) : (${ExpressionReplacer.groovy(processor.ternaryFalse,parameter.valueType)}); |
|||
if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -0,0 +1,12 @@ |
|||
//WhenThen 运算 |
|||
if(${ExpressionReplacer.groovy(processor.when,null)}){ |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${ExpressionReplacer.groovy(processor.then,parameter.valueType)}; |
|||
if(log.isDebugEnabled()){log.debug(" WhenThen 运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
<#-- 如果是短路操作,直接结束处理 --> |
|||
<#if processor.isWhenThenShorted> |
|||
if(log.isDebugEnabled()){log.debug(" WhenThen 短路!!!");} |
|||
if(log.isDebugEnabled()){log.debug(" 参数结果值 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
return; |
|||
</#if> |
|||
} |
|||
|
@ -0,0 +1,11 @@ |
|||
<#assign resource=$wrapper.resource> |
|||
//外部引入------------------------------------------------------- |
|||
<#if resource.imports??> |
|||
${resource.imports} |
|||
</#if> |
|||
|
|||
<#if resource.type=="MODEL"> |
|||
<#include "/model/model.ftl"/> |
|||
<#elseif resource.type=="SCORE_CARD"> |
|||
<#include "/scorecard/score_card.ftl"/> |
|||
</#if> |
@ -0,0 +1,89 @@ |
|||
/********************************************************************************** |
|||
* 评分卡参数类 * |
|||
**********************************************************************************/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class Argument{ |
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
<#if 'NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_VALUE'==(scoreCardVar.type)!> |
|||
BigDecimal ${CodeReplacer.fieldName(scoreCardVar.code)};//${scoreCardVar.name}, ${scoreCardVar.type} |
|||
<#elseif 'OPTION'==(scoreCardVar.type)! || 'INDICATOR_OPTION'==(scoreCardVar.type)!> |
|||
String ${CodeReplacer.fieldName(scoreCardVar.code)};//${scoreCardVar.name}, ${scoreCardVar.type} |
|||
</#if> |
|||
</#list> |
|||
|
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
BigDecimal R_${scoreCardVar.code};//${scoreCardVar.name}得分, OUT |
|||
</#list> |
|||
|
|||
/* 最终得分 -------------------------------*/ |
|||
BigDecimal _SCORE_;//最终得分 |
|||
|
|||
<#-- 参数转换(Map) --> |
|||
public static Argument convertArgument(Map<String,Object> map){ |
|||
if(map!=null){ |
|||
Argument argument =new Argument(); |
|||
|
|||
Object obj =null; |
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
<#if 'NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_VALUE'==(scoreCardVar.type)!> |
|||
obj =DataTypeConvertor.convert(map.get("${scoreCardVar.code}"),BigDecimal.class);if(obj!=null){argument.${CodeReplacer.fieldName(scoreCardVar.code)} =obj;}//${scoreCardVar.name} |
|||
<#elseif 'OPTION'==(scoreCardVar.type)! || 'INDICATOR_OPTION'==(scoreCardVar.type)!> |
|||
obj =DataTypeConvertor.convert(map.get("${scoreCardVar.code}"),String.class);if(obj!=null){argument.${CodeReplacer.fieldName(scoreCardVar.code)} =obj;}//${scoreCardVar.name} |
|||
</#if> |
|||
</#list> |
|||
return argument; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
<#-- 参数转换(json) --> |
|||
public static Argument convertArgument(String json){ |
|||
if(json!=null && !"".equals(json.trim())){ |
|||
return JacksonObjectMapper.getDefaultObjectMapper().readValue(json, Argument.class); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public void validate(ValidateResult result) { |
|||
|
|||
} |
|||
|
|||
public void mergeParameterValueFromIndicatorLib(Map<String,Object> libs){ |
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
<#if 'INDICATOR_OPTION'==(scoreCardVar.type)! || 'INDICATOR_NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_VALUE'==(scoreCardVar.type)!> |
|||
<#-- 如果直接给模型参数(类型为指标)设置过非空值,则直接采用设置过的值,否则采用指标库计算结果值 --> |
|||
<#if $wrapper.isExecuteTestCase> |
|||
if(this.${CodeReplacer.fieldName(scoreCardVar.code)}==null){this.${CodeReplacer.fieldName(scoreCardVar.code)} =libs.get("${scoreCardVar.libCode}_${scoreCardVar.libVersion}").${CodeReplacer.fieldName(scoreCardVar.indicatorCode)};}//${scoreCardVar.name} |
|||
<#else> |
|||
this.${CodeReplacer.fieldName(scoreCardVar.code)} =libs.get("${scoreCardVar.libCode}_${scoreCardVar.libVersion}").${CodeReplacer.fieldName(scoreCardVar.indicatorCode)};//${scoreCardVar.name} |
|||
</#if> |
|||
</#if> |
|||
</#list> |
|||
} |
|||
|
|||
public ResourceResult toResult(){ |
|||
ResourceResult resourceResult =new ResourceResult(); |
|||
|
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
resourceResult.addParameterResult(new ParameterResult("R_${scoreCardVar.code}","""${scoreCardVar.name}""",ParameterType.OUT,"java.math.BigDecimal",this.R_${scoreCardVar.code}==null?null:this.R_${scoreCardVar.code}.toString())); |
|||
</#list> |
|||
|
|||
resourceResult.addParameterResult(new ParameterResult("_SCORE_","最终得分",ParameterType.OUT,"java.math.BigDecimal",this._SCORE_==null?null:this._SCORE_.toString())); |
|||
return resourceResult; |
|||
} |
|||
|
|||
public Map<String,Object> toMap(){ |
|||
Map<String,Object> map =new HashMap<String,Object>(); |
|||
|
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
map.put("${scoreCardVar.code}",this.${scoreCardVar.code}); |
|||
</#list> |
|||
|
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
map.put("R_${scoreCardVar.code}",this.R_${scoreCardVar.code}); |
|||
</#list> |
|||
|
|||
map.put("_SCORE_",this._SCORE_); |
|||
return map; |
|||
} |
|||
} |
@ -0,0 +1,147 @@ |
|||
/** |
|||
* 资源类(name:${resource.name}, code:${resource.code}, version:${resource.version}) |
|||
* ${(resource.description)!} |
|||
* @author auto generated by engine |
|||
*/ |
|||
class ${CodeReplacer.className(resource.code)}_V${resource.version}{ |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(resource.code)}_V${resource.version}.class); |
|||
|
|||
/** |
|||
* 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) |
|||
* @param map 输入参数封装器 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Map<String,Object> map) throws Exception{ |
|||
return execute(map["executor"],map["subModelCode"],map["argument"]); |
|||
} |
|||
|
|||
<#-- 执行方法(Map作为输入参数) --> |
|||
/** |
|||
* 执行方法 |
|||
* @param executor 执行器对象 |
|||
* @param subModelCode 子模型代码 |
|||
* @param data 输入参数 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{ |
|||
if(log.isDebugEnabled()){log.debug("开始执行评分卡 : ${resource.name}_${resource.version}");} |
|||
if(data instanceof Map){ |
|||
if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(data));} |
|||
}else if(data instanceof String){ |
|||
if(log.isDebugEnabled()){log.debug("显示输入参数(Json字符串)=================================================\n{}",data);} |
|||
} |
|||
|
|||
<#list ($wrapper.libs)! as lib> |
|||
//初始化指标库[name:${lib.name}, code:${lib.code}, version:${lib.version}] |
|||
if(log.isDebugEnabled()){log.debug("初始化指标库 : ${lib.name}_${lib.version}");} |
|||
${CodeReplacer.className(lib.code,lib.version)} ${CodeReplacer.varName(lib.code,lib.version)} =new ${CodeReplacer.className(lib.code,lib.version)}(); |
|||
${CodeReplacer.varName(lib.code,lib.version)}.convertArgument(data); |
|||
</#list> |
|||
|
|||
//初始化评分卡变量 |
|||
if(log.isDebugEnabled()){log.debug("初始化评分卡变量");} |
|||
Argument argument =Argument.convertArgument(data); |
|||
|
|||
//输入参数合法性检查(指标库) |
|||
ValidateResult validateResult =new ValidateResult(); |
|||
<#list ($wrapper.libs)! as lib> |
|||
if(log.isDebugEnabled()){log.debug("开始检查输入参数数据合法性(指标库: ${lib.name}_${lib.version})");} |
|||
${CodeReplacer.varName(lib.code,lib.version)}.validate(validateResult); |
|||
if(validateResult.hasError()){ |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} |
|||
ResourceResult result =new ResourceResult(); |
|||
result.setValidateResult(validateResult); |
|||
return result; |
|||
} |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} |
|||
</#list> |
|||
|
|||
//输入参数合法性检查(评分卡) |
|||
if(log.isDebugEnabled()){log.debug("开始检查评分卡输入参数数据合法性");} |
|||
argument.validate(validateResult); |
|||
if(validateResult.hasError()){ |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");} |
|||
ResourceResult result =new ResourceResult(); |
|||
result.setValidateResult(validateResult); |
|||
return result; |
|||
} |
|||
if(log.isDebugEnabled()){log.debug("\t检查结果: 成功!");} |
|||
|
|||
//执行指标库 |
|||
<#if $wrapper.isExecuteTestCase> |
|||
<#else> |
|||
<#list ($wrapper.libs)! as lib> |
|||
if(log.isDebugEnabled()){log.debug("开始执行指标库: ${lib.name}_${lib.version}");} |
|||
${CodeReplacer.varName(lib.code,lib.version)}.execute(); |
|||
</#list> |
|||
</#if> |
|||
|
|||
//合并指标库指标 |
|||
if(log.isDebugEnabled()){log.debug("开始合并指标库指标");} |
|||
Map<String,Object> indicatorLibs =new HashMap<String,Object>(); |
|||
<#list ($wrapper.libs)! as lib> |
|||
indicatorLibs.put("${lib.code}_${lib.version}",${CodeReplacer.varName(lib.code,lib.version)}); |
|||
</#list> |
|||
argument.mergeParameterValueFromIndicatorLib(indicatorLibs); |
|||
if(log.isDebugEnabled()){log.debug("显示合并后输入参数:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(argument));} |
|||
|
|||
//调用评分卡 |
|||
${CodeReplacer.fieldName(resource.code)}(executor,argument);//调用评分卡(${resource.name}) |
|||
|
|||
//返回结果 |
|||
ResourceResult result =argument.toResult(); |
|||
if(log.isDebugEnabled()){log.debug("评分卡调用成功,返回结果:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(result));} |
|||
return result; |
|||
} |
|||
|
|||
//${resource.name} |
|||
public static void ${CodeReplacer.fieldName(resource.code)}(Executor executor,Argument ${ExpressionReplacer.ARGUMENT_NAME}){ |
|||
if(log.isDebugEnabled()){log.debug("开始调用评分卡: {}","${resource.name}");} |
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
//${scoreCardVar.name} |
|||
${CodeReplacer.fieldName(scoreCardVar.code)}(executor,${ExpressionReplacer.ARGUMENT_NAME}); |
|||
</#list> |
|||
|
|||
//计算最终得分 |
|||
${ExpressionReplacer.ARGUMENT_NAME}._SCORE_ =0; |
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
${ExpressionReplacer.ARGUMENT_NAME}._SCORE_ +=${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code}==null?0:${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code}; |
|||
</#list> |
|||
if(log.isDebugEnabled()){log.debug("评分卡结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}._SCORE_);} |
|||
} |
|||
|
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
//计算评分卡变量得分(${scoreCardVar.name}) |
|||
public static void ${CodeReplacer.fieldName(scoreCardVar.code)}(Executor executor,Argument arg){ |
|||
<#if "OPTION"==(scoreCardVar.type)! || "INDICATOR_OPTION"==(scoreCardVar.type)!> |
|||
//选项 |
|||
if(log.isDebugEnabled()){log.debug(" {}","${scoreCardVar.name}(OUT)");} |
|||
${Option.generateGroovyCode(scoreCardVar)} |
|||
if(log.isDebugEnabled()){log.debug(" 选项运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code});} |
|||
<#elseif "NUMBER_RANGE"==(scoreCardVar.type)! || "INDICATOR_NUMBER_RANGE"==(scoreCardVar.type)!> |
|||
//数值分段函数 |
|||
if(log.isDebugEnabled()){log.debug(" {}","${scoreCardVar.name}(OUT)");} |
|||
${NumberRange.generateGroovyCode(scoreCardVar)} |
|||
if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.R_${scoreCardVar.code});} |
|||
<#elseif "INDICATOR_VALUE"==(scoreCardVar.type)!> |
|||
//指标值 |
|||
if(log.isDebugEnabled()){log.debug(" {}","${scoreCardVar.name}(OUT)");} |
|||
${ExpressionReplacer.ARGUMENT_NAME}.R_${CodeReplacer.fieldName(scoreCardVar.code)} =${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(scoreCardVar.code)}; |
|||
if(log.isDebugEnabled()){log.debug(" 指标值运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.R_${CodeReplacer.fieldName(scoreCardVar.code)});} |
|||
</#if> |
|||
} |
|||
|
|||
</#list> |
|||
} |
|||
|
|||
<#-- 参数类 --> |
|||
<#include "/scorecard/argument.ftl"/> |
|||
|
|||
<#-- 库类 --> |
|||
<#include "/lib/lib.ftl"/> |
|||
|
|||
<#-- 数据字典类 --> |
|||
<#include "/dictionary/dictionary.ftl"/> |
|||
|
|||
//执行并返回 |
|||
${CodeReplacer.className(resource.code)}_V${resource.version}.execute(INPUT_PARAMETER); |
@ -0,0 +1,111 @@ |
|||
class IndicatorManager { |
|||
static #wrapper: any; |
|||
|
|||
public static setWrapper(wrapper): void { |
|||
IndicatorManager.#wrapper = wrapper; |
|||
} |
|||
|
|||
public static getLibMap() { |
|||
if (IndicatorManager.#wrapper) { |
|||
const result = []; |
|||
for (const libCode in IndicatorManager.#wrapper) { |
|||
const lib = IndicatorManager.#wrapper[libCode]; |
|||
if (lib) { |
|||
result.push({ label: lib.name, value: libCode }); |
|||
} |
|||
} |
|||
return result; |
|||
} |
|||
return []; |
|||
} |
|||
|
|||
public static getLibVersionMap(libCode) { |
|||
if (IndicatorManager.#wrapper) { |
|||
if (libCode) { |
|||
const lib = IndicatorManager.#wrapper[libCode]; |
|||
if (lib) { |
|||
const versions = lib.versions; |
|||
if (versions) { |
|||
const result = []; |
|||
for (const version in versions) { |
|||
result.push({ label: version, value: version }); |
|||
} |
|||
return result; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return []; |
|||
} |
|||
|
|||
public static getIndicatorMap(libCode, libVersion) { |
|||
if (IndicatorManager.#wrapper) { |
|||
if (libCode) { |
|||
const lib = IndicatorManager.#wrapper[libCode]; |
|||
if (lib) { |
|||
const versions = lib.versions; |
|||
if (versions) { |
|||
const indicators = versions['' + libVersion]; |
|||
if (indicators) { |
|||
const result = []; |
|||
for (const code in indicators) { |
|||
result.push({ label: indicators[code], value: code }); |
|||
} |
|||
return result; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return []; |
|||
} |
|||
|
|||
public static getIndicatorName(libCode, libVersion, indicatorCode) { |
|||
if (IndicatorManager.#wrapper) { |
|||
if (libCode) { |
|||
const lib = IndicatorManager.#wrapper[libCode]; |
|||
if (lib) { |
|||
const versions = lib.versions; |
|||
if (versions) { |
|||
const indicators = versions[libVersion]; |
|||
if (indicators) { |
|||
for (const code in indicators) { |
|||
if (code == indicatorCode) { |
|||
return indicators[code]; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static getIndicatorFullPathName(libCode, libVersion, indicatorCode) { |
|||
let path = ''; |
|||
if (IndicatorManager.#wrapper) { |
|||
if (libCode) { |
|||
const lib = IndicatorManager.#wrapper[libCode]; |
|||
if (lib) { |
|||
path += lib.name; |
|||
const versions = lib.versions; |
|||
if (versions) { |
|||
const indicators = versions[libVersion]; |
|||
if (indicators) { |
|||
path += '/' + libVersion; |
|||
for (const code in indicators) { |
|||
if (code == indicatorCode) { |
|||
path += '/' + indicators[code]; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return path; |
|||
} |
|||
} |
|||
|
|||
export { IndicatorManager }; |
@ -0,0 +1,14 @@ |
|||
<template> |
|||
<div> |
|||
<q-chip v-if="status === 'HISTORY'" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.HISTORY')" dense></q-chip> |
|||
<q-chip v-if="status === 'ON_LINE'" color="green" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.ON_LINE')" dense></q-chip> |
|||
<q-chip v-if="status === 'OFF_LINE'" color="brown" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.OFF_LINE')" dense></q-chip> |
|||
<q-chip v-if="status === 'SKETCH'" color="blue-grey" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.SKETCH')" dense></q-chip> |
|||
<q-chip v-if="status === 'APPROVING'" color="orange" text-color="white" :label="$t('io.sc.engine.rule.core.enums.DeployStatus.APPROVING')" dense></q-chip> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
const props = defineProps({ |
|||
status: { type: String, default: '' }, |
|||
}); |
|||
</script> |
@ -0,0 +1,184 @@ |
|||
<template> |
|||
<w-dialog |
|||
ref="dialogRef" |
|||
:title="$t('re.workflow.dialog.title')" |
|||
width="1248px" |
|||
height="500px" |
|||
:can-maximize="false" |
|||
:buttons="[ |
|||
{ |
|||
label: $t('confirm'), |
|||
noCaps: true, |
|||
click: () => { |
|||
axios |
|||
.post(Environment.apiContextPath('/api/re/model/parameter/addIndicators'), { |
|||
modelId: modelId, |
|||
indicators: indicatorGridRef.getTickedRows(), |
|||
}) |
|||
.then((response) => { |
|||
close(); |
|||
parameterGrid.refresh(); |
|||
}); |
|||
}, |
|||
}, |
|||
]" |
|||
> |
|||
<q-splitter :model-value="450" unit="px" separator-style="width: 3px;" class="w-full" style="height: 100%"> |
|||
<template #before> |
|||
<div class="pr-1" style="height: 100%"> |
|||
<w-grid |
|||
ref="libTreeGridRef" |
|||
:title="$t('re.lib.grid.title')" |
|||
dense-body |
|||
hide-bottom |
|||
:config-button="true" |
|||
selection="multiple" |
|||
:checkbox-selection="false" |
|||
:tree="true" |
|||
:tree-icon=" |
|||
(row) => { |
|||
if (row.type === 'FOLDER') { |
|||
return { name: 'folder', color: 'amber' }; |
|||
} else { |
|||
return { name: 'bi-card-list' }; |
|||
} |
|||
} |
|||
" |
|||
ticked-field="selected" |
|||
:data-url="Environment.apiContextPath('/api/re/lib')" |
|||
:pageable="false" |
|||
:toolbar-configure="{ noIcon: false }" |
|||
:toolbar-actions="['refresh', 'separator', 'expand', 'separator', 'view', 'separator']" |
|||
:columns="[ |
|||
{ |
|||
width: '100%', |
|||
name: 'name', |
|||
label: $t('name'), |
|||
}, |
|||
{ |
|||
width: 80, |
|||
name: 'type', |
|||
label: $t('type'), |
|||
format: (value) => { |
|||
if (value !== 'FOLDER') { |
|||
return Formater.enum(Enums.LibType)(value); |
|||
} |
|||
}, |
|||
}, |
|||
{ width: 60, name: 'version', label: $t('version') }, |
|||
{ |
|||
width: 80, |
|||
name: 'status', |
|||
label: $t('status'), |
|||
align: 'center', |
|||
format: (value, row) => { |
|||
return { |
|||
componentType: ResourceDeployStatusTag, |
|||
attrs: { status: value }, |
|||
}; |
|||
}, |
|||
}, |
|||
]" |
|||
@row-click=" |
|||
(evt, row, index) => { |
|||
console.log(row); |
|||
if (row.type === 'INDICATOR') { |
|||
currentSelectedLibIdRef = row.id; |
|||
} else { |
|||
currentSelectedLibIdRef = null; |
|||
} |
|||
indicatorGridRef?.refresh(); |
|||
} |
|||
" |
|||
@before-request-data=" |
|||
() => { |
|||
currentSelectedLibIdRef = null; |
|||
indicatorGridRef?.refresh(); |
|||
} |
|||
" |
|||
></w-grid> |
|||
</div> |
|||
</template> |
|||
<template #after> |
|||
<div class="pl-1" style="height: 100%"> |
|||
<w-grid |
|||
ref="indicatorGridRef" |
|||
:title="$t('re.lib.grid.title')" |
|||
dense-body |
|||
hide-bottom |
|||
:config-button="true" |
|||
selection="multiple" |
|||
:checkbox-selection="true" |
|||
:tree="false" |
|||
:fetch-data-url="Environment.apiContextPath('api/re/indicator?lib=' + currentSelectedLibIdRef)" |
|||
:data-url="Environment.apiContextPath('api/re/indicator')" |
|||
:pageable="false" |
|||
:toolbar-configure="{ noIcon: false }" |
|||
:toolbar-actions="['query', 'refresh', 'separator', 'view']" |
|||
:query-form-cols-num="2" |
|||
:query-form-fields="[ |
|||
{ name: 'code', label: $t('code'), type: 'text', clearable: true }, |
|||
{ name: 'name', label: $t('name'), type: 'text', clearable: true }, |
|||
]" |
|||
:columns="[ |
|||
{ width: 60, name: 'order', label: $t('order'), align: 'right' }, |
|||
{ width: 250, name: 'name', label: $t('name') }, |
|||
{ width: 100, name: 'type', label: $t('type'), format: Formater.enum(Enums.IndicatorType) }, |
|||
{ |
|||
width: 100, |
|||
name: 'valueType', |
|||
label: $t('valueType'), |
|||
format: (value, row) => { |
|||
return ValueTypeMap[value]; |
|||
}, |
|||
}, |
|||
{ width: 80, name: 'valueTypeIsList', label: $t('re.resources.designer.parameter.grid.entity.valueTypeIsList'), format: Formater.checkTag() }, |
|||
{ width: '100%', name: 'defaultValue', label: $t('defaultValue') }, |
|||
]" |
|||
></w-grid> |
|||
</div> |
|||
</template> |
|||
</q-splitter> |
|||
</w-dialog> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref } from 'vue'; |
|||
import { axios, Environment, EnumTools, Formater } from 'platform-core'; |
|||
import ResourceDeployStatusTag from '@/views/shared/ResourceDeployStatusTag.vue'; |
|||
|
|||
const props = defineProps({ |
|||
parameterGrid: { type: Object, default: undefined }, |
|||
modelId: { type: String, default: undefined }, |
|||
}); |
|||
|
|||
const dialogRef = ref(); |
|||
const libTreeGridRef = ref(); |
|||
const currentSelectedLibIdRef = ref(); |
|||
const indicatorGridRef = ref(); |
|||
|
|||
const open = () => { |
|||
dialogRef.value.show(); |
|||
}; |
|||
|
|||
const close = () => { |
|||
dialogRef.value.hide(); |
|||
}; |
|||
|
|||
defineExpose({ |
|||
open, |
|||
close, |
|||
}); |
|||
|
|||
const Enums = await EnumTools.fetch(['io.sc.engine.rule.core.enums.LibType', 'io.sc.engine.rule.core.enums.DeployStatus']); |
|||
let ValueTypeMap = {}; |
|||
let ValueTypeList = []; |
|||
const response = await axios.get(Environment.apiContextPath('/api/re/dictionary/getAllDictionaryMap')); |
|||
if (response && response.data) { |
|||
ValueTypeMap = {}; |
|||
ValueTypeList = []; |
|||
for (const item of response.data) { |
|||
ValueTypeMap[item.key] = item.value; |
|||
ValueTypeList.push({ value: item.key, label: item.value }); |
|||
} |
|||
} |
|||
</script> |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,18 +1,52 @@ |
|||
package io.sc.engine.rule.server.lib.controller; |
|||
|
|||
import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassFieldEntity; |
|||
import io.sc.engine.rule.server.dictionary.vo.UserDefinedJavaClassFieldVo; |
|||
import io.sc.engine.rule.server.lib.entity.IndicatorProcessorEntity; |
|||
import io.sc.engine.rule.server.lib.repository.IndicatorProcessorRepository; |
|||
import io.sc.engine.rule.server.lib.service.IndicatorProcessorService; |
|||
import io.sc.engine.rule.server.lib.service.IndicatorService; |
|||
import io.sc.engine.rule.server.lib.vo.IndicatorProcessorVo; |
|||
import io.sc.engine.rule.server.util.CodeAndNameMapping; |
|||
import io.sc.engine.rule.server.util.VariableCodeAndNameReplacer; |
|||
import io.sc.platform.mvc.controller.support.RestCrudController; |
|||
import io.sc.platform.orm.entity.BaseEntity; |
|||
import io.sc.platform.orm.service.support.QueryParameter; |
|||
import io.sc.platform.orm.service.support.QueryResult; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.data.domain.Page; |
|||
import org.springframework.data.domain.PageImpl; |
|||
import org.springframework.stereotype.Controller; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
|
|||
import javax.servlet.http.HttpServletRequest; |
|||
import javax.servlet.http.HttpServletResponse; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 指标处理器 Controller |
|||
*/ |
|||
@Controller |
|||
@RequestMapping("/api/re/indicator/processor") |
|||
public class IndicatorProcessorWebController extends RestCrudController<IndicatorProcessorVo,IndicatorProcessorEntity,String,IndicatorProcessorRepository,IndicatorProcessorService> { |
|||
@Autowired private IndicatorService indicatorService; |
|||
|
|||
@Override |
|||
protected Page<IndicatorProcessorVo> query(HttpServletRequest request, HttpServletResponse response, QueryParameter queryParameter) throws Exception { |
|||
Page<IndicatorProcessorEntity> page =service.query(queryParameter); |
|||
if(page==null){ |
|||
return QueryResult.emptyPage(); |
|||
} |
|||
List<IndicatorProcessorEntity> entities =page.getContent(); |
|||
List<IndicatorProcessorVo> vos =new ArrayList<>(entities.size()); |
|||
CodeAndNameMapping mapping =indicatorService.loadCodeAndNameMappingByIndicatorId(request.getParameter("indicator")); |
|||
VariableCodeAndNameReplacer.replace(entities,mapping.getCode2NameMapping()); |
|||
for(IndicatorProcessorEntity entity : entities){ |
|||
if(entity instanceof BaseEntity){ |
|||
vos.add(((BaseEntity<IndicatorProcessorVo>)entity).toVo()); |
|||
} |
|||
} |
|||
return new PageImpl<>(vos,page.getPageable(),page.getTotalElements()); |
|||
} |
|||
} |
|||
|
@ -0,0 +1,58 @@ |
|||
package io.sc.engine.rule.server.model.entity.processor; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonTypeName; |
|||
import io.sc.engine.rule.core.enums.ProcessorType; |
|||
import io.sc.engine.rule.core.util.ExpressionReplacer; |
|||
import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity; |
|||
import io.sc.engine.rule.server.model.vo.processor.ArithmeticParameterProcessorVo; |
|||
import io.sc.engine.rule.server.model.vo.processor.MathFormulaParameterProcessorVo; |
|||
|
|||
import javax.persistence.Column; |
|||
import javax.persistence.DiscriminatorValue; |
|||
import javax.persistence.Entity; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* 模型参数处理器(算数运算操作)实体类 |
|||
*/ |
|||
@Entity |
|||
@DiscriminatorValue("MATH_FORMULA") |
|||
@JsonTypeName("MATH_FORMULA") |
|||
public class MathFormulaParameterProcessorEntity extends ParameterProcessorEntity { |
|||
//算数表达式
|
|||
@Column(name="MATH_FORMULA_") |
|||
private String mathFormula; |
|||
|
|||
@Override |
|||
public MathFormulaParameterProcessorVo toVo() { |
|||
MathFormulaParameterProcessorVo vo =new MathFormulaParameterProcessorVo(); |
|||
super.toVo(vo); |
|||
vo.setMathFormula(this.getMathFormula()); |
|||
return vo; |
|||
} |
|||
|
|||
@Override |
|||
public ProcessorType getType() { |
|||
return ProcessorType.MATH_FORMULA; |
|||
} |
|||
|
|||
public String getMathFormula() { |
|||
return mathFormula; |
|||
} |
|||
|
|||
public void setMathFormula(String mathFormula) { |
|||
this.mathFormula = mathFormula; |
|||
} |
|||
|
|||
@Override |
|||
public boolean replace(Map<String, String> mapping) { |
|||
String replaced =ExpressionReplacer.replace(this.mathFormula, mapping); |
|||
replaced =(replaced==null?"":replaced); |
|||
boolean result =false; |
|||
if(!replaced.equals(this.mathFormula)) { |
|||
result =true; |
|||
} |
|||
this.mathFormula =replaced; |
|||
return result; |
|||
} |
|||
} |
@ -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 MathFormulaParameterProcessorVo extends ParameterProcessorVo { |
|||
|
|||
//数学公式
|
|||
private String mathFormula; |
|||
|
|||
@Override |
|||
public ProcessorType getType() { |
|||
return ProcessorType.MATH_FORMULA; |
|||
} |
|||
|
|||
public String getMathFormula() { |
|||
return mathFormula; |
|||
} |
|||
|
|||
public void setMathFormula(String mathFormula) { |
|||
this.mathFormula = mathFormula; |
|||
} |
|||
} |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue