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; |
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.entity.IndicatorProcessorEntity; |
||||
import io.sc.engine.rule.server.lib.repository.IndicatorProcessorRepository; |
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.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.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.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.stereotype.Controller; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
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 |
||||
*/ |
*/ |
||||
@Controller |
@Controller |
||||
@RequestMapping("/api/re/indicator/processor") |
@RequestMapping("/api/re/indicator/processor") |
||||
public class IndicatorProcessorWebController extends RestCrudController<IndicatorProcessorVo,IndicatorProcessorEntity,String,IndicatorProcessorRepository,IndicatorProcessorService> { |
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